diff --git a/.ruby-gemset b/.ruby-gemset new file mode 100644 index 0000000..8ffaef2 --- /dev/null +++ b/.ruby-gemset @@ -0,0 +1,2 @@ +thingspeak + diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..c6dcdce --- /dev/null +++ b/.ruby-version @@ -0,0 +1,2 @@ +ruby-2.1.0 + diff --git a/Gemfile b/Gemfile index c191e62..a364c6a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,18 +1,61 @@ source 'http://rubygems.org' -gem 'rails', '3.2.1' +gem 'rails', '4.0.2' +gem 'jquery-rails', '3.0.4' +gem 'rails_autolink' gem 'mysql2' gem 'authlogic' -gem 'jquery-rails', '2.0.1' +gem 'twitter_oauth', git: 'git://github.com/moomerman/twitter_oauth.git' +gem 'therubyracer' +gem 'exception_notification' +gem 'nested_form' +gem 'dalli' +gem 'kgio' +gem 'will_paginate', '~> 3.0.pre2' +gem 'nokogiri' +gem 'acts_as_tree' +gem 'acts_as_list' +gem 'gravatarify' +gem 'dynamic_form' +gem 'geokit' +gem 'redis' +gem 'resque-scheduler', '2.3.1', :require => 'resque_scheduler' +gem 'resque-timeout' +gem 'daemons' +#gem 'db2fog' (not compatible with Rails 4, see https://github.com/hakanensari/db2fog for Rails 4 version) +gem 'simplificator-rwebthumb', :git => "git://github.com/simplificator/rwebthumb.git" +gem 'tweetstream' +gem 'capistrano', '~> 2.15.4' +gem 'rack-utf8_sanitizer' +gem 'newrelic_rpm' +gem 'actionpack-xml_parser' +# To use debugger +# gem 'ruby-debug' -# Bundle gems for the local environment. Make sure to -# put test-only gems in this group so their generators -# and rake tasks are available in development mode: -group :development, :test do - gem 'rspec', '>= 2.0.0.beta.20' - gem 'rspec-rails', '>= 2.0.0.beta.20' - gem 'autotest' - gem 'webrat' - gem 'annotate' +# assets +gem 'sass-rails', " ~> 4.0" +gem 'coffee-rails', " ~> 4.0" +gem 'uglifier' + +group :development do + gem 'annotate', '~> 2.6.1' + gem 'quiet_assets' + gem 'thin' + gem 'i18n-tasks', '~> 0.2.10' end + +group :test do + gem 'sqlite3-ruby', '1.3.3', :require => 'sqlite3' + gem 'rspec-rails', '~> 2.14.1' + gem 'spork' + gem 'factory_girl_rails' + gem 'webrat' + gem 'faker' + gem 'json_spec' + gem 'autotest' + gem 'autotest-rails' + gem 'ZenTest' + gem 'database_cleaner', '~> 1.2.0' +end + diff --git a/Gemfile.lock b/Gemfile.lock index caa6abe..9902680 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,123 +1,333 @@ +GIT + remote: git://github.com/moomerman/twitter_oauth.git + revision: 04e6bbfe635a376cae342d234214cdab864fe797 + specs: + twitter_oauth (0.4.94) + json (>= 1.8.0) + mime-types (>= 1.16) + oauth (>= 0.4.7) + +GIT + remote: git://github.com/simplificator/rwebthumb.git + revision: dbd96a62787201f7bf901c39c8df003a22b45ec9 + specs: + simplificator-rwebthumb (0.3.4) + GEM remote: http://rubygems.org/ specs: - ZenTest (4.6.2) - actionmailer (3.2.1) - actionpack (= 3.2.1) - mail (~> 2.4.0) - actionpack (3.2.1) - activemodel (= 3.2.1) - activesupport (= 3.2.1) - builder (~> 3.0.0) + ZenTest (4.9.5) + actionmailer (4.0.2) + actionpack (= 4.0.2) + mail (~> 2.5.4) + actionpack (4.0.2) + activesupport (= 4.0.2) + builder (~> 3.1.0) erubis (~> 2.7.0) - journey (~> 1.0.1) - rack (~> 1.4.0) - rack-cache (~> 1.1) - rack-test (~> 0.6.1) - sprockets (~> 2.1.2) - activemodel (3.2.1) - activesupport (= 3.2.1) - builder (~> 3.0.0) - activerecord (3.2.1) - activemodel (= 3.2.1) - activesupport (= 3.2.1) - arel (~> 3.0.0) - tzinfo (~> 0.3.29) - activeresource (3.2.1) - activemodel (= 3.2.1) - activesupport (= 3.2.1) - activesupport (3.2.1) - i18n (~> 0.6) - multi_json (~> 1.0) - annotate (2.4.0) - arel (3.0.0) - authlogic (3.1.0) - activerecord (>= 3.0.7) - activerecord (>= 3.0.7) + rack (~> 1.5.2) + rack-test (~> 0.6.2) + actionpack-xml_parser (1.0.1) + actionpack (>= 4.0.0.rc1) + activemodel (4.0.2) + activesupport (= 4.0.2) + builder (~> 3.1.0) + activerecord (4.0.2) + activemodel (= 4.0.2) + activerecord-deprecated_finders (~> 1.0.2) + activesupport (= 4.0.2) + arel (~> 4.0.0) + activerecord-deprecated_finders (1.0.3) + activesupport (4.0.2) + i18n (~> 0.6, >= 0.6.4) + minitest (~> 4.2) + multi_json (~> 1.3) + thread_safe (~> 0.1) + tzinfo (~> 0.3.37) + acts_as_list (0.3.0) + activerecord (>= 3.0) + acts_as_tree (1.5.0) + activerecord (>= 3.0.0) + addressable (2.3.5) + annotate (2.6.1) + activerecord (>= 2.3.0) + rake (>= 0.8.7) + arel (4.0.1) + atomic (1.1.14) + authlogic (3.3.0) + activerecord (>= 3.2) + activesupport (>= 3.2) autotest (4.4.6) ZenTest (>= 4.4.1) - builder (3.0.0) - diff-lcs (1.1.3) + autotest-rails (4.2.1) + ZenTest (~> 4.5) + builder (3.1.4) + capistrano (2.15.4) + highline + net-scp (>= 1.0.0) + net-sftp (>= 2.0.0) + net-ssh (>= 2.0.14) + net-ssh-gateway (>= 1.1.0) + coffee-rails (4.0.1) + coffee-script (>= 2.2.0) + railties (>= 4.0.0, < 5.0) + coffee-script (2.2.0) + coffee-script-source + execjs + coffee-script-source (1.6.3) + cookiejar (0.3.0) + daemons (1.1.9) + dalli (2.7.0) + database_cleaner (1.2.0) + diff-lcs (1.2.5) + dynamic_form (1.1.4) + easy_translate (0.4.0) + json + thread + thread_safe + em-http-request (1.1.2) + addressable (>= 2.3.4) + cookiejar + em-socksify (>= 0.3) + eventmachine (>= 1.0.3) + http_parser.rb (>= 0.6.0) + em-socksify (0.3.0) + eventmachine (>= 1.0.0.beta.4) + em-twitter (0.3.2) + eventmachine (~> 1.0) + http_parser.rb (~> 0.6) + simple_oauth (~> 0.2) erubis (2.7.0) - hike (1.2.1) - i18n (0.6.0) - journey (1.0.1) - jquery-rails (2.0.1) - railties (>= 3.2.0, < 5.0) - thor (~> 0.14) - json (1.6.5) - mail (2.4.1) - i18n (>= 0.4.0) + eventmachine (1.0.3) + exception_notification (4.0.1) + actionmailer (>= 3.0.4) + activesupport (>= 3.0.4) + execjs (2.0.2) + factory_girl (4.3.0) + activesupport (>= 3.0.0) + factory_girl_rails (4.3.0) + factory_girl (~> 4.3.0) + railties (>= 3.0.0) + faker (1.2.0) + i18n (~> 0.5) + faraday (0.8.9) + multipart-post (~> 1.2.0) + geokit (1.8.4) + multi_json (>= 1.3.2) + gravatarify (3.1.0) + highline (1.6.20) + hike (1.2.3) + http_parser.rb (0.6.0) + i18n (0.6.9) + i18n-tasks (0.2.18) + activesupport + easy_translate (>= 0.4.0) + erubis + highline + rake + term-ansicolor + terminal-table + jquery-rails (3.0.4) + railties (>= 3.0, < 5.0) + thor (>= 0.14, < 2.0) + json (1.8.1) + json_spec (1.1.1) + multi_json (~> 1.0) + rspec (~> 2.0) + kgio (2.8.1) + libv8 (3.16.14.3) + mail (2.5.4) mime-types (~> 1.16) treetop (~> 1.4.8) - mime-types (1.17.2) - multi_json (1.0.4) - mysql2 (0.3.11) - nokogiri (1.5.0) + mime-types (1.25.1) + mini_portile (0.5.2) + minitest (4.7.5) + mono_logger (1.1.0) + multi_json (1.8.4) + multipart-post (1.2.0) + mysql2 (0.3.14) + nested_form (0.3.2) + net-scp (1.1.2) + net-ssh (>= 2.6.5) + net-sftp (2.1.2) + net-ssh (>= 2.6.5) + net-ssh (2.7.0) + net-ssh-gateway (1.2.0) + net-ssh (>= 2.6.5) + newrelic_rpm (3.7.1.182) + nokogiri (1.6.1) + mini_portile (~> 0.5.0) + oauth (0.4.7) polyglot (0.3.3) - rack (1.4.1) - rack-cache (1.1) - rack (>= 0.4) - rack-ssl (1.3.2) + quiet_assets (1.0.2) + railties (>= 3.1, < 5.0) + rack (1.5.2) + rack-protection (1.5.2) rack - rack-test (0.6.1) + rack-test (0.6.2) rack (>= 1.0) - rails (3.2.1) - actionmailer (= 3.2.1) - actionpack (= 3.2.1) - activerecord (= 3.2.1) - activeresource (= 3.2.1) - activesupport (= 3.2.1) - bundler (~> 1.0) - railties (= 3.2.1) - railties (3.2.1) - actionpack (= 3.2.1) - activesupport (= 3.2.1) - rack-ssl (~> 1.3.2) + rack-utf8_sanitizer (1.1.0) + rack (~> 1.0) + rails (4.0.2) + actionmailer (= 4.0.2) + actionpack (= 4.0.2) + activerecord (= 4.0.2) + activesupport (= 4.0.2) + bundler (>= 1.3.0, < 2.0) + railties (= 4.0.2) + sprockets-rails (~> 2.0.0) + rails_autolink (1.1.5) + rails (> 3.1) + railties (4.0.2) + actionpack (= 4.0.2) + activesupport (= 4.0.2) rake (>= 0.8.7) - rdoc (~> 3.4) - thor (~> 0.14.6) - rake (0.9.2.2) - rdoc (3.12) - json (~> 1.4) - rspec (2.8.0) - rspec-core (~> 2.8.0) - rspec-expectations (~> 2.8.0) - rspec-mocks (~> 2.8.0) - rspec-core (2.8.0) - rspec-expectations (2.8.0) - diff-lcs (~> 1.1.2) - rspec-mocks (2.8.0) - rspec-rails (2.8.1) + thor (>= 0.18.1, < 2.0) + rake (10.1.1) + redis (3.0.7) + redis-namespace (1.4.1) + redis (~> 3.0.4) + ref (1.0.5) + resque (1.25.1) + mono_logger (~> 1.0) + multi_json (~> 1.0) + redis-namespace (~> 1.2) + sinatra (>= 0.9.2) + vegas (~> 0.1.2) + resque-scheduler (2.3.1) + redis (>= 3.0.0) + resque (~> 1.25) + rufus-scheduler (~> 2.0) + resque-timeout (1.0.0) + resque (~> 1.0) + rspec (2.14.1) + rspec-core (~> 2.14.0) + rspec-expectations (~> 2.14.0) + rspec-mocks (~> 2.14.0) + rspec-core (2.14.7) + rspec-expectations (2.14.4) + diff-lcs (>= 1.1.3, < 2.0) + rspec-mocks (2.14.4) + rspec-rails (2.14.1) actionpack (>= 3.0) + activemodel (>= 3.0) activesupport (>= 3.0) railties (>= 3.0) - rspec (~> 2.8.0) - sprockets (2.1.2) + rspec-core (~> 2.14.0) + rspec-expectations (~> 2.14.0) + rspec-mocks (~> 2.14.0) + rufus-scheduler (2.0.24) + tzinfo (>= 0.3.22) + sass (3.2.13) + sass-rails (4.0.1) + railties (>= 4.0.0, < 5.0) + sass (>= 3.1.10) + sprockets-rails (~> 2.0.0) + simple_oauth (0.2.0) + sinatra (1.4.4) + rack (~> 1.4) + rack-protection (~> 1.4) + tilt (~> 1.3, >= 1.3.4) + spork (0.9.2) + sprockets (2.10.1) hike (~> 1.2) + multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - thor (0.14.6) - tilt (1.3.3) - treetop (1.4.10) + sprockets-rails (2.0.1) + actionpack (>= 3.0) + activesupport (>= 3.0) + sprockets (~> 2.8) + sqlite3 (1.3.8) + sqlite3-ruby (1.3.3) + sqlite3 (>= 1.3.3) + term-ansicolor (1.2.2) + tins (~> 0.8) + terminal-table (1.4.5) + therubyracer (0.12.0) + libv8 (~> 3.16.14.0) + ref + thin (1.6.1) + daemons (>= 1.0.9) + eventmachine (>= 1.0.0) + rack (>= 1.0.0) + thor (0.18.1) + thread (0.1.3) + thread_safe (0.1.3) + atomic + tilt (1.4.1) + tins (0.13.1) + treetop (1.4.15) polyglot polyglot (>= 0.3.1) - tzinfo (0.3.31) + tweetstream (2.6.0) + daemons (~> 1.1) + em-http-request (>= 1.1.1) + em-twitter (~> 0.3) + multi_json (~> 1.3) + twitter (~> 4.8) + twitter (4.8.1) + faraday (~> 0.8, < 0.10) + multi_json (~> 1.0) + simple_oauth (~> 0.2) + tzinfo (0.3.38) + uglifier (2.4.0) + execjs (>= 0.3.0) + json (>= 1.8.0) + vegas (0.1.11) + rack (>= 1.0.0) webrat (0.7.3) nokogiri (>= 1.2.0) rack (>= 1.0) rack-test (>= 0.5.3) + will_paginate (3.0.5) PLATFORMS ruby DEPENDENCIES - annotate + ZenTest + actionpack-xml_parser + acts_as_list + acts_as_tree + annotate (~> 2.6.1) authlogic autotest - jquery-rails (= 2.0.1) + autotest-rails + capistrano (~> 2.15.4) + coffee-rails (~> 4.0) + daemons + dalli + database_cleaner (~> 1.2.0) + dynamic_form + exception_notification + factory_girl_rails + faker + geokit + gravatarify + i18n-tasks (~> 0.2.10) + jquery-rails (= 3.0.4) + json_spec + kgio mysql2 - rails (= 3.2.1) - rspec (>= 2.0.0.beta.20) - rspec-rails (>= 2.0.0.beta.20) + nested_form + newrelic_rpm + nokogiri + quiet_assets + rack-utf8_sanitizer + rails (= 4.0.2) + rails_autolink + redis + resque-scheduler (= 2.3.1) + resque-timeout + rspec-rails (~> 2.14.1) + sass-rails (~> 4.0) + simplificator-rwebthumb! + spork + sqlite3-ruby (= 1.3.3) + therubyracer + thin + tweetstream + twitter_oauth! + uglifier webrat + will_paginate (~> 3.0.pre2) diff --git a/README.textile b/README.textile index a8b2b42..638c1cb 100644 --- a/README.textile +++ b/README.textile @@ -24,7 +24,7 @@ h3. Run The Application 1. Start the server: rails server -Your application will now be running at http://localhost:3000/ +Your application will now be running at http://localhost:3000/ h2. Changing Application Text @@ -36,14 +36,9 @@ h2. (Optional) Memcached Support and Rate Limiting Please see our "official memcached fork":https://github.com/llawlor/thingspeak -h2. (Optional) HTTP GET Support - -By default the application will accept channel updates via GET or POST. To only allow POSTs, change the value of GET_SUPPORT found in config/initializers/constants.rb - h2. (Optional) Email Setup Set your domain, user_name, and password in config/environment.rb -Also set your password reset link in app/controllers/mailer.controller.rb line 14 (and uncomment the line) h1. Installation on clean install of Ubuntu 10.10 and 11.10 @@ -57,8 +52,8 @@ Start Terminal bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer ) echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile - -source ~/.bash_profile + +source .bash_profile sudo aptitude install mysql-server libmysqlclient-dev libmysql-ruby Note: Enter and confirm a new MySQL password @@ -83,3 +78,4 @@ Start Terminal rake db:schema:load rails server + diff --git a/app/assets/images/GitHub_ThingSpeak_API.jpg b/app/assets/images/GitHub_ThingSpeak_API.jpg new file mode 100644 index 0000000..5d77b0a Binary files /dev/null and b/app/assets/images/GitHub_ThingSpeak_API.jpg differ diff --git a/app/assets/images/eye.png b/app/assets/images/eye.png new file mode 100644 index 0000000..209f8c2 Binary files /dev/null and b/app/assets/images/eye.png differ diff --git a/app/assets/images/flag_gray.gif b/app/assets/images/flag_gray.gif new file mode 100644 index 0000000..b0a565a Binary files /dev/null and b/app/assets/images/flag_gray.gif differ diff --git a/app/assets/images/flag_red.gif b/app/assets/images/flag_red.gif new file mode 100644 index 0000000..1c4d62d Binary files /dev/null and b/app/assets/images/flag_red.gif differ diff --git a/app/assets/images/front.png b/app/assets/images/front.png new file mode 100644 index 0000000..265e75c Binary files /dev/null and b/app/assets/images/front.png differ diff --git a/app/assets/images/icon_location_24.png b/app/assets/images/icon_location_24.png new file mode 100644 index 0000000..e4df926 Binary files /dev/null and b/app/assets/images/icon_location_24.png differ diff --git a/app/assets/images/icon_rss.gif b/app/assets/images/icon_rss.gif new file mode 100644 index 0000000..316f769 Binary files /dev/null and b/app/assets/images/icon_rss.gif differ diff --git a/app/assets/images/icons/InfoBox.png b/app/assets/images/icons/InfoBox.png new file mode 100755 index 0000000..dd413d9 Binary files /dev/null and b/app/assets/images/icons/InfoBox.png differ diff --git a/app/assets/images/icons/Locked.png b/app/assets/images/icons/Locked.png new file mode 100644 index 0000000..6f285c7 Binary files /dev/null and b/app/assets/images/icons/Locked.png differ diff --git a/app/assets/images/icons/Public_32.png b/app/assets/images/icons/Public_32.png new file mode 100644 index 0000000..4db4fee Binary files /dev/null and b/app/assets/images/icons/Public_32.png differ diff --git a/app/assets/images/icons/Unlocked.png b/app/assets/images/icons/Unlocked.png new file mode 100644 index 0000000..8b5b5e0 Binary files /dev/null and b/app/assets/images/icons/Unlocked.png differ diff --git a/app/assets/images/icons/delete.png b/app/assets/images/icons/delete.png new file mode 100755 index 0000000..08f2493 Binary files /dev/null and b/app/assets/images/icons/delete.png differ diff --git a/app/assets/images/my_house_status_update.png b/app/assets/images/my_house_status_update.png new file mode 100644 index 0000000..4cb4421 Binary files /dev/null and b/app/assets/images/my_house_status_update.png differ diff --git a/app/assets/images/rails.png b/app/assets/images/rails.png new file mode 100644 index 0000000..d5edc04 Binary files /dev/null and b/app/assets/images/rails.png differ diff --git a/app/assets/images/shading.png b/app/assets/images/shading.png new file mode 100644 index 0000000..b0aaeca Binary files /dev/null and b/app/assets/images/shading.png differ diff --git a/app/assets/images/social_sensor_network_logo.png b/app/assets/images/social_sensor_network_logo.png new file mode 100644 index 0000000..690b8a4 Binary files /dev/null and b/app/assets/images/social_sensor_network_logo.png differ diff --git a/app/assets/images/social_sensor_network_main.png b/app/assets/images/social_sensor_network_main.png new file mode 100644 index 0000000..a7a4562 Binary files /dev/null and b/app/assets/images/social_sensor_network_main.png differ diff --git a/app/assets/images/thingspeak_logo.png b/app/assets/images/thingspeak_logo.png new file mode 100644 index 0000000..5f4fa2e Binary files /dev/null and b/app/assets/images/thingspeak_logo.png differ diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 13d9269..0e73893 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -1,9 +1,21 @@ -// This is a manifest file that'll be compiled into including all the files listed below. -// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically -// be included in the compiled file accessible from http://example.com/assets/application.js -// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -// the compiled file. -// -//= require jquery +// Place your application-specific JavaScript functions and classes here +// This file is automatically included by javascript_include_tag :defaults + //= require jquery_ujs -//= require_tree . \ No newline at end of file +//= require ./jquery.cookie.js +//= require ./highcharts.js +//= require ./exporting.js +//= require ./updateChart.js +//= require ./timeago.min.js +//= require ./jquery.shorten.min.js +//= require ./nested_form.js +//= require ./noapi.js +//= require ./rest.js +//= require ./tabby.js +//= require ./validate.min.js +//= require ./channels.js +//= require ./sidebar.js +//= require ./prettify.js +//= require ./docs.js +//= require ./custom.js + diff --git a/app/assets/javascripts/channels.js b/app/assets/javascripts/channels.js new file mode 100644 index 0000000..f083b59 --- /dev/null +++ b/app/assets/javascripts/channels.js @@ -0,0 +1,21 @@ +$(function () { + $("[id^=showsite]").each ( + function() { + var element = this; + $(element).shorten( + { + width:235, + tooltip:true, + tail: '...' + + }); + }); + $("div.progressbar").each ( + function () { + var element = this; + $(element).progressbar( + { + value: parseInt($(element).attr("rel")) + }); + }); +}); \ No newline at end of file diff --git a/app/assets/javascripts/custom.js b/app/assets/javascripts/custom.js new file mode 100644 index 0000000..98b7d2b --- /dev/null +++ b/app/assets/javascripts/custom.js @@ -0,0 +1,11 @@ +// when the document is ready +$(document).ready(function() { + + // show form to add a talkback command + $('#talkback_command_add').click(function() { + $(this).hide(); + $('#talkback_command_add_form').removeClass('hide'); + }); + +}); + diff --git a/app/assets/javascripts/docs.js b/app/assets/javascripts/docs.js new file mode 100644 index 0000000..e93d402 --- /dev/null +++ b/app/assets/javascripts/docs.js @@ -0,0 +1,23 @@ +$(document).ready(function() { + + // when a response is clicked + $('.response').click(function() { + // get the response type + var response_type = $(this).data('response_type'); + + // remove active responses + $('.response').removeClass('active'); + + // add active response + $('.response-' + response_type).addClass('active'); + + // hide other formats + $('.format').hide(); + + // show this format + $('.format-' + response_type).show(); + + }); + +}); + diff --git a/app/assets/javascripts/exporting.js b/app/assets/javascripts/exporting.js new file mode 100644 index 0000000..792c127 --- /dev/null +++ b/app/assets/javascripts/exporting.js @@ -0,0 +1,21 @@ +/* + Highcharts JS v2.1.4 (2011-03-02) + Exporting module + + (c) 2010 Torstein H?nsi + + License: www.highcharts.com/license +*/ +(function(){var k=Highcharts,y=k.Chart,C=k.addEvent,r=k.createElement,z=k.discardElement,u=k.css,w=k.merge,s=k.each,p=k.extend,D=Math.max,q=document,E=window,A="ontouchstart"in q.documentElement,B=k.setOptions({lang:{downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",exportButtonTitle:"Export to raster or vector image",printButtonTitle:"Print the chart"}});B.navigation={menuStyle:{border:"1px solid #A0A0A0", +background:"#FFFFFF"},menuItemStyle:{padding:"0 5px",background:"none",color:"#303030",fontSize:A?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{align:"right",backgroundColor:{linearGradient:[0,0,0,20],stops:[[0.4,"#F7F7F7"],[0.6,"#E3E3E3"]]},borderColor:"#B0B0B0",borderRadius:3,borderWidth:1,height:20,hoverBorderColor:"#909090",hoverSymbolFill:"#81A7CF",hoverSymbolStroke:"#4572A5",symbolFill:"#E0E0E0",symbolStroke:"#A0A0A0",symbolX:11.5,symbolY:10.5,verticalAlign:"top", +width:24,y:10}};B.exporting={type:"image/png",url:"http://export.highcharts.com/",width:800,buttons:{exportButton:{symbol:"exportIcon",x:-10,symbolFill:"#A8BF77",hoverSymbolFill:"#768F3E",_titleKey:"exportButtonTitle",menuItems:[{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}, +printButton:{symbol:"printIcon",x:-36,symbolFill:"#B5C9DF",hoverSymbolFill:"#779ABF",_titleKey:"printButtonTitle",onclick:function(){this.print()}}}};p(y.prototype,{getSVG:function(b){var c=this,a,f,d,i,e,h,j=w(c.options,b);if(!q.createElementNS)q.createElementNS=function(l,g){var n=q.createElement(g);n.getBBox=function(){return c.renderer.Element.prototype.getBBox.apply({element:n})};return n};a=r("div",null,{position:"absolute",top:"-9999em",width:c.chartWidth+"px",height:c.chartHeight+"px"},q.body); +p(j.chart,{renderTo:a,forExport:true});j.exporting.enabled=false;j.chart.plotBackgroundImage=null;j.series=[];s(c.series,function(l){d=l.options;d.animation=false;d.showCheckbox=false;if(d&&d.marker&&/^url\(/.test(d.marker.symbol))d.marker.symbol="circle";d.data=[];s(l.data,function(g){i=g.config;e={x:g.x,y:g.y,name:g.name};typeof i=="object"&&g.config&&i.constructor!=Array&&p(e,i);d.data.push(e);(h=g.config&&g.config.marker)&&/^url\(/.test(h.symbol)&&delete h.symbol});j.series.push(d)});b=new Highcharts.Chart(j); +f=b.container.innerHTML;j=null;b.destroy();z(a);f=f.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/isTracker="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(l){return l.toLowerCase()});f=f.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g, +"'");if(f.match(/ xmlns="/g).length==2)f=f.replace(/xmlns="[^"]+"/,"");return f},exportChart:function(b,c){var a,f=this.getSVG(c);b=w(this.options.exporting,b);a=r("form",{method:"post",action:b.url},{display:"none"},q.body);s(["filename","type","width","svg"],function(d){r("input",{type:"hidden",name:d,value:{filename:b.filename||"chart",type:b.type,width:b.width,svg:f}[d]},null,a)});a.submit();z(a)},print:function(){var b=this,c=b.container,a=[],f=c.parentNode,d=q.body,i=d.childNodes;if(!b.isPrinting){b.isPrinting= +true;s(i,function(e,h){if(e.nodeType==1){a[h]=e.style.display;e.style.display="none"}});d.appendChild(c);E.print();setTimeout(function(){f.appendChild(c);s(i,function(e,h){if(e.nodeType==1)e.style.display=a[h]});b.isPrinting=false},1E3)}},contextMenu:function(b,c,a,f,d,i){var e=this,h=e.options.navigation,j=h.menuItemStyle,l=e.chartWidth,g=e.chartHeight,n="cache-"+b,m=e[n],o=D(d,i),t,x;if(!m){e[n]=m=r("div",{className:"highcharts-"+b},{position:"absolute",zIndex:1E3,padding:o+"px"},e.container);t= +r("div",null,p({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},h.menuStyle),m);x=function(){u(m,{display:"none"})};C(m,"mouseleave",x);s(c,function(v){if(v)r("div",{onmouseover:function(){u(this,h.menuItemHoverStyle)},onmouseout:function(){u(this,j)},innerHTML:v.text||k.getOptions().lang[v.textKey]},p({cursor:"pointer"},j),t)[A?"ontouchstart":"onclick"]=function(){x();v.onclick.apply(e,arguments)}});e.exportMenuWidth=m.offsetWidth;e.exportMenuHeight= +m.offsetHeight}b={display:"block"};if(a+e.exportMenuWidth>l)b.right=l-a-d-o+"px";else b.left=a-o+"px";if(f+i+e.exportMenuHeight>g)b.bottom=g-f-o+"px";else b.top=f+i-o+"px";u(m,b)},addButton:function(b){function c(){g.attr(o);l.attr(m)}var a=this,f=a.renderer,d=w(a.options.navigation.buttonOptions,b),i=d.onclick,e=d.menuItems,h=d.width,j=d.height,l,g,n;b=d.borderWidth;var m={stroke:d.borderColor},o={stroke:d.symbolStroke,fill:d.symbolFill};if(d.enabled!==false){l=f.rect(0,0,h,j,d.borderRadius,b).align(d, +true).attr(p({fill:d.backgroundColor,"stroke-width":b,zIndex:19},m)).add();n=f.rect(0,0,h,j,0).align(d).attr({fill:"rgba(255, 255, 255, 0.001)",title:k.getOptions().lang[d._titleKey],zIndex:21}).css({cursor:"pointer"}).on("mouseover",function(){g.attr({stroke:d.hoverSymbolStroke,fill:d.hoverSymbolFill});l.attr({stroke:d.hoverBorderColor})}).on("mouseout",c).on("click",c).add();if(e)i=function(){c();var t=n.getBBox();a.contextMenu("export-menu",e,t.x,t.y,h,j)};n.on("click",function(){i.apply(a,arguments)}); +g=f.symbol(d.symbol,d.symbolX,d.symbolY,(d.symbolSize||12)/2).align(d,true).attr(p(o,{"stroke-width":d.symbolStrokeWidth||1,zIndex:20})).add()}}});k.Renderer.prototype.symbols.exportIcon=function(b,c,a){return["M",b-a,c+a,"L",b+a,c+a,b+a,c+a*0.5,b-a,c+a*0.5,"Z","M",b,c+a*0.5,"L",b-a*0.5,c-a/3,b-a/6,c-a/3,b-a/6,c-a,b+a/6,c-a,b+a/6,c-a/3,b+a*0.5,c-a/3,"Z"]};k.Renderer.prototype.symbols.printIcon=function(b,c,a){return["M",b-a,c+a*0.5,"L",b+a,c+a*0.5,b+a,c-a/3,b-a,c-a/3,"Z","M",b-a*0.5,c-a/3,"L",b-a* +0.5,c-a,b+a*0.5,c-a,b+a*0.5,c-a/3,"Z","M",b-a*0.5,c+a*0.5,"L",b-a*0.75,c+a,b+a*0.75,c+a,b+a*0.5,c+a*0.5,"Z"]};y.prototype.callbacks.push(function(b){var c,a=b.options.exporting,f=a.buttons;if(a.enabled!==false)for(c in f)b.addButton(f[c])})})(); diff --git a/app/assets/javascripts/highcharts.js b/app/assets/javascripts/highcharts.js new file mode 100644 index 0000000..12d7080 --- /dev/null +++ b/app/assets/javascripts/highcharts.js @@ -0,0 +1,295 @@ +/* + Highcharts JS v3.0.8 (2014-01-09) + + (c) 2009-2014 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(){function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function x(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+M(a-c).toFixed(f).slice(2):"")}function Fa(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Ua(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this, +a)}}function Ga(a,b){for(var c="{",d=!1,e,f,g,h,i,j=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h-1?h.thousandsSep:"")):e=$a(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function lb(a){return P.pow(10,N(P.log(a)/P.LN10))}function mb(a,b,c,d){var e,c=o(c, +1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allowDecimals===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;dc&&(c= +a[b]);return c}function Na(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Oa(a){ab||(ab=T(Ha));a&&ab.appendChild(a);ab.innerHTML=""}function la(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw c;else C.console&&console.log(c)}function ha(a){return parseFloat(a.toPrecision(14))}function Pa(a,b){pa=o(a,b.animation)}function Bb(){var a=G.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set";Qa=(a&&G.global.timezoneOffset||0)*6E4;bb=a? +Date.UTC:function(a,b,c,g,h,i){return(new Date(a,b,o(c,1),o(g,0),o(h,0),o(i,0))).getTime()};ob=b+"Minutes";pb=b+"Hours";qb=b+"Day";Va=b+"Date";cb=b+"Month";db=b+"FullYear";Cb=c+"Minutes";Db=c+"Hours";rb=c+"Date";Eb=c+"Month";Fb=c+"FullYear"}function qa(){}function Ra(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function ra(){this.init.apply(this,arguments)}function Gb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d; +this.total=null;this.points={};this.stack=e;this.percent=f==="percent";this.alignOptions={align:b.align||(g?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(g?"middle":c?"bottom":"top"),y:o(b.y,g?4:c?14:-6),x:o(b.x,g?c?-6:6:0)};this.textAlign=b.textAlign||(g?c?"right":"left":"center")}function sb(){this.init.apply(this,arguments)}function eb(){this.init.apply(this,arguments)}var u,v=document,C=window,P=Math,w=P.round,N=P.floor,Ia=P.ceil,t=P.max,I=P.min,M=P.abs,U=P.cos,$=P.sin,Ba=P.PI,Ca= +Ba*2/360,sa=navigator.userAgent,Hb=C.opera,za=/msie/i.test(sa)&&!Hb,fb=v.documentMode===8,gb=/AppleWebKit/.test(sa),Wa=/Firefox/.test(sa),Ib=/(Mobile|Android|Windows Phone)/.test(sa),Da="http://www.w3.org/2000/svg",V=!!v.createElementNS&&!!v.createElementNS(Da,"svg").createSVGRect,Nb=Wa&&parseInt(sa.split("Firefox/")[1],10)<4,ba=!V&&!za&&!!v.createElement("canvas").getContext,Xa,hb=v.documentElement.ontouchstart!==u,Jb={},tb=0,ab,G,$a,pa,ub,E,ma=function(){},Ja=[],Ha="div",Q="none",Ob=/^[0-9]+$/, +Kb="rgba(192,192,192,"+(V?1.0E-4:0.002)+")",Lb="stroke-width",bb,Qa,ob,pb,qb,Va,cb,db,Cb,Db,rb,Eb,Fb,L={};C.Highcharts=C.Highcharts?la(16,!0):{};$a=function(a,b,c){if(!s(b)||isNaN(b))return"Invalid date";var a=o(a,"%Y-%m-%d %H:%M:%S"),d=new Date(b-Qa),e,f=d[pb](),g=d[qb](),h=d[Va](),i=d[cb](),j=d[db](),k=G.lang,l=k.weekdays,d=r({a:l[g].substr(0,3),A:l[g],d:Fa(h),e:h,b:k.shortMonths[i],B:k.months[i],m:Fa(i+1),y:j.toString().substr(2,2),Y:j,H:Fa(f),I:Fa(f%12||12),l:f%12||12,M:Fa(d[ob]()),p:f<12?"AM": +"PM",P:f<12?"am":"pm",S:Fa(d.getSeconds()),L:Fa(w(b%1E3),3)},Highcharts.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a};Ab.prototype={wrapColor:function(a){if(this.color>=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};E=function(){for(var a=0,b=arguments,c=b.length,d={};a-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length{point.key}
',pointFormat:'{series.name}: {point.y}
',shadow:!0,snap:Ib?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"ThingSpeak.com",href:"https://thingspeak.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#D62020",fontSize:"9px"}}};var Y=G.plotOptions,W=Y.line;Bb(); +var Sb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,Tb=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,Ub=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,ua=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Sa(a.stops,function(a){return ua(a[1])}):(c=Sb.exec(a))?b=[z(c[1]),z(c[2]),z(c[3]),parseFloat(c[4],10)]:(c=Tb.exec(a))?b=[z(c[1],16),z(c[2],16),z(c[3],16),1]:(c=Ub.exec(a))&&(b=[z(c[1]),z(c[2]),z(c[3]),1])})(a);return{get:function(c){var f; +d?(f=x(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)n(d,function(b){b.brighten(a)});else if(xa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=z(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};qa.prototype={init:function(a,b){this.element=b==="span"?T(b):v.createElementNS(Da, +b);this.renderer=a;this.attrSetters={}},opacity:1,animate:function(a,b,c){b=o(b,pa,!0);Ya(this);if(b){b=x(b);if(c)b.complete=c;jb(this,a,b)}else this.attr(a),c&&c()},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName.toLowerCase(),i=this.renderer,j,k=this.attrSetters,l=this.shadows,m,p,q=this;da(a)&&s(b)&&(c=a,a={},a[c]=b);if(da(a))c=a,h==="circle"?c={x:"cx",y:"cy"}[c]||c:c==="strokeWidth"&&(c="stroke-width"),q=y(g,c)||this[c]||0,c!=="d"&&c!=="visibility"&&c!=="fill"&&(q=parseFloat(q));else{for(c in a)if(j= +!1,d=a[c],e=k[c]&&k[c].call(this,d,c),e!==!1){e!==u&&(d=e);if(c==="d")d&&d.join&&(d=d.join(" ")),/(NaN| {2}|^$)/.test(d)&&(d="M 0 0");else if(c==="x"&&h==="text")for(e=0;e1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted= +!0;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(this.x||0)+" "+(this.y||0)+")");(s(c)||s(d))&&a.push("scale("+o(c,1)+" "+o(d,1)+")");a.length&&y(this.element,"transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a); +return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=a,this.alignByTranslate=b,!c||da(c))this.alignTo=d=c||"renderer",fa(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=o(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=w(f);if(e==="bottom"||e==="middle")g+=(c.height- +(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=w(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(){var a=this.bBox,b=this.renderer,c,d,e=this.rotation;c=this.element;var f=this.styles,g=e*Ca;d=this.textStr;var h;if(d===""||Ob.test(d))h=d.length+"|"+f.fontSize+"|"+f.fontFamily,a=b.cache[h];if(!a){if(c.namespaceURI===Da||b.forExport){try{a=c.getBBox?r({},c.getBBox()):{width:c.offsetWidth,height:c.offsetHeight}}catch(i){}if(!a|| +a.width<0)a={width:0,height:0}}else a=this.htmlGetBBox();if(b.isSVG){c=a.width;d=a.height;if(za&&f&&f.fontSize==="11px"&&d.toPrecision(3)==="22.7")a.height=d=14;if(e)a.width=M(d*$(g))+M(c*U(g)),a.height=M(d*U(g))+M(c*$(g))}this.bBox=a;h&&(b.cache[h]=a)}return a},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.hide()}})},add:function(a){var b= +this.renderer,c=a||b,d=c.element||b.box,e=d.childNodes,f=this.element,g=y(f,"zIndex"),h;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);if(g)c.handleZ=!0,g=z(g);if(c.handleZ)for(c=0;cg||!s(g)&&s(b))){d.insertBefore(f,a);h=!0;break}h||d.appendChild(f);this.added=!0;A(this,"add");return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element|| +{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Ya(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f/g,'').replace(/<(i|em)>/g,'').replace(//g,"").split(//g),f=b.childNodes, +g=/style="([^"]+)"/,h=/href="(http[^"]+)"/,i=y(b,"x"),j=a.styles,k=a.textWidth,l=j&&j.lineHeight,m=f.length;m--;)b.removeChild(f[m]);k&&!a.added&&this.box.appendChild(b);e[e.length-1]===""&&e.pop();n(e,function(e,f){var m,o=0,e=e.replace(//g,"|||");m=e.split("|||");n(m,function(e){if(e!==""||m.length===1){var p={},n=v.createElementNS(Da,"tspan"),s;g.test(e)&&(s=e.match(g)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),y(n,"style",s));h.test(e)&&!d&&(y(n,"onclick", +'location.href="'+e.match(h)[1]+'"'),D(n,{cursor:"pointer"}));e=(e.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");if(e!==" "&&(n.appendChild(v.createTextNode(e)),o?p.dx=0:p.x=i,y(n,p),!o&&f&&(!V&&d&&D(n,{display:"block"}),y(n,"dy",l||c.fontMetrics(/px$/.test(n.style.fontSize)?n.style.fontSize:j.fontSize).h,gb&&n.offsetHeight)),b.appendChild(n),o++,k))for(var e=e.replace(/([^\^])-/g,"$1- ").split(" "),p=e.length>1&&j.whiteSpace!=="nowrap",t,w,u=a._clipHeight,r=[],B=z(l|| +16),x=1;p&&(e.length||r.length);)delete a.bBox,t=a.getBBox(),w=t.width,!V&&c.forExport&&(w=c.measureSpanWidth(n.firstChild.data,a.styles)),t=w>k,!t||e.length===1?(e=r,r=[],e.length&&(x++,u&&x*B>u?(e=["..."],a.attr("title",a.textStr)):(n=v.createElementNS(Da,"tspan"),y(n,{dy:B,x:i}),s&&y(n,"style",s),b.appendChild(n),w>k&&(k=w)))):(n.removeChild(n.firstChild),r.unshift(e.pop())),e.length&&n.appendChild(v.createTextNode(e.join(" ").replace(/- /g,"-")))}})})},button:function(a,b,c,d,e,f,g,h,i){var j= +this.label(a,b,c,i,null,null,null,null,"button"),k=0,l,m,p,q,n,o,a={x1:0,y1:0,x2:0,y2:1},e=x({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);p=e.style;delete e.style;f=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);q=f.style;delete f.style;g=x(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);n=g.style;delete g.style;h=x(e,{style:{color:"#CCC"}},h);o=h.style; +delete h.style;F(j.element,za?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(q)});F(j.element,za?"mouseout":"mouseleave",function(){k!==3&&(l=[e,f,g][k],m=[p,q,n][k],j.attr(l).css(m))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(n):a===3&&j.attr(h).css(o):j.attr(e).css(p)};return j.on("click",function(){k!==3&&d.call(j)}).attr(e).css(r({cursor:"default"},p))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=w(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=w(a[2])+b%2/2);return a},path:function(a){var b= +{fill:Q};La(a)?b.d=a:S(a)&&r(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=S(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(S(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){e=S(a)?a.r:e;e=this.createElement("rect").attr({rx:e,ry:e,fill:Q});return e.attr(S(a)?a:e.crisp(f,a,b,t(c,0),t(d,0)))},setSize:function(a, +b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[o(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return s(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:Q};arguments.length>1&&r(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href", +a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(w(b),w(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),r(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&r(g,f);else if(i.test(a))k=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(w((d-b[0])/2),w((e-b[1])/2)))},j=a.match(i)[1],a=Jb[j],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),T("img",{onload:function(){k(g,Jb[j]=[this.width,this.height])},src:j})); +return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001, +d=e.innerR,h=e.open,i=U(f),j=$(f),k=U(g),g=$(g),e=e.end-fl&&/[ \-]/.test(b.textContent||b.innerText))D(b,{width:l+"px",display:"block",whiteSpace:"normal"}),i=l;this.getSpanCorrection(i,k,h,j,g)}D(b,{left:e+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(gb)k=b.offsetHeight;this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,c){var d= +{},e=za?"-ms-transform":gb?"-webkit-transform":Wa?"MozTransform":Hb?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)";d[e+(Wa?"Origin":"-origin")]=b*100+"% "+c+"px";D(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});r(va.prototype,{html:function(a,b,c){var d=G.chart.style,e=this.createElement("span"),f=e.attrSetters,g=e.element,h=e.renderer;f.text=function(a){a!==g.innerHTML&&delete this.bBox;g.innerHTML=a;return!1};f.x=f.y=f.align=f.rotation=function(a,b){b=== +"align"&&(b="textAlign");e[b]=a;e.htmlUpdateTransform();return!1};e.attr({text:a,x:w(b),y:w(c)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:d.fontFamily,fontSize:d.fontSize});e.css=e.htmlCss;if(h.isSVG)e.add=function(a){var b,c=h.box.parentNode,d=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)d.push(a),a=a.parentGroup;n(d.reverse(),function(a){var d;b=a.div=a.div||T(Ha,{className:y(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c); +d=b.style;r(a.attrSetters,{translateX:function(a){d.left=a+"px"},translateY:function(a){d.top=a+"px"},visibility:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(g);e.added=!0;e.alignOnAdd&&e.htmlUpdateTransform();return e};return e}});var R;if(!V&&!ba){Highcharts.VMLElement=R={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ha;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="', +d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=T(c);this.renderer=a;this.attrSetters={}},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();A(this,"add");return this},updateTransform:qa.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=U(a*Ca),c=$(a*Ca);D(this.element,{filter:a? +["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""):Q})},getSpanCorrection:function(a,b,c,d,e){var f=d?U(d*Ca):1,g=d?$(d*Ca):0,h=o(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!=="left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),D(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length, +c=[];b--;)if(xa(a[b]))c[b]=w(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,k,l=this.shadows,m,p=this.attrSetters,q=this;da(a)&&s(b)&&(c=a,a={},a[c]=b);if(da(a))c=a,q=c==="strokeWidth"||c==="stroke-width"?this.strokeweight:this[c];else for(c in a)if(d= +a[c],m=!1,e=p[c]&&p[c].call(this,d,c),e!==!1&&d!==null){e!==u&&(d=e);if(j&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c))k||(this.symbolAttr(a),k=!0),m=!0;else if(c==="d"){d=d||[];this.d=d.join(" ");f.path=d=this.pathToVML(d);if(l)for(e=l.length;e--;)l[e].path=l[e].cutOff?this.cutOffPath(d,l[e].cutOff):d;m=!0}else if(c==="visibility"){if(l)for(e=l.length;e--;)l[e].style[c]=d;h==="DIV"&&(d=d==="hidden"?"-999em":0,fb||(g[c]=d?"visible":"hidden"),c="top");g[c]=d;m=!0}else if(c==="zIndex")d&& +(g[c]=d),m=!0;else if(ta(c,["x","y","width","height"])!==-1)this[c]=d,c==="x"||c==="y"?c={x:"left",y:"top"}[c]:d=t(0,d),this.updateClipping?(this[c]=d,this.updateClipping()):g[c]=d,m=!0;else if(c==="class"&&h==="DIV")f.className=d;else if(c==="stroke")d=i.color(d,f,c),c="strokecolor";else if(c==="stroke-width"||c==="strokeWidth")f.stroked=d?!0:!1,c="strokeweight",this[c]=d,xa(d)&&(d+="px");else if(c==="dashstyle")(f.getElementsByTagName("stroke")[0]||T(i.prepVML([""]),null,null,f))[c]=d|| +"solid",this.dashstyle=d,m=!0;else if(c==="fill")if(h==="SPAN")g.color=d;else{if(h!=="IMG")f.filled=d!==Q?!0:!1,d=i.color(d,f,c,this),c="fillcolor"}else if(c==="opacity")m=!0;else if(h==="shape"&&c==="rotation")this[c]=f.style[c]=d,f.style.left=-w($(d*Ca)+1)+"px",f.style.top=w(U(d*Ca))+"px";else if(c==="translateX"||c==="translateY"||c==="rotation")this[c]=d,this.updateTransform(),m=!0;m||(fb?f[c]=d:y(f,c,d))}return q},clip:function(a){var b=this,c;a?(c=a.members,fa(c,b),c.push(b),b.destroyClip=function(){fa(c, +b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:fb?"inherit":"rect(auto)"});return b.css(a)},css:qa.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Oa(a)},destroy:function(){this.destroyClip&&this.destroyClip();return qa.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=C.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=z(a[c-2])-10*b;return a.join(" ")}, +shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,p,q;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){p=o(a.width,3);q=(a.opacity||0.15)/p;for(e=1;e<=3;e++){l=p*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=[''];h=T(g.prepVML(j),null,{left:z(i.left)+o(a.offsetX,1),top:z(i.top)+o(a.offsetY,1)});if(c)h.cutOff=l+1;j=[''];T(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this}};R=ga(qa,R);var xb={Element:R,isIE8:sa.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d,e;this.alignedObjects=[];d=this.createElement(Ha);e=d.element;e.style.position="relative";a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.cache={};this.setSize(b,c,!1);if(!v.namespaces.hcv){v.namespaces.add("hcv","urn:schemas-microsoft-com:vml"); +try{v.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){v.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=S(a);return r(e,{members:[],left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b= +a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+w(a?e:d)+"px,"+w(a?f:b)+"px,"+w(a?b:f)+"px,"+w(a?d:e)+"px)"};!a&&fb&&c==="DIV"&&r(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){n(e.members,function(a){a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=Q;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient, +p,q,o,H,t,s="",a=a.stops,w,r=[],u=function(){h=[''];T(e.prepVML(h),null,null,b)};p=a[0];w=a[a.length-1];p[0]>0&&a.unshift([0,p[1]]);w[0]<1&&a.push([1,w[1]]);n(a,function(a,b){g.test(a[1])?(f=ua(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);r.push(a[0]*100+"% "+k);b?(o=l,H=k):(q=l,t=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,p=m.x2||m[2]||0,m=m.y2||m[3]||0,s='angle="'+ +(90-P.atan((m-a)/(p-c))*180/Ba)+'"',u();else{var j=m.r,x=j*2,Z=j*2,y=m.cx,B=m.cy,v=b.radialReference,ja,j=function(){v&&(ja=d.getBBox(),y+=(v[0]-ja.x)/ja.width-0.5,B+=(v[1]-ja.y)/ja.height-0.5,x*=v[2]/ja.width,Z*=v[2]/ja.height);s='src="'+G.global.VMLRadialGradientURL+'" size="'+x+","+Z+'" origin="0.5,0.5" position="'+y+","+B+'" color2="'+t+'" ';u()};d.added?j():F(d,"add",j);j=H}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=ua(a),h=["<",c,' opacity="',f.get("a"),'"/>'],T(this.prepVML(h),null,null, +b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","1&&f.attr({x:b,y:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){var g=this.symbol("rect");g.r= +S(a)?a.r:e;return g.attr(S(a)?a:g.crisp(f,a,b,t(c,0),t(d,0)))},invertChild:function(a,b){var c=b.style;D(a,{flip:"x",left:z(c.width)-1,top:z(c.height)-1,rotation:-90})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=U(f),i=$(f),j=U(g),k=$(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r); +e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){var f=a+c,g=b+d,h;!s(e)||!e.r?f=va.prototype.symbols.square.apply(0,arguments):(h=I(e.r,c,d),f=["M",a+h,b,"L",f-h,b,"wa",f-2*h,b,f,b+2*h,f-h,b,f,b+h,"L",f,g-h,"wa",f-2*h,g-2*h,f,g,f,g-h,f-h,g,"L",a+h,g,"wa",a,g-2*h,a+2*h,g,a+h,g,a,g-h,"L",a,b+h,"wa",a,b,a+2*h,b+2*h,a,b+h,a+h,b,"x","e"]);return f}}};Highcharts.VMLRenderer=R=function(){this.init.apply(this,arguments)};R.prototype=x(va.prototype, +xb);Xa=R}va.prototype.measureSpanWidth=function(a,b){var c=v.createElement("span"),d;d=v.createTextNode(a);c.appendChild(d);D(c,b);this.box.appendChild(c);d=c.offsetWidth;Oa(c);return d};var Mb;if(ba)Highcharts.CanVGRenderer=R=function(){Da="http://www.w3.org/1999/xhtml"},R.prototype.symbols={},Mb=function(){function a(){var a=b.length,d;for(d=0;dq[p]?q[p]=g+j:o||(c=!1);if(o)B=(d=d.ticks[i[a+(e?1:-1)]])&&d.label.xy&&d.label.xy.x+d.getLabelSides()[e?0:1],i=B,e&&!h||f&&h?g+ki&&(c=!1)):g+j>m&&(g= +m-j,d&&g+k0&&b.height>0){f=x({align:c&&k&& +"center",x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},f);if(!g)a.label=g=u.text(f.text,0,0,f.useHTML).attr({align:f.textAlign||f.align,rotation:f.rotation,zIndex:w}).css(f.style).add();b=[q[1],q[4],o(q[6],q[1])];q=[q[2],q[5],o(q[7],q[2])];c=Ma(b);k=Ma(q);g.align(f,!1,{x:c,y:k,width:Aa(b)-c,height:Aa(q)-k});g.show()}else g&&g.hide();return a},destroy:function(){fa(this.axis.plotLinesAndBands,this);delete this.axis;Na(this)}};ra.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L", +second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:J,lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e", +fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return Ea(this.total,-1)},style:J.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0, +y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!== +!1;this.categories=d.categories||e==="category";this.names=[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=s(d.linkedTo);this.tickmarkOffset=this.categories&&d.tickmarkPlacement==="between"?0.5:0;this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stackExtremes={};this.min= +this.max=null;this.crosshair=o(d.crosshair,ka(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;ta(this,a.axes)===-1&&(a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&&c&&this.reversed===u)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)F(this,f,d[f]);if(this.isLog)this.val2lin=ya,this.lin2val=ea},setOptions:function(a){this.options=x(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions, +this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],x(G[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d=this.dateTimeLabelFormat,e=G.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ga(h,this);else if(c)g=b;else if(d)g=$a(d,b);else if(f&&a>=1E3)for(;f--&&g===u;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=Ea(b/c,-1)+e[f]);g===u&&(g=b>=1E4?Ea(b,0):Ea(b,-1,u,"")); +return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=null;a.stackExtremes={};a.buildStacks();n(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d;d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=I(o(a.dataMin,d[0]),Ma(d)),a.dataMax=t(o(a.dataMax,d[0]),Aa(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(s(c)&&s(e))a.dataMin=I(o(a.dataMin,c),c),a.dataMax= +t(o(a.dataMax,e),e);if(s(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMaxg+this.width)m=!0}else if(a=g,c=l-this.right,ih+this.height)m=!0;return m&&!d?null:f.renderer.crispLine(["M",a,i,"L",c,j],b||1)},getLinearTickPositions:function(a,b,c){for(var d,b=ha(N(b/a)*a),c=ha(Ia(c/a)*a),e=[];b<=c;){e.push(b);b=ha(b+a);if(b===d)break;d=b}return e},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e;if(this.isLog){e=b.length;for(a=1;a=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===u&&!this.isLog)s(a.min)||s(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length- +1;g>0;g--)if(h=i[g]-i[g-1],f===u||hb&&(g=0);c=t(c,g);e=t(e,da(i)?0:g/2);f=t(f,i==="on"?0:g);!a.noSharedTooltip&&s(m)&&(d=s(d)?I(d,m):m)}),g=this.ordinalSlope&&d?this.ordinalSlope/d:1,this.minPointOffset=e*=g,this.pointRangePadding=f*=g,this.pointRange=I(c,b),this.closestPointRange=d;if(a)this.oldTransA=i;this.translationSlope=this.transA=i=this.len/(b+f||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=i*e},setTickPositions:function(a){var b= +this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=b.options.tickPositioner,j=d.maxPadding,k=d.minPadding,l=d.tickInterval,m=d.minTickInterval,p=d.tickPixelInterval,q,na=b.categories;h?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=o(c.min,c.dataMin),b.max=o(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&la(11,1)):(b.min=o(b.userMin,d.min,b.dataMin),b.max=o(b.userMax,d.max,b.dataMax));if(e)!a&&I(b.min,o(b.dataMin,b.min))<=0&&la(10, +1),b.min=ha(ya(b.min)),b.max=ha(ya(b.max));if(b.range&&s(b.max))b.userMin=b.min=t(b.min,b.max-b.range),b.userMax=b.max,b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!na&&!b.usePercentage&&!h&&s(b.min)&&s(b.max)&&(c=b.max-b.min)){if(!s(d.min)&&!s(b.userMin)&&k&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*k;if(!s(d.max)&&!s(b.userMax)&&j&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*j}b.min===b.max||b.min===void 0||b.max===void 0?b.tickInterval=1:h&&!l&&p===b.linkedParent.options.tickPixelInterval? +b.tickInterval=b.linkedParent.tickInterval:(b.tickInterval=o(l,na?1:(b.max-b.min)*p/t(b.len,p)),!s(l)&&b.lent(2*b.len,200)&&la(19,!0),a=f?b.getTimeTicks(b.normalizeTimeTickInterval(b.tickInterval,d.units),b.min,b.max,d.startOfWeek,b.ordinalPositions,b.closestPointRange, +!0):e?b.getLogTickPositions(b.tickInterval,b.min,b.max):b.getLinearTickPositions(b.tickInterval,b.min,b.max),q&&a.splice(1,a.length-2),b.tickPositions=a;if(!h)e=a[0],f=a[a.length-1],h=b.minPointOffset||0,d.startOnTick?b.min=e:b.min-h>e&&a.shift(),d.endOnTick?b.max=f:b.max+h(b[d]||0)&&this.options.alignTicks!==!1)b[d]=c.length;a.maxTicks=b},adjustTickAmount:function(){var a=this._maxTicksKey,b=this.tickPositions,c=this.chart.maxTicks;if(c&&c[a]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1&&this.min!==u){var d=this.tickAmount,e=b.length;this.tickAmount=a=c[a];if(e=this.dataMax&&(b=u));this.displayBtn=a!==u||b!==u;this.setExtremes(a,b,!1,u,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=b.offsetRight||0,e=this.horiz,f,g;this.left=g=o(b.left,a.plotLeft+c);this.top=f=o(b.top,a.plotTop);this.width=c=o(b.width,a.plotWidth-c+d);this.height=b=o(b.height,a.plotHeight);this.bottom=a.chartHeight-b-f;this.right=a.chartWidth-c-g;this.len=t(e?c:b,0);this.pos=e?g:f},getExtremes:function(){var a= +this.isLog;return{min:a?ha(ea(this.min)):this.min,max:a?ha(ea(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?ea(this.min):this.min,b=b?ea(this.max):this.max;c>a||a===null?a=c:b15&&a<165?"right":a>195&&a<345?"left":"center"},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options, +e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k=0,l,m=0,p=d.title,q=d.labels,na=0,H=b.axisOffset,w=b.clipOffset,r=[-1,1,1,-1][h],v,x=1,y=o(q.maxStaggerLines,5),z,Z,K,B;a.hasData=j=a.hasVisibleSeries||s(a.min)&&s(a.max)&&!!e;a.showAxis=b=j||o(d.showEmpty,!0);a.staggerLines=a.horiz&&q.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:q.zIndex|| +7}).add();if(j||a.isLinked){a.labelAlign=o(q.align||a.autoLabelAlign(q.rotation));n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ra(a,b)});if(a.horiz&&!a.staggerLines&&y&&!q.rotation){for(v=a.reversed?[].concat(e).reverse():e;x1)a.staggerLines=x}n(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)na= +t(f[b].getLabelSize(),na)});if(a.staggerLines)na*=a.staggerLines,a.labelOffset=na}else for(v in f)f[v].destroy(),delete f[v];if(p&&p.text&&p.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(p.text,0,0,p.useHTML).attr({zIndex:7,rotation:p.rotation||0,align:p.textAlign||{low:"left",middle:"center",high:"right"}[p.align]}).css(p.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(b)k=a.axisTitle.getBBox()[g?"height":"width"],m=o(p.margin,g?5:10),l=p.offset;a.axisTitle[b?"show":"hide"]()}a.offset=r*o(d.offset, +H[h]);a.axisTitleMargin=o(l,na+m+(h!==2&&na&&r*d.labels[g?"y":"x"]));H[h]=t(H[h],a.axisTitleMargin+k+r*a.offset);w[i]=t(w[i],N(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left, +c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=z(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,b=a.horiz,c=a.reversed,d=a.chart,e=d.renderer,f=a.options,g=a.isLog,h=a.isLinked,i=a.tickPositions,j,k=a.axisTitle,l=a.stacks,m=a.ticks,p=a.minorTicks, +q=a.alternateBands,o=f.stackLabels,H=f.alternateGridColor,t=a.tickmarkOffset,w=f.lineWidth,r=d.hasRendered&&s(a.oldMin)&&!isNaN(a.oldMin),v=a.hasData,x=a.showAxis,y,z=a.justifyLabels=!a.staggerLines&&b&&f.labels.overflow==="justify",K;a.labelEdge.length=0;n([m,p,q],function(a){for(var b in a)a[b].isActive=!1});if(v||h)if(a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){p[b]||(p[b]=new Ra(a,b,"minor"));r&&p[b].isNew&&p[b].render(null,!0);p[b].render(null,!1,1)}),i.length&& +(j=i.slice(),(b&&c||!b&&!c)&&j.reverse(),z&&(j=j.slice(1).concat([j[0]])),n(j,function(b,c){z&&(c=c===j.length-1?0:c+1);if(!h||b>=a.min&&b<=a.max)m[b]||(m[b]=new Ra(a,b)),r&&m[b].isNew&&m[b].render(c,!0,0.1),m[b].render(c,!1,1)}),t&&a.min===0&&(m[-1]||(m[-1]=new Ra(a,-1,null,!0)),m[-1].render(-1))),H&&n(i,function(b,c){if(c%2===0&&b=0.5)a=w(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=N(b),h,i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];fb&&(!d||k<=c)&&g.push(k),k>c&&(l=!0),k=j}else if(b=ea(b),c=ea(c),a=e[d?"minorTickInterval":"tickInterval"],a=o(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)|| +1)),a=mb(a,null,lb(a)),g=Sa(this.getLinearTickPositions(a,b,c),ya),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};ra.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=G.global.useUTC,h,i=new Date(b-Qa),j=a.unitRange,k=a.count;if(s(b)){j>=E.second&&(i.setMilliseconds(0),i.setSeconds(j>=E.minute?0:k*N(i.getSeconds()/k)));if(j>=E.minute)i[Cb](j>=E.hour?0:k*N(i[ob]()/k));if(j>=E.hour)i[Db](j>=E.day?0:k*N(i[pb]()/k));if(j>=E.day)i[rb](j>=E.month?1:k*N(i[Va]()/k));j>=E.month&& +(i[Eb](j>=E.year?0:k*N(i[cb]()/k)),h=i[db]());j>=E.year&&(h-=h%k,i[Fb](h));if(j===E.week)i[rb](i[Va]()-i[qb]()+o(d,1));b=1;Qa&&(i=new Date(i.getTime()+Qa));h=i[db]();for(var d=i.getTime(),l=i[cb](),m=i[Va](),p=g?Qa:(864E5+i.getTimezoneOffset()*6E4)%864E5;d1||M(b-f.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(){var a=this,b;clearTimeout(this.hideTimer);if(!this.isHidden)b=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){a.label.fadeOut();a.isHidden=!0},o(this.options.hideDelay,500)),b&&n(b,function(a){a.setState()}),this.chart.hoverPoints=null},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted, +f=d.plotTop,g=0,h=0,i,a=ka(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===u&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){i=a.series.yAxis;g+=a.plotX;h+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&i?i.top-f:0)}),g/=a.length,h/=a.length,c=[e?d.plotWidth-h:g,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-g:h]);return Sa(c,w)},getPosition:function(a,b,c){var d=this.chart,e=d.plotLeft,f=d.plotTop,g=d.plotWidth,h=d.plotHeight,i=o(this.options.distance, +12),j=c.plotX,c=c.plotY,d=j+e+(d.inverted?i:-a-i),k=c-b+f+15,l;d<7&&(d=e+t(j,0)+i);d+a>e+g&&(d-=d+a-(e+g),k=c-b+f-i,l=!0);k=k&&c<=k+b&&(k=c+f+i));k+b>f+h&&(k=t(f,f+h-b-i));return{x:d,y:k}},defaultFormatter:function(a){var b=this.points||ka(this),c=b[0].series,d;d=[c.tooltipHeaderFormatter(b[0])];n(b,function(a){c=a.series;d.push(c.tooltipFormatter&&c.tooltipFormatter(a)||a.point.tooltipFormatter(c.tooltipOptions.pointFormat))});d.push(a.options.footerFormat||"");return d.join("")}, +refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=this.shared;clearTimeout(this.hideTimer);this.followPointer=ka(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];l&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h,function(a){a.setState()}),n(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j,a=a[0]):h=a.getLabelConfig(); +i=i.call(h,this);h=a.series;i===!1?this.hide():(this.isHidden&&(Ya(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g}),this.isHidden=!1);A(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(w(c.x),w(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)}}; +var Za=Highcharts.Pointer=function(a,b){this.init(a,b)};Za.prototype={init:function(a,b){var c=b.chart,d=c.events,e=ba?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(b.tooltip.enabled)a.tooltip=new sb(a,b.tooltip);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||C.event;if(!a.target)a.target=a.srcElement; +a=Rb(a);d=a.touches?a.touches.item(0):a;if(!b)this.chartPosition=b=Qb(this.chart.container);d.pageX===u?(c=t(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return r(a,{chartX:w(c),chartY:w(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},getIndex:function(a){var b=this.chart;return b.inverted?b.plotHeight+b.plotTop-a.chartY:a.chartX-b.plotLeft}, +runPointActions:function(a){var b=this,c=b.chart,d=c.series,e=c.tooltip,f,g,h=c.hoverPoint,i=c.hoverSeries,j,k,l=c.chartWidth,m=b.getIndex(a);if(e&&b.options.tooltip.shared&&(!i||!i.noSharedTooltip)){g=[];j=d.length;for(k=0;kl&&g.splice(j,1);if(g.length&&g[0].clientX!==b.hoverX)e.refresh(g, +a),b.hoverX=g[0].clientX}if(i&&i.tracker){if((f=i.tooltipPoints[m])&&f!==h)f.onMouseOver(a)}else e&&e.followPointer&&!e.isHidden&&(d=e.getAnchor([{}],a),e.updatePosition({plotX:d[0],plotY:d[1]}));if(e&&!b._onDocumentMouseMove)b._onDocumentMouseMove=function(a){b.onDocumentMouseMove(a)},F(v,"mousemove",b._onDocumentMouseMove);n(c.axes,function(b){b.drawCrosshair(a,o(h,f))})},reset:function(a){var b=this.chart,c=b.hoverSeries,d=b.hoverPoint,e=b.tooltip,f=e&&e.shared?b.hoverPoints:d;(a=a&&e&&f)&&ka(f)[0].plotX=== +u&&(a=!1);if(a)e.refresh(f),d&&d.setState(d.state,!0);else{if(d)d.onMouseOut();if(c)c.onMouseOut();e&&e.hide();if(this._onDocumentMouseMove)X(v,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null;n(b.axes,function(a){a.hideCrosshair()});this.hoverX=null}},scaleGroups:function(a,b){var c=this.chart,d;n(c.series,function(e){d=a||e.getPlotBox();e.xAxis&&e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&& +e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},pinchTranslate:function(a,b,c,d,e,f,g,h){a&&this.pinchTranslateDirection(!0,c,d,e,f,g,h);b&&this.pinchTranslateDirection(!1,c,d,e,f,g,h)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x":"y",k=a?"X":"Y",l="chart"+k,m=a?"width":"height",p=i["plot"+(a?"Left":"Top")],q,o,n=h||1,t=i.inverted,w=i.bounds[a?"h":"v"],r=b.length===1,s=b[0][l],u=c[0][l],v=!r&&b[1][l],x=!r&&c[1][l],y,c=function(){!r&&M(s-v)>20&&(n=h||M(u-x)/ +M(s-v));o=(p-u)/n+s;q=i["plot"+(a?"Width":"Height")]/n};c();b=o;bw.max&&(b=w.max-q,y=!0);y?(u-=0.8*(u-g[j][0]),r||(x-=0.8*(x-g[j][1])),c()):g[j]=[u,x];t||(f[j]=o-p,f[m]=q);f=t?1/n:n;e[m]=q;e[j]=b;d[t?a?"scaleY":"scaleX":"scale"+k]=n;d["translate"+k]=f*p+(u-f*s)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=c.tooltip&&c.tooltip.options.followTouchMove,f=a.touches,g=f.length,h=b.lastValidTouch,i=b.zoomHor||b.pinchHor,j=b.zoomVert||b.pinchVert,k=i||j,l=b.selectionMarker, +m={},p=g===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||c.runChartClick),q={};(k||e)&&!p&&a.preventDefault();Sa(f,function(a){return b.normalize(a)});if(a.type==="touchstart")n(f,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),h.x=[d[0].chartX,d[1]&&d[1].chartX],h.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(a.dataMin),f=a.toPixels(a.dataMax),g=I(e,f),e=t(e,f);b.min=I(a.pos,g-d); +b.max=t(a.pos+a.len,e+d)}});else if(d.length){if(!l)b.selectionMarker=l=r({destroy:ma},c.plotBox);b.pinchTranslate(i,j,d,f,m,l,q,h);b.hasPinched=k;b.scaleGroups(m,q);!k&&e&&g===1&&this.runPointActions(b.normalize(a))}},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop, +j=b.plotWidth,k=b.plotHeight,l,m=this.mouseDownX,p=this.mouseDownY;dh+j&&(d=h+j);ei+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(p-e,2));if(this.hasDragged>10){l=b.isInsidePlot(m-h,p-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:M(d),x:(d> +0?0:d)+m}));this.selectionMarker&&g&&(d=e-p,this.selectionMarker.attr({height:M(d),y:(d>0?0:d)+p}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this.chart,c=this.hasPinched;if(this.selectionMarker){var d={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},e=this.selectionMarker,f=e.x,g=e.y,h;if(this.hasDragged||c)n(b.axes,function(a){if(a.zoomEnabled){var b=a.horiz,c=a.toValue(b?f:g),b=a.toValue(b?f+e.width:g+e.height);!isNaN(c)&&!isNaN(b)&&(d[a.coll].push({axis:a, +min:I(c,b),max:t(c,b)}),h=!0)}}),h&&A(b,"selection",d,function(a){b.zoom(r(a,c?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();c&&this.scaleGroups()}if(b)D(b.container,{cursor:b._cursor}),b.cancelClick=this.hasDragged>10,b.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){this.drop(a)},onDocumentMouseMove:function(a){var b= +this.chart,c=this.chartPosition,d=b.hoverSeries,a=this.normalize(a,c);c&&d&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart,a=this.normalize(a);b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)}, +inClass:function(a,b){for(var c;a;){if(c=y(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries,a=a.relatedTarget||a.toElement,c=a.point&&a.point.series;if(b&&!b.options.stickyTracking&&!this.inClass(a,"highcharts-tooltip")&&c!==b)b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,f=b.inverted,g,h,i,a=this.normalize(a);a.cancelBubble= +!0;if(!b.cancelClick)c&&this.inClass(a.target,"highcharts-tracker")?(g=this.chartPosition,h=c.plotX,i=c.plotY,r(c,{pageX:g.left+d+(f?b.plotWidth-i:h),pageY:g.top+e+(f?b.plotHeight-h:i)}),A(c.series,"click",r(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(r(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&A(b,"click",a))},onContainerTouchStart:function(a){var b=this.chart;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)?(this.runPointActions(a), +this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===1||a.touches.length===2)&&this.pinch(a)},onDocumentTouchEnd:function(a){this.drop(a)},setDOMEvents:function(){var a=this,b=a.chart.container,c;this._events=c=[[b,"onmousedown","onContainerMouseDown"],[b,"onmousemove","onContainerMouseMove"],[b,"onclick","onContainerClick"],[b,"mouseleave","onContainerMouseLeave"],[v,"mouseup","onDocumentMouseUp"]];hb&&c.push([b,"ontouchstart","onContainerTouchStart"], +[b,"ontouchmove","onContainerTouchMove"],[v,"touchend","onDocumentTouchEnd"]);n(c,function(b){a["_"+b[2]]=function(c){a[b[2]](c)};b[1].indexOf("on")===0?b[0][b[1]]=a["_"+b[2]]:F(b[0],b[1],a["_"+b[2]])})},destroy:function(){var a=this;n(a._events,function(b){b[1].indexOf("on")===0?b[0][b[1]]=null:X(b[0],b[1],a["_"+b[2]])});delete a._events;clearInterval(a.tooltipTimeout)}};J=Highcharts.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(c){var d= +c.target,e;if(b.hoverSeries!==a)a.onMouseOver();for(;d&&!e;)e=d.point,d=d.parentNode;if(e!==u&&e!==b.hoverPoint)e.onMouseOver(c)};n(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)n(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),hb))a[b].on("touchstart",f)}),a._hasTracking=!0},drawTrackerGraph:function(){var a=this,b=a.options, +c=b.trackByArea,d=[].concat(c?a.areaPath:a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,j=a.tracker,k=b.cursor,l=k&&{cursor:k},k=a.singlePoints,m,p=function(){if(f.hoverSeries!==a)a.onMouseOver()};if(e&&!c)for(m=e+1;m--;)d[m]==="M"&&d.splice(m+1,0,d[m+1]-i,d[m+2],"L"),(m&&d[m]==="M"||m===e)&&d.splice(m,0,"L",d[m-2]+i,d[m-1]);for(m=0;mc-6&&g(p||c.chartWidth-2*k-r))b.itemX=r,b.itemY+=n+b.lastLineHeight+q,b.lastLineHeight=0;b.maxItemWidth=t(b.maxItemWidth,e);b.lastItemY=n+b.itemY+q;b.lastLineHeight=t(g,b.lastLineHeight); +a._legendItemPos=[b.itemX,b.itemY];f?b.itemX+=e:(b.itemY+=n+g+q,b.lastLineHeight=g);b.offsetWidth=p||t((f?b.itemX-r-l:e)+k,b.offsetWidth)},getAllItems:function(){var a=[];n(this.chart.series,function(b){var c=b.options;if(o(c.showInLegend,!s(c.linkedTo)?u:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY= +a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=a.getAllItems();nb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;n(e,function(b){a.renderItem(b)});g=j.width||a.offsetWidth;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h); +if(l||m){g+=k;h+=k;if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp(null,null,null,g,h)),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,"stroke-width":l||0,fill:m||Q}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)});f&&d.align(r({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options, +f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,j=e.navigation,k=o(j.animation,!0),l=j.arrowSize||12,m=this.nav,p=this.pages,q,t=this.allItems;e.layout==="horizontal"&&(f/=2);g&&(f=I(f,g));p.length=0;if(a>f&&!e.useHTML){this.clipHeight=h=f-20-this.titleHeight-this.padding;this.currentPage=o(this.currentPage,1);this.fullHeight=a;n(t,function(a,b){var c=a._legendItemPos[1],d=w(a.legendItem.bBox.height),e=p.length;if(!e||c-p[e-1]>h)p.push(q||c); +b===t.length-1&&c+d-p[e-1]>h&&p.push(c);c!==q&&(q=c)});if(!i)i=b.clipRect=d.clipRect(0,this.padding,9999,0),b.contentGroup.clip(i);i.attr({height:h});if(!m)this.nav=m=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,l,l).on("click",function(){b.scroll(-1,k)}).add(m),this.pager=d.text("",15,10).css(j.style).add(m),this.down=d.symbol("triangle-down",0,0,l,l).on("click",function(){b.scroll(1,k)}).add(m);b.scroll(0);a=f}else if(m)i.attr({height:c.chartHeight}),m.hide(),this.scrollGroup.attr({translateY:1}), +this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,h=g.activeColor,g=g.inactiveColor,i=this.pager,j=this.padding;e>d&&(e=d);if(e>0)b!==u&&Pa(b,this.chart),this.nav.attr({translateX:j,translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default":"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e=== +d?"default":"pointer"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};R=Highcharts.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||12;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-5-c/2,a.symbolWidth,c,o(a.options.symbolRadius,2)).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d;d=a.symbolWidth;var e=this.chart.renderer,f=this.legendGroup,a=a.baseline- +w(e.fontMetrics(a.options.itemStyle.fontSize).b*0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled)b=c.radius,this.legendSymbol=d=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b).add(f),d.isMarker=!0}};/Trident\/7\.0/.test(sa)&&Ua(zb.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};c.chart.renderer.forExport?d():setTimeout(d)});eb.prototype={init:function(a, +b){var c,d=a.series;a.series=null;c=x(G,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=Ja.length;Ja.push(f);d.reflow!==!1&&F(f,"load",function(){f.initReflow()});if(e)for(g in e)F(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=ba?!1:o(d.animation, +!0);f.pointCount=0;f.counters=new Ab;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=L[a.type||b.type||b.defaultSeriesType])||la(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&n(this.axes,function(a){a.adjustTickAmount()});this.maxTicks=null},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend, +f=this.isDirtyLegend,g,h,i=this.isDirtyBox,j=c.length,k=j,l=this.renderer,m=l.isHidden(),p=[];Pa(a,this);m&&this.cloneRenderTo();for(this.layOutTitles();k--;)if(a=c[k],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(k=j;k--;)if(a=c[k],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType==="point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()}); +this.adjustTickAmounts();this.getMargins();n(b,function(a){a.isDirty&&(i=!0)});n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,p.push(function(){A(a,"afterSetExtremes",r(a.eventArgs,a.getExtremes()));delete a.eventArgs});(i||g)&&a.redraw()})}i&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset&&d.reset(!0);l.draw();A(this,"redraw");m&&this.cloneRenderTo(!0);n(p,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series, +d,e;for(d=0;dI(k.dataMin,k.min)&&i=18&&a<=25&&(a=15);c&&(c.css({width:(d.width||f)+"px"}).align(r({y:a+e.margin},d),!1,"spacingBox"),!d.floating&& +!d.verticalAlign&&(a=Ia(a+c.getBBox().height)));this.titleOffset=a},getChartSize:function(){var a=this.options.chart,b=this.renderToClone||this.renderTo;this.containerWidth=ib(b,"width");this.containerHeight=ib(b,"height");this.chartWidth=t(0,a.width||this.containerWidth||600);this.chartHeight=t(0,o(a.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Oa(b),delete this.renderToClone):(c&& +c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),D(b,{position:"absolute",top:"-9999px",display:"block"}),v.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+tb++;if(da(a))this.renderTo=a=v.getElementById(a);a||la(13,!0);c=z(y(a,"data-highcharts-chart"));!isNaN(c)&&Ja[c]&&Ja[c].destroy();y(a,"data-highcharts-chart",this.index);a.innerHTML="";a.offsetWidth|| +this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;this.container=a=T(Ha,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},r({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=b.forExport?new va(a,c,d,!0):new Xa(a,c,d);ba&&this.renderer.create(this,a,c,d)},getMargins:function(){var a= +this.spacing,b,c=this.legend,d=this.margin,e=this.options.legend,f=o(e.margin,10),g=e.x,h=e.y,i=e.align,j=e.verticalAlign,k=this.titleOffset;this.resetMargins();b=this.axisOffset;if(k&&!s(d[0]))this.plotTop=t(this.plotTop,k+this.options.title.margin+a[0]);if(c.display&&!e.floating)if(i==="right"){if(!s(d[1]))this.marginRight=t(this.marginRight,c.legendWidth-g+f+a[1])}else if(i==="left"){if(!s(d[3]))this.plotLeft=t(this.plotLeft,c.legendWidth+g+f+a[3])}else if(j==="top"){if(!s(d[0]))this.plotTop=t(this.plotTop, +c.legendHeight+h+f+a[0])}else if(j==="bottom"&&!s(d[2]))this.marginBottom=t(this.marginBottom,c.legendHeight-h+f+a[2]);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&n(this.axes,function(a){a.getOffset()});s(d[3])||(this.plotLeft+=b[3]);s(d[0])||(this.plotTop+=b[0]);s(d[2])||(this.marginBottom+=b[2]);s(d[1])||(this.marginRight+=b[1]);this.setChartSize()},reflow:function(a){var b=this,c=b.options.chart, +d=b.renderTo,e=c.width||ib(d,"width"),f=c.height||ib(d,"height"),c=a?a.target:C,d=function(){if(b.container)b.setSize(e,f,!1),b.hasUserSize=null};if(!b.hasUserSize&&e&&f&&(c===C||c===v)){if(e!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),a?b.reflowTimeout=setTimeout(d,100):d();b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};F(C,"resize",b);F(a,"destroy",function(){X(C,"resize",b)})},setSize:function(a,b,c){var d=this,e, +f,g;d.isResizing+=1;g=function(){d&&A(d,"endResize",null,function(){d.isResizing-=1})};Pa(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(s(a))d.chartWidth=e=t(0,w(a)),d.hasUserSize=!!e;if(s(b))d.chartHeight=f=t(0,w(b));(pa?jb:D)(d.container,{width:e+"px",height:f+"px"},pa);d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.getMargins();d.redraw(c); +d.oldChartHeight=null;A(d,"resize");pa===!1?g():setTimeout(g,pa&&pa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=w(this.plotLeft);this.plotTop=j=w(this.plotTop);this.plotWidth=k=t(0,w(d-i-this.marginRight));this.plotHeight=l=t(0,w(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox= +c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*N(this.plotBorderWidth/2);b=Ia(t(d,h[3])/2);c=Ia(t(d,h[0])/2);this.clipBox={x:b,y:c,width:N(this.plotSizeX-t(d,h[1])/2-b),height:N(this.plotSizeY-t(d,h[2])/2-c)};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this.spacing,b=this.margin;this.plotTop=o(b[0],a[0]);this.marginRight=o(b[1],a[1]);this.marginBottom=o(b[2],a[2]);this.plotLeft= +o(b[3],a[3]);this.axisOffset=[0,0,0,0];this.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,p,q=this.plotLeft,o=this.plotTop,n=this.plotWidth,t=this.plotHeight,s=this.plotBox,r=this.clipRect,w=this.clipBox;p=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp(null, +null,null,c-p,d-p));else{e={fill:j||Q};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(p/2,p/2,c-p,d-p,a.borderRadius,i).attr(e).add().shadow(a.shadow)}if(k)f?f.animate(s):this.plotBackground=b.rect(q,o,n,t,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(s):this.plotBGImage=b.image(l,q,o,n,t).add();r?r.animate({width:w.width,height:w.height}):this.clipRect=b.clipRect(w);if(m)g?g.animate(g.crisp(null,q,o,n,t)):this.plotBorder=b.rect(q,o,n,t,0,-m).attr({stroke:a.plotBorderColor, +"stroke-width":m,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=L[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=L[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(da(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b), +b.linkedParent=d})},render:function(){var a=this,b=a.axes,c=a.renderer,d=a.options,e=d.labels,f=d.credits,g;a.setTitle();a.legend=new zb(a,d.legend);a.getStacks();n(b,function(a){a.setScale()});a.getMargins();a.maxTicks=null;n(b,function(a){a.setTickPositions(!0);a.setMaxTicks()});a.adjustTickAmounts();a.getMargins();a.drawChartBox();a.hasCartesianSeries&&n(b,function(a){a.render()});if(!a.seriesGroup)a.seriesGroup=c.g("series-group").attr({zIndex:3}).add();n(a.series,function(a){a.translate();a.setTooltipPoints(); +a.render()});e.items&&n(e.items,function(b){var d=r(e.style,b.style),f=z(d.left)+a.plotLeft,g=z(d.top)+a.plotTop+12;delete d.left;delete d.top;c.text(b.html,f,g).attr({zIndex:2}).css(d).add()});if(f.enabled&&!a.credits)g=f.href,a.credits=c.text(f.text,0,0).on("click",function(){if(g)location.href=g}).attr({align:f.position.align,zIndex:8}).css(f.style).add().align(f.position);a.hasRendered=!0},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;A(a,"destroy");Ja[a.index]= +u;a.renderTo.removeAttribute("data-highcharts-chart");X(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",X(d),f&&Oa(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!V&&C==C.top&&v.readyState!== +"complete"||ba&&!C.canvg?(ba?Mb.push(function(){a.firstRender()},a.options.global.canvasToolsURL):v.attachEvent("onreadystatechange",function(){v.detachEvent("onreadystatechange",a.firstRender);v.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender())a.getContainer(),A(a,"init"),a.resetMargins(),a.setChartSize(),a.propFromSeries(),a.getAxes(),n(b.series||[],function(b){a.initSeries(b)}),a.linkSeries(),A(a,"beforeRender"), +a.pointer=new Za(a,b),a.render(),a.renderer.draw(),c&&c.apply(a,[a]),n(a.callbacks,function(b){b.apply(a,[a])}),a.cloneRenderTo(!0),A(a,"load")},splashArray:function(a,b){var c=b[a],c=S(c)?c:[c,c,c,c];return[o(b[a+"Top"],c[0]),o(b[a+"Right"],c[1]),o(b[a+"Bottom"],c[2]),o(b[a+"Left"],c[3])]}};eb.prototype.callbacks=[];var xb=Highcharts.CenteredSeriesMixin={getCenter:function(){var a=this.options,b=this.chart,c=2*(a.slicedOffset||0),d,e=b.plotWidth-2*c,f=b.plotHeight-2*c,b=a.center,a=[o(b[0],"50%"), +o(b[1],"50%"),a.size||"100%",a.innerSize||0],g=I(e,f),h;return Sa(a,function(a,b){h=/%$/.test(a);d=b<2||b===2&&h;return(h?[e,f,g,g][b]*z(a)/100:a)+(d?c:0)})}},Ka=function(){};Ka.prototype={init:function(a,b,c){this.series=a;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series, +d=c.pointValKey,a=Ka.prototype.optionsToObject.call(this,a);r(this,a);this.options=this.options?r(this.options,a):a;if(d)this.y=this[d];if(this.x===u&&c)this.x=b===u?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b[d[0]]=a;else if(La(a)){if(a.length>e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];f++}for(;ga+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments= +b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=x(e,c.series,a);this.tooltipOptions=x(G.tooltip,G.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;return c},getColor:function(){var a=this.options,b=this.userOptions,c=this.chart.options.colors,d=this.chart.counters,e;e=a.color||Y[this.type].color;if(!e&&!a.colorByPoint)s(b._colorIndex)? +a=b._colorIndex:(b._colorIndex=d.color,a=d.color++),e=c[a];this.color=e;d.wrapColor(c.length)},getSymbol:function(){var a=this.userOptions,b=this.options.marker,c=this.chart,d=c.options.symbols,c=c.counters;this.symbol=b.symbol;if(!this.symbol)s(a._symbolIndex)?a=a._symbolIndex:(a._symbolIndex=c.symbol,a=c.symbol++),this.symbol=d[a];if(/^url/.test(this.symbol))b.radius=0;c.wrapSymbol(d.length)},drawLegendSymbol:R.drawLineMarker,setData:function(a,b){var c=this,d=c.points,e=c.options,f=c.chart,g=null, +h=c.xAxis,i=h&&!!h.categories,j;c.xIncrement=null;c.pointRange=i?1:e.pointRange;c.colorCounter=0;var a=a||[],k=a.length;j=e.turboThreshold;var l=this.xData,m=this.yData,p=c.pointArrayMap,p=p&&p.length;n(this.parallelArrays,function(a){c[a+"Data"].length=0});if(j&&k>j){for(j=0;g===null&&jj||this.forceCrop))if(a=h.min,h=h.max,b[d-1]h)b=[],c=[];else if(b[0]h)e=this.cropData(this.xData,this.yData,a,h),b=e.xData,c=e.yData,e=e.start,f=!0;for(h=b.length-1;h>=0;h--)d=b[h]-b[h-1],d>0&&(g===u||d=c){f=t(0,i-h);break}for(;id){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m0),j=this.getExtremesFromAll||this.cropped||(c[l+1]||j)>=g&&(c[l-1]||j)<=h,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]=k;this.dataMin=o(void 0,Ma(e));this.dataMax=o(void 0,Aa(e))},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i=== +"between"||xa(i),k=a.threshold,a=0;a=f.min&&c<=f.max){h=b[i+1];c=d===u?0:d+1;for(d=b[i+1]?I(t(0,N((e.clientX+(h?h.wrappedClientX||h.clientX:g))/2)),g):g;c>=0&&c<=d;)j[c++]=e}this.tooltipPoints=j}},tooltipHeaderFormatter:function(a){var b=this.tooltipOptions,c=b.dateTimeLabelFormats,d=b.xDateFormat||c.year,e=this.xAxis,f=e&&e.options.type==="datetime",b=b.headerFormat,e=e&&e.closestPointRange,g;if(f&&!d)if(e)for(g in E){if(E[g]>=e){d=c[g]; +break}}else d=c.day;f&&d&&xa(a.key)&&(b=b.replace("{point.key}","{point.key:"+d+"}"));return Ga(b,{point:a,series:this})},onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&A(this,"mouseOver");this.setState("hover");a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;if(d)d.onMouseOut();this&&a.events.mouseOut&&A(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&& +c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this,c=b.chart,d=c.renderer,e;e=b.options.animation;var f=c.clipBox,g=c.inverted,h;if(e&&!S(e))e=Y[b.type].animation;h="_sharedClip"+e.duration+e.easing;if(a)a=c[h],e=c[h+"m"],a||(c[h]=a=d.clipRect(r(f,{width:0})),c[h+"m"]=e=d.clipRect(-99,g?-c.plotLeft:-c.plotTop,99,g?c.chartWidth:c.chartHeight)),b.group.clip(a),b.markerGroup.clip(e),b.sharedClipKey=h;else{if(a=c[h])a.animate({width:c.plotSizeX},e),c[h+"m"].animate({width:c.plotSizeX+ +99},e);b.animate=null;b.animationTimeout=setTimeout(function(){b.afterAnimate()},e.duration)}},afterAnimate:function(){var a=this.chart,b=this.sharedClipKey,c=this.group;c&&this.options.clip!==!1&&(c.clip(a.clipRect),this.markerGroup.clip());setTimeout(function(){b&&a[b]&&(a[b]=a[b].destroy(),a[b+"m"]=a[b+"m"].destroy())},100)},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m=this.pointAttr[""],p,q=this.markerGroup;if(l.enabled||this._hasPointMarkers)for(f= +b.length;f--;)if(g=b[f],d=N(g.plotX),e=g.plotY,k=g.graphic,i=g.marker||{},a=l.enabled&&i.enabled===u||i.enabled,p=c.isInsidePlot(w(d),e,c.inverted),a&&e!==u&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""]||m,h=a.r,i=o(i.symbol,this.symbol),j=i.indexOf("url")===0,k)k.attr({visibility:p?V?"inherit":"visible":"hidden"}).animate(r({x:d-h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(p&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h).attr(a).add(q)}else if(k)g.graphic= +k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=o(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=Y[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color;f={stroke:g,fill:g};var h=a.points||[],i,j=[],k,l=a.pointAttrToOptions;i=b.turboThreshold;var m=b.negativeColor,p=c.lineColor,q;b.marker?(e.radius=e.radius||c.radius+2,e.lineWidth=e.lineWidth||c.lineWidth+1):e.color=e.color|| +ua(e.color||g).brighten(e.brightness).get();j[""]=a.convertAttribs(c,f);n(["hover","select"],function(b){j[b]=a.convertAttribs(d[b],j[""])});a.pointAttr=j;g=h.length;if(!i||g1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color]],d=b.lineWidth,e=b.dashStyle,f=b.linecap!=="square",g=this.getGraphPath(),h=b.negativeColor; +h&&c.push(["graphNeg",h]);n(c,function(c,h){var k=c[0],l=a[k];if(l)Ya(l),l.animate({d:g});else if(d&&g.length)l={stroke:c[1],"stroke-width":d,zIndex:1},e?l.dashstyle=e:f&&(l["stroke-linecap"]=l["stroke-linejoin"]="round"),a[k]=a.chart.renderer.path(g).attr(l).add(a.group).shadow(!h&&b.shadow)})},clipNeg:function(){var a=this.options,b=this.chart,c=b.renderer,d=a.negativeColor||a.negativeFillColor,e,f=this.graph,g=this.area,h=this.posClip,i=this.negClip;e=b.chartWidth;var j=b.chartHeight,k=t(e,j), +l=this.yAxis;if(d&&(f||g)){d=w(l.toPixels(a.threshold||0,!0));d<0&&(k-=d);a={x:0,y:0,width:k,height:d};k={x:0,y:d,width:k,height:k};if(b.inverted)a.height=k.y=b.plotWidth-d,c.isVML&&(a={x:b.plotWidth-d-b.plotLeft,y:0,width:e,height:j},k={x:d+b.plotLeft-e,y:0,width:b.plotLeft+d,height:e});l.reversed?(b=k,e=a):(b=a,e=k);h?(h.animate(b),i.animate(e)):(this.posClip=h=c.clipRect(b),this.negClip=i=c.clipRect(e),f&&this.graphNeg&&(f.clip(h),this.graphNeg.clip(i)),g&&(g.clip(h),this.areaNeg.clip(i)))}},invertGroups:function(){function a(){var a= +{width:b.yAxis.len,height:b.xAxis.len};n(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)F(c,"resize",a),F(b,"destroy",function(){X(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis? +this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this.chart,b,c=this.options,d=c.animation&&!!this.animate&&a.renderer.isSVG,e=this.visible?"visible":"hidden",f=c.zIndex,g=this.hasRendered,h=a.seriesGroup;b=this.plotGroup("group","series",e,f,h);this.markerGroup=this.plotGroup("markerGroup","markers",e,f,h);d&&this.animate(!0);this.getAttribs();b.inverted=this.isCartesian?a.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels&&this.drawDataLabels(); +this.visible&&this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();a.inverted&&this.invertGroups();c.clip!==!1&&!this.sharedClipKey&&!g&&b.clip(a.clipRect);d?this.animate():g||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:o(d&&d.left,a.plotLeft),translateY:o(e&&e.top,a.plotTop)})); +this.translate();this.setTooltipPoints(!0);this.render();b&&A(this,"updatedData")},setState:function(a){var b=this.options,c=this.graph,d=this.graphNeg,e=b.states,b=b.lineWidth,a=a||"";if(this.state!==a)this.state=a,e[a]&&e[a].enabled===!1||(a&&(b=e[a].lineWidth||b+1),c&&!c.dashstyle&&(a={"stroke-width":b},c.attr(a),d&&d.attr(a)))},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===u?!h:a)?"show": +"hide";n(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&n(d.series,function(a){if(a.options.stacking&&a.visible)a.isDirty=!0});n(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();A(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===u?!this.selected:a;if(this.checkbox)this.checkbox.checked= +a;A(this,a?"select":"unselect")},drawTracker:J.drawTrackerGraph};r(eb.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=o(b,!0),A(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options;new ra(this,x(a,{index:this[e].length,isX:b}));f[e]=ka(f[e]||{});f[e].push(a);o(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this.options,c=this.loadingDiv,d=b.loading;if(!c)this.loadingDiv= +c=T(Ha,{className:"highcharts-loading"},r(d.style,{zIndex:10,display:Q}),this.container),this.loadingSpan=T("span",null,d.labelStyle,c);this.loadingSpan.innerHTML=a||b.lang.loading;if(!this.loadingShown)D(c,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),jb(c,{opacity:d.style.opacity},{duration:d.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&jb(b,{opacity:0},{duration:a.loading.hideDuration|| +100,complete:function(){D(b,{display:Q})}});this.loadingShown=!1}});r(Ka.prototype,{update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g,h=e.data,i=e.chart,j=e.options,b=o(b,!0);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);if(S(a)){e.getAttribs();if(f)a&&a.marker&&a.marker.symbol?d.graphic=f.destroy():f.attr(d.pointAttr[d.state||""]);if(a&&a.dataLabels&&d.dataLabel)d.dataLabel=d.dataLabel.destroy()}g=ta(d,h);e.updateParallelArrays(d,g);j.data[g]=d.options;e.isDirty=e.isDirtyData= +!0;if(!e.fixedBox&&e.hasCartesianSeries)i.isDirtyBox=!0;j.legendType==="point"&&i.legend.destroyItem(d);b&&i.redraw(c)})},remove:function(a,b){var c=this,d=c.series,e=d.points,f=d.chart,g,h=d.data;Pa(b,f);a=o(a,!0);c.firePointEvent("remove",null,function(){g=ta(c,h);h.length===e.length&&e.splice(g,1);h.splice(g,1);d.options.data.splice(g,1);d.updateParallelArrays(c,"splice",g,1);c.destroy();d.isDirty=!0;d.isDirtyData=!0;a&&f.redraw()})}});r(O.prototype,{addPoint:function(a,b,c,d){var e=this.options, +f=this.data,g=this.graph,h=this.area,i=this.chart,j=this.xAxis&&this.xAxis.names,k=g&&g.shift||0,l=e.data,m,p=this.xData;Pa(d,i);c&&n([g,h,this.graphNeg,this.areaNeg],function(a){if(a)a.shift=k+1});if(h)h.isArea=!0;b=o(b,!0);d={series:this};this.pointClass.prototype.applyOptions.apply(d,[a]);g=d.x;h=p.length;if(this.requireSorting&&gg;)h--;this.updateParallelArrays(d,"splice",h);this.updateParallelArrays(d,h);if(j)j[g]=d.name;l.splice(h,0,a);m&&(this.data.splice(h,0,null), +this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(d,"shift"),l.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},remove:function(a,b){var c=this,d=c.chart,a=o(a,!0);if(!c.isRemoving)c.isRemoving=!0,A(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},update:function(a,b){var c=this.chart,d=this.type,e=L[d].prototype, +f,a=x(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);for(f in e)e.hasOwnProperty(f)&&(this[f]=u);r(this,L[a.type||d].prototype);this.init(c,a);o(b,!0)&&c.redraw(!1)}});r(ra.prototype,{update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=x(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.userMin=this.userMax=u;this.init(c,r(a,{events:u}));c.isDirtyBox=!0;o(b,!0)&&c.redraw()},remove:function(a){var b= +this.chart,c=this.coll;n(this.series,function(a){a.remove(!1)});fa(b.axes,this);fa(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;o(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});var aa=ga(O);L.line=aa;Y.area=x(W,{threshold:0});var Ta=ga(O,{type:"area",getSegments:function(){var a=[],b=[],c=[],d=this.xAxis,e=this.yAxis,f=e.stacks[this.stackKey], +g={},h,i,j=this.points,k=this.options.connectNulls,l,m,p;if(this.options.stacking&&!this.cropped){for(m=0;m=0;d--)g=o(a[d].yBottom,f),da&&i>e?(i=t(a,e),k=2*e-i):ig&&k>e?(k=t(g,e),i=2*e-k):kf?b-f:e-(d.translate(a.y,0,1,0, +1)<=e?f:0)));a.barX=n;a.pointWidth=g;b=M(n)<0.5;s=w(n+s)+j;n=w(n)+j;s-=n;u=M(r)<0.5;c=w(r+c)+k;r=w(r)+k;c-=r;b&&(n+=1,s-=1);u&&(r-=1,c+=1);a.shapeType="rect";a.shapeArgs={x:n,y:r,width:s,height:c}})},getSymbol:ma,drawLegendSymbol:R.drawRectangle,drawGraph:ma,drawPoints:function(){var a=this,b=this.chart,c=a.options,d=b.renderer,e=b.options.animationLimit||250,f;n(a.points,function(g){var h=g.plotY,i=g.graphic;if(h!==u&&!isNaN(h)&&g.y!==null)f=g.shapeArgs,i?(Ya(i),i[b.pointCount{series.name}
',pointFormat:"x: {point.x}
y: {point.y}
",followPointer:!0},stickyTracking:!1});aa=ga(O,{type:"scatter",sorted:!1, +requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],takeOrdinalPosition:!1,drawTracker:J.drawTrackerPoint,drawGraph:function(){this.options.lineWidth&&O.prototype.drawGraph.call(this)},setTooltipPoints:ma});L.scatter=aa;Y.pie=x(W,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1, +shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});W={type:"pie",isCartesian:!1,pointClass:ga(Ka,{init:function(){Ka.prototype.init.apply(this,arguments);var a=this,b;if(a.y<0)a.y=null;r(a,{visible:a.visible!==!1,name:o(a.name,"Slice")});b=function(b){a.slice(b.type==="select")};F(a,"select",b);F(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e;b.visible=b.options.visible=a=a===u?!b.visible:a;c.options.data[ta(b,c.data)]=b.options;e=a?"show":"hide";n(["graphic", +"dataLabel","connector","shadowGroup"],function(a){if(b[a])b[a][e]()});b.legendItem&&d.legend.colorizeItem(b,a);if(!c.isDirty&&c.options.ignoreHiddenPoint)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;Pa(c,d.chart);o(b,!0);this.sliced=this.options.sliced=a=s(a)?a:!this.sliced;d.options.data[ta(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}}),requireSorting:!1,noSharedTooltip:!0, +trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:ma,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b){O.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()}, +generatePoints:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;O.prototype.generatePoints.call(this);c=this.points;d=c.length;for(a=0;a0?e.y/b*100:0,e.total=b},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=Ba/180*(i-90),i=(this.endAngleRad=Ba/180*((c.endAngle||i+360)-90))-j,k=this.points,l=c.dataLabels.distance, +c=c.ignoreHiddenPoint,m,n=k.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=P.asin((b-a[1])/(a[2]/2+l));return a[0]+(c?-1:1)*U(h)*(a[2]/2+l)};for(m=0;m0.75*i&&(h-=2*Ba);o.slicedTranslation={translateX:w(U(h)*d),translateY:w($(h)*d)};f=U(h)*a[2]/2;g=$(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g* +0.7];o.half=h<-Ba/2||h>Ba/2?1:0;o.angle=h;e=I(e,l/2);o.labelPos=[a[0]+f+U(h)*l,a[1]+g+$(h)*l,a[0]+f+U(h)*e,a[1]+g+$(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},setTooltipPoints:ma,drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?h.slicedTranslation: +{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(r(g,c)):h.graphic=d=b.arc(g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible!==void 0&&h.setVisible(h.visible)})},sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawTracker:J.drawTrackerPoint,drawLegendSymbol:R.drawRectangle,getCenter:xb.getCenter,getSymbol:ma};W=ga(O,W);L.pie=W;O.prototype.drawDataLabels= +function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,b=a.points,e,f,g,h;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),h=a.plotGroup("dataLabelsGroup","data-labels",a.visible?"visible":"hidden",d.zIndex||6),f=d,n(b,function(b){var j,k=b.dataLabel,l,m,n=b.connector,q=!0;e=b.options&&b.options.dataLabels;j=o(e&&e.enabled,f.enabled);if(k&&!j)b.dataLabel=k.destroy();else if(j){d=x(f,e);j=d.rotation;l=b.getLabelConfig();g=d.format?Ga(d.format,l):d.formatter.call(l,d); +d.style.color=o(d.color,d.style.color,a.color,"black");if(k)if(s(g))k.attr({text:g}),q=!1;else{if(b.dataLabel=k=k.destroy(),n)b.connector=n.destroy()}else if(s(g)){k={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:j,padding:d.padding,zIndex:1};for(m in k)k[m]===u&&delete k[m];k=b.dataLabel=a.chart.renderer[j?"text":"label"](g,0,-999,null,null,null,d.useHTML).attr(k).css(r(d.style,c&&{cursor:c})).add(h).shadow(d.shadow)}k&&a.alignDataLabel(b,k, +d,null,q)}})};O.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=o(a.plotX,-999),i=o(a.plotY,-999),j=b.getBBox();if(a=this.visible&&(a.series.forceDL||f.isInsidePlot(a.plotX,a.plotY,g)))d=r({x:g?f.plotWidth-i:h,y:w(g?f.plotHeight-h:i),width:0,height:0},d),r(c,{width:j.width,height:j.height}),c.rotation?(g={align:c.align,x:d.x+c.x+d.width/2,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g)):(b.align(c,null,d),g=b.alignAttr,o(c.overflow,"justify")==="justify"?this.justifyDataLabel(b, +c,g,j,d,e):o(c.crop,!0)&&(a=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)));if(!a)b.attr({y:-999}),b.placed=!1};O.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k;j=c.x;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0;j=c.y;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height;if(j>g.plotHeight)i==="top"?b.verticalAlign="bottom":b.y=g.plotHeight- +j,k=!0;if(k)a.placed=!f,a.align(b,null,e)};if(L.pie)L.pie.prototype.drawDataLabels=function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=o(e.connectorPadding,10),g=o(e.connectorWidth,1),h=d.plotWidth,d=d.plotHeight,i,j,k=o(e.softConnector,!0),l=e.distance,m=a.center,p=m[2]/2,q=m[1],s=l>0,r,u,v,x,y=[[],[]],z,A,E,K,B,D=[0,0,0,0],I=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){O.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&a.visible&&y[a.half].push(a)}); +for(K=0;!x&&b[K];)x=b[K]&&b[K].dataLabel&&(b[K].dataLabel.getBBox().height||21),K++;for(K=2;K--;){var b=[],J=[],F=y[K],G=F.length,C;a.sortByAngle(F,K-0.5);if(l>0){for(B=q-p-l;B<=q+p+l;B+=x)b.push(B);u=b.length;if(G>u){c=[].concat(F);c.sort(I);for(B=G;B--;)c[B].rank=B;for(B=G;B--;)F[B].rank>=u&&F.splice(B,1);G=F.length}for(B=0;B0){if(u=J.pop(),C=u.i,A=u.y,c>A&&b[C+1]!==null||ch-f&&(D[1]=t(w(z+u-h+f),D[1])),A-x/2<0?D[0]= +t(w(-A+x/2),D[0]):A+x/2>d&&(D[2]=t(w(A+x/2-d),D[2]))}}if(Aa(D)===0||this.verifyDataLabelOverflow(D))this.placeDataLabels(),s&&g&&n(this.points,function(b){i=b.connector;v=b.labelPos;if((r=b.dataLabel)&&r._pos)E=r._attr.visibility,z=r.connX,A=r.connY,j=k?["M",z+(v[6]==="left"?5:-5),A,"C",z,A,2*v[2]-v[4],2*v[3]-v[5],v[2],v[3],"L",v[4],v[5]]:["M",z+(v[6]==="left"?5:-5),A,"L",v[2],v[3],"L",v[4],v[5]],i?(i.animate({d:j}),i.attr("visibility",E)):b.connector=i=a.chart.renderer.path(j).attr({"stroke-width":g, +stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.group);else if(i)b.connector=i.destroy()})}},L.pie.prototype.placeDataLabels=function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved=!0):a&&a.attr({y:-999})})},L.pie.prototype.alignDataLabel=ma,L.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||80,f;d[0]!==null?e=t(b[2]-t(a[1],a[3]),c):(e=t(b[2]-a[1]-a[3], +c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=t(I(e,b[2]-t(a[0],a[2])),c):(e=t(I(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);eo(this.translatedThreshold,f.plotSizeY),j=o(c.inside,!!this.options.stacking);if(h&&(d=x(h), +g&&(d={x:f.plotWidth-d.y-d.height,y:f.plotHeight-d.x-d.width,width:d.height,height:d.width}),!j))g?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=o(c.align,!g||j?"center":i?"right":"left");c.verticalAlign=o(c.verticalAlign,g||j?"middle":i?"top":"bottom");O.prototype.alignDataLabel.call(this,a,b,c,d,e)};r(Highcharts,{Axis:ra,Chart:eb,Color:ua,Point:Ka,Tick:Ra,Tooltip:sb,Renderer:Xa,Series:O,SVGElement:qa,SVGRenderer:va,arrayMin:Ma,arrayMax:Aa,charts:Ja,dateFormat:$a,format:Ga, +pathAnim:ub,getOptions:function(){return G},hasBidiBug:Nb,isTouchDevice:Ib,numberFormat:Ea,seriesTypes:L,setOptions:function(a){G=x(!0,G,a);Bb();return G},addEvent:F,removeEvent:X,createElement:T,discardElement:Oa,css:D,each:n,extend:r,map:Sa,merge:x,pick:o,splat:ka,extendClass:ga,pInt:z,wrap:Ua,svg:V,canvas:ba,vml:!V&&!ba,product:"Highcharts",version:"3.0.8"})})(); + diff --git a/app/assets/javascripts/jquery.cookie.js b/app/assets/javascripts/jquery.cookie.js new file mode 100644 index 0000000..6d5974a --- /dev/null +++ b/app/assets/javascripts/jquery.cookie.js @@ -0,0 +1,47 @@ +/*! + * jQuery Cookie Plugin + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2011, Klaus Hartl + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://www.opensource.org/licenses/mit-license.php + * http://www.opensource.org/licenses/GPL-2.0 + */ +(function($) { + $.cookie = function(key, value, options) { + + // key and at least value given, set cookie... + if (arguments.length > 1 && (!/Object/.test(Object.prototype.toString.call(value)) || value === null || value === undefined)) { + options = $.extend({}, options); + + if (value === null || value === undefined) { + options.expires = -1; + } + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setDate(t.getDate() + days); + } + + value = String(value); + + return (document.cookie = [ + encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // key and possibly options given, get cookie... + options = value || {}; + var decode = options.raw ? function(s) { return s; } : decodeURIComponent; + + var pairs = document.cookie.split('; '); + for (var i = 0, pair; pair = pairs[i] && pairs[i].split('='); i++) { + if (decode(pair[0]) === key) return decode(pair[1] || ''); // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, thus pair[1] may be undefined + } + return null; + }; +})(jQuery); diff --git a/app/assets/javascripts/jquery.shorten.min.js b/app/assets/javascripts/jquery.shorten.min.js new file mode 100644 index 0000000..c0f3fa7 --- /dev/null +++ b/app/assets/javascripts/jquery.shorten.min.js @@ -0,0 +1,7 @@ +/* + * Shorten, a jQuery plugin to automatically shorten text to fit in a block or a pre-set width and configure how the text ends. + * Copyright (C) 2009-2011 Marc Diethelm + * License: (GPL 3, http://www.gnu.org/licenses/gpl-3.0.txt) see license.txt + */ + +(function(a){function s(g,c){return c.measureText(g).width}function t(g,c){c.text(g);return c.width()}var q=false,o,j,k;a.fn.shorten=function(){var g={},c=arguments,r=c.callee;if(c.length)if(c[0].constructor==Object)g=c[0];else if(c[0]=="options")return a(this).eq(0).data("shorten-options");else g={width:parseInt(c[0]),tail:c[1]};this.css("visibility","hidden");var h=a.extend({},r.defaults,g);return this.each(function(){var e=a(this),d=e.text(),p=d.length,i,f=a("").html(h.tail).text(),l={shortened:false, textOverflow:false};i=e.css("float")!="none"?h.width||e.width():h.width||e.parent().width();if(i<0)return true;e.data("shorten-options",h);this.style.display="inline-block";this.style.whiteSpace="nowrap";if(o){var b=a(this),n=document.createElement("canvas");ctx=n.getContext("2d");b.html(n);ctx.font=b.css("font-style")+" "+b.css("font-variant")+" "+b.css("font-weight")+" "+Math.ceil(parseFloat(b.css("font-size")))+"px "+b.css("font-family");j=ctx;k=s}else{b=a('
'); $td=a("td",b);a(this).html(b);j=$td;k=t}b=k.call(this,d,j);if(b"+h.tail+"
").text();if(n.length==1&&n.charCodeAt(0)==8230){e.text(d);this.style.overflow="hidden";this.style[r._native]="ellipsis";this.style.visibility="visible";l.shortened=true;l.textOverflow="ellipsis";e.data("shorten-info",l);return true}}f=k.call(this,f,j);i-=f;f=i*1.15; if(b-f>0){f=d.substring(0,Math.ceil(p*(f/b)));if(k.call(this,f,j)>i){d=f;p=d.length}}do{p--;d=d.substring(0,p)}while(k.call(this,d,j)>=i);e.html(a.trim(a("").text(d).html())+h.tail);this.style.visibility="visible";l.shortened=true;e.data("shorten-info",l);return true})};var m=document.documentElement.style;if("textOverflow"in m)q="textOverflow";else if("OTextOverflow"in m)q="OTextOverflow";if(typeof Modernizr!="undefined"&&Modernizr.canvastext)o=Modernizr.canvastext;else{m=document.createElement("canvas"); o=!!(m.getContext&&m.getContext("2d")&&typeof m.getContext("2d").fillText==="function")}a.fn.shorten._is_canvasTextSupported=o;a.fn.shorten._native=q;a.fn.shorten.defaults={tail:"…",tooltip:true}})(jQuery); diff --git a/app/assets/javascripts/nested_form.js b/app/assets/javascripts/nested_form.js new file mode 100644 index 0000000..dcdbc8a --- /dev/null +++ b/app/assets/javascripts/nested_form.js @@ -0,0 +1,114 @@ +(function($) { + window.NestedFormEvents = function() { + this.addFields = $.proxy(this.addFields, this); + this.removeFields = $.proxy(this.removeFields, this); + }; + + NestedFormEvents.prototype = { + addFields: function(e) { + // Setup + var link = e.currentTarget; + var assoc = $(link).data('association'); // Name of child + var blueprint = $('#' + $(link).data('blueprint-id')); + var content = blueprint.data('blueprint'); // Fields template + + // Make the context correct by replacing with the generated ID + // of each of the parent objects + var context = ($(link).closest('.fields').closestChild('input, textarea, select').eq(0).attr('name') || '').replace(new RegExp('\[[a-z_]+\]$'), ''); + + // context will be something like this for a brand new form: + // project[tasks_attributes][1255929127459][assignments_attributes][1255929128105] + // or for an edit form: + // project[tasks_attributes][0][assignments_attributes][1] + if (context) { + var parentNames = context.match(/[a-z_]+_attributes(?=\]\[(new_)?\d+\])/g) || []; + var parentIds = context.match(/[0-9]+/g) || []; + + for(var i = 0; i < parentNames.length; i++) { + if(parentIds[i]) { + content = content.replace( + new RegExp('(_' + parentNames[i] + ')_.+?_', 'g'), + '$1_' + parentIds[i] + '_'); + + content = content.replace( + new RegExp('(\\[' + parentNames[i] + '\\])\\[.+?\\]', 'g'), + '$1[' + parentIds[i] + ']'); + } + } + } + + // Make a unique ID for the new child + var regexp = new RegExp('new_' + assoc, 'g'); + var new_id = this.newId(); + content = $.trim(content.replace(regexp, new_id)); + + var field = this.insertFields(content, assoc, link); + // bubble up event upto document (through form) + field + .trigger({ type: 'nested:fieldAdded', field: field }) + .trigger({ type: 'nested:fieldAdded:' + assoc, field: field }); + return false; + }, + newId: function() { + return new Date().getTime(); + }, + insertFields: function(content, assoc, link) { + var target = $(link).data('target'); + if (target) { + return $(content).appendTo($(target)); + } else { + return $(content).insertBefore(link); + } + }, + removeFields: function(e) { + var $link = $(e.currentTarget), + assoc = $link.data('association'); // Name of child to be removed + + var hiddenField = $link.prev('input[type=hidden]'); + hiddenField.val('1'); + + var field = $link.closest('.fields'); + field.hide(); + + field + .trigger({ type: 'nested:fieldRemoved', field: field }) + .trigger({ type: 'nested:fieldRemoved:' + assoc, field: field }); + return false; + } + }; + + window.nestedFormEvents = new NestedFormEvents(); + $(document) + .delegate('form a.add_nested_fields', 'click', nestedFormEvents.addFields) + .delegate('form a.remove_nested_fields', 'click', nestedFormEvents.removeFields); +})(jQuery); + +// http://plugins.jquery.com/project/closestChild +/* + * Copyright 2011, Tobias Lindig + * + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + */ +(function($) { + $.fn.closestChild = function(selector) { + // breadth first search for the first matched node + if (selector && selector != '') { + var queue = []; + queue.push(this); + while(queue.length > 0) { + var node = queue.shift(); + var children = node.children(); + for(var i = 0; i < children.length; ++i) { + var child = $(children[i]); + if (child.is(selector)) { + return child; //well, we found one + } + queue.push(child); + } + } + } + return $();//nothing found + }; +})(jQuery); diff --git a/app/assets/javascripts/noapi.js b/app/assets/javascripts/noapi.js new file mode 100644 index 0000000..d47b992 --- /dev/null +++ b/app/assets/javascripts/noapi.js @@ -0,0 +1,5 @@ +// if on api subdomain, redirect +var wloc = window.location.toString(); +if (wloc.indexOf('api') != -1 && wloc.indexOf('api') < 10) { + window.location = wloc.replace('api', 'www'); +} \ No newline at end of file diff --git a/app/assets/javascripts/prettify.js b/app/assets/javascripts/prettify.js new file mode 100644 index 0000000..ba5bd43 --- /dev/null +++ b/app/assets/javascripts/prettify.js @@ -0,0 +1,35 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p ss) || (el >= es && sl < es) || (sl > ss && el < es)}); + sl = el + 1;// for "\n" + } + + // walk through the array of lines (indices) and add tabs where appropriate + var modifier = 0; + for (var i in indices) { + if (indices[i].selected) { + var pos = indices[i].start + modifier; // adjust for tabs already inserted/removed + // SHIFT+TAB + if (shft && options.tabString == o.value.substring(pos,pos+options.tabString.length)) { // only SHIFT+TAB if there's a tab at the start of the line + o.value = o.value.substring(0,pos) + o.value.substring(pos + options.tabString.length); // omit the tabstring to the right + modifier -= options.tabString.length; + } + // TAB + else if (!shft) { + o.value = o.value.substring(0,pos) + options.tabString + o.value.substring(pos); // insert the tabstring + modifier += options.tabString.length; + } + } + } + o.focus(); + var ns = ss + ((modifier > 0) ? options.tabString.length : (modifier < 0) ? -options.tabString.length : 0); + var ne = es + modifier; + o.setSelectionRange(ns,ne); + } + } + + function ie_tab (o, shft, options) { + var range = document.selection.createRange(); + + if (o == range.parentElement()) { + // when there's no selection and we're just working with the caret, we'll add/remove the tabs at the caret, providing more control + if ('' == range.text) { + // SHIFT+TAB + if (shft) { + var bookmark = range.getBookmark(); + //first try to the left by moving opening up our empty range to the left + range.moveStart('character', -options.tabString.length); + if (options.tabString == range.text) { + range.text = ''; + } else { + // if that didn't work then reset the range and try opening it to the right + range.moveToBookmark(bookmark); + range.moveEnd('character', options.tabString.length); + if (options.tabString == range.text) + range.text = ''; + } + // move the pointer to the start of them empty range and select it + range.collapse(true); + range.select(); + } + + else { + // very simple here. just insert the tab into the range and put the pointer at the end + range.text = options.tabString; + range.collapse(false); + range.select(); + } + } + // selections will always add/remove tabs from the start of the line + else { + + var selection_text = range.text; + var selection_len = selection_text.length; + var selection_arr = selection_text.split("\r\n"); + + var before_range = document.body.createTextRange(); + before_range.moveToElementText(o); + before_range.setEndPoint("EndToStart", range); + var before_text = before_range.text; + var before_arr = before_text.split("\r\n"); + var before_len = before_text.length; // - before_arr.length + 1; + + var after_range = document.body.createTextRange(); + after_range.moveToElementText(o); + after_range.setEndPoint("StartToEnd", range); + var after_text = after_range.text; // we can accurately calculate distance to the end because we're not worried about MSIE trimming a \r\n + + var end_range = document.body.createTextRange(); + end_range.moveToElementText(o); + end_range.setEndPoint("StartToEnd", before_range); + var end_text = end_range.text; // we can accurately calculate distance to the end because we're not worried about MSIE trimming a \r\n + + var check_html = $(o).html(); + $("#r3").text(before_len + " + " + selection_len + " + " + after_text.length + " = " + check_html.length); + if((before_len + end_text.length) < check_html.length) { + before_arr.push(""); + before_len += 2; // for the \r\n that was trimmed + if (shft && options.tabString == selection_arr[0].substring(0,options.tabString.length)) + selection_arr[0] = selection_arr[0].substring(options.tabString.length); + else if (!shft) selection_arr[0] = options.tabString + selection_arr[0]; + } else { + if (shft && options.tabString == before_arr[before_arr.length-1].substring(0,options.tabString.length)) + before_arr[before_arr.length-1] = before_arr[before_arr.length-1].substring(options.tabString.length); + else if (!shft) before_arr[before_arr.length-1] = options.tabString + before_arr[before_arr.length-1]; + } + + for (var i = 1; i < selection_arr.length; i++) { + if (shft && options.tabString == selection_arr[i].substring(0,options.tabString.length)) + selection_arr[i] = selection_arr[i].substring(options.tabString.length); + else if (!shft) selection_arr[i] = options.tabString + selection_arr[i]; + } + + if (1 == before_arr.length && 0 == before_len) { + if (shft && options.tabString == selection_arr[0].substring(0,options.tabString.length)) + selection_arr[0] = selection_arr[0].substring(options.tabString.length); + else if (!shft) selection_arr[0] = options.tabString + selection_arr[0]; + } + + if ((before_len + selection_len + after_text.length) < check_html.length) { + selection_arr.push(""); + selection_len += 2; // for the \r\n that was trimmed + } + + before_range.text = before_arr.join("\r\n"); + range.text = selection_arr.join("\r\n"); + + var new_range = document.body.createTextRange(); + new_range.moveToElementText(o); + + if (0 < before_len) new_range.setEndPoint("StartToEnd", before_range); + else new_range.setEndPoint("StartToStart", before_range); + new_range.setEndPoint("EndToEnd", range); + + new_range.select(); + + } + } + } + +// end of closure +})(jQuery); diff --git a/app/assets/javascripts/timeago.min.js b/app/assets/javascripts/timeago.min.js new file mode 100644 index 0000000..940c7b8 --- /dev/null +++ b/app/assets/javascripts/timeago.min.js @@ -0,0 +1,11 @@ +(function($){$.timeago=function(timestamp){if(timestamp instanceof Date){return inWords(timestamp);}else if(typeof timestamp==="string"){return inWords($.timeago.parse(timestamp));}else{return inWords($.timeago.datetime(timestamp));}};var $t=$.timeago;$.extend($.timeago,{settings:{refreshMillis:60000,allowFuture:false,strings:{prefixAgo:null,prefixFromNow:null,suffixAgo:"ago",suffixFromNow:"from now",seconds:"less than a minute",minute:"about a minute",minutes:"%d minutes",hour:"about an hour",hours:"about %d hours",day:"a day",days:"%d days",month:"about a month",months:"%d months",year:"about a year",years:"%d years",numbers:[]}},inWords:function(distanceMillis){var $l=this.settings.strings;var prefix=$l.prefixAgo;var suffix=$l.suffixAgo;if(this.settings.allowFuture){if(distanceMillis<0){prefix=$l.prefixFromNow;suffix=$l.suffixFromNow;} +distanceMillis=Math.abs(distanceMillis);} +var seconds=distanceMillis/1000;var minutes=seconds/60;var hours=minutes/60;var days=hours/24;var years=days/365;function substitute(stringOrFunction,number){var string=$.isFunction(stringOrFunction)?stringOrFunction(number,distanceMillis):stringOrFunction;var value=($l.numbers&&$l.numbers[number])||number;return string.replace(/%d/i,value);} +var words=seconds<45&&substitute($l.seconds,Math.round(seconds))||seconds<90&&substitute($l.minute,1)||minutes<45&&substitute($l.minutes,Math.round(minutes))||minutes<90&&substitute($l.hour,1)||hours<24&&substitute($l.hours,Math.round(hours))||hours<48&&substitute($l.day,1)||days<30&&substitute($l.days,Math.floor(days))||days<60&&substitute($l.month,1)||days<365&&substitute($l.months,Math.floor(days/30))||years<2&&substitute($l.year,1)||substitute($l.years,Math.floor(years));return $.trim([prefix,words,suffix].join(" "));},parse:function(iso8601){var s=$.trim(iso8601);s=s.replace(/\.\d\d\d+/,"");s=s.replace(/-/,"/").replace(/-/,"/");s=s.replace(/T/," ").replace(/Z/," UTC");s=s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2");return new Date(s);},datetime:function(elem){var isTime=$(elem).get(0).tagName.toLowerCase()==="time";var iso8601=isTime?$(elem).attr("datetime"):$(elem).attr("title");return $t.parse(iso8601);}});$.fn.timeago=function(){var self=this;self.each(refresh);var $s=$t.settings;if($s.refreshMillis>0){setInterval(function(){self.each(refresh);},$s.refreshMillis);} +return self;};function refresh(){var data=prepareData(this);if(!isNaN(data.datetime)){$(this).text(inWords(data.datetime));} +return this;} +function prepareData(element){element=$(element);if(!element.data("timeago")){element.data("timeago",{datetime:$t.datetime(element)});var text=$.trim(element.text());if(text.length>0){element.attr("title",text);}} +return element.data("timeago");} +function inWords(date){return $t.inWords(distance(date));} +function distance(date){return(new Date().getTime()-date.getTime());} +document.createElement("abbr");document.createElement("time");}(jQuery)); \ No newline at end of file diff --git a/app/assets/javascripts/updateChart.js b/app/assets/javascripts/updateChart.js new file mode 100644 index 0000000..c544552 --- /dev/null +++ b/app/assets/javascripts/updateChart.js @@ -0,0 +1,296 @@ +// update the chart with all the textbox values +function openDialogCenter(element) { + element.dialog("open"); + var sizeArr = getDimensions( element.parent() ); + element.dialog({position:[ sizeArr[0], sizeArr[1] ] }); + +} +function getDimensions(element) { + var sizeArr = new Array(2); + sizeArr[0] = $(window).width()/2 - element.width()/2; + sizeArr[1] = $(window).height()/2 - element.height()/2; + return sizeArr; +} + +function updateChart(index, + postUpdate, + width, + height, + channelId, + newOptionsSave) { + // default width and height + var width = width; + var height = height; + // get old src + + var iframe = $('#iframe' + index).attr("default_src"); + + if (!iframe) { + iframe = $('#iframe' + index).attr('src'); + } + + src = iframe.split('?')[0]; + // if not a line chart, a timeslice should be present or set timescale=30 + if ($('#type_' + index).val() != 'line') { + if ($('#timescale_' + index).val().length == 0 && $('#average_' + index).val().length == 0 && $('#median_' + index).val().length == 0 && $('#sum_' + index).val().length == 0) { + $('#timescale_' + index).val(30); + } + } + + // add inputs to array + var inputs = []; + $('.chart_options' + index).each(function() { + var v = $(this).val(); + var id = $(this).attr('id'); + var tag = id.split("_")[0]; + + if (v.length > 0) { inputs.push([tag, v]); } + }); + + // create querystring + var qs = ''; + while (inputs.length > 0) { + var p = inputs.pop(); + if (p[0] == 'width') { width = parseInt(p[1]); } + if (p[0] == 'height') { height = parseInt(p[1]); } + + // don't add type=line to querystring, it's the default value + if (!(p[0] == 'type' && p[1] == 'line')) { + qs += '&' + p[0] + '=' + encodeURIComponent(p[1]); + } + } + // if querystring exists, add it to src + if (qs.length > 0) { src += '?' + qs.substring(1); } + + // save chart options to database + if (postUpdate && index > 0 && newOptionsSave) { + $.update("/channels/" + channelId + "/charts/" + index, + { + newOptions : { options: qs } + } ); + } + else if (postUpdate && index > 0) { + $.update("/channels/" + channelId + "/charts/" + index, + { options: qs } ); + } + + // set embed code + $('#embed' + index).val(''); + + // set new src + $('#iframe' + index).attr('src', src); + $('#iframe' + index).attr('width', width); + $('#iframe' + index).attr('height', height); +} +function updateSelectValues() { + selectedValue = $(this).val(); + $(".mutuallyexclusive"+index).each(function () { $(this).val(""); }); + $(this).val(selectedValue); +} + +function setupChartForm(channelIndex) { + return function(index, value) { + if (value.length > 0) { + $('#' + value.split('=')[0] + "_" + channelIndex).val(decodeURIComponent(value.split('=')[1])); + } + }; +} + + + + +function setupColumns(current_user, channel_id) +{ + $( sortColumnSetup(current_user, channel_id) ) ; + $( ".column" ).disableSelection(); +} + +function createWindowsWithData (data, current_user, channel_id, colName) { + + for (var i in data) { + //each array element has a single chart object as an associative array with the type as the key + // so I need to iterate over a array with size=1 to get a string with the window type + for (var type in data[i]) { + var wtype = type; + } + if (data[i].chart_window) window = data[i].chart_window; + if (data[i].plugin_window) window = data[i].plugin_window; + if (data[i].portlet_window) window = data[i].portlet_window; + + if (window == "undefined") + var window = (data[i].portlet_window) ? data[i].portlet_window : data[i].chart_window; + colId = window.col; + title = window.title; + + var content = window.html; + if (data[i].chart_window) { + var windowId = window.id; + $("body").append("
"); + } + var portlet = addWindow(colName, colId, window.id, wtype, title, content); + portlet.each ( decoratePortlet(current_user) ) ; + + portlet.find( ".ui-toggle" ).click( uiToggleClick ); + portlet.find( ".ui-view" ).click( uiViewClick (channel_id) ); + portlet.find( ".ui-edit" ).click( uiEditClick (channel_id) ); + portlet.find( ".ui-close" ).click( uiCloseClick (channel_id) ); + } +} +var createWindows = function (current_user, channel_id, colName) { + return function(data) { + createWindowsWithData(data, current_user, channel_id, colName); + }; +} + +function addWindow(colName, colId, windowId, wtype, title, content) { + $("#"+colName+"_dialog"+colId).append('
' + title + + '
'+content+'
') ; + + if ($("#portlet_"+windowId).length > 1) { + throw "Portlet count doesn't match what's expected"; + } else { + return $("#portlet_"+windowId); + } + +} + + +var updatePortletPositions = function( current_user, channel_id) { + return function() { + if (current_user) { + var result = $(this).sortable('serialize'); + colId = $(this).attr('id').charAt($(this).attr('id').length - 1); + portletArray = getPortletArray(result); + jsonResult = { + "col" : colId, + "positions" : portletArray + } ; + + if (portletArray.length > 0) { + $.ajax({ + type: 'PUT', + url: '../channels/' + channel_id + '/windows', + data: {_method:'PUT', page : JSON.stringify(jsonResult ) }, + dataType: 'json' + }); + } + } +} +} + +function sortColumnSetup(current_user, channel_id) { + + $( ".column" ).sortable({ + opacity: 0.6, + helper: function( event ) { + return $("
Drop to re-position
"); + }, + connectWith: ".column", + update: updatePortletPositions(current_user, channel_id) + }); +} +var decoratePortlet = function (current_user) { + return function() { + var portletHeader = $(this).find( ".portlet-header") ; + portletHeader.append( ""); + + thisObject = $(this); + if (current_user == "true") { + // Use feature Rollout here - needs to be implemented for this user, and this channel needs to belong to this user. + thisObject.find('.wtype').prepend( ""); + thisObject.find(".wtype-chart_window").append(""); + thisObject.find(".wtype").append(""); + thisObject.find(".portlet-header").css("cursor","move"); + } + else { + $(".column").sortable({ disabled:true }); + } + return $(this).attr("id"); + } +} +function getPortletArray(data) { + + var resultArray = new Array(); + var inputArray = data.split("&"); + + for (i in inputArray) { + + val = inputArray[i].split("=")[1] ; + resultArray.push(val); + } + + return resultArray; +} + + +var uiEditClick = function (channel_id) { + return function() { + var id = $( this ).parents( ".portlet:first" ).attr("id").substring(8); + + var options = ""; + $("#chartConfig"+id).load("/channels/"+channel_id+"/charts/"+id+"/edit", + function() { + options = $("#chartOptions"+id).html(); + + if (options != "undefined" && options.length >2) { + $.each((options.split('&')), setupChartForm( id )); + } + $("#button"+id).click( function() { + updateChart(id, true, 450, 250, channel_id, true); + $("#chartConfig"+id).dialog("close"); + + }); + }) + .dialog({ title:"Chart Options", modal: true, resizable: false, width: 500, dialogClass: "dev-info-dialog" }); + + }; +} + +var uiViewClick = function (channel_id) { + return function() { + var x = $( this ).parents( ".portlet:first" ).find( ".portlet-content" ).offset().left; + var y = $( this ).parents( ".portlet:first" ).find( ".portlet-content" ).offset().top; + var id = $( this ).parents( ".portlet:first" ).attr("id").substring(8); + + $("body").append(''); + + $.get("/channels/"+channel_id+"/windows/"+id+"/iframe", + function(response) { + var display = response.replace(/id=\"iframe[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?\"/, "" ); + $("#iframeinner"+id).text(display); + } + ); + + $("#iframepopup"+id).dialog({ + resizable:false, + width: "300px", + position:[x+200,y-200], + title: "Chart Iframe", + dialogClass: "dev-info-dialog" + }); + }; +} + +var uiCloseClick = function (channel_id) { + return function() { + var id = $( this ).parents( ".portlet:first" ).attr("id").substring(8); + var portlet = $( this ).parents( ".portlet:first" ) ; + $.update("/channels/"+channel_id+"/windows/"+id+"/hide" , + function(response) { + portlet.hide("drop", function(){ + portlet.remove();}); + }) ; + } +} + + +function uiToggleClick() { + $( this ).toggleClass( "ui-icon-minusthick" ).toggleClass( "ui-icon-plusthick" ); + $( this ).parents( ".portlet:first" ).find( ".portlet-content" ).toggle(); +} + diff --git a/app/assets/javascripts/validate.min.js b/app/assets/javascripts/validate.min.js new file mode 100644 index 0000000..e551e34 --- /dev/null +++ b/app/assets/javascripts/validate.min.js @@ -0,0 +1,16 @@ +/* + * validate.js 1.0.1 + * Copyright (c) 2011 Rick Harrison, http://rickharrison.me + * validate.js is open sourced under the MIT license. + * Portions of validate.js are inspired by CodeIgniter. + * http://rickharrison.github.com/validate.js + */ + +(function(j,k,i){var l={required:"The %s field is required.",matches:"The %s field does not match the %s field.",valid_email:"The %s field must contain a valid email address.",min_length:"The %s field must be at least %s characters in length.",max_length:"The %s field must not exceed %s characters in length.",exact_length:"The %s field must be exactly %s characters in length.",greater_than:"The %s field must contain a number greater than %s.",less_than:"The %s field must contain a number less than %s.", +alpha:"The %s field must only contain alphabetical characters.",alpha_numeric:"The %s field must only contain alpha-numeric characters.",alpha_dash:"The %s field must only contain alpha-numeric characters, underscores, and dashes.",numeric:"The %s field must contain only numbers.",integer:"The %s field must contain an integer."},m=function(){},n=/^(.+)\[(.+)\]$/,g=/^[0-9]+$/,o=/^\-?[0-9]+$/,h=/^\-?[0-9]*\.?[0-9]+$/,p=/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}$/i,q=/^[a-z]+$/i,r=/^[a-z0-9]+$/i,s=/^[a-z0-9_-]+$/i, +e=function(a,b,d){this.callback=d||m;this.errors=[];this.fields={};this.form=k.forms[a]||{};this.messages={};this.handlers={};a=0;for(d=b.length;a0)if(a&&a.preventDefault)a.preventDefault();else return false;return true};e.prototype._validateField= +function(a){var b=a.rules.split("|");if(!(a.rules.indexOf("required")===-1&&(!a.value||a.value===""||a.value===i)))for(var d=0,c=b.length;d=b},max_length:function(a,b){return!g.test(b)? +false:a.value.length<=b},exact_length:function(a,b){return!g.test(b)?false:a.value.length==b},greater_than:function(a,b){return!h.test(a.value)?false:parseFloat(a.value)>parseFloat(b)},less_than:function(a,b){return!h.test(a.value)?false:parseFloat(a.value).caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media (min-width:992px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="date"]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:992px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:none}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:992px){.navbar{border-radius:4px}}@media (min-width:992px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:992px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:992px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:992px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:992px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:992px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:none}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:992px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:991px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:992px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:992px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:991px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:992px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:992px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:991px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:991px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.428571429;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group .list-group-item:first-child{border-top:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tfoot>tr:first-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tfoot>tr:first-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>td{border-top:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.428571429px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.5) 0), color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.0001) 0), color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:none;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none !important}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none !important}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none !important}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none !important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none !important}} diff --git a/app/assets/stylesheets/bootstrap_overrides.css b/app/assets/stylesheets/bootstrap_overrides.css new file mode 100644 index 0000000..acb3812 --- /dev/null +++ b/app/assets/stylesheets/bootstrap_overrides.css @@ -0,0 +1,6 @@ +/* 3D button styles */ +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} + +/* force line breaks */ +code { word-wrap: break-word; white-space: normal; } + diff --git a/app/assets/stylesheets/custom.css b/app/assets/stylesheets/custom.css index 862769c..faea9a1 100644 --- a/app/assets/stylesheets/custom.css +++ b/app/assets/stylesheets/custom.css @@ -1,85 +1,545 @@ -html, body { height: 100%; margin: 0; padding: 0; font-family: Helvetica, Arial, sans-serif; color: #333333; } -img { border: 0; } -h2 { margin-top: 5px; } -h3 { margin-top: 0; } -a { color: #2565a5; text-decoration: none; } -a:hover, a:hover div, -a:hover .info { color: #0066ff; text-decoration: underline; } -ul { margin: 0; padding: 0 0 0 20px; } -ul li { margin-left: 15px; } -table { border-collapse: collapse; } -#logo { margin: 6px 0 0 20px; font-size: 45px; font-weight: bold; font-family: Tahoma, Geneva, Kalimati, sans-serif; } -#logo a { color: #d62020; } -#logo a span, .paygray { color: #666666; } -#logo a:hover { text-decoration: none; } -#logo.small { font-size: 30px; color: #666666; } -#options { float: right; text-align: right; } -#options span { padding-right: 10px; } -#login { padding: 6px; border: 1px solid #bbbbbb; border-collapse: separate; border-spacing: 3px; background-color: #eeeeee; background: -webkit-gradient(linear, left top, right top, from(#dddddd), to(#f5f5f5)); background: -moz-linear-gradient(left, #dddddd, #f5f5f5); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd', endColorstr='#f5f5f5', GradientType=1)); } -#menu { height: 40px; margin: 0 auto; border: 1px solid #dddddd; background-color: #d6d6d6; background: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#bbbbbb)); background: -moz-linear-gradient(top, #eeeeee, #bbbbbb); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#bbbbbb')); } -#menu div { float: left; } -#menu div a { color: #777777; padding: 10px 30px; display: block; font-weight: bold; } -#menu div:hover { background-color: #cccccc; } -#menu div:hover a { color: #000000; text-decoration: none; } -#menu .selected, -#menu .selected:hover { background-color: #e5e5e5; } -#menu .selected a { color: #000000; } -.userlogin { display:none; } -.login_info { font-weight: bold; text-align: right; font-size: 12px; } -.round { -moz-border-radius: 7px; -webkit-border-radius: 7px; } -.text_center { text-align: center; } -.big { font-size: 18px; } -.large { font-size: 20px; } -.xlarge { font-size: 30px; } -.small { font-size: 12px; } -.action { margin-right: 30px; position: relative; top: 25px; font-weight: bold; } -.nicetable { font-size: 14px; border: 1px solid #bbbbbb; } -.nicetable .header { font-weight: bold; background-color: #e5e5e5; } -.nicetable .header td { padding-top: 3px; } -.nicetable td { padding: 2px 10px; border-bottom: 1px solid #bbbbbb; } -.nicetable .stripe { background-color: #f9f9f9; } -.table_no_header { font-size: 14px; border: 1px solid #bbbbbb; } -.table_no_header td { padding: 2px 10px; border-bottom: 1px solid #bbbbbb; } -.table_no_header .left { font-weight: bold; } -.pagination { font-size: 14px; } -.centerme { display: table; margin: 0 auto; } -.fixedwidth { width: 990px; display: table; margin: 0 auto; } - -/* error messages */ -.errorExplanation { background-color: #ffffe0; display: table; margin-bottom: 20px; padding: 10px; border: 1px solid #aaaaaa; } -.field_with_errors { display: inline; } - -/* main layout */ -#wrapper { min-height: 100%; position: relative; } -#header { height: 75px; } -#menuwrap { padding: 0 20px; } -#content { padding: 23px 20px 58px 23px; } - -/* shortcuts */ -.FL { float: left; } -.FR { float: right; } -.FN { float: none; } -.DT { display: table; } -.CL { clear: left; } -.UL { text-decoration: underline; } -.TAR { text-align: right; } -.TAC { text-align: center; } -.VAT { vertical-align: top; } -.PB10 { padding-bottom: 10px; } -.PR20 { padding-right: 20px; } -.PL20 { padding-left: 20px; } -.PL30 { padding-left: 30px; } -.MR20 { margin-right: 20px; } -.MR60 { margin-right: 60px; } -.ML20 { margin-left: 20px; } -.W100 { width: 100%; } -.left20 { position: relative; left: -20px; } -.up2 { position: relative; top: -2px; } -.up20 { position: relative; top: -20px; } - -/* form styling */ -input[type='text'], -input[type='password'] { border: 1px inset #999999; width: 165px; } -input[type='text']:focus, -input[type='password']:focus { background-color: #ffffdd; } -input[type='submit'] { font-size: 14px; padding: 3px 6px; color: #333333; } \ No newline at end of file +/* bootstrap overrides */ +.navbar-collapse { max-height: 350px; } +.breadcrumb { margin-top: 10px; margin-bottom: 20px; } /* margins to make sure breadcrumb and h4.breadcrumb line up properly */ +.table td { word-break: break-word; } + +/* misc */ +body { padding-top: 70px; } +.break-word { word-break: break-word; } +.col-pad { padding: 0 15px; } + +/* multiline forms */ +.form-horizontal .multiline-label { margin-top: -10px; } + +/* nested fields */ +.nested-fields { border: 1px solid #d6d6d6; padding: 10px 10px 0 10px; max-width: 275px; } + +/* prettify code */ +.customcode, +.customcode .str, +.customcode .lit, +.customcode .pln { color: #00ab9b; } + +/* response types */ +.response-div { margin-top: 12px; font-size: 0.8em; } +.response { background-color: #ddd; margin: 0 1px; border: 1px solid #555; padding: 2px; font-weight: bold; color: #555; cursor: pointer; } +.response:hover { background-color: #eeb; } +.response.active { background-color: #beb; cursor: initial; } +.format-json, +.format-xml { display: none; } +.format-block { min-height: 200px; } +.format-block-lg { min-height: 350px; } + + +/* Sticky footer styles +-------------------------------------------------- */ + +html, +body { + height: 100%; + /* The html and body elements cannot have any padding or margin. */ +} + +/* Wrapper for page content to push down footer */ +#wrap { + min-height: 100%; + height: auto; + /* Negative indent footer by its height */ + margin: 0 auto -30px; + padding: 0 0 60px; +} + +/* Set the fixed height of the footer here */ +#footer { + padding-top: 5px; + border-top: 1px solid #ddd; + height: 30px; + background-color: #f5f5f5; +} +#footer .container { background-color: #f5f5f5; } +@media (max-width: 767px) { + #footer span { display: block; text-align: center; float: none !important; } +} + +/* old styles */ +.infobox { + vertical-align:bottom; +} +.spanlink { cursor: pointer; } +.boldlink { font-weight: bold; } +.apps a:hover, +.apps:hover div { text-decoration: none; } +.commentarea { width: 300px; height: 80px; } +#options { float: right; text-align: right; } +#login { + padding: 6px; + border: 1px solid #bbbbbb; + border-collapse: separate; + border-spacing: 3px; + background-color: #eeeeee; + background: -webkit-gradient(linear, left top, right top, from(#dddddd), to(#f5f5f5)); + background: -moz-linear-gradient(left, #dddddd, #f5f5f5); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd', endColorstr='#f5f5f5', GradientType=1); +} +#channel_info { padding-bottom: 20px; } +.signed_in_channel_header {display:inline-block; } +.public_private_icon {display:inline-block;} +.signed_in_channel_header { width:300px;height: 10px;} +#list_progress_bar { width:300px;height: 10px;} +.public_channel_box { +margin:5px;border-radius:7px;height:300px;border:solid 1px red;display:inline-block;width:260px;vertical-align:top +} +.public_channel_inner { +margin-left:10px; +margin-right:5px +} +.public_channel_name { + height: 11px; + font-size: 1.3em; + font-weight:bold; + color: #2565A5; +} +.public_channel_user { + height:15px; + margin-left:7px; + font-size: 0.9em; +} +.progressbar { + height:10px; + +} +.public_channel_desc { + height:140px; + word-break:break-all; +} +.public_channel_url { + height:10px; +} +.public_channel_tags { + height:57px; + margin-bottom:10px; + overflow: hidden; +} +.public_channel_thumbnail { +position:absolute;border:2px solid red;display:none +} +h1.channel_info { + margin:0; + padding-top: 10px +} + +div.list_tags { +padding-top:20px; +} +.channelLinks { + padding: 0 0 0 0; + margin-bottom: 15px; +} +.channelLinks li { + padding : 7px; + border: 1px solid #CCC ; + border-radius: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + display:inline; + margin:0 0 0 0; + list-style: none; +} +#comments { width: 100%; } +#commentsmain { float:left; width: 190px; background-color: #fffff9; border: 1px dashed #d0d0d0; padding: 5px; margin-right: 16px; overflow: hidden; display:none } +.commentlink { float:left;width:100%} +#public_statuses { width: 455px; height: 380px; overflow: auto; font-size: 1.5em; } +#public_statuses div { margin-left: 15px; } +.statusIFrame { + border : 1px solid #cccccc ; + background-color: #ffffff; +} + +.userlogin { display:none; } +.login_info { font-weight: bold; text-align: right; font-size: 12px; } +.round { -moz-border-radius: 7px; -webkit-border-radius: 7px; } +.text_center { text-align: center; } +.big { font-size: 18px; } +.large { font-size: 20px; } +.xlarge { font-size: 30px; } +.small { font-size: 12px; } +.action { margin-right: 20px; position: relative; top: 35px; font-weight: bold; padding:10px;} +.action_reverse { margin-right: 20px; position: relative; top: 35px; font-weight: bold; background-color: #d62020; padding:8px; color: #000000;} +.action_reverse a { color: #FFFFFF;} +.section_header_reverse { margin: 15px 0 5px 0; display: inline-block; font-weight: bold; color:#FFFFFF; background-color: #d62020; padding:8px;} +.nicetable { font-size: 14px; border: 1px solid #bbbbbb; } +.nicetable-borderless { font-size: 14px; border: none; } +.nicetable-borderless p { margin-left:20px; margin-top:5px; margin-bottom:10px; } +.nicetable-borderless h3 { margin-bottom:0; } +.nicetable-borderless h3.signed_in_channel_header { margin-bottom:10px; } +.nicetable .header { font-weight: bold; background-color: #e5e5e5; } +.nicetable .header td { padding-top: 3px; } +.nicetable td { padding: 2px 10px; border-bottom: 1px solid #bbbbbb; word-wrap:word} +.nicetable .stripe { background-color: #f9f9f9; } +.nicetable .disabled { background-color: #eee; } +.nicetable .disabled a { color: #888; } +.fulltable { width: 95%; } + +.fullform { width: 100%; margin-bottom: 1.5em;} +.deletecol { width: 1em; } + +.table_no_header { font-size: 14px; } +.table_no_header td { padding: 2px 10px; } +.table_no_header .left { font-weight: bold; } + +.max_width_400 { max-width:40; word-wrap:break-word; } +.helplink { float: right; margin-top: 3px; } +.votediv, +.votedivphoto, +.votedivlink { color: #3478e3; } +.votedivlink { padding-right: 20px; } +.votediv { float: right; display: none;} +.voteicon { padding: 2px; background: #f8f8f8; border: 1px solid #ddd; cursor: pointer; } +.voteicon:hover { text-decoration: none; } +.voteicon img { position: relative; top: 3px; } +.nestedcomment { padding-left: 30px; } +.commenttable { padding: 0; margin: 0; width: 100%; } +.commenttable td { padding: 4px 10px 4px 5px; } +.commentchannel { color: #f08600; font-weight: bold; } +.commentbody { color: #333333; } +.commentdiv { width:100%; padding: 5px 0 5px 0; + font-size: 12px; + border-top: 1px solid #aaa; } +.gravatar { border: 1px solid #999; } +.noavatar { width: 50px; height: 50px; border: 1px solid #ddd; color: #ddd; text-align: center; } +.noavatartext { padding-top: 5px; } +.prettydate { color: #aaa; } +.username a { color: #3478E3; font-weight: bold; } + +.timeago { + + + font-size: 0.8em; + color: #ccc; +} + +.pagination { font-size: 14px; } +.centerme { display: table; margin: 0 auto; } +.fixedwidth { width: 960px; display: table; margin: 0 auto; } +.code { margin: 10px 0; background-color: #fafafa; white-space: pre-wrap; font: 12px Monaco, Lucida Console, monospace; color: #000000; border: 1px solid #bbbbbb; padding: 10px; } +.apps { padding: 0 30px 40px 0; font-size: 20px; float: left; text-align: center; margin: 0 auto; width: 150px; } +input[type="text"].shortfield { width: 30px; } +input[type="text"].midfield { width: 120px; } +textarea.tweet { margin-top: 0.5em; width: 40em; height: 3em; } + +/* error messages */ +.errorExplanation { width: 95%; background-color: #ffffe0; display: table; margin-bottom: 20px; padding: 10px; border: 1px solid #aaaaaa; } +#error { + color: red; +} +.field_with_errors { display: inline; } +/*.error_box { margin-top: 15px; padding: 5px; background-color: #f99; color: #300; border: 1px solid #f66; }*/ +.warning_box { margin: 15px 0 15px 0; padding: 10px; background-color: #fc3; color: #000; border: 1px solid #f90; } + +/* main layout */ +#maincontent { float: left; width:980px; padding-bottom: 20px; margin-left:10px; overflow:false} +#maincontent.thin { width: 400px; } +#maincontent.medium { + + width: 500px; +} + +#maincontent .thinghttptable { table-layout:fixed; width: 400px; word-wrap: break-word; } +#maincontent .thinghttptable .url { width: 100px; } +#maincontent .thinghttptable .apikey { width: 80px; } + +input#upload_csv { padding-top:5px;margin:20px 0;} + +#sidebar { } +#sidebar.wide { width: 520px; } +#sidebar.medium { width: 470px; } +#sidebar.narrow { width: 470px; margin-left: 520px;} +#sidebar .helplink { float: right; margin-top: 5px; font-weight: normal; font-size: 12px; } + +/* shortcuts */ +.FL { float: left; } +.FR { float: right; } +.FN { float: none; } +.DT { display: table; } +.CL { clear: left; } +.CR { clear: right; } +.CB { clear: both; } +.UL { text-decoration: underline; } +.TAR { text-align: right; } +.TAC { text-align: center; } +.VAT { vertical-align: top; } +.PB10 { padding-bottom: 10px; } +.PR20 { padding-right: 20px; } +.PL20 { padding-left: 20px; } +.PL30 { padding-left: 30px; } +.MT10 { margin-top: 5px; } +.MR20 { margin-right: 20px; } +.MR60 { margin-right: 60px; margin-bottom: 20px; } +.ML20 { margin-left: 20px; } +.ML60 { margin-left: 60px; } +.W50 { width: 50%; } +.W100 { width: 100%; } +.left20 { position: relative; left: -20px; } +.up2 { position: relative; top: -2px; } +.up20 { position: relative; top: -20px; } + +/* form styling */ +input.video_narrow {width:100px; } +/* home page */ +#feature_signup {} +#feature_signup a {border-bottom: 3px solid #d62020; text-decoration: none; font-weight: bold;} +#feature_signup a:hover {text-decoration: none;} + + +/* jQuery Nav */ +#nav { list-style: none; padding:0 10px 0 92px; margin: 0;} +#nav li { float:left; margin: 0px 0px 0px 10px;padding:0px 15px 0px 0px;position:relative;font-size:14px;line-height: 1.4;zoom: 1} +#nav li:last-child {padding:0;} +#nav .current-cat a, +#nav .current_page_item a {color: #d62020; border-bottom:5px solid #2565A5;} +#nav .current-cat li a, +#nav .current_page_item li a {color: #000} +#nav .current-cat li a:hover, +#nav .current_page_item li a:hover {color: #d62020; border-bottom:5px solid #2565A5;} + +#nav li a { text-transform: uppercase; font-weight: bold; text-decoration: none; color: #000;border:none; text-decoration: none; float: left; border-bottom:5px solid #FFFFFF;} +#nav li a:hover {color:#d62020; border-bottom:5px solid #aaa;} +#nav li span { width: 12px; height:20px; background: url('arrow-down.gif') no-repeat left 7px;margin:0;padding:0;position: absolute;right:0;top:0} +#nav ul {display:none} +#nav li span.child { width: 12px; height: 20px; background: url('arrow-right.gif') no-repeat left 10px;margin:0;padding:0;position: absolute;right:0;top:0; } + +#nav li a.rss {background: url(rss_feed.png) right 0px no-repeat; padding:0px 30px 0px 0;} +#nav li a.rss:hover {background: url(rss_feed.png) right -24px no-repeat; padding:0px 30px 0px 0; border-bottom:0 solid #aaa;} + +/* jQuery Overrides */ +.ui-widget { font-size: .8em; } +.ui-widget-header { + border: 1px solid #0867A3; + background: #0867a3 none top right no-repeat; +} +.ui-progressbar { + height: 5px; +} +.ui-progressbar-value { + background-color: green; +} +.ui-widget-content a{ + color:blue; + text-decoration: underline; + margin:0; +} +.ui-widget-content p { + margin:0 0 10px 10px; + +} + +.column { width: 470px; float: left; padding-bottom: 50px; padding-left: 5px; } +.portlet { margin: 0 1em 1em 0; } + +.portlet-header { margin: 0.3em; padding: 7px 7px 7px 7px; } +.portlet-header .ui-icon { float: right; margin-top: -2px; cursor:pointer; cursor:hand;} +.portlet-content { padding: 0.4em; } +.ui-sortable-placeholder { border: 1px dotted black; visibility: visible !important; height: 50px !important; } +.ui-sortable-placeholder * { visibility: hidden; } + +.buttonlets { + float:left; + overflow:hidden; + max-width:95px; +} + +.tweetButton { + width:80px; +} +.facebookButton { + width:85px; +} +.googleplusButton { + width:70px; +} + +.padded { + margin-top:2px; +} + +.ui-button { + height: 19px; + line-height:1em; +} +.ui-button-text-only .ui-button-text { + padding: 0.2em 1em 0.2em 0.4em ; + font-size: 12px; +} + +.ui-state-active { + border: 1px solid #2565a5; + background: #ddd none 50% 50% repeat-x; + color: #2565a5; +} + +.ui-state-default { + border: 1px solid #ccc; + color: #2565a5; +} + +.ui-state-hover { + background: #ccc none 50% 50% repeat-x; +} + +.topLink { + font-size: 16px; + +} +.developerlink { + + padding:7px; + margin-left:10px; + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + -webkit-border-bottom-left-radius: 15px; + -webkit-border-bottom-right-radius: 15px; + -moz-border-bottom-left-radius: 15px; + -moz-border-bottom-right-radius: 15px; + background-color:#aaa; + +} + +.addpluginlink { + color:white; + padding:7px; + margin-left:10px; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + background-color:#aaa; + cursor:pointer; +} +.addpluginlink:hover { + background-color: #ccc; +} + +.pluginrectangle { + display:none; + background-color:#aaa; + border-radius:5px; + position:absolute; + height:70%; + width:100%; + top:30px; + right:0; +} + + +.developerlink:hover { + background-color: #ccc; +} +.developerlink a { + color : white; + text-decoration:none; +} + +.channelInfo { + max-width: 500px; +} +.channelDescription { + width: 450px; + height: 60px; + +} + +.socialButtons { + float:right; + display:inline; + +} + +.dev-info-dialog { + border : 2px solid #bbb; + +} +.dev-info-dialog .ui-dialog-titlebar { + background-color: #aaa; + color : white; +} + + +.dev-info-dialog a { + text-decoration : underline; +} + +.ui-tabs { +height:100%; +} +.dev-info-dialog ul { +/* display: inline; */ + list-style-type: none; + background-color: whitesmoke; +} +#devInfo { + font-size: 1.2em; +} +.dev-info-dialog ul li { + display: inline; + list-style-type: none; +} + +.dev_info_table1 { + margin-bottom:10px; +} + +.dev_info_table2 { + margin-left: 10px; +} +.dev_info_table2 td { + max-width:300px; +} +.watchButtonLabel { + white-space: nowrap; + padding-right:10px; +} + +.watchButtonImage { +float:left;background-position:left;background-image:url('eye.png');background-repeat:no-repeat;width:19px;height:16px; +} + +.watchButtonPadding { + padding-right : 5px; +} + +.chartOptions { + display: none; +} +.fade { + display: none; + font-size : 1.2em; +} +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #d82020; background: #f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #d82020; } +.ui-state-hover a, .ui-state-hover a:hover { color: #d82020; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #d82020; background: #f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #d82020; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #d82020; text-decoration: none; } +.ui-widget :active { outline: none; } + +.ui-tabs .ui-tabs-panel { + padding-top:0; +} + +.addportlet { + padding:5px; + width:50px; + margin:5px; + border-radius:5px; + border : 2px solid red; + cursor: pointer; + display:inline-block; +} + +.channel_stats_location { +clear:right; float:right;width:475px;padding-top:23px +} +.channel_stats_text { +font-weight:bold;font-size:1.2em +} +.channel_time_text { +color:black;font-size:1em; +} + diff --git a/app/assets/stylesheets/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/app/assets/stylesheets/images/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100755 index 0000000..954e22d Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_diagonals-thick_18_b81900_40x40.png differ diff --git a/app/assets/stylesheets/images/ui-bg_diagonals-thick_20_666666_40x40.png b/app/assets/stylesheets/images/ui-bg_diagonals-thick_20_666666_40x40.png new file mode 100755 index 0000000..64ece57 Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_diagonals-thick_20_666666_40x40.png differ diff --git a/app/assets/stylesheets/images/ui-bg_flat_10_000000_40x100.png b/app/assets/stylesheets/images/ui-bg_flat_10_000000_40x100.png new file mode 100755 index 0000000..abdc010 Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_flat_10_000000_40x100.png differ diff --git a/app/assets/stylesheets/images/ui-bg_glass_100_f6f6f6_1x400.png b/app/assets/stylesheets/images/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100755 index 0000000..9b383f4 Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_glass_100_f6f6f6_1x400.png differ diff --git a/app/assets/stylesheets/images/ui-bg_glass_100_fdf5ce_1x400.png b/app/assets/stylesheets/images/ui-bg_glass_100_fdf5ce_1x400.png new file mode 100755 index 0000000..a23baad Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_glass_100_fdf5ce_1x400.png differ diff --git a/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png b/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100755 index 0000000..42ccba2 Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/app/assets/stylesheets/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/app/assets/stylesheets/images/ui-bg_gloss-wave_35_f6a828_500x100.png new file mode 100755 index 0000000..39d5824 Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_gloss-wave_35_f6a828_500x100.png differ diff --git a/app/assets/stylesheets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/app/assets/stylesheets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100755 index 0000000..f127367 Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png differ diff --git a/app/assets/stylesheets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/app/assets/stylesheets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png new file mode 100755 index 0000000..359397a Binary files /dev/null and b/app/assets/stylesheets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png differ diff --git a/app/assets/stylesheets/images/ui-icons_222222_256x240.png b/app/assets/stylesheets/images/ui-icons_222222_256x240.png new file mode 100755 index 0000000..b273ff1 Binary files /dev/null and b/app/assets/stylesheets/images/ui-icons_222222_256x240.png differ diff --git a/app/assets/stylesheets/images/ui-icons_228ef1_256x240.png b/app/assets/stylesheets/images/ui-icons_228ef1_256x240.png new file mode 100755 index 0000000..a641a37 Binary files /dev/null and b/app/assets/stylesheets/images/ui-icons_228ef1_256x240.png differ diff --git a/app/assets/stylesheets/images/ui-icons_ef8c08_256x240.png b/app/assets/stylesheets/images/ui-icons_ef8c08_256x240.png new file mode 100755 index 0000000..85e63e9 Binary files /dev/null and b/app/assets/stylesheets/images/ui-icons_ef8c08_256x240.png differ diff --git a/app/assets/stylesheets/images/ui-icons_ffd27a_256x240.png b/app/assets/stylesheets/images/ui-icons_ffd27a_256x240.png new file mode 100755 index 0000000..e117eff Binary files /dev/null and b/app/assets/stylesheets/images/ui-icons_ffd27a_256x240.png differ diff --git a/app/assets/stylesheets/images/ui-icons_ffffff_256x240.png b/app/assets/stylesheets/images/ui-icons_ffffff_256x240.png new file mode 100755 index 0000000..42f8f99 Binary files /dev/null and b/app/assets/stylesheets/images/ui-icons_ffffff_256x240.png differ diff --git a/app/assets/stylesheets/jquery-ui-1.8.24.custom.css b/app/assets/stylesheets/jquery-ui-1.8.24.custom.css new file mode 100755 index 0000000..2522079 --- /dev/null +++ b/app/assets/stylesheets/jquery-ui-1.8.24.custom.css @@ -0,0 +1,563 @@ +/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } +.ui-helper-clearfix:after { clear: both; } +.ui-helper-clearfix { zoom: 1; } +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; } +.ui-widget-content a { color: #333333; } +.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; } +.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); } +.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -khtml-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*! + * jQuery UI Resizable 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; } +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*! + * jQuery UI Selectable 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/*! + * jQuery UI Accordion 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +/*! + * jQuery UI Autocomplete 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.24 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/*! + * jQuery UI Button 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/*! + * jQuery UI Dialog 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/*! + * jQuery UI Slider 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/*! + * jQuery UI Tabs 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/*! + * jQuery UI Datepicker 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/*! + * jQuery UI Progressbar 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; overflow: hidden; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/app/assets/stylesheets/prettify.css b/app/assets/stylesheets/prettify.css new file mode 100644 index 0000000..34841f1 --- /dev/null +++ b/app/assets/stylesheets/prettify.css @@ -0,0 +1,31 @@ +.com { color: #93a1a1; } +.lit { color: #195f91; } +.pun, .opn, .clo { color: #93a1a1; } +.fun { color: #dc322f; } +.str, .atv { color: #D14; } +.kwd, .prettyprint .tag { color: #1e347b; } +.typ, .atn, .dec, .var { color: teal; } +.pln { color: #48484c; } + +.prettyprint { + padding: 8px; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +.prettyprint.linenums { + -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin: 0 0 0 33px; /* IE indents via margin-left */ +} +ol.linenums li { + padding-left: 12px; + color: #bebec5; + line-height: 20px; + text-shadow: 0 1px 0 #fff; +} + diff --git a/app/assets/stylesheets/sidebar.css b/app/assets/stylesheets/sidebar.css new file mode 100644 index 0000000..a5acce1 --- /dev/null +++ b/app/assets/stylesheets/sidebar.css @@ -0,0 +1,28 @@ +.affix-top,.affix{ + position: static; +} + +#bootstrap-sidebar { + background-color: #eee; + border: 1px solid #bbb; + border-radius: 5px; + padding: 2px 0; +} + +#bootstrap-sidebar li a:hover { + background-color: #fafafa; +} + +#bootstrap-sidebar li.active { + border:0 #666 solid; + border-right-width:4px; +} + +@media (min-width: 979px) { + #bootstrap-sidebar.affix-top, #bootstrap-sidebar.affix { + position: fixed; + top:90px; + width:228px; + } +} + diff --git a/app/assets/stylesheets/status.css b/app/assets/stylesheets/status.css new file mode 100644 index 0000000..c569113 --- /dev/null +++ b/app/assets/stylesheets/status.css @@ -0,0 +1,9 @@ +.recent_status { + font-family: sans-serif; + margin: 4px; +} +.timeago { + font-size: 0.8em; + color: #ccc; + margin-left:10px; +} \ No newline at end of file diff --git a/app/controllers/api_keys_controller.rb b/app/controllers/api_keys_controller.rb index 87d4c38..9653962 100644 --- a/app/controllers/api_keys_controller.rb +++ b/app/controllers/api_keys_controller.rb @@ -1,42 +1,50 @@ class ApiKeysController < ApplicationController - include KeyUtilities + include KeyUtilities, ApiKeys - before_filter :require_user, :set_channels_menu + before_filter :require_user, :set_channels_menu - def index - @channel = current_user.channels.find(params[:channel_id]) - @write_key = @channel.api_keys.write_keys.first - @read_keys = @channel.api_keys.read_keys - end + def index + api_index params[:channel_id] + end - def destroy - current_user.api_keys.find_by_api_key(params[:id]).try(:destroy) - redirect_to :back - end + def destroy + current_user.api_keys.find_by_api_key(params[:id]).try(:destroy) + redirect_to :back + end - def create - @channel = current_user.channels.find(params[:channel_id]) - @api_key = @channel.api_keys.write_keys.first + def create + @channel = current_user.channels.find(params[:channel_id]) + @api_key = @channel.api_keys.write_keys.first - # if no api key found or read api key - if (@api_key.nil? or params[:write] == '0') - @api_key = ApiKey.new - @api_key.channel_id = @channel.id - @api_key.user_id = current_user.id - @api_key.write_flag = params[:write] - end + # if no api key found or read api key + if (@api_key.nil? || params[:write] == '0') + @api_key = ApiKey.new + @api_key.channel_id = @channel.id + @api_key.user_id = current_user.id + @api_key.write_flag = params[:write] + end - # set new api key and save - @api_key.api_key = generate_api_key - @api_key.save + # set new api key and save + @api_key.api_key = generate_api_key + @api_key.save - # redirect - redirect_to channel_api_keys_path(@channel) - end + # redirect +# redirect_to channel_api_keys_path(@channel.id) + redirect_to channel_path(@channel.id, :anchor => "apikeys") + end + + def update + @api_key = current_user.api_keys.find_by_api_key(params[:id]) + @api_key.update_attributes(api_key_params) + redirect_to :back + end + + private + + # only allow these params + def api_key_params + params.require(:api_key).permit(:note) + end - def update - @api_key = current_user.api_keys.find_by_api_key(params[:id]) - @api_key.update_attributes(params[:api_key]) - redirect_to :back - end end + diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4795ed0..141c002 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,51 +1,134 @@ class ApplicationController < ActionController::Base - # include all helpers for controllers + # include all helpers for controllers helper :all - # include these helper methods for views - helper_method :current_user_session, :current_user, :get_header_value + # include these helper methods for views + helper_method :current_user_session, :current_user, :logged_in?, :is_admin?, :get_header_value, :to_bytes protect_from_forgery - before_filter :set_variables + before_filter :allow_cross_domain_access, :set_variables - # set up some variables across the entire application + # responds with blank + def respond_with_blank + respond_to do |format| + format.html { render :text => '' } + format.json { render :json => {}.to_json } + # fix xml response line breaks + format.xml { render :xml => {}.to_xml.gsub("\n", '').gsub("", "\n") } + end + end + + # responds with an error + def respond_with_error(error_code) + error_response = ErrorResponse.new(error_code) + respond_to do |format| + format.html { render :text => error_response.error_code, :status => error_response.http_status } + format.json { render :json => error_response.to_json, :status => error_response.http_status } + format.xml { render :xml => error_response.to_xml, :status => error_response.http_status } + end + end + + # set up some variables across the entire application def set_variables + @api_domain ||= api_domain + @ssl_api_domain ||= ssl_api_domain @locale ||= get_locale - I18n.locale = ALLOWED_LOCALES.include?(@locale) ? @locale : I18n.default_locale + I18n.locale = @locale # sets timezone for current user, all DateTime outputs will be automatically formatted Time.zone = current_user.time_zone if current_user end - + # get the locale, but don't fail if header value doesn't exist def get_locale locale = get_header_value('HTTP_ACCEPT_LANGUAGE') - # only look for 'pt-br' as first 5 letters, can make more robust in future if other languages are needed - locale = locale[0..4].downcase if locale + + if locale and ALLOWED_LOCALES.include?(locale[0..1].downcase) + locale = locale[0..1].downcase + elsif locale and ALLOWED_LOCALES.include?(locale[0..4].downcase) + locale = locale[0..4].downcase + else + locale = I18n.default_locale + end + return locale end private - def set_channels_menu - @menu = 'channels' - end + # allow javascript requests from any domain + def allow_cross_domain_access + response.headers['Access-Control-Allow-Origin'] = '*' + response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS, DELETE, PATCH' + response.headers['Access-Control-Allow-Headers'] = 'origin, content-type, X-Requested-With' + response.headers['Access-Control-Max-Age'] = '1800' + end + + def logged_in? + true if current_user + end + + # check that user's email address matches admin + def is_admin? + current_user && ADMIN_EMAILS.include?(current_user.email) + end + + def set_admin_menu + @menu = 'admin' + end + + # converts a string to a byte string for c output + def to_bytes(input, separator='.', prefix='') + return '' if input == nil + output = [] + # split the input array using the separator, and add necessary prefixes to each item + input.split(separator).each { |i| output.push(prefix + i) } + # rejoin the array into a comma separated string + return output.join(', ') + end + + def set_channels_menu + @menu = 'channels' + end + + def set_apps_menu + @menu = 'apps' + end + + def set_plugins_menu + @menu = 'plugins' + end + + def set_devices_menu + @menu = 'devices' + end def current_user_session return @current_user_session if defined?(@current_user_session) @current_user_session = UserSession.find end - + def current_user return @current_user if defined?(@current_user) @current_user = current_user_session && current_user_session.record end - - # check that user is logged in - def require_user - if current_user.nil? - redirect_to login_path - false - end - end - + + def require_user + logger.info "Require User" + if current_user.nil? + respond_to do |format| + format.html { + session[:link_back] = request.url + logger.debug "Redirecting to login" + redirect_to login_path + return true + } + format.json do + render :json => {'error' => 'Could not authenticate you.'}, :status => :unauthorized + return true + end + end + return false + end + end + def require_no_user if current_user store_location @@ -54,142 +137,205 @@ class ApplicationController < ActionController::Base end end - def store_location - if params[:controller] != "user_sessions" - session[:return_to] = request.fullpath - end + def require_admin + unless current_user && is_admin? + render :nothing => true, :status => 403 and return + false + end end - + + def store_location + if params[:controller] != "user_sessions" + session[:return_to] = request.fullpath + end + end + def redirect_back_or_default(default) redirect_to(session[:return_to] || default) session[:return_to] = nil end - def domain - u = request.url - begin - # the number 12 is the position at which to begin searching for '/', so we don't get the intitial '/' from http:// - u = u[0..u.index('/', 12)] - rescue - u += '/' - end - # uncomment the line below for https support in a production environment - #u = u.sub(/http:/, 'https:') if Rails.env == 'production' - return u - end + def domain(ssl=true) + u = request.url + begin + # the number 12 is the position at which to begin searching for '/', so we don't get the intitial '/' from http:// + u = u[0..u.index('/', 12)] + rescue + u += '/' + end + u = u.sub(/http:/, 'https:') if (Rails.env == 'production' and ssl) + return u + end - # gets the api key - def get_userkey - return get_header_value('THINGSPEAKAPIKEY') || params[:key] || params[:api_key] || params[:apikey] - end + def ssl + (Rails.env == 'production') ? 'https' : 'http' + end - # get specified header value - def get_header_value(name) - value = nil - for header in request.env - value = header[1] if (header[0].upcase.index(name.upcase)) - end - return value - end + # domain for the api + def api_domain + (Rails.env == 'production') ? API_DOMAIN : domain + end + + # ssl domain for the api + def ssl_api_domain; (Rails.env == 'production') ? api_domain.sub('http', 'https'): api_domain; end + + # gets the api key + def get_apikey + key = get_header_value(HTTP_HEADER_API_KEY_NAME) || params[:key] || params[:api_key] || params[:apikey] + key.strip if key.present? + return key + end + + # get specified header value + def get_header_value(name) + name.upcase! + request.env.select {|header| header.upcase.index(name) }.values[0] + end + + # generates a hash key unique to the user and url + def cache_key(type) + cache_key = request.host + request.path + user_id = current_user ? current_user.id : '0' + + params.each do |key, value| + # add the parameter if appropriate + cache_key += "&#{key}=#{value}" if key != 'callback' && key != 'controller' && key != 'action' && key != 'format' + end + + return "#{user_id}-#{type}-#{cache_key}" + end + + # reads a file using the relative path to the file + def read_file(file_path) + path = file_path[0, file_path.rindex('/')] + filename = file_path[file_path.rindex('/') + 1, file_path.length] + output = '' + + File.open("#{File.expand_path(path)}/#{filename}", 'r') do |f| + while line = f.gets + output += line + end + end + + return output + end + + # prepends or appends text + def add_prepend_append(input) + output = input.to_s + output = params[:prepend] + output if params[:prepend] + output += params[:append] if params[:append] + return output + end # gets the same data for showing or editing def get_channel_data @channel = current_user.channels.find(params[:channel_id]) if params[:channel_id] @channel = current_user.channels.find(params[:id]) if @channel.nil? and params[:id] + + if @channel.ranking.blank? + @channel.ranking = @channel.calc_ranking + end + @key = @channel.api_keys.write_keys.first.try(:api_key) || "" end - def check_permissions(channel) - render :text => t(:channel_permission) and return if (current_user.nil? || (channel.user_id != current_user.id)) - end + def check_permissions(channel) + render :text => t(:channel_permission) and return if (current_user.nil? || (channel.user_id != current_user.id)) + end - # checks permission for channel using api_key - def channel_permission?(channel, api_key) - if channel.public_flag or (api_key and api_key.channel_id == channel.id) or (current_user and channel.user_id == current_user.id) - return true - else - return false - end - end + # checks permission for channel using api_key + def channel_permission?(channel, api_key) + if channel.public_flag or (api_key and api_key.channel_id == channel.id) or (current_user and channel.user_id == current_user.id) + return true + else + return false + end + end - # outputs error for bad channel - def bad_channel_xml - channel_unauthorized = Channel.new - channel_unauthorized.id = -1 - return channel_unauthorized.to_xml(:only => :id) - end + # outputs error for bad channel + def bad_channel_xml + channel_unauthorized = Channel.new + channel_unauthorized.id = -1 + return channel_unauthorized.to_xml(:only => :id) + end - # outputs error for bad feed - def bad_feed_xml - feed_unauthorized = Feed.new - feedl_unauthorized.id = -1 - return feed_unauthorized.to_xml(:only => :entry_id) - end + # outputs error for bad feed + def bad_feed_xml + feed_unauthorized = Feed.new + feed_unauthorized.id = -1 + return feed_unauthorized.to_xml(:only => :entry_id) + end - # options: days = how many days ago, start = start date, end = end date, offset = timezone offset - def get_date_range(params) - # set timezone correctly - set_time_zone(params) + # options: days = how many days ago, start = start date, end = end date, offset = timezone offset + def get_date_range(params) + # set timezone correctly + set_time_zone(params) - # if results are specified without start or days parameters, allow start date to be larger - get_old_data = (params[:results] && params[:start].blank? and params[:days].blank?) ? true : false + # allow more past data if necessary + get_old_data = (params[:results].present? || params[:start].present? || params[:days].present?) ? true : false - start_date = (get_old_data) ? (Time.now - 1.year) : (Time.now - 1.day) - end_date = Time.now - start_date = (Time.now - params[:days].to_i.days) if params[:days] - start_date = DateTime.strptime(params[:start]) if params[:start] - end_date = DateTime.strptime(params[:end]) if params[:end] - date_range = (start_date..end_date) - # only get a maximum of 30 days worth of data - date_range = (end_date - 30.days..end_date) if ((end_date - start_date) > 30.days and !get_old_data) - - return date_range - end + start_date = (get_old_data) ? Time.parse('2010-01-01') : (Time.now - 1.day) + end_date = Time.now + start_date = (Time.now - params[:days].to_i.days) if params[:days] + start_date = DateTime.parse(params[:start]) if params[:start] + end_date = DateTime.parse(params[:end]) if params[:end] + date_range = (start_date..end_date) + # only get a maximum of 30 days worth of data + date_range = (end_date - 30.days..end_date) if ((end_date - start_date) > 30.days and !get_old_data) + return date_range + end - def is_a_number?(s) - s.to_s.gsub(/,/, '.').match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true - end - def set_time_zone(params) - # set timezone correctly - if params[:offset] + def set_time_zone(params) + # set timezone correctly + if params[:offset] # check for 0 offset first since it's the most common if params[:offset] == '0' Time.zone = 'UTC' else - Time.zone = set_timezone_from_offset(params[:offset]) + Time.zone = set_timezone_from_offset(params[:offset]) end - elsif current_user - Time.zone = current_user.time_zone - else - Time.zone = 'UTC' - end - end + elsif current_user + Time.zone = current_user.time_zone + else + Time.zone = 'UTC' + end + end # use the offset to find an appropriate timezone def set_timezone_from_offset(offset) offset = offset.to_i # keep track of whether a match was found found = false - + # loop through each timezone ActiveSupport::TimeZone.zones_map.each do |z| # set time zone Time.zone = z[0] timestring = Time.zone.now.to_s - + # if time zone matches the offset, leave it as the current timezone if (timestring.slice(-5..-3).to_i == offset and timestring.slice(-2..-1).to_i == 0) found = true break end end - + # if no time zone found, set to utc Time.zone = 'UTC' if !found - + return Time.zone end + def help + Helper.instance + end + + class Helper + include Singleton + include ActionView::Helpers::TextHelper + end end + diff --git a/app/controllers/apps_controller.rb b/app/controllers/apps_controller.rb new file mode 100644 index 0000000..e1db658 --- /dev/null +++ b/app/controllers/apps_controller.rb @@ -0,0 +1,9 @@ +class AppsController < ApplicationController + + def index + @menu = 'apps' + @title = 'Internet of Things Apps' if current_user.nil? + # @twitters = TwitterAccount.find(:all, :conditions => { :user_id => current_user.id }) if current_user + end + +end diff --git a/app/controllers/channels_controller.rb b/app/controllers/channels_controller.rb index 2734222..f8e69e9 100644 --- a/app/controllers/channels_controller.rb +++ b/app/controllers/channels_controller.rb @@ -1,258 +1,474 @@ class ChannelsController < ApplicationController - before_filter :require_user, :except => [ :show, :post_data ] - before_filter :set_channels_menu - protect_from_forgery :except => :post_data - require 'csv' + include ChannelsHelper, ApiKeys + before_filter :require_user, :except => [ :show, :post_data, :social_show, :social_feed, :public] + before_filter :set_channels_menu + layout 'application', :except => [:social_show, :social_feed] + protect_from_forgery :except => :post_data + require 'csv' - def index - @channels = current_user.channels - end + # view list of watched channels + def watched + @channels = current_user.watched_channels + end - def show - @channel = Channel.find(params[:id]) if params[:id] - @domain = domain + # user watches a channel + def watch + @watching = Watching.find_by_user_id_and_channel_id(current_user.id, params[:id]) - # if owner of channel - get_channel_data if current_user and @channel.user_id == current_user.id - end + # add watching + if params[:flag] == 'true' + @watching = Watching.new(:user_id => current_user.id, :channel_id => params[:id]) if @watching.nil? + @watching.save + # delete watching + else + @watching.delete if !@watching.nil? + end - def edit - get_channel_data - end + render :text => '1' + end - def update - @channel = current_user.channels.find(params[:id]) - @channel.update_attributes(params[:channel]) + # list public channels + def public + # get channels by ids + if params[:channel_ids].present? + flash[:notice] = t(:selected_channels) + @channels = Channel.public_viewable.by_array(params[:channel_ids]).order('ranking desc, updated_at DESC').paginate :page => params[:page] + # get channels that match a tag + elsif params[:tag].present? + flash[:notice] = "#{t(:tag).capitalize}: #{params[:tag]}" + @channels = Channel.public_viewable.active.order('ranking desc, updated_at DESC').with_tag(params[:tag]).paginate :page => params[:page] + # normal channel list + else + flash[:notice] = t(:featured_channels) + @channels = Channel.public_viewable.active.order('ranking desc, updated_at DESC').paginate :page => params[:page] + end - redirect_to channel_path(@channel.id) - end + respond_to do |format| + format.html + format.json { render :json => Channel.paginated_hash(@channels).to_json } + format.xml { render :xml => Channel.paginated_hash(@channels).to_xml(:root => 'response') } + end + end + + # widget for social feeds + def social_feed + # get domain based on ssl + @domain = domain((get_header_value('x_ssl') == 'true')) + end + + # main page for a socialsensornetwork.com project + def social_show + @channel = Channel.find_by_slug(params[:slug]) + + # redirect home if wrong slug + redirect_to '/' and return if @channel.nil? + + api_key = ApiKey.find(:first, :conditions => { :channel_id => @channel.id, :write_flag => 1 } ) + @post_url = "/update?key=#{api_key.api_key}" + + # names of non-blank channel fields + @fields = [] + @channel.attribute_names.each do |attr| + @fields.push(attr) if attr.index('field') and !@channel[attr].blank? + end + end + + def social_new + @channel = Channel.new + end + + def social_create + @channel = Channel.new(channel_params) + + # check for blank name + @channel.errors.add(:base, t(:social_channel_error_name_blank)) if @channel.name.blank? + + # check for blank slug + @channel.errors.add(:base, t(:social_channel_error_slug_blank)) if @channel.slug.blank? + + # check for at least one field + fields = false + @channel.attribute_names.each do |attr| + if (attr.index('field') or attr.index('status')) and !@channel[attr].blank? + fields = true + break + end + end + @channel.errors.add(:base, t(:social_channel_error_fields)) if !fields + + # check for existing slug + if @channel.errors.count == 0 + @channel.errors.add(:base, t(:social_channel_error_slug_exists)) if Channel.find_by_slug(@channel.slug) + end + + # if there are no errors + if @channel.errors.count == 0 + @channel.user_id = current_user.id + @channel.social = true + @channel.public_flag = true + @channel.save + + # create an api key for this channel + channel.add_write_api_key + + redirect_to channels_path + else + render :action => :social_new + end + + end + + def index + + @channels = current_user.channels + respond_to do |format| + format.html + format.json { render :json => @channels } + end + end + + def show + + @channel = Channel.find(params[:id]) if params[:id] + + @title = @channel.name + @domain = domain + @mychannel = (current_user && current_user.id == @channel.user_id) + @width = Chart.default_width + @height = Chart.default_height + + api_index @channel.id + # if owner of channel + get_channel_data if @mychannel + respond_to do |format| + format.html do + if @mychannel + render "private_show" + session[:errors] = nil + else + render "public_show" + session[:errors] = nil + end + end + format.json { render :json => @channel } + end + end + + def edit + get_channel_data + end + + + def update + + @channel = current_user.channels.find(params[:id]) + puts params[:channel].inspect + # make sure channel isn't social + #render :text => '' and return if @channel.social + if params["channel"]["video_type"].blank? && !params["channel"]["video_id"].blank? + @channel.errors.add(:base, t(:channel_video_type_blank)) + end + if @channel.errors.count <= 0 + @channel.save_tags(params[:tags][:name]) + @channel.assign_attributes(channel_params) + @channel.set_windows + @channel.save + else + session[:errors] = @channel.errors + redirect_to channel_path(@channel.id, :anchor => "channelsettings") and return + end + + flash[:notice] = t(:channel_update_success) + redirect_to channel_path(@channel.id) + + end def create channel = current_user.channels.create(:field1 => "#{t(:channel_default_field)} 1") + channel.set_windows + channel.save channel.add_write_api_key - - # redirect to edit the newly created channel - redirect_to edit_channel_path(channel) + @channel_id = channel.id + redirect_to channel_path(@channel_id, :anchor => "channelsettings") end # clear all data from a channel def clear channel = current_user.channels.find(params[:id]) channel.delete_feeds - channel.update_attribute(:last_entry_id, nil) + redirect_to channel_path(channel.id) + end + def destroy + channel = current_user.channels.find(params[:id]) + channel.destroy redirect_to channels_path - end + end - def destroy - channel = current_user.channels.find(params[:id]) - channel.destroy + # response is '0' if failure, 'entry_id' if success + def post_data - redirect_to channels_path - end + status = '0' + feed = Feed.new - # response is '0' if failure, 'entry_id' if success - def post_data - status = '0' - feed = Feed.new - - api_key = ApiKey.find_by_api_key(get_userkey) + api_key = ApiKey.find_by_api_key(get_apikey) - # if write persmission, allow post - if (api_key && api_key.write_flag) - channel = Channel.find(api_key.channel_id) + # if write permission, allow post + if (api_key && api_key.write_flag) + channel = api_key.channel - # update entry_id for channel and feed - entry_id = channel.last_entry_id.nil? ? 1 : channel.last_entry_id + 1 - channel.last_entry_id = entry_id - feed.entry_id = entry_id + # don't rate limit if tstream parameter is present + tstream = params[:tstream] || false; - # try to get created_at datetime if appropriate - if params[:created_at] - begin - feed.created_at = DateTime.parse(params[:created_at]) - # if invalid datetime, don't do anything--rails will set created_at - rescue - end - end - - # modify parameters - params.each do |key, value| - # strip line feeds from end of parameters - params[key] = value.sub(/\\n$/, '').sub(/\\r$/, '') if value - # use ip address if found - params[key] = request.remote_addr if value.upcase == 'IP_ADDRESS' - end - - # set feed details - feed.channel_id = channel.id - feed.raw_data = params - feed.field1 = params[:field1] if params[:field1] - feed.field2 = params[:field2] if params[:field2] - feed.field3 = params[:field3] if params[:field3] - feed.field4 = params[:field4] if params[:field4] - feed.field5 = params[:field5] if params[:field5] - feed.field6 = params[:field6] if params[:field6] - feed.field7 = params[:field7] if params[:field7] - feed.field8 = params[:field8] if params[:field8] - feed.status = params[:status] if params[:status] - feed.latitude = params[:lat] if params[:lat] - feed.latitude = params[:latitude] if params[:latitude] - feed.longitude = params[:long] if params[:long] - feed.longitude = params[:longitude] if params[:longitude] - feed.elevation = params[:elevation] if params[:elevation] + # don't rate limit if talkback_key parameter is present + talkback_key = params[:talkback_key] || false; - if channel.save && feed.save - status = entry_id - end - end - - # output response code - render :text => '0', :status => 400 and return if status == '0' - render :text => status - end + # rate limit posts if channel is not social and timespan is smaller than the allowed window + render :text => '0' and return if (RATE_LIMIT && !tstream && !talkback_key && !channel.social && Time.now < channel.updated_at + RATE_LIMIT_FREQUENCY.to_i.seconds) + + # if social channel, latitude MUST be present + render :text => '0' and return if (channel.social && params[:latitude].blank?) + + # update entry_id for channel and feed + entry_id = channel.next_entry_id + channel.last_entry_id = entry_id + feed.entry_id = entry_id + + # try to get created_at datetime if appropriate + if params[:created_at].present? + begin + feed.created_at = DateTime.parse(params[:created_at]) + # if invalid datetime, don't do anything--rails will set created_at + rescue + end + end + + # modify parameters + params.each do |key, value| + # this fails so much due to encoding problems that we need to ignore errors + begin + # strip line feeds from end of parameters + params[key] = value.sub(/\\n$/, '').sub(/\\r$/, '') if value + # use ip address if found + params[key] = get_header_value('X_REAL_IP') if value.try(:upcase) == 'IP_ADDRESS' + rescue + end + end + + # set feed details + feed.channel_id = channel.id + feed.field1 = params[:field1] || params['1'] if params[:field1] || params['1'] + feed.field2 = params[:field2] || params['2'] if params[:field2] || params['2'] + feed.field3 = params[:field3] || params['3'] if params[:field3] || params['3'] + feed.field4 = params[:field4] || params['4'] if params[:field4] || params['4'] + feed.field5 = params[:field5] || params['5'] if params[:field5] || params['5'] + feed.field6 = params[:field6] || params['6'] if params[:field6] || params['6'] + feed.field7 = params[:field7] || params['7'] if params[:field7] || params['7'] + feed.field8 = params[:field8] || params['8'] if params[:field8] || params['8'] + feed.status = params[:status] if params[:status] + feed.latitude = params[:lat] if params[:lat] + feed.latitude = params[:latitude] if params[:latitude] + feed.longitude = params[:long] if params[:long] + feed.longitude = params[:longitude] if params[:longitude] + feed.elevation = params[:elevation] if params[:elevation] + feed.location = params[:location] if params[:location] + + # if the saves were successful + if channel.save && feed.save + status = entry_id + + # check for tweet + if params[:twitter] && params[:tweet] + # check username + twitter_account = TwitterAccount.find_by_user_id_and_screen_name(api_key.user_id, params[:twitter]) + if twitter_account + twitter_account.tweet(params[:tweet]) + end + end + else + raise "Channel or Feed didn't save correctly" + end + end + + # if there is a talkback to execute + if params[:talkback_key].present? + talkback = Talkback.find_by_api_key(params[:talkback_key]) + command = talkback.execute_command! if talkback.present? + end + + # output response code + render(:text => '0', :status => 400) and return if status == '0' + + # if there is a talkback_key and a command that was executed + if params[:talkback_key].present? && command.present? + respond_to do |format| + format.html { render :text => command.command_string } + format.json { render :json => command.to_json } + format.xml { render :xml => command.to_xml(Command.public_options) } + end and return + end + + # if there is a talkback_key but no command + respond_with_blank and return if params[:talkback_key].present? && command.blank? + + # normal route, respond with the entry id of the feed + render :text => status + end + + # import view + def import + get_channel_data + end + + # upload csv file to channel + def upload + channel = Channel.find(params[:id]) + check_permissions(channel) + + # if no data + if params[:upload].blank? || params[:upload][:csv].blank? + flash[:error] = t(:upload_no_file) + redirect_to channel_path(channel.id, :anchor => "dataimport") and return + end + + # set time zone + Time.zone = params[:feed][:time_zone] + + # read data from uploaded file + csv_array = CSV.parse(params[:upload][:csv].read) + if csv_array.nil? || csv_array.blank? + flash[:error] = t(:upload_no_data) + redirect_to channel_path(channel.id, :anchor => "dataimport") and return + end + + # does the column have headers + headers = has_headers?(csv_array) + + # remember the column positions + entry_id_column = -1 + latitude_column = -1 + longitude_column = -1 + elevation_column = -1 + location_column = -1 + status_column = -1 + if headers + csv_array[0].each_with_index do |column, index| + entry_id_column = index if column.downcase == 'entry_id' + latitude_column = index if column.downcase == 'latitude' + longitude_column = index if column.downcase == 'longitude' + elevation_column = index if column.downcase == 'elevation' + location_column = index if column.downcase == 'location' + status_column = index if column.downcase == 'status' + end + end + + # delete the first row if it contains headers + csv_array.delete_at(0) if headers + + # determine if the date can be parsed + parse_date = date_parsable?(csv_array[0][0]) unless csv_array[0].nil? || csv_array[0][0].nil? + + # if 2 or more rows + if !csv_array[1].blank? + date1 = parse_date ? Time.parse(csv_array[0][0]) : Time.at(csv_array[0][0]) + date2 = parse_date ? Time.parse(csv_array[1][0]) : Time.at(csv_array[1][0]) + + # reverse the array if 1st date is larger than 2nd date + csv_array = csv_array.reverse if date1 > date2 + end + + # loop through each row + csv_array.each do |row| + # if row isn't blank + if !row.blank? + feed = Feed.new + + # set location and status then delete the rows + # these 5 deletes must be performed in the proper (reverse) order + feed.status = row.delete_at(status_column) if status_column > 0 + feed.location = row.delete_at(location_column) if location_column > 0 + feed.elevation = row.delete_at(elevation_column) if elevation_column > 0 + feed.longitude = row.delete_at(longitude_column) if longitude_column > 0 + feed.latitude = row.delete_at(latitude_column) if latitude_column > 0 + + # remove entry_id column if necessary + row.delete_at(entry_id_column) if entry_id_column > 0 + + # update entry_id for channel and feed + entry_id = channel.last_entry_id.nil? ? 1 : channel.last_entry_id + 1 + channel.last_entry_id = entry_id + feed.entry_id = entry_id + + # set feed data + feed.channel_id = channel.id + feed.created_at = parse_date ? Time.zone.parse(row[0]) : Time.zone.at(row[0].to_f) + feed.field1 = row[1] + feed.field2 = row[2] + feed.field3 = row[3] + feed.field4 = row[4] + feed.field5 = row[5] + feed.field6 = row[6] + feed.field7 = row[7] + feed.field8 = row[8] + + # save channel and feed + feed.save + channel.save + + end + end + + # set the user's time zone back + set_time_zone(params) + + # redirect + flash[:notice] = t(:upload_successful) + redirect_to channel_path(channel.id, :anchor => "dataimport") + end - # import view - def import - get_channel_data - end + private - # upload csv file to channel - def upload - # if no data - render :text => t(:select_file) and return if params[:upload].blank? or params[:upload][:csv].blank? + # only allow these params + def channel_params + params.require(:channel).permit(:name, :url, :description, :latitude, :longitude, :field1, :field2, :field3, :field4, :field5, :field6, :field7, :field8, :elevation, :public_flag, :status, :video_id, :video_type) + end - channel = Channel.find(params[:channel_id]) - channel_id = channel.id - # make sure channel belongs to current user - check_permissions(channel) - - # set time zone - Time.zone = params[:feed][:time_zone] + # determine if the date can be parsed + def date_parsable?(date) + return !is_a_number?(date) + end - # read data from uploaded file - csv_array = CSV.parse(params[:upload][:csv].read) + # determine if the csv file has headers + def has_headers?(csv_array) + headers = false - # does the column have headers - headers = has_headers?(csv_array) + # if there are at least 2 rows + if (csv_array[0] and csv_array[1]) + row0_integers = 0 + row1_integers = 0 - # remember the column positions - entry_id_column = -1 - latitude_column = -1 - longitude_column = -1 - elevation_column = -1 - status_column = -1 - if headers - csv_array[0].each_with_index do |column, index| - entry_id_column = index if column.downcase == 'entry_id' - latitude_column = index if column.downcase == 'latitude' - longitude_column = index if column.downcase == 'longitude' - elevation_column = index if column.downcase == 'elevation' - status_column = index if column.downcase == 'status' - end - end + # if first row, first value contains 'create' or 'date', assume it has headers + if (csv_array[0][0].downcase.include?('create') or csv_array[0][0].downcase.include?('date')) + headers = true + else + # count integers in row0 + csv_array[0].each_with_index do |value, i| + row0_integers += 1 if is_a_number?(value) + end - # delete the first row if it contains headers - csv_array.delete_at(0) if headers + # count integers in row1 + csv_array[1].each_with_index do |value, i| + row1_integers += 1 if is_a_number?(value) + end - # determine if the date can be parsed - parse_date = date_parsable?(csv_array[0][0]) + # if row1 has more integers, assume row0 is headers + headers = true if row1_integers > row0_integers + end + end - # if 2 or more rows - if !csv_array[1].blank? - date1 = parse_date ? Time.parse(csv_array[0][0]) : Time.at(csv_array[0][0]) - date2 = parse_date ? Time.parse(csv_array[1][0]) : Time.at(csv_array[1][0]) + return headers + end - # reverse the array if 1st date is larger than 2nd date - csv_array = csv_array.reverse if date1 > date2 - end +end - # loop through each row - csv_array.each do |row| - # if row isn't blank - if !row.blank? - feed = Feed.new - - # set location and status then delete the rows - # these 4 deletes must be performed in the proper (reverse) order - feed.status = row.delete_at(status_column) if status_column > 0 - feed.elevation = row.delete_at(elevation_column) if elevation_column > 0 - feed.longitude = row.delete_at(longitude_column) if longitude_column > 0 - feed.latitude = row.delete_at(latitude_column) if latitude_column > 0 - - # remove entry_id column if necessary - row.delete_at(entry_id_column) if entry_id_column > 0 - - # update entry_id for channel and feed - entry_id = channel.last_entry_id.nil? ? 1 : channel.last_entry_id + 1 - channel.last_entry_id = entry_id - feed.entry_id = entry_id - - # set feed data - feed.channel_id = channel_id - feed.created_at = parse_date ? Time.zone.parse(row[0]) : Time.zone.at(row[0].to_f) - feed.raw_data = row.to_s - feed.field1 = row[1] - feed.field2 = row[2] - feed.field3 = row[3] - feed.field4 = row[4] - feed.field5 = row[5] - feed.field6 = row[6] - feed.field7 = row[7] - feed.field8 = row[8] - - # save channel and feed - feed.save - channel.save - - end - end - - # set the user's time zone back - set_time_zone(params) - - # redirect - redirect_to channel_path(channel.id) - end - - -private - - # determine if the date can be parsed - def date_parsable?(date) - return !is_a_number?(date) - end - - # determine if the csv file has headers - def has_headers?(csv_array) - headers = false - - # if there are at least 2 rows - if (csv_array[0] and csv_array[1]) - row0_integers = 0 - row1_integers = 0 - - # if first row, first value contains 'create' or 'date', assume it has headers - if (csv_array[0][0].downcase.include?('create') or csv_array[0][0].downcase.include?('date')) - headers = true - else - # count integers in row0 - csv_array[0].each_with_index do |value, i| - row0_integers += 1 if is_a_number?(value) - end - - # count integers in row1 - csv_array[1].each_with_index do |value, i| - row1_integers += 1 if is_a_number?(value) - end - - # if row1 has more integers, assume row0 is headers - headers = true if row1_integers > row0_integers - end - end - - return headers - end - -end \ No newline at end of file diff --git a/app/controllers/charts_controller.rb b/app/controllers/charts_controller.rb index 0ab5b9a..556afc5 100644 --- a/app/controllers/charts_controller.rb +++ b/app/controllers/charts_controller.rb @@ -1,78 +1,110 @@ class ChartsController < ApplicationController + before_filter :require_user, :only => [:edit] + def edit + # params[:id] is the windows ID + @channel = current_user.channels.find(params[:channel_id]) - def index - set_channels_menu - @channel = Channel.find(params[:channel_id]) - @channel_id = params[:channel_id] - @domain = domain + window_id = params[:id] + logger.debug "Windows ID is #{window_id}" + window_detail = @channel.windows.find(window_id).becomes(ChartWindow).window_detail + options = window_detail.options unless window_detail.nil? + logger.debug "Options for window #{window_id} are " + options.inspect - # default chart size - @width = default_width - @height = default_height + render :partial => "charts/config", :locals => { + :displayconfig => false, + :title => @channel.name, + :src => "/channels/#{@channel.id}/charts/#{window_id}", + :options => options, + :index => window_id, + :width => Chart.default_width, + :height => Chart.default_height + } + end - check_permissions(@channel) - end + def index - def show - # allow these parameters when creating feed querystring - feed_params = ['key','days','start','end','round','timescale','average','median','sum'] + set_channels_menu + @channel = Channel.find(params[:channel_id]) + @channel_id = params[:channel_id] + @domain = domain - # default chart size - @width = default_width - @height = default_height + # default chart size + @width = Chart.default_width + @height = Chart.default_height - # add extra parameters to querystring - @qs = '' - params.each do |p| - @qs += "&#{p[0]}=#{p[1]}" if feed_params.include?(p[0]) - end + check_permissions(@channel) + end - # fix chart colors if necessary - params[:color] = fix_color(params[:color]) - params[:bgcolor] = fix_color(params[:bgcolor]) + def show - @domain = domain - render :layout => false - end + # allow these parameters when creating feed querystring + feed_params = ['key','days','start','end','round','timescale','average','median','sum','results','location','status'] - # save chart options - def update - @channel = Channel.find(params[:channel_id]) - @status = 0 + # default chart size + @width = Chart.default_width + @height = Chart.default_height - # check permissions - if @channel.user_id == current_user.id + # add extra parameters to querystring + @qs = '' + params.each do |p| + @qs += "&#{p[0]}=#{p[1]}" if feed_params.include?(p[0]) + end - # save data - @channel["options#{params[:id]}"] = params[:options] - if @channel.save - @status = 1 - end + # fix chart colors if necessary + params[:color] = fix_color(params[:color]) + params[:bgcolor] = fix_color(params[:bgcolor]) - end + # set ssl + @ssl = (get_header_value('x_ssl') == 'true') + @domain = domain(@ssl) - # return response: 1=success, 0=failure - render :json => @status.to_json - end + # should data be pushed off the end in dynamic chart + @push = (params[:push] and params[:push] == 'false') ? false : true + @results = params[:results] + render :layout => false + end - private - def default_width - 450 - end + # save chart options + def update + #Check to see if we're using the new options, or the old - def default_height - 250 - end + @channel = Channel.find(params[:channel_id]) + @status = 0 - # fixes chart color if user forgets the leading '#' - def fix_color(color) - # check for 3 or 6 character hexadecimal value - if (color and color.match(/^([0-9]|[a-f]|[A-F]){3}(([0-9]|[a-f]|[A-F]){3})?$/)) - color = '#' + color - end + # check permissions + if @channel.user_id == current_user.id + logger.debug "Saving Data with new options " + params[:newOptions].to_s + # save data + if params[:newOptions] + logger.debug "Updating new style options on window id #{params[:id]} with #{params[:newOptions][:options]}" + chart_window = @channel.windows.find(params[:id]).becomes(ChartWindow) + chart_window.window_detail.options = params[:newOptions][:options] + if !chart_window.save + raise "Couldn't save the Chart Window" + end + end + if @channel.save + @status = 1 + end - return color - end + end + + # return response: 1=success, 0=failure + render :json => @status.to_json + end + + private + + # fixes chart color if user forgets the leading '#' + def fix_color(color) + # check for 3 or 6 character hexadecimal value + if (color and color.match(/^([0-9]|[a-f]|[A-F]){3}(([0-9]|[a-f]|[A-F]){3})?$/)) + color = '#' + color + end + + return color + end end + diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb new file mode 100644 index 0000000..7e29f5d --- /dev/null +++ b/app/controllers/comments_controller.rb @@ -0,0 +1,47 @@ +class CommentsController < ApplicationController + before_filter :require_user + + def index + redirect_to channel_path(:id => params[:channel_id], :public => true) + end + + def create + render :text => '' and return if params[:userlogin].length > 0 + + @channel = Channel.find(params[:channel_id]) + @comment = @channel.comments.new + @comment.user = current_user + @comment.ip_address = get_header_value('X_REAL_IP') + @comment.parent_id = params[:parent_id] + @comment.body = params[:comment][:body].gsub(/<\/?[^>]*>/, '').gsub(/\n/, '
') + # save comment + if @comment.save + flash[:success] = "Thanks for adding a comment!" + else + flash[:error] = "Comment can't be blank!" + end + redirect_to :back + end + + def vote + # make sure this is a post + render :text => '' and return if !request.post? + + @comment = Comment.find(params[:id]) + @comment.flags += 1 + # delete if too many flags + if (@comment.flags > 3) + @comment.destroy + render :text => '' + # else save + else + @comment.save + render :text => '1' + end + end + + def destroy + comment = current_user.comments.find(params[:id]).destroy + redirect_to :back + end +end diff --git a/app/controllers/cors_controller.rb b/app/controllers/cors_controller.rb new file mode 100644 index 0000000..bebe86d --- /dev/null +++ b/app/controllers/cors_controller.rb @@ -0,0 +1,8 @@ +class CorsController < ApplicationController + skip_before_filter :verify_authenticity_token + + # dummy method that responds with status 200 for CORS preflighting + def preflight; render :nothing => true; end + +end + diff --git a/app/controllers/docs_controller.rb b/app/controllers/docs_controller.rb new file mode 100644 index 0000000..3a4b123 --- /dev/null +++ b/app/controllers/docs_controller.rb @@ -0,0 +1,19 @@ +class DocsController < ApplicationController + + def index; ;end + + def talkback + # default values + @talkback_id = 3 + @talkback_api_key = 'XXXXXXXXXXXXXXXX' + + # if user is signed in + if current_user && current_user.talkbacks.any? + @talkback = current_user.talkbacks.order('updated_at desc').first + @talkback_id = @talkback.id + @talkback_api_key = @talkback.api_key + end + end + +end + diff --git a/app/controllers/feed_controller.rb b/app/controllers/feed_controller.rb index bdf05cd..8bbf376 100644 --- a/app/controllers/feed_controller.rb +++ b/app/controllers/feed_controller.rb @@ -1,570 +1,254 @@ class FeedController < ApplicationController - require 'csv' - layout 'application', :except => :index + include FeedHelper + require 'csv' + layout 'application', :except => [:index, :debug] - def index - channel = Channel.find(params[:channel_id]) - api_key = ApiKey.find_by_api_key(get_userkey) - @success = channel_permission?(channel, api_key) + def index + feed_factory = FeedFactory.new(params) + channel = Channel.find(params[:channel_id]) + api_key = ApiKey.find_by_api_key(get_apikey) + @success = channel_permission?(channel, api_key) - # set timezone correctly - set_time_zone(params) + # set callback for jsonp + @callback = params[:callback] if params[:callback] - # set limits - limit = params[:results].to_i if params[:results] + # set csv headers if necessary + @csv_headers = feed_factory.feed_select_options if params[:format] == 'csv' - # check for access - if @success + # set timezone correctly + set_time_zone(params) - # create options hash - channel_options = { :only => channel_select_data(channel) } - select_options = feed_select_data(channel) + # check for access + if @success - # get feed based on conditions - feeds = Feed.find( - :all, - :conditions => { :channel_id => channel.id, :created_at => get_date_range(params) }, - :select => select_options, - :order => 'created_at desc', - :limit => limit - ) - - # keep track of whether data has been rounded already - rounded = false - - # if a feed has data - if !feeds.empty? - # convert to timescales if necessary - if timeparam_valid?(params[:timescale]) - feeds = feeds_into_timescales(feeds) - # convert to sums if necessary - elsif timeparam_valid?(params[:sum]) - feeds = feeds_into_sums(feeds) - rounded = true - # convert to averages if necessary - elsif timeparam_valid?(params[:average]) - feeds = feeds_into_averages(feeds) - rounded = true - # convert to medians if necessary - elsif timeparam_valid?(params[:median]) - feeds = feeds_into_medians(feeds) - rounded = true - end - end - - # if a feed needs to be rounded - if params[:round] and !rounded - feeds = object_round(feeds, params[:round].to_i) + if feed_factory.cache_feeds + # check cache for stored value + feed_output_cache_key = cache_key('feed_output') + channel_output_cache_key = cache_key('channel_output') + @feed_output = Rails.cache.read(feed_output_cache_key) + @channel_output = Rails.cache.read(channel_output_cache_key) end - # set output correctly - if params[:format] == 'xml' - @channel_output = channel.to_xml(channel_options).sub('', '').strip - @feed_output = feeds.to_xml(:skip_instruct => true).gsub(/\n/, "\n ").chop.chop - elsif params[:format] == 'csv' - @feed_output = feeds - else - @channel_output = channel.to_json(channel_options).chop - @feed_output = feeds.to_json - end + # if cache miss, get data + if @feed_output.nil? or @channel_output.nil? - # else no access, set error code - else - if params[:format] == 'xml' - @channel_output = bad_channel_xml - else - @channel_output = '-1'.to_json - end - end + # get feeds + feeds = feed_factory.get_output_feeds - # set callback for jsonp - @callback = params[:callback] if params[:callback] + # set output correctly + if params[:format] == 'xml' + @channel_output = channel.to_xml(channel.select_options).sub('', '').strip + @feed_output = feeds.to_xml(:skip_instruct => true).gsub(/\n/, "\n ").chop.chop + elsif params[:format] == 'csv' + @feed_output = feeds + else + @channel_output = channel.to_json(channel.select_options).chop + @feed_output = feeds.to_json(:only => feed_factory.feed_select_options) + end - # set csv headers if necessary - @csv_headers = select_options if params[:format] == 'csv' + if feed_factory.cache_feeds + # save to cache + Rails.cache.write(feed_output_cache_key, @feed_output, :expires_in => 5.minutes) + Rails.cache.write(channel_output_cache_key, @channel_output, :expires_in => 5.minutes) + end - # output proper http response if error - render :text => '-1', :status => 400 and return if !@success + end # end if feeds not empty - # output data in proper format - respond_to do |format| - format.html - format.json - format.xml - format.csv - end - end + # else no access, set error code + else + if params[:format] == 'xml' + @channel_output = bad_channel_xml + else + @channel_output = '-1'.to_json + end + end - def show - @channel = Channel.find(params[:channel_id]) - @api_key = ApiKey.find_by_api_key(get_userkey) - output = '-1' + # output proper http response if error + render :text => '-1', :status => 400 and return if !@success - # get most recent entry if necessary - params[:id] = @channel.last_entry_id if params[:id] == 'last' + # output data in proper format + respond_to do |format| + format.html + format.json + format.xml + format.csv + end + end - # set timezone correctly - set_time_zone(params) + def last_sum + last_method = method('last_group_call') + last_method.call('sums') + end - @feed = Feed.find( - :first, - :conditions => { :channel_id => @channel.id, :entry_id => params[:id] }, - :select => feed_select_data(@channel) - ) - @success = channel_permission?(@channel, @api_key) + def last_median + last_method = method('last_group_call') + last_method.call('medians') + end + + def last_average + last_method = method('last_group_call') + last_method.call('averages') + end + + def last_group_call(arg) + @channel = Channel.find(params[:channel_id]) + @api_key = ApiKey.find_by_api_key(get_apikey) + set_time_zone(params) + + # limit for the number of results to get + limit = 30 + limit = params[:sum].to_i if params[:sum].present? + limit = params[:median].to_i if params[:median].present? + limit = params[:average].to_i if params[:average].present? + # max limit of 100 past results + limit = 100 if limit > 100 + + # get the last (limit) feeds + last_feeds = Feed.where(:channel_id => @channel.id).limit(limit).order('created_at desc') + # put feeds in correct order (oldest to most recent) + last_feeds.reverse! + + feeds_into = self.method("feeds_into_#{arg}") + feed = feeds_into.call(last_feeds, params).last if last_feeds.length > 0 + create_group_result(feed) + end + + def create_group_result(feed) + @success = channel_permission?(@channel, @api_key) + + # if a feed needs to be rounded + if params[:round] && feed.present? + feed = item_round(feed, params[:round].to_i) + end + + # check for access + if @success && feed.present? + # set output correctly + if params[:format] == 'xml' + output = feed.to_xml + elsif params[:format] == 'csv' + @csv_headers = Feed.select_options(@channel, params) + elsif (params[:format] == 'txt' or params[:format] == 'text') + output = add_prepend_append(feed["field#{params[:field_id]}"]) + else + output = feed.to_json + end + # else set error code + else + if params[:format] == 'xml' + output = bad_feed_xml + else + output = '-1'.to_json + end + end + + # output data in proper format + respond_to do |format| + format.html { render :json => output } + format.json { render :json => output, :callback => params[:callback] } + format.xml { render :xml => output } + format.csv + format.text { render :text => output } + end + end + + def show + + @channel = Channel.find(params[:channel_id]) + @api_key = ApiKey.find_by_api_key(get_apikey) + output = '-1' + + # set timezone correctly + set_time_zone(params) + + # make sure field parameter is set correctly, changes "field1" to "1" + params[:field_id] = params[:field_id].sub('field', '') if params[:field_id].present? + + # if last entry + if params[:id] == 'last' && params[:field_id].present? && params[:field_id].to_i != 0 + # look for a feed where the value isn't null + @feed = Feed.where(:channel_id => @channel.id) + .where("field? is not null", params[:field_id].to_i) + .select(Feed.select_options(@channel, params)) + .order('entry_id desc') + .first + # else get by entry + else + # get most recent entry if necessary + params[:id] = @channel.last_entry_id if params[:id] == 'last' + @feed = Feed.where(:channel_id => @channel.id, :entry_id => params[:id]).select(Feed.select_options(@channel, params)).first + end + + @success = channel_permission?(@channel, @api_key) # if a feed needs to be rounded if params[:round] @feed = item_round(@feed, params[:round].to_i) end - # check for access - if @success - # set output correctly - if params[:format] == 'xml' - output = @feed.to_xml - elsif params[:format] == 'csv' - @csv_headers = feed_select_data(@channel) - elsif (params[:format] == 'txt' or params[:format] == 'text') - output = add_prepend_append(@feed["field#{params[:field_id]}"]) - else - output = @feed.to_json - end - # else set error code - else - if params[:format] == 'xml' - output = bad_feed_xml - else - output = '-1'.to_json - end - end + # check for access + if @success and @feed - # output data in proper format - respond_to do |format| - format.html { render :json => output } - format.json { render :json => output, :callback => params[:callback] } - format.xml { render :xml => output } - format.csv - format.text { render :text => output } - end - end + # set output correctly + if params[:format] == 'xml' + output = @feed.to_xml + elsif params[:format] == 'csv' + @csv_headers = Feed.select_options(@channel, params) + elsif (params[:format] == 'txt' or params[:format] == 'text') + output = add_prepend_append(@feed["field#{params[:field_id]}"]) + else + output = @feed.to_json - private - - # only output these fields for channel - def channel_select_data(channel) - only = [:name, :created_at, :updated_at, :id, :last_entry_id] - only += [:description] unless channel.description.blank? - only += [:latitude] unless channel.latitude.blank? - only += [:longitude] unless channel.longitude.blank? - only += [:elevation] unless channel.elevation.blank? - only += [:field1] unless channel.field1.blank? - only += [:field2] unless channel.field2.blank? - only += [:field3] unless channel.field3.blank? - only += [:field4] unless channel.field4.blank? - only += [:field5] unless channel.field5.blank? - only += [:field6] unless channel.field6.blank? - only += [:field7] unless channel.field7.blank? - only += [:field8] unless channel.field8.blank? - - return only - end - - # only output these fields for feed - def feed_select_data(channel) - only = [:created_at] - only += [:entry_id] unless timeparam_valid?(params[:timescale]) or timeparam_valid?(params[:average]) or timeparam_valid?(params[:median]) or timeparam_valid?(params[:sum]) - only += [:field1] unless channel.field1.blank? or (params[:field_id] and params[:field_id] != '1') - only += [:field2] unless channel.field2.blank? or (params[:field_id] and params[:field_id] != '2') - only += [:field3] unless channel.field3.blank? or (params[:field_id] and params[:field_id] != '3') - only += [:field4] unless channel.field4.blank? or (params[:field_id] and params[:field_id] != '4') - only += [:field5] unless channel.field5.blank? or (params[:field_id] and params[:field_id] != '5') - only += [:field6] unless channel.field6.blank? or (params[:field_id] and params[:field_id] != '6') - only += [:field7] unless channel.field7.blank? or (params[:field_id] and params[:field_id] != '7') - only += [:field8] unless channel.field8.blank? or (params[:field_id] and params[:field_id] != '8') - - # add geolocation data if necessary - if params[:location] and params[:location].upcase == 'TRUE' - only += [:latitude] - only += [:longitude] - only += [:elevation] - end - - # add status if necessary - only += [:status] if params[:status] and params[:status].upcase == 'TRUE' - - return only - end - - # checks for valid timescale - def timeparam_valid?(timeparam) - valid_minutes = [10, 15, 20, 30, 60, 240, 720, 1440] - if timeparam and valid_minutes.include?(timeparam.to_i) - return true - else - return false - end - end - - # applies rounding to an enumerable object - def object_round(object, round=nil, match='field') - object.each_with_index do |o, index| - object[index] = item_round(o, round, match) end - - return object + # else set error code + else + if params[:format] == 'xml' + output = bad_feed_xml + else + output = '-1'.to_json + end end - # applies rounding to a single item's attributes if necessary - def item_round(item, round=nil, match='field') - # for each attribute - item.attribute_names.each do |attr| - # only add non-null numeric fields - if attr.index(match) and !item[attr].nil? and is_a_number?(item[attr]) - # keep track of whether the value contains commas - comma_flag = (item[attr].to_s.index(',')) ? true : false - - # replace commas with decimals if appropriate - item[attr] = item[attr].to_s.gsub(/,/, '.') if comma_flag - - # do the actual rounding - item[attr] = sprintf "%.#{round}f", item[attr] - - # replace decimals with commas if appropriate - item[attr] = item[attr].to_s.gsub(/\./, ',') if comma_flag - end - end - - # output new item - return item + # output data in proper format + respond_to do |format| + format.html { render :json => output } + format.json { render :json => output, :callback => params[:callback] } + format.xml { render :xml => output } + format.csv + format.text { render :text => output } end + end - # slice feed into timescales - def feeds_into_timescales(feeds) - # convert timescale (minutes) into seconds - seconds = params[:timescale].to_i * 60 - # get floored time ranges - start_time = get_floored_time(feeds.first.created_at, seconds) - end_time = get_floored_time(feeds.last.created_at, seconds) + def debug + @time_start = Time.now - # create empty array with appropriate size - timeslices = Array.new((((end_time - start_time) / seconds).abs).floor) + channel = Channel.find(params[:channel_id]) + api_key = ApiKey.find_by_api_key(get_apikey) + @success = channel_permission?(channel, api_key) + # create options hash + select_options = Feed.select_options(channel, params) - # create a blank clone of the first feed so that we only get the necessary attributes - empty_feed = create_empty_clone(feeds.first) + # get feed based on conditions + feeds = Feed.find( + :all, + :conditions => { :channel_id => channel.id, :created_at => get_date_range(params) }, + :select => select_options, + :order => 'created_at desc' + ) + @count = feeds.count + @time_after_db = Time.now - # add feeds to array - feeds.each do |f| - i = ((f.created_at - start_time) / seconds).floor - f.created_at = start_time + i * seconds - timeslices[i] = f if timeslices[i].nil? - end + # sort properly + feeds.reverse! - # fill in empty array elements - timeslices.each_index do |i| - if timeslices[i].nil? - current_feed = empty_feed.clone - current_feed.created_at = (start_time + (i * seconds)) - timeslices[i] = current_feed - end - end + @time_after_sort = Time.now - return timeslices - end + @channel_output = channel.to_json(channel.select_options).chop + @feed_output = feeds.to_json - # slice feed into averages - def feeds_into_averages(feeds) - # convert timescale (minutes) into seconds - seconds = params[:average].to_i * 60 - # get floored time ranges - start_time = get_floored_time(feeds.first.created_at, seconds) - end_time = get_floored_time(feeds.last.created_at, seconds) - - # create empty array with appropriate size - timeslices = Array.new(((end_time - start_time) / seconds).floor) - - # create a blank clone of the first feed so that we only get the necessary attributes - empty_feed = create_empty_clone(feeds.first) - - # add feeds to array - feeds.each do |f| - i = ((f.created_at - start_time) / seconds).floor - f.created_at = start_time + i * seconds - # create multidimensional array - timeslices[i] = [] if timeslices[i].nil? - timeslices[i].push(f) - end - - # keep track of whether numbers use commas as decimals - comma_flag = false - - # fill in array - timeslices.each_index do |i| - # insert empty values - if timeslices[i].nil? - current_feed = empty_feed.clone - current_feed.created_at = (start_time + (i * seconds)) - timeslices[i] = current_feed - # else average the inner array - else - sum_feed = empty_feed.clone - sum_feed.created_at = timeslices[i].first.created_at - # for each feed - timeslices[i].each do |f| - # for each attribute, add to sum_feed so that we have the total - sum_feed.attribute_names.each do |attr| - - # only add non-null integer fields - if attr.index('field') and !f[attr].nil? and is_a_number?(f[attr]) - # set comma_flag once if we find a number with a comma - comma_flag = true if !comma_flag and f[attr].to_s.index(',') - - # set initial data - if sum_feed[attr].nil? - sum_feed[attr] = parsefloat(f[attr]) - # add data - elsif f[attr] - sum_feed[attr] = parsefloat(sum_feed[attr]) + parsefloat(f[attr]) - end - end - - end - end - - # set to the averaged feed - timeslices[i] = object_average(sum_feed, timeslices[i].length, comma_flag, params[:round]) - end - end - - return timeslices - end - - # slice feed into medians - def feeds_into_medians(feeds) - # convert timescale (minutes) into seconds - seconds = params[:median].to_i * 60 - # get floored time ranges - start_time = get_floored_time(feeds.first.created_at, seconds) - end_time = get_floored_time(feeds.last.created_at, seconds) - - # create empty array with appropriate size - timeslices = Array.new(((end_time - start_time) / seconds).floor) - - # create a blank clone of the first feed so that we only get the necessary attributes - empty_feed = create_empty_clone(feeds.first) - - # add feeds to array - feeds.each do |f| - i = ((f.created_at - start_time) / seconds).floor - f.created_at = start_time + i * seconds - # create multidimensional array - timeslices[i] = [] if timeslices[i].nil? - timeslices[i].push(f) - end - - # keep track of whether numbers use commas as decimals - comma_flag = false - - # fill in array - timeslices.each_index do |i| - # insert empty values - if timeslices[i].nil? - current_feed = empty_feed.clone - current_feed.created_at = (start_time + (i * seconds)) - timeslices[i] = current_feed - # else get median values for the inner array - else - - # create blank hash called 'fields' to hold data - fields = {} - - # for each feed - timeslices[i].each do |f| - - # for each attribute - f.attribute_names.each do |attr| - if attr.index('field') - - # create blank array for each field - fields["#{attr}"] = [] if fields["#{attr}"].nil? - - # push numeric field data onto its array - if is_a_number?(f[attr]) - # set comma_flag once if we find a number with a comma - comma_flag = true if !comma_flag and f[attr].to_s.index(',') - - fields["#{attr}"].push(parsefloat(f[attr])) - end - - end - end - - end - - # sort fields arrays - fields.each_key do |key| - fields[key] = fields[key].compact.sort - end - - # get the median - median_feed = empty_feed.clone - median_feed.created_at = timeslices[i].first.created_at - median_feed.attribute_names.each do |attr| - median_feed[attr] = object_median(fields[attr], comma_flag, params[:round]) if attr.index('field') - end - - timeslices[i] = median_feed - - end - end - - return timeslices - end - - # slice feed into sums - def feeds_into_sums(feeds) - # convert timescale (minutes) into seconds - seconds = params[:sum].to_i * 60 - # get floored time ranges - start_time = get_floored_time(feeds.first.created_at, seconds) - end_time = get_floored_time(feeds.last.created_at, seconds) - - # create empty array with appropriate size - timeslices = Array.new(((end_time - start_time) / seconds).floor) - - # create a blank clone of the first feed so that we only get the necessary attributes - empty_feed = create_empty_clone(feeds.first) - - # add feeds to array - feeds.each do |f| - i = ((f.created_at - start_time) / seconds).floor - f.created_at = start_time + i * seconds - # create multidimensional array - timeslices[i] = [] if timeslices[i].nil? - timeslices[i].push(f) - end - - # keep track of whether numbers use commas as decimals - comma_flag = false - - # fill in array - timeslices.each_index do |i| - # insert empty values - if timeslices[i].nil? - current_feed = empty_feed.clone - current_feed.created_at = (start_time + (i * seconds)) - timeslices[i] = current_feed - # else sum the inner array - else - sum_feed = empty_feed.clone - sum_feed.created_at = timeslices[i].first.created_at - # for each feed - timeslices[i].each do |f| - # for each attribute, add to sum_feed so that we have the total - sum_feed.attribute_names.each do |attr| - # only add non-null integer fields - if attr.index('field') and !f[attr].nil? and is_a_number?(f[attr]) - - # set comma_flag once if we find a number with a comma - comma_flag = true if !comma_flag and f[attr].to_s.index(',') - - # set initial data - if sum_feed[attr].nil? - sum_feed[attr] = parsefloat(f[attr]) - # add data - elsif f[attr] - sum_feed[attr] = parsefloat(sum_feed[attr]) + parsefloat(f[attr]) - end - - end - end - end - - # set to the summed feed - timeslices[i] = object_sum(sum_feed, comma_flag, params[:round]) - end - end - - return timeslices - end - - def is_a_number?(s) - s.to_s.gsub(/,/, '.').match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true - end - - def parsefloat(number) - return number.to_s.gsub(/,/, '.').to_f - end - - # gets the median for an object - def object_median(object, comma_flag=false, round=nil) - return nil if object.nil? - length = object.length - return nil if length == 0 - output = '' - - # do the calculation - if length % 2 == 0 - output = (object[(length - 1) / 2] + object[length / 2]) / 2 - else - output = object[(length - 1) / 2] - end - - output = sprintf "%.#{round}f", output if round and is_a_number?(output) - - # replace decimals with commas if appropriate - output = output.to_s.gsub(/\./, ',') if comma_flag - - return output.to_s - end - - # averages a summed object over length - def object_average(object, length, comma_flag=false, round=nil) - object.attribute_names.each do |attr| - # only average non-null integer fields - if !object[attr].nil? and is_a_number?(object[attr]) - if round - object[attr] = sprintf "%.#{round}f", (parsefloat(object[attr]) / length) - else - object[attr] = (parsefloat(object[attr]) / length).to_s - end - # replace decimals with commas if appropriate - object[attr] = object[attr].gsub(/\./, ',') if comma_flag - end - end - - return object - end - - # formats a summed object correctly - def object_sum(object, comma_flag=false, round=nil) - object.attribute_names.each do |attr| - # only average non-null integer fields - if !object[attr].nil? and is_a_number?(object[attr]) - if round - object[attr] = sprintf "%.#{round}f", parsefloat(object[attr]) - else - object[attr] = parsefloat(object[attr]).to_s - end - # replace decimals with commas if appropriate - object[attr] = object[attr].gsub(/\./, ',') if comma_flag - end - end - - return object - end - - # creates an empty clone of an object - def create_empty_clone(object) - empty_clone = object.dup - empty_clone.attribute_names.each { |attr| empty_clone[attr] = nil } - return empty_clone - end - - # gets time floored to proper interval - def get_floored_time(input_time, seconds) - return Time.zone.at((input_time.to_f / seconds).floor * seconds) - end + @time_after_json = Time.now + end end + diff --git a/app/controllers/mailer_controller.rb b/app/controllers/mailer_controller.rb index eb2e62e..c3e5645 100644 --- a/app/controllers/mailer_controller.rb +++ b/app/controllers/mailer_controller.rb @@ -1,20 +1,23 @@ class MailerController < ApplicationController - def resetpassword - @user = User.find_by_login_or_email(params[:user][:login]) + def resetpassword + # protect against bots + render :text => '' and return if params[:userlogin].length > 0 - if @user.nil? - session[:mail_message] = t(:account_not_found) - else - begin - @user.reset_perishable_token! - # Mailer.password_reset(@user, "https://www.thingspeak.com/users/#{@user.id}/reset_password?token=#{@user.perishable_token}").deliver - session[:mail_message] = t(:password_reset_mailed) - rescue - session[:mail_message] = t(:password_reset_error) - end - end - redirect_to login_path - end + @user = User.find_by_login_or_email(params[:user][:login]) + if @user.nil? + sleep 2 + session[:mail_message] = t(:account_not_found) + else + begin + @user.reset_perishable_token! + Mailer.password_reset(@user, "#{RESET_PASSWORD_URL}#{@user.id}?token=#{@user.perishable_token}").deliver + session[:mail_message] = t(:password_reset_mailed) + rescue + session[:mail_message] = t(:password_reset_error) + end + end + redirect_to login_path + end end diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb new file mode 100644 index 0000000..2e9a188 --- /dev/null +++ b/app/controllers/maps_controller.rb @@ -0,0 +1,44 @@ +class MapsController < ApplicationController + + # show map with channel's location + def channel_show + set_map_vars + render :layout => false + end + + # show social map with feed points as markers + def show + set_map_vars + render :layout => false + end + + # set map variables + def set_map_vars + # allow these parameters when creating feed querystring + feed_params = ['key','days','start','end','round','timescale','average','median','sum','results','status'] + + # default map size + @width = default_width + @height = default_height + + # add extra parameters to querystring + @qs = '' + params.each do |p| + @qs += "&#{p[0]}=#{p[1]}" if feed_params.include?(p[0]) + end + + # set ssl + @ssl = (get_header_value('x_ssl') == 'true') + @map_domain = @ssl ? 'https://maps-api-ssl.google.com' : 'http://maps.google.com' + @domain = domain(@ssl) + end + + private + def default_width + 450 + end + + def default_height + 250 + end +end diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 23d7a02..acd6a29 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -1,7 +1,23 @@ class PagesController < ApplicationController + layout 'application', :except => [:social_home] - def home - @menu = 'home' - end + def home + @menu = 'home' + @title = 'Internet of Things' + end + + def social_home; ; end + + def features + @menu = 'features' + end + + def about + @menu = 'about' + end + + def headers + end end + diff --git a/app/controllers/pipes_controller.rb b/app/controllers/pipes_controller.rb new file mode 100644 index 0000000..7cc83c3 --- /dev/null +++ b/app/controllers/pipes_controller.rb @@ -0,0 +1,16 @@ +class PipesController < ApplicationController + before_filter :require_admin, :set_admin_menu + + def index + @pipes = Pipe.paginate :page => params[:page], :order => 'created_at DESC' + end + + def new + @pipe = Pipe.new + end + + def create + + end + +end diff --git a/app/controllers/plugins_controller.rb b/app/controllers/plugins_controller.rb new file mode 100644 index 0000000..ae9eb61 --- /dev/null +++ b/app/controllers/plugins_controller.rb @@ -0,0 +1,161 @@ +class PluginsController < ApplicationController + before_filter :require_user, :except => [:show_public, :show] + before_filter :set_plugins_menu + before_filter :check_permission, :only => ['edit', 'update', 'ajax_update', 'destroy'] + + def check_permission + @plugin = Plugin.find(params[:id]) + if @plugin.user_id != current_user.id + render :text=> "#{t(:permission)} #{t(:plugin)}", :layout => true + return true + end + return false + end + + def index + @plugins = current_user.plugins + + end + + def public_plugins + + channel_id = params[:channel_id].to_i + return if channel_id.nil? + #private page should display all plugins + #plugins = current_user.plugins.where("private_flag = true") + @plugin_windows = [] + plugins = current_user.plugins + plugins.each do |plugin| + plugin.make_windows channel_id, api_domain #will only make the window the first time + @plugin_windows = @plugin_windows + plugin.public_dashboard_windows(channel_id) + + end + + respond_to do |format| + format.html { render :partial => 'plugins' } + end + + end + + def private_plugins + channel_id = params[:channel_id].to_i + return if channel_id.nil? + #private page should display all plugins + @plugin_windows = [] + + plugins = current_user.plugins + + plugins.each do |plugin| + plugin.make_windows channel_id, api_domain #will only make the window the first time + @plugin_windows = @plugin_windows + plugin.private_dashboard_windows(channel_id) + end + respond_to do |format| + format.html { render :partial => 'plugins' } + end + end + + def create + # add plugin with defaults + @plugin = Plugin.new + @plugin.html = read_file('app/views/plugins/default.html') + @plugin.css = read_file('app/views/plugins/default.css') + @plugin.js = read_file('app/views/plugins/default.js') + @plugin.user_id = current_user.id + @plugin.private_flag = true + @plugin.save + + # now that the plugin is saved, we can create the default name + @plugin.name = "#{t(:plugin_default_name)} #{@plugin.id}" + @plugin.save + + # redirect to edit the newly created plugin + redirect_to edit_plugin_path(@plugin.id) + end + + def show + # Have to check permissions in the method so I can use show to display public, or private plugins + @plugin = Plugin.find(params[:id]) + if @plugin.private? + return if require_user + render :text=> "#{t(:permission)} #{t(:plugin)}", :layout => true and return if check_permission + end + @output = @plugin.html.sub('%%PLUGIN_CSS%%', @plugin.css).sub('%%PLUGIN_JAVASCRIPT%%', @plugin.js) + + if @plugin.private? + render :layout => false and return + else + if request.url.include? api_domain + render :layout => false and return + else + + protocol = ssl + host = api_domain.split('://')[1] + + redirect_to :host => host, + :protocol => protocol, + :controller => "plugins", + :action => "show", + :id => @plugin.id and return + end + end + end + + def show_public + + @plugin = Plugin.find(params[:id]) + @output = @plugin.html.sub('%%PLUGIN_CSS%%', @plugin.css).sub('%%PLUGIN_JAVASCRIPT%%', @plugin.js) + if @plugin.private? + render :layout => false + else + if request.url.include? 'api_domain' + render :layout => false + else + + redirect_to :host => api_domain, + :controller => "plugins", + :action => "show", + :id => @plugin.id + end + end + end + + def edit + end + + def update + @plugin.update_attribute(:name, params[:plugin][:name]) + @plugin.update_attribute(:private_flag, params[:plugin][:private_flag]) + @plugin.update_attribute(:css, params[:plugin][:css]) + @plugin.update_attribute(:js, params[:plugin][:js]) + @plugin.update_attribute(:html,params[:plugin][:html]) + + if @plugin.save + + @plugin.update_all_windows + redirect_to plugins_path and return + end + + end + + def ajax_update + status = 0 + @plugin.update_attribute(:name, params[:plugin][:name]) + @plugin.update_attribute(:private_flag, params[:plugin][:private_flag]) + @plugin.update_attribute(:css, params[:plugin][:css]) + @plugin.update_attribute(:js, params[:plugin][:js]) + @plugin.update_attribute(:html, params[:plugin][:html]) + + if @plugin.save + @plugin.update_all_windows + status = 1 + end + + # return response: 1=success, 0=failure + render :json => status.to_json + end + + def destroy + @plugin.destroy + redirect_to plugins_path + end +end diff --git a/app/controllers/status_controller.rb b/app/controllers/status_controller.rb index a851c5f..983eec1 100644 --- a/app/controllers/status_controller.rb +++ b/app/controllers/status_controller.rb @@ -1,114 +1,158 @@ class StatusController < ApplicationController - require 'csv' + require 'csv' + layout false - def index - @channel = Channel.find(params[:channel_id]) - @api_key = ApiKey.find_by_api_key(get_userkey) - @success = channel_permission?(@channel, @api_key) + def recent + logger.info "Domain is #{@domain}" + channel = Channel.find(params[:channel_id]) + @channel_id = channel.id + if channel.public_flag || (current_user && current_user.id == channel.user_id) + @statuses = channel.recent_statuses + respond_to do |format| + format.html { render :partial => 'status/recent' } + format.json { render :json => @statuses} + end + else + respond_to do |format| + format.json { render :json => 'Status are not public' } + format.html { render :text => 'Sorry the statuses are not public' } + end + end + + end - # check for access - if @success - # create options hash - channel_options = { :only => channel_select_terse(@channel) } - # display only 1 day by default - params[:days] = 1 if !params[:days] + def index + @channel = Channel.find(params[:channel_id]) + @api_key = ApiKey.find_by_api_key(get_apikey) + @success = channel_permission?(@channel, @api_key) - # get feed based on conditions - @feeds = Feed.find( - :all, - :conditions => { :channel_id => @channel.id, :created_at => get_date_range(params) }, - :select => [:created_at, :status], - :order => 'created_at' - ) + # check for access + if @success + # create options hash + channel_options = { :only => channel_select_terse(@channel) } - # set output correctly - if params[:format] == 'xml' - @channel_output = @channel.to_xml(channel_options).sub('', '').strip - @feed_output = @feeds.to_xml(:skip_instruct => true).gsub(/\n/, "\n ").chop.chop - elsif params[:format] == 'csv' - @csv_headers = [:created_at, :status] - @feed_output = @feeds - else - @channel_output = @channel.to_json(channel_options).chop - @feed_output = @feeds.to_json - end - # else set error code - else - if params[:format] == 'xml' - @channel_output = bad_channel_xml - else - @channel_output = '-1'.to_json - end - end + # display only 1 day by default + params[:days] = 1 if !params[:days] - # set callback for jsonp - @callback = params[:callback] if params[:callback] - # output data in proper format - respond_to do |format| - format.html { render :text => @feed_output } - format.json { render "feed/index" } - format.xml { render "feed/index" } - format.csv { render "feed/index" } - end - end + # set limits + limit = (request.format == 'csv') ? 1000000 : 8000 + limit = params[:results].to_i if (params[:results] and params[:results].to_i < 8000) - def show - @channel = Channel.find(params[:channel_id]) - @api_key = ApiKey.find_by_api_key(params[:key]) - output = '-1' + # get feed based on conditions + @feeds = @channel.feeds.find( + :all, + :conditions => { :created_at => get_date_range(params) }, + :select => [:created_at, :entry_id, :status], + :order => 'created_at desc', + :limit => limit + ) - # get most recent entry if necessary - params[:id] = @channel.last_entry_id if params[:id] == 'last' + # sort properly + @feeds.reverse! - @feed = Feed.find( - :first, - :conditions => { :channel_id => @channel.id, :entry_id => params[:id] }, - :select => [:created_at, :status] - ) - @success = channel_permission?(@channel, @api_key) - # check for access - if @success - # set output correctly - if params[:format] == 'xml' - output = @feed.to_xml - elsif params[:format] == 'csv' - @csv_headers = [:created_at, :entry_id, :status] - elsif (params[:format] == 'txt' or params[:format] == 'text') - output = add_prepend_append(@feed.status) - else - output = @feed.to_json - end - # else set error code - else - if params[:format] == 'xml' - output = bad_feed_xml - else - output = '-1'.to_json - end - end + # set output correctly + if request.format == 'xml' + @channel_output = @channel.to_xml(channel_options).sub('', '').strip + @feed_output = @feeds.to_xml(:skip_instruct => true).gsub(/\n/, "\n ").chop.chop + elsif request.format == 'csv' + @csv_headers = [:created_at, :entry_id, :status] + @feed_output = @feeds + else + @channel_output = @channel.to_json(channel_options).chop + @feed_output = @feeds.to_json + end + # else set error code + else + if params[:format] == 'xml' + @channel_output = bad_channel_xml + else + @channel_output = '-1'.to_json - # output data in proper format - respond_to do |format| - format.html { render :json => output } - format.json { render :json => output, :callback => params[:callback] } - format.xml { render :xml => output } - format.csv { render :action => 'feed/show' } - format.text { render :text => output } - end - end + end + end + + # set callback for jsonp + @callback = params[:callback] if params[:callback] + + # output data in proper format + respond_to do |format| + + format.html { render :template => 'feed/index' } + format.json { render :template => 'feed/index' } + format.xml { render :template => 'feed/index' } + format.csv { render :template => 'feed/index' } + + end + end + + def show + @channel = Channel.find(params[:channel_id]) + @api_key = ApiKey.find_by_api_key(get_apikey) + output = '-1' + + # get most recent entry if necessary + params[:id] = @channel.last_entry_id if params[:id] == 'last' + + + @feed = @channel.feeds.find( + :first, + :conditions => { :entry_id => params[:id] }, + :select => [:created_at, :entry_id, :status] + ) + + @success = channel_permission?(@channel, @api_key) + + # check for access + if @success + # set output correctly + + if request.format == 'xml' + output = @feed.to_xml + elsif request.format == 'csv' + @csv_headers = [:created_at, :entry_id, :status] + elsif (request.format == 'txt' or request.format == 'text') + + output = add_prepend_append(@feed.status) + else + output = @feed.to_json + end + + # else set error code + else + if request.format == 'xml' + + output = bad_feed_xml + else + output = '-1'.to_json + end + end + + # output data in proper format + respond_to do |format| + format.html { render :json => output } + format.json { render :json => output, :callback => params[:callback] } + + format.xml { render :xml => output } + format.csv { render :action => 'feed/show' } + + format.text { render :text => output } + end + end + + private + + # only output these fields for channel + def channel_select_terse(channel) + only = [:name] + only += [:latitude] unless channel.latitude.nil? + only += [:longitude] unless channel.longitude.nil? + only += [:elevation] unless channel.elevation.nil? or channel.elevation.empty? + + return only + end - private - # only output these fields for channel - def channel_select_terse(channel) - only = [:name] - only += [:latitude] unless channel.latitude.nil? - only += [:longitude] unless channel.longitude.nil? - only += [:elevation] unless channel.elevation.nil? or channel.elevation.empty? - - return only - end end diff --git a/app/controllers/subdomains_controller.rb b/app/controllers/subdomains_controller.rb index ec3a272..ba4603b 100644 --- a/app/controllers/subdomains_controller.rb +++ b/app/controllers/subdomains_controller.rb @@ -1,15 +1,15 @@ class SubdomainsController < ApplicationController - # show a blank page if subdomain - def index - render :text => '' - end + # show a blank page if subdomain + def index + render :text => '' + end - # output the file crossdomain.xml.erb - def crossdomain - respond_to do |format| - format.xml - end - end + # output the file crossdomain.xml.erb + def crossdomain + respond_to do |format| + format.xml + end + end end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb new file mode 100644 index 0000000..71c2cdf --- /dev/null +++ b/app/controllers/tags_controller.rb @@ -0,0 +1,37 @@ +class TagsController < ApplicationController + def index + + render 'show' and return if params[:channel_id].nil? + + channel = Channel.find(params[:channel_id]) + if current_user && channel.nil? + tag = Tag.find_by_name(params[:id], :include => :channels, :conditions => ['channels.public_flag = true OR channels.user_id = ?', current_user.id]) + else + channels = [] + channel.tags.each do |tag| + channels << tag.channel_ids + end + + channels = channels.flatten.uniq + + end + redirect_to public_channels_path(:channel_ids => channels) + end + + def create + redirect_to tag_path(params[:tag][:name]) + end + + def show + # if user is logged in, search their channels also + if current_user + tag = Tag.find_by_name(params[:id], :include => :channels, :conditions => ['channels.public_flag = true OR channels.user_id = ?', current_user.id]) + # else only search public channels + else + tag = Tag.find_by_name(params[:id], :include => :channels, :conditions => ['channels.public_flag = true']) + end + + @results = tag.channels if tag + end + +end diff --git a/app/controllers/user_sessions_controller.rb b/app/controllers/user_sessions_controller.rb index 52d4c6a..630d422 100644 --- a/app/controllers/user_sessions_controller.rb +++ b/app/controllers/user_sessions_controller.rb @@ -3,42 +3,53 @@ class UserSessionsController < ApplicationController before_filter :require_user, :only => :destroy def new - @title = t(:signin) + @title = t(:signin) @user_session = UserSession.new - @mail_message = session[:mail_message] if !session[:mail_message].nil? + @mail_message = session[:mail_message] if !session[:mail_message].nil? end - def show - redirect_to root_path - end + def show + redirect_to root_path + end def create - if params[:userlogin].length > 0 - render :text => '' - else - @user_session = UserSession.new(params[:user_session]) - # remember user_id if checkbox is checked - if params[:user_session][:remember_id] == '1' - cookies['user_id'] = { :value => params[:user_session][:login], :expires => 1.month.from_now } - else - cookies.delete 'user_id' - end + if params[:userlogin].length > 0 + render :text => '' + else + @user_session = UserSession.new(params[:user_session]) - if @user_session.save - redirect_to root_path and return - else - # prevent timing and brute force password attacks - sleep 1 - @failed = true - render :action => :new - end - end + # remember user_id if checkbox is checked + if params[:user_session][:remember_id] == '1' + cookies['user_id'] = { :value => params[:user_session][:login], :expires => 1.month.from_now } + else + cookies.delete 'user_id' + end + + if @user_session.save + # if link_back, redirect back + redirect_to session[:link_back] and return if session[:link_back] + redirect_to channels_path and return + else + # log to failedlogins + failed = Failedlogin.new + failed.login = params[:user_session][:login] + failed.password = params[:user_session][:password] + failed.ip_address = get_header_value('X_REAL_IP') + failed.save + + # prevent timing and brute force password attacks + sleep 1 + @failed = true + render :action => :new + end + end end def destroy + session[:link_back] = nil current_user_session.destroy - reset_session - redirect_to root_path + reset_session + redirect_to root_path end -end \ No newline at end of file +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index cff9943..2b0921b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,85 +1,180 @@ class UsersController < ApplicationController + include KeyUtilities before_filter :require_no_user, :only => [:new, :create, :forgot_password] - before_filter :require_user, :only => [:show, :edit, :update, :change_password] + before_filter :require_user, :only => [:show, :edit, :update, :change_password, :edit_profile] + + # generates a new api key + def new_api_key + current_user.set_new_api_key! + redirect_to account_path + end + + # edit public profile + def edit_profile + @user = current_user + end + + # update public profile + def update_profile + @user = current_user # makes our views "cleaner" and more consistent + # update + @user.update_attributes(user_params) + redirect_to account_path + end + + # public profile for a user + def profile + # set params and request.format correctly + set_request_details!(params) + + @user = User.find_by_login(params[:id]) + + # output error if user not found + render :text => t(:user_not_found) and return if @user.nil? + + # if a json or xml request + if request.format == :json || request.format == :xml + # authenticate the user if api key matches the target user + authenticated = (User.find_by_api_key(get_apikey) == @user) + # set options correctly + options = authenticated ? User.private_options : User.public_options(@user) + end + + respond_to do |format| + format.html + format.json { render :json => @user.as_json(options) } + format.xml { render :xml => @user.to_xml(options) } + end + end + + # list all public channels for a user + def list_channels + @user = User.find_by_login(params[:id]) + + # output error if user not found + render :text => t(:user_not_found) and return if @user.nil? + + # if html request + if request.format == :html + @title = "Internet of Things - Public Channels for #{@user.login}" + @channels = @user.channels.public_viewable.paginate :page => params[:page], :order => 'last_entry_id DESC' + # if a json or xml request + elsif request.format == :json || request.format == :xml + # authenticate the user if api key matches the target user + authenticated = (User.find_by_api_key(get_apikey) == @user) + # get all channels if authenticated, otherwise only public ones + channels = authenticated ? @user.channels : @user.channels.public_viewable + # set channels correctly + @channels = { channels: channels.as_json(Channel.public_options) } + end + + respond_to do |format| + format.html + format.json { render :json => @channels } + format.xml { render :xml => @channels.to_xml(:root => 'response') } + end + end def new - @title = t(:signup) + @title = t(:signup) @user = User.new end - + def create - @user = User.new(params[:user]) + @user = User.new(user_params) + @user.api_key = generate_api_key(16, 'user') - # save user - if @user.valid? - if @user.save - redirect_back_or_default account_path - end - else - render :action => :new - end + # save user + if @user.valid? + + if @user.save + redirect_back_or_default channels_path and return + end + else + render :action => :new + end end - + def show - @menu = 'account' - @user = current_user + @menu = 'account' + @user = @current_user end - + def edit - @menu = 'account' - @user = current_user + @menu = 'account' + @user = @current_user end - # displays forgot password page - def forgot_password - end + # displays forgot password page + def forgot_password + @user = User.new + end - # this action is called from an email link when a password reset is requested - def reset_password - # if user has been logged in (due to previous form submission) - if !current_user.nil? - @user = current_user - @user.errors.add(t(:password_problem)) - @valid_link = true - else - @user = User.find_by_id(params[:id]) - # make sure tokens match and password reset is within last 10 minutes - if @user.perishable_token == params[:token] && @user.updated_at > 600.seconds.ago - @valid_link = true - # log the user in - @user_session = UserSession.new(@user) - @user_session.save - end - end - end - - # do the actual password change - def change_password - # protect against bots - render :text => '' and return if params[:userlogin].length > 0 + # this action is called from an email link when a password reset is requested + def reset_password + # if user has been logged in (due to previous form submission) + if !current_user.nil? + @user = current_user + @user.errors.add(:base, t(:password_problem)) + @valid_link = true + else + @user = User.find_by_id(params[:id]) + # make sure tokens match and password reset is within last 10 minutes + if @user.perishable_token == params[:token] && @user.updated_at > 600.seconds.ago + @valid_link = true + # log the user in + @user_session = UserSession.new(@user) + @user_session.save + end + end + end + # do the actual password change + def change_password @user = current_user - # if no password entered, redirect - redirect_to reset_password_path and return if params[:user][:password].empty? - # check current password and update - if @user.update_attributes(params[:user]) + # if no password entered, redirect + redirect_to reset_password_path and return if params[:user][:password].empty? + # check current password and update + if @user.update_attributes(user_params) redirect_to account_path else redirect_to reset_password_path end - end + end def update - @menu = 'account' - @user = current_user # makes our views "cleaner" and more consistent - # check current password and update - if @user.valid_password?(params[:password_current]) && @user.update_attributes(params[:user]) + @menu = 'account' + @user = @current_user # makes our views "cleaner" and more consistent + # check current password and update + if @user.valid_password?(params[:password_current]) && @user.update_attributes(user_params) redirect_to account_path else - @user.errors.add :base, t(:password_incorrect) - render :edit + @user.errors.add(:base, t(:password_incorrect)) + render :action => :edit end end -end \ No newline at end of file + private + + # only allow these params + def user_params + params.require(:user).permit(:email, :login, :time_zone, :public_flag, :bio, :website, :password, :password_confirmation) + end + + # set params[:id] and request.format correctly + def set_request_details!(params) + # set format + new_format = 'html' if params[:glob].end_with?('.html') + new_format = 'json' if params[:glob].end_with?('.json') + new_format = 'xml' if params[:glob].end_with?('.xml') + + # remove the format from the end of the glob + params[:id] = params[:glob].chomp(".#{new_format}") + + # set the new format if it exists + request.format = new_format.to_sym if new_format.present? + end + +end + diff --git a/app/controllers/windows_controller.rb b/app/controllers/windows_controller.rb new file mode 100644 index 0000000..bf9a526 --- /dev/null +++ b/app/controllers/windows_controller.rb @@ -0,0 +1,219 @@ +class WindowsController < ApplicationController + before_filter :require_user, :except => [:index, :html, :iframe] + + def hide + window = Window.find(params[:id]) + window.show_flag = false + if window.save + render :text => window.id.to_s + else + render :text => '-1' + end + end + + # Call WindowsController.display when we want to display a window on the dashboard + # params[:visibility_flag] is whether it is the private or public dashboard + # params[:plugin] is for displaying a plugin, instead of a window + # params[:id] is the window ID for conventional windows, but the plugin_id for plugins + # params[:channel_id] is the channel_id + def display + @visibility = params[:visibility_flag] + + window = Window.find(params[:id]) + window = Window.new if window.nil? + window.show_flag = true + #Just save this change, then modify the object before rendering the JSON + savedWindow = window.save + + config_window window + + @mychannel = current_user && current_user.id == window.channel.user_id + + if savedWindow + render :json => window.to_json + else + render :json => 'An error occurred'.to_json + end + end + + def config_window(window) + if window.type == "PluginWindow" + pluginName = Plugin.find(window.window_detail.plugin_id).name + window.title = t(window.title, {:name => pluginName}) + elsif window.type == "ChartWindow" + window.title = t(window.title, {:field_number => window.window_detail.field_number}) + options = window.becomes(ChartWindow).window_detail.options if !window.becomes(ChartWindow).window_detail.nil? + options ||= "" + window.html["::OPTIONS::"] = options unless window.html.nil? || window.html.index("::OPTIONS::").nil? + else + window.title = t(window.title) + end + end + def html + window = Window.find(params[:id]) + options = window.window_detail.options unless window.window_detail.nil? || window.type!="ChartWindow" + window.html["::OPTIONS::"] = options unless window.html.nil? || window.html.index("::OPTIONS::").nil? + html = window.html + + render :text => html + end + + def iframe + window = Window.find(params[:id]) + options = window.window_detail.options unless window.window_detail.nil? || window.type!="ChartWindow" + window.html["::OPTIONS::"] = options unless window.html.nil? || window.html.index("::OPTIONS::").nil? + iframe_html = window.html + + iframe_html = iframe_html.gsub(/src=\"[\/.]/, 'src="' + api_domain); + render :text => iframe_html + end + + def index + channel = Channel.find(params[:channel_id]) + + channel.update_status_portlet false if (channel.windows.select { |w| w.wtype == :status && w.private_flag == false } ) + channel.update_status_portlet true if (channel.windows.select { |w| w.wtype == :status && w.private_flag == true } ) + channel.update_video_portlet false if (channel.windows.select { |w| w.wtype == :video && w.private_flag == false } ) + channel.update_video_portlet true if (channel.windows.select { |w| w.wtype == :video && w.private_flag == true } ) + channel.update_location_portlet false if (channel.windows.select { |w| w.wtype == :location && w.private_flag == false } ) + channel.update_location_portlet true if (channel.windows.select { |w| w.wtype == :location && w.private_flag == true } ) + channel.update_chart_portlets if (channel.windows.select { |w| w.wtype == :chart } ) + windows = channel.public_windows(true).order(:position) unless params[:channel_id].nil? + + if channel.recent_statuses.nil? || channel.recent_statuses.size <= 0 + @windows = windows.delete_if { |w| w.wtype == "status" } + else + @windows = windows + end + + @windows.each do |window| + + if window.type == "PluginWindow" + pluginName = Plugin.find(window.window_detail.plugin_id).name + window.title = t(window.title, {:name => pluginName}) + elsif window.type == "ChartWindow" + window.title = t(window.title, {:field_number => window.window_detail.field_number}) + options = window.becomes(ChartWindow).window_detail.options if !window.becomes(ChartWindow).window_detail.nil? + options ||= "" + window.html["::OPTIONS::"] = options unless window.html.nil? || window.html.index("::OPTIONS::").nil? + else + window.title = t(window.title) + end + + end + + respond_to do |format| + format.html + format.json { render :json => @windows.as_json( :include => [:window_detail] ) } + end + end + + # This is going to display windows that are hidden (show_flag = false) + # The "visibility_flag" param indicates whether it's public or private visibility + def hidden_windows + @visibility = params[:visibility_flag] + channel = Channel.find(params[:channel_id]) + + if @visibility == "private" + @windows = channel.private_windows(false) unless channel.nil? + else + @windows = channel.public_windows(false) unless channel.nil? + end + @windows.reject! { |window| window.type == "PluginWindow" } + @windows.each do |window| + if window.type == "PluginWindow" + elsif window.type == "ChartWindow" + window.title = t(window.title, {:field_number => window.window_detail.field_number}) + options = window.becomes(ChartWindow).window_detail.options unless window.becomes(ChartWindow).window_detail.nil? + options ||= "" + window.html["::OPTIONS::"] = options unless window.html.nil? || window.html.index("::OPTIONS::").nil? + else + window.title = t(window.title) + end + end + + respond_to do |format| + format.html { render :partial => "hidden_windows" } + # format.json { render :json => @windows.as_json( :include => [:window_detail] ) } + end + end + + def private_windows + channel = Channel.find(params[:channel_id]) + + channel.update_status_portlet false if (channel.windows.select { |w| w.wtype == :status && w.private_flag == false } ) + channel.update_status_portlet true if (channel.windows.select { |w| w.wtype == :status && w.private_flag == true } ) + channel.update_video_portlet false if (channel.windows.select { |w| w.wtype == :video && w.private_flag == false } ) + channel.update_video_portlet true if (channel.windows.select { |w| w.wtype == :video && w.private_flag == true } ) + channel.update_location_portlet false if (channel.windows.select { |w| w.wtype == :location && w.private_flag == false } ) + channel.update_location_portlet true if (channel.windows.select { |w| w.wtype == :location && w.private_flag == true } ) + channel.update_chart_portlets if (channel.windows.select { |w| w.wtype == :chart } ) + + windows = channel.private_windows(true).order(:position) unless params[:channel_id].nil? + + if channel.recent_statuses.nil? || channel.recent_statuses.size <= 0 + @windows = windows.delete_if { |w| w.wtype == "status" } + else + @windows = windows + end + + @windows.each do |window| + if window.type == "PluginWindow" + windowDetail = window.window_detail + pluginName = Plugin.find(windowDetail.plugin_id).name + window.title = t(window.title, {:name => pluginName}) + elsif window.type == "ChartWindow" + window.title = t(window.title, {:field_number => window.window_detail.field_number}) + options = window.becomes(ChartWindow).window_detail.options unless window.becomes(ChartWindow).window_detail.nil? + options ||= "" + window.html["::OPTIONS::"] = options unless window.html.nil? || window.html.index("::OPTIONS::").nil? + else + window.title = t(window.title) + end + end + + respond_to do |format| + format.html + format.json { render :json => @windows.as_json( :include => [:window_detail] ) } + end + end + + + def update + logger.info "We're trying to update the windows with " + params.to_s + #params for this put are going to look like + # page"=>"{\"col\":0,\"positions\":[1,2,3]}" + #So.. the position values are Windows.id They should get updated with the ordinal value based + # on their array position and the column should get updated according to col value. + # Since the windows are order by position, when a window record changes from + # col1,position0 -> col0,position0 the entire new column is reordered. + # The old column is missing a position, but the remaining are just left to their order + # (ie., 0,1,2 become 1,2) Unless they are also changed + + # First parse the JSON in params["page"] ... + values = JSON(params[:page]) + + # .. then find each window and update with new ordinal position and col. + logger.info "Channel id = " + params[:channel_id].to_s + @channel = current_user.channels.find(params[:channel_id]) + col = values["col"] + saved = true + values["positions"].each_with_index do |p,i| + windows = @channel.windows.where({:id => p}) unless p.nil? + unless windows.nil? || windows.empty? + w = windows[0] + w.position = i + w.col = col + if !w.save + saved = false + end + end + end + if saved + render :text => '0' + else + render :text => '-1' + end + + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index de6be79..b17ca94 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,2 +1,12 @@ module ApplicationHelper + + def is_a_number?(s) + s.to_s.gsub(/,/, '.').match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true + end + + def parsefloat(number) + return number.to_s.gsub(/,/, '.').to_f + end + end + diff --git a/app/helpers/apps_helper.rb b/app/helpers/apps_helper.rb new file mode 100644 index 0000000..0ba39ff --- /dev/null +++ b/app/helpers/apps_helper.rb @@ -0,0 +1,2 @@ +module AppsHelper +end diff --git a/app/helpers/channels_helper.rb b/app/helpers/channels_helper.rb new file mode 100644 index 0000000..4e71974 --- /dev/null +++ b/app/helpers/channels_helper.rb @@ -0,0 +1,11 @@ +module ChannelsHelper + include ApplicationHelper + def auth_channels_path + if current_user + '/channels' + else + '/channels/public' + end + end +end + diff --git a/app/helpers/comments_helper.rb b/app/helpers/comments_helper.rb new file mode 100644 index 0000000..0ec9ca5 --- /dev/null +++ b/app/helpers/comments_helper.rb @@ -0,0 +1,2 @@ +module CommentsHelper +end diff --git a/app/helpers/feed_helper.rb b/app/helpers/feed_helper.rb index 6709856..073ec91 100644 --- a/app/helpers/feed_helper.rb +++ b/app/helpers/feed_helper.rb @@ -1,2 +1,365 @@ module FeedHelper + include ApplicationHelper + + # applies rounding to an enumerable object + def object_round(object, round=nil, match='field') + object.each_with_index do |o, index| + object[index] = item_round(o, round, match) + end + + return object + end + + # applies rounding to a single item's attributes if necessary + def item_round(item, round=nil, match='field') + return nil if item.nil? + + # for each attribute + item.attribute_names.each do |attr| + # only add non-null numeric fields + if attr.index(match) and !item[attr].nil? and is_a_number?(item[attr]) + # keep track of whether the value contains commas + comma_flag = (item[attr].to_s.index(',')) ? true : false + + # replace commas with decimals if appropriate + item[attr] = item[attr].to_s.gsub(/,/, '.') if comma_flag + + # do the actual rounding + item[attr] = sprintf "%.#{round}f", item[attr] + + # replace decimals with commas if appropriate + item[attr] = item[attr].to_s.gsub(/\./, ',') if comma_flag + end + end + + # output new item + return item + end + # gets the median for an object + def object_median(object, comma_flag=false, round=nil) + return nil if object.nil? + length = object.length + return nil if length == 0 + output = '' + + # do the calculation + if length % 2 == 0 + output = (object[(length - 1) / 2] + object[length / 2]) / 2 + else + output = object[(length - 1) / 2] + end + + output = sprintf "%.#{round}f", output if round and is_a_number?(output) + + # replace decimals with commas if appropriate + output = output.to_s.gsub(/\./, ',') if comma_flag + + return output.to_s + end + + # averages a summed object over length + def object_average(object, length, comma_flag=false, round=nil) + object.attribute_names.each do |attr| + # only average non-null integer fields + if !object[attr].nil? and is_a_number?(object[attr]) + if round + object[attr] = sprintf "%.#{round}f", (parsefloat(object[attr]) / length) + else + object[attr] = (parsefloat(object[attr]) / length).to_s + end + # replace decimals with commas if appropriate + object[attr] = object[attr].gsub(/\./, ',') if comma_flag + end + end + + return object + end + + # formats a summed object correctly + def object_sum(object, comma_flag=false, round=nil) + object.attribute_names.each do |attr| + # only average non-null integer fields + if !object[attr].nil? and is_a_number?(object[attr]) + if round + object[attr] = sprintf "%.#{round}f", parsefloat(object[attr]) + else + object[attr] = parsefloat(object[attr]).to_s + end + # replace decimals with commas if appropriate + object[attr] = object[attr].gsub(/\./, ',') if comma_flag + end + end + + return object + end + + + def create_empty_clone(object) + empty_clone = object.dup + empty_clone.attribute_names.each { |attr| empty_clone[attr] = nil } + return empty_clone + end + def get_floored_time(input_time, seconds) + return Time.zone.at((input_time.to_f / seconds).floor * seconds) + end + # slice feed into timescales + def feeds_into_timescales(feeds, params) + + # convert timescale (minutes) into seconds + seconds = params[:timescale].to_i * 60 + # get floored time ranges + start_time = get_floored_time(feeds.first.created_at, seconds) + end_time = get_floored_time(feeds.last.created_at, seconds) + + # create empty array with appropriate size + timeslices = Array.new((((end_time - start_time) / seconds).abs).floor) + + # create a blank clone of the first feed so that we only get the necessary attributes + empty_feed = create_empty_clone(feeds.first) + + # add feeds to array + feeds.each do |f| + i = ((f.created_at - start_time) / seconds).floor + f.created_at = start_time + i * seconds + timeslices[i] = f if timeslices[i].nil? + end + + # fill in empty array elements + timeslices.each_index do |i| + if timeslices[i].nil? + current_feed = empty_feed.dup + current_feed.created_at = (start_time + (i * seconds)) + timeslices[i] = current_feed + end + end + + return timeslices + end + + + # slice feed into sums + def feeds_into_sums(feeds, params) + # convert timescale (minutes) into seconds + seconds = params[:sum].to_i * 60 + # get floored time ranges + start_time = get_floored_time(feeds.first.created_at, seconds) + end_time = get_floored_time(feeds.last.created_at, seconds) + + # create empty array with appropriate size + timeslices = Array.new((((end_time - start_time) / seconds).abs).floor) + + # create a blank clone of the first feed so that we only get the necessary attributes + empty_feed = create_empty_clone(feeds.first) + + # add feeds to array + feeds.each do |f| + i = ((f.created_at - start_time) / seconds).floor + f.created_at = start_time + i * seconds + # create multidimensional array + timeslices[i] = [] if timeslices[i].nil? + timeslices[i].push(f) + end + + # keep track of whether numbers use commas as decimals + comma_flag = false + + # fill in array + timeslices.each_index do |i| + # insert empty values + if timeslices[i].nil? + current_feed = empty_feed.dup + current_feed.created_at = (start_time + (i * seconds)) + timeslices[i] = current_feed + # else sum the inner array + else + sum_feed = empty_feed.dup + sum_feed.created_at = timeslices[i].first.created_at + # for each feed + timeslices[i].each do |f| + # for each attribute, add to sum_feed so that we have the total + sum_feed.attribute_names.each do |attr| + # only add non-null integer fields + if attr.index('field') and !f[attr].nil? and is_a_number?(f[attr]) + + # set comma_flag once if we find a number with a comma + comma_flag = true if !comma_flag and f[attr].to_s.index(',') + + # set initial data + if sum_feed[attr].nil? + sum_feed[attr] = parsefloat(f[attr]) + # add data + elsif f[attr] + sum_feed[attr] = parsefloat(sum_feed[attr]) + parsefloat(f[attr]) + end + + end + end + end + + # set to the summed feed + timeslices[i] = object_sum(sum_feed, comma_flag, params[:round]) + end + end + + return timeslices + end + + def feeds_into_averages(feeds, params) + + # convert timescale (minutes) into seconds + seconds = params[:average].to_i * 60 + # get floored time ranges + start_time = get_floored_time(feeds.first.created_at, seconds) + end_time = get_floored_time(feeds.last.created_at, seconds) + + # create empty array with appropriate size + timeslices = Array.new((((end_time - start_time) / seconds).abs).floor) + + # create a blank clone of the first feed so that we only get the necessary attributes + empty_feed = create_empty_clone(feeds.first) + + # add feeds to array normalizing created time for timeslices + feeds.each do |f| + i = ((f.created_at - start_time) / seconds).floor + f.created_at = start_time + i * seconds + # create multidimensional array that will hold all feeds for each timeslice + timeslices[i] = [] if timeslices[i].nil? + timeslices[i].push(f) + end + + # keep track of whether numbers use commas as decimals + comma_flag = false + + # fill in array + timeslices.each_index do |i| + # insert empty values if there wasn't a feed value for a slice, just enter an empty feed + if timeslices[i].nil? + current_feed = empty_feed.dup + current_feed.created_at = (start_time + (i * seconds)) + timeslices[i] = current_feed + # else average the inner array + else + sum_feed = empty_feed.dup + sum_feed.created_at = timeslices[i].first.created_at + # for each feed + timeslices[i].each do |f| + # for each attribute, add to sum_feed so that we have the total + + sum_feed.attribute_names.each do |attr| + + # only add non-null integer fields + if attr.index('field') and !f[attr].nil? and is_a_number?(f[attr]) + # set comma_flag once if we find a number with a comma + comma_flag = true if !comma_flag and f[attr].to_s.index(',') + # set initial data + if sum_feed[attr].nil? + sum_feed[attr] = parsefloat(f[attr]) + elsif f[attr] # add data + sum_feed[attr] = parsefloat(sum_feed[attr]) + parsefloat(f[attr]) + end + end + + end + end + + # set to the averaged feed + timeslices[i] = object_average(sum_feed, timeslices[i].length, comma_flag, params[:round]) + end + end + + return timeslices + end + + # slice feed into medians + def feeds_into_medians(feeds, params) + # convert timescale (minutes) into seconds + seconds = params[:median].to_i * 60 + # get floored time ranges + start_time = get_floored_time(feeds.first.created_at, seconds) + end_time = get_floored_time(feeds.last.created_at, seconds) + + # create empty array with appropriate size + timeslices = Array.new((((end_time - start_time) / seconds).abs).floor) + + # create a blank clone of the first feed so that we only get the necessary attributes + empty_feed = create_empty_clone(feeds.first) + + # add feeds to array + feeds.each do |f| + i = ((f.created_at - start_time) / seconds).floor + f.created_at = start_time + i * seconds + # create multidimensional array + timeslices[i] = [] if timeslices[i].nil? + timeslices[i].push(f) + end + + # keep track of whether numbers use commas as decimals + comma_flag = false + + # fill in array + timeslices.each_index do |i| + # insert empty values + if timeslices[i].nil? + current_feed = empty_feed.dup + current_feed.created_at = (start_time + (i * seconds)) + timeslices[i] = current_feed + # else get median values for the inner array + else + + # create blank hash called 'fields' to hold data + fields = {} + + # for each feed + timeslices[i].each do |f| + + # for each attribute + f.attribute_names.each do |attr| + if attr.index('field') + + # create blank array for each field + fields["#{attr}"] = [] if fields["#{attr}"].nil? + + # push numeric field data onto its array + if is_a_number?(f[attr]) + # set comma_flag once if we find a number with a comma + comma_flag = true if !comma_flag and f[attr].to_s.index(',') + + fields["#{attr}"].push(parsefloat(f[attr])) + end + + end + end + + end + + # sort fields arrays + fields.each_key do |key| + fields[key] = fields[key].compact.sort + end + + # get the median + median_feed = empty_feed.dup + median_feed.created_at = timeslices[i].first.created_at + median_feed.attribute_names.each do |attr| + median_feed[attr] = object_median(fields[attr], comma_flag, params[:round]) if attr.index('field') + end + + timeslices[i] = median_feed + + end + end + + return timeslices + end + + # checks for valid timescale + def timeparam_valid?(timeparam) + valid_minutes = [10, 15, 20, 30, 60, 240, 720, 1440] + if timeparam and valid_minutes.include?(timeparam.to_i) + return true + else + return false + end + end end + diff --git a/app/helpers/maps_helper.rb b/app/helpers/maps_helper.rb new file mode 100644 index 0000000..88ee3d5 --- /dev/null +++ b/app/helpers/maps_helper.rb @@ -0,0 +1,2 @@ +module MapsHelper +end diff --git a/app/helpers/pages_helper.rb b/app/helpers/pages_helper.rb index 2c057fd..d271609 100644 --- a/app/helpers/pages_helper.rb +++ b/app/helpers/pages_helper.rb @@ -1,2 +1,28 @@ module PagesHelper + def blog_entries + blog = '' + begin + Timeout::timeout(5) do + # get the blog data + blog_url = "http://community.thingspeak.com" + doc = Nokogiri::HTML(open(blog_url, "User-Agent" => "Ruby/#{RUBY_VERSION}").read) + + # parse out the html we need + doc.css("img").remove + doc.css("script").remove + doc.css("iframe").remove + doc.css("div.post").each_with_index do |d, i| + # only show 3 posts + if (i < 3) + blog += d.css("h2").to_s + blog += d.css("div.entry").to_s + blog += "

" + end + end + end + rescue Timeout::Error + rescue + end + blog + end end diff --git a/app/helpers/pipes_helper.rb b/app/helpers/pipes_helper.rb new file mode 100644 index 0000000..df526f4 --- /dev/null +++ b/app/helpers/pipes_helper.rb @@ -0,0 +1,2 @@ +module PipesHelper +end diff --git a/app/helpers/plugins_helper.rb b/app/helpers/plugins_helper.rb new file mode 100644 index 0000000..75f3122 --- /dev/null +++ b/app/helpers/plugins_helper.rb @@ -0,0 +1,2 @@ +module PluginsHelper +end diff --git a/app/jobs/clear_channel_job.rb b/app/jobs/clear_channel_job.rb new file mode 100644 index 0000000..4497978 --- /dev/null +++ b/app/jobs/clear_channel_job.rb @@ -0,0 +1,14 @@ +class ClearChannelJob + @queue = :clear_channel + + def self.perform(channel_id) + Feed.delete_all(["channel_id = ?", channel_id]) + DailyFeed.delete_all(["channel_id = ?", channel_id]) + if channel = Channel.find(channel_id) + channel.last_entry_id = nil + channel.clearing = false + channel.save + end + end +end + diff --git a/app/models/api_key.rb b/app/models/api_key.rb index cc240f1..401a95c 100644 --- a/app/models/api_key.rb +++ b/app/models/api_key.rb @@ -1,14 +1,27 @@ +# == Schema Information +# +# Table name: api_keys +# +# id :integer not null, primary key +# api_key :string(16) +# channel_id :integer +# user_id :integer +# write_flag :boolean default(FALSE) +# created_at :datetime +# updated_at :datetime +# note :string(255) +# + class ApiKey < ActiveRecord::Base belongs_to :channel belongs_to :user validates_uniqueness_of :api_key - scope :write_keys, :conditions => { :write_flag => true } - scope :read_keys, :conditions => { :write_flag => false } + scope :write_keys, lambda { where("write_flag = true") } + scope :read_keys, lambda { where("write_flag = false") } attr_readonly :created_at - attr_accessible :note def to_s api_key @@ -22,18 +35,3 @@ end - -# == Schema Information -# -# Table name: api_keys -# -# id :integer(4) not null, primary key -# api_key :string(16) -# channel_id :integer(4) -# user_id :integer(4) -# write_flag :boolean(1) default(FALSE) -# created_at :datetime -# updated_at :datetime -# note :string(255) -# - diff --git a/app/models/channel.rb b/app/models/channel.rb index 28be06a..f1597e6 100644 --- a/app/models/channel.rb +++ b/app/models/channel.rb @@ -1,18 +1,392 @@ +# == Schema Information +# +# Table name: channels +# +# id :integer not null, primary key +# user_id :integer +# name :string(255) +# description :string(255) +# latitude :decimal(15, 10) +# longitude :decimal(15, 10) +# field1 :string(255) +# field2 :string(255) +# field3 :string(255) +# field4 :string(255) +# field5 :string(255) +# field6 :string(255) +# field7 :string(255) +# field8 :string(255) +# scale1 :integer +# scale2 :integer +# scale3 :integer +# scale4 :integer +# scale5 :integer +# scale6 :integer +# scale7 :integer +# scale8 :integer +# created_at :datetime +# updated_at :datetime +# elevation :string(255) +# last_entry_id :integer +# public_flag :boolean default(FALSE) +# options1 :string(255) +# options2 :string(255) +# options3 :string(255) +# options4 :string(255) +# options5 :string(255) +# options6 :string(255) +# options7 :string(255) +# options8 :string(255) +# social :boolean default(FALSE) +# slug :string(255) +# status :string(255) +# url :string(255) +# video_id :string(255) +# video_type :string(255) +# clearing :boolean default(FALSE), not null +# ranking :integer +# + class Channel < ActiveRecord::Base include KeyUtilities - + belongs_to :user - has_many :feeds - has_many :api_keys + has_many :feeds + has_many :daily_feeds + has_many :api_keys, :dependent => :destroy + has_many :taggings + has_many :tags, :through => :taggings + has_many :comments, :dependent => :destroy + has_many :windows, :dependent => :destroy, :autosave => true + + self.include_root_in_json = true attr_readonly :created_at - attr_protected :user_id, :last_entry_id - after_create :set_initial_default_name - before_validation :set_default_name - after_destroy :delete_feeds - - validates :name, :presence => true, :on => :update + after_commit :set_default_name + after_commit :set_ranking, :unless => "ranking == calc_ranking" + + before_destroy :delete_feeds + + validates :video_type, :presence => true, :if => lambda{ |channel| !channel.video_id.nil? && !channel.video_id.empty?} + + scope :public_viewable, lambda { where("public_flag = true AND social != true") } + scope :is_public, lambda { where("public_flag = true") } + scope :active, lambda { where("channels.last_entry_id > 1 and channels.updated_at > ?", DateTime.now.utc - 7.day) } + scope :being_cleared, lambda { where("clearing = true") } + scope :by_array, lambda {|ids| { :conditions => ["id in (?)", ids.uniq] } } + scope :with_tag, lambda {|name| joins(:tags).where("tags.name = ?", name) } + + # pagination variables + cattr_reader :per_page + @@per_page = 15 + + # select options + def select_options + only = [:name, :created_at, :updated_at, :id, :last_entry_id] + only += [:description] unless self.description.blank? + only += [:latitude] unless self.latitude.blank? + only += [:longitude] unless self.longitude.blank? + only += [:elevation] unless self.elevation.blank? + only += [:field1] unless self.field1.blank? + only += [:field2] unless self.field2.blank? + only += [:field3] unless self.field3.blank? + only += [:field4] unless self.field4.blank? + only += [:field5] unless self.field5.blank? + only += [:field6] unless self.field6.blank? + only += [:field7] unless self.field7.blank? + only += [:field8] unless self.field8.blank? + + # return a hash + return { :only => only } + end + + # adds a feed to the channel + def add_status_feed(status) + # update the entry_id for the channel + entry_id = self.next_entry_id + self.last_entry_id = entry_id + self.save + # create the new feed with the correct status and entry_id + self.feeds.create(:status => status, :entry_id => entry_id) + end + + # get next last_entry_id for a channel + def next_entry_id + self.last_entry_id.nil? ? 1 : self.last_entry_id + 1 + end + + # for internal admin use, shows the ids of a channel per month (useful as a proxy for growth) + def show_growth + output = [] + date = self.feeds.order("entry_id asc").first.created_at + + # while the date is in the past + while (date < Time.now) + # get a feed on that day + feed = self.feeds.where("created_at > ?", date).where("created_at < ?", date + 1.day).first + # output the date and feed id + output << "#{date.strftime('%Y-%m-%d')},#{feed.id}" if feed.present? + # set the date 1 month further + date = date + 1.month + end + + # show the output + puts output.join("\n") + end + + # paginated hash for json and xml output + # channels input must be paginated + def self.paginated_hash(channels) + { + pagination: + { + current_page: channels.current_page, + per_page: channels.per_page, + total_entries: channels.total_entries, + }, + channels: channels.as_json(Channel.public_options) + } + end + + # for to_json or to_xml, return only the public attributes + def self.public_options + { + :root => false, + :only => [:id, :name, :description, :latitude, :longitude, :last_entry_id, :elevation, :created_at, :ranking], + :methods => :username, + :include => { :tags => {:only => [:id, :name]}} + } + end + + # login name of the user who created the channel + def username; self.user.try(:login); end + + # custom as_json method to allow: root => false + def as_json(options = nil) + root = include_root_in_json + root = options[:root] if options.try(:key?, :root) + if root + root = self.class.model_name.element if root == true + { root => serializable_hash(options) } + else + serializable_hash(options) + end + end + + def private_windows *hidden + if hidden.size >= 1 + return windows.where("private_flag = true and show_flag = #{hidden[0].to_s}") + else + return windows.where("private_flag = true" ) + end + end + + # overloaded version witthout private/public flag for the has_many dependent destroy action + def public_windows hidden + return windows.where("private_flag = false and show_flag = #{hidden}") + end + # measure of activity in terms of feeds per time period + + def public? + return public_flag + end + + def video_changed? + video_id_changed? || video_type_changed? + end + + def location_changed? + latitude_changed? || longitude_changed? + end + + def feeds_changed? + field1_changed? || + field2_changed? || + field3_changed? || + field4_changed? || + field5_changed? || + field6_changed? || + field7_changed? || + field8_changed? + end + + def update_chart_portlets + self.fields.each do |field| + update_chart_portlet field, true + update_chart_portlet field, false + end + #remove portlets for fields that don't exist + #iterate all chart windows... and look for a matching field + chartWindows = windows.where(:wtype => :chart ) + chartWindows.each do |window| + if self.send(window.name).blank? + window.destroy + end + + end + + end + + def update_status_portlet isPrivate + + window = windows.where(:wtype => :status, :private_flag => isPrivate ) + + status_html = "" + + if window.nil? || window[0].nil? + + window = PortletWindow.new + window.wtype = :status + window.position = 1 + window.col = 1 + window.title = "window_status" + else + + window = window[0] + end + + window.private_flag = isPrivate + window.html = status_html + window.window_detail = PortletWindowDetail.new if window.window_detail.nil? + self.windows.push window + + end + + def video_fields_valid? + !video_id.nil? && !video_id.empty? && !video_type.nil? && !video_type.empty? + end + + def update_video_portlet isPrivate + window = windows.where(:wtype => :video, :private_flag => isPrivate ) + if video_fields_valid? + youtube_html = "" + vimeo_html = "" + if window.nil? || window[0].nil? + window = PortletWindow.new + window.wtype = :video + window.position = 1 + window.col = 1 + window.title = "window_channel_video" + else + window = window[0] + end + window.private_flag = isPrivate + window.html = youtube_html if video_type == 'youtube' + window.html = vimeo_html if video_type == 'vimeo' + window.window_detail = PortletWindowDetail.new if window.window_detail.nil? + self.windows.push window + else + unless window[0].nil? + window[0].delete + end + end + end + + def update_location_portlet isPrivate + window = windows.where(:wtype => :location, :private_flag => isPrivate ) + if !latitude.nil? && !longitude.nil? + maps_html = "" + if window.nil? || window[0].nil? + window = PortletWindow.new + window.wtype = :location + window.position = 0 + window.col = 1 + window.title = "window_map" + else + window = window[0] + end + window.private_flag = isPrivate + window.html = maps_html + window.window_detail = PortletWindowDetail.new if window.window_detail.nil? + + self.windows.push window + + else + unless window[0].nil? + + window[0].delete + end + end + end + + # get recent status messages from channel + def recent_statuses + self.feeds.select('status, created_at, entry_id').order('created_at DESC').limit(30).collect {|f| f unless f.status.blank? }.compact + end + + def latest_feed + self.feeds.where(:entry_id => self.last_entry_id).first + end + + def delete_feeds + if self.feeds.count < 1000 + Feed.delete_all(["channel_id = ?", self.id]) + DailyFeed.delete_all(["channel_id = ?", self.id]) + begin + self.update_attribute(:last_entry_id, nil) + rescue Exception => e + end + + else + self.update_attribute(:clearing, true) + Resque.enqueue(ClearChannelJob, self.id) + end + end + + # true if channel is active + def active? + return (last_entry_id and updated_at and last_entry_id > 1 and updated_at > DateTime.now.utc - 1.days) + end + + def list_tags + (self.tags.collect { |t| t.name }).join(', ') + end + + def save_tags(tags) + # for each tag + tags.split(',').each do |name| + tag = Tag.find_by_name(name.strip) + # save if new tag + if tag.nil? + tag = Tag.new + tag.name = name.strip + tag.save + end + + tagging = Tagging.find(:first, :conditions => { :tag_id => tag.id, :channel_id => self.id}) + # save if new tagging + if tagging.nil? + tagging = Tagging.new + tagging.channel_id = self.id + tagging.tag_id = tag.id + tagging.save + end + end + + # delete any tags that were removed + self.remove_tags(tags) + end + + # if tags don't exist anymore, remove them + def remove_tags(tags) + tag_array = tags.split(',') + # remove white space + tag_array = tag_array.collect {|t| t.strip } + + # get all taggings for this channel + taggings = Tagging.find(:all, :conditions => { :channel_id => self.id }, :include => :tag) + + # check for existence + taggings.each do |tagging| + # if tagging is not in list + if !tag_array.include?(tagging.tag.name) + # delete tagging + tagging.delete + end + end + end def add_write_api_key write_key = self.api_keys.new @@ -22,61 +396,102 @@ class Channel < ActiveRecord::Base write_key.save end + def queue_react + self.reacts.on_insertion.each do |react| + begin + Resque.enqueue(ReactJob, react.id) + rescue Exception => e + + end + end + end + def field_label(field_number) self.attributes["field#{field_number}"] end - - def delete_feeds - Feed.delete_all(["channel_id = ?", self.id]) + + def fields + fields = attribute_names.reject { |x| + !(x.index('field') && self[x] && !self[x].empty?) + } end -private + def calc_ranking + result = 0 + result = result + 15 unless name.blank? + result = result + 20 unless description.blank? + result = result + 15 unless latitude.blank? || longitude.blank? + result = result + 15 unless url.blank? + result = result + 15 unless video_id.blank? || video_type.blank? - def set_default_name - self.name = "#{I18n.t(:channel_default_name)} #{self.id}" if self.name.blank? + result = result + 20 unless tags.empty? + result end - def set_initial_default_name - update_attribute(:name, "#{I18n.t(:channel_default_name)} #{self.id}") + def set_windows + #check for video window + if video_changed? + update_video_portlet true + update_video_portlet false + end + + #does channel have a location and corresponding google map + if location_changed? + update_location_portlet true + update_location_portlet false + end + + #does channel have status and corresponding status window. Add the status window no matter what. Only display if it has values + update_status_portlet true + update_status_portlet false + + #does channel have a window for every chart element + if feeds_changed? + update_chart_portlets + end end + private + + def set_ranking + update_attribute(:ranking, calc_ranking) unless ranking == calc_ranking + + end + def update_chart_portlet (field, isPrivate) + + chartWindows = windows.where(:type => "ChartWindow", :name => "field#{field.last.to_s}", :private_flag => isPrivate ) + if chartWindows.nil? || chartWindows[0].nil? + window = ChartWindow.new + window.wtype = :chart + window.position = 0 + window.col = 0 + window.title = "window_field_chart" + window.name = field.to_s + window.window_detail = ChartWindowDetail.new + window.window_detail.options = "&results=60&dynamic=true" + else + window = chartWindows[0] + # If there are options, use them.. if options are not available, then assign defaults + window.window_detail.options ||= "&results=60&dynamic=true" + end + + window.window_detail.field_number = field.last + window.private_flag = isPrivate + windows.push window + window.html ="" + + if !window.save + raise "The Window could not be saved" + end + end + + def set_default_name + update_attribute(:name, "#{I18n.t(:channel_default_name)} #{self.id}") if self.name.blank? + end + + + + + end - - - - - -# == Schema Information -# -# Table name: channels -# -# id :integer(4) not null, primary key -# user_id :integer(4) -# name :string(255) -# description :string(255) -# latitude :decimal(15, 10) -# longitude :decimal(15, 10) -# field1 :text -# field2 :text -# field3 :text -# field4 :text -# field5 :text -# field6 :text -# field7 :text -# field8 :text -# scale1 :integer(4) -# scale2 :integer(4) -# scale3 :integer(4) -# scale4 :integer(4) -# scale5 :integer(4) -# scale6 :integer(4) -# scale7 :integer(4) -# scale8 :integer(4) -# created_at :datetime -# updated_at :datetime -# elevation :string(255) -# last_entry_id :integer(4) -# public_flag :boolean(1) default(FALSE) -# - diff --git a/app/models/chart.rb b/app/models/chart.rb new file mode 100644 index 0000000..da92ee1 --- /dev/null +++ b/app/models/chart.rb @@ -0,0 +1,8 @@ +class Chart + def self.default_width + 450 + end + def self.default_height + 250 + end +end diff --git a/app/models/chart_window.rb b/app/models/chart_window.rb new file mode 100644 index 0000000..a271e49 --- /dev/null +++ b/app/models/chart_window.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: windows +# +# id :integer not null, primary key +# channel_id :integer +# position :integer +# created_at :datetime +# updated_at :datetime +# html :text +# col :integer +# title :string(255) +# wtype :string(255) +# name :string(255) +# type :string(255) +# private_flag :boolean default(FALSE) +# show_flag :boolean default(TRUE) +# + +class ChartWindow < Window + relate_to_details +end diff --git a/app/models/chart_window_detail.rb b/app/models/chart_window_detail.rb new file mode 100644 index 0000000..d66cb8a --- /dev/null +++ b/app/models/chart_window_detail.rb @@ -0,0 +1,14 @@ +# == Schema Information +# +# Table name: chart_window_details +# +# id :integer not null, primary key +# chart_window_id :integer +# field_number :integer +# created_at :datetime +# updated_at :datetime +# options :string(255) +# + +class ChartWindowDetail < ActiveRecord::Base +end diff --git a/app/models/comment.rb b/app/models/comment.rb new file mode 100644 index 0000000..3d20858 --- /dev/null +++ b/app/models/comment.rb @@ -0,0 +1,32 @@ +# == Schema Information +# +# Table name: comments +# +# id :integer not null, primary key +# parent_id :integer +# body :text +# flags :integer +# user_id :integer +# ip_address :string(255) +# created_at :datetime +# updated_at :datetime +# channel_id :integer +# + +class Comment < ActiveRecord::Base + belongs_to :channel + belongs_to :user + acts_as_tree :order => 'created_at' + + validates :body, :presence => true + validates_associated :user + + before_create :set_defaults + + private + + def set_defaults + self.flags = 0 + end +end + diff --git a/app/models/daily_feed.rb b/app/models/daily_feed.rb new file mode 100644 index 0000000..47a68bd --- /dev/null +++ b/app/models/daily_feed.rb @@ -0,0 +1,47 @@ +# == Schema Information +# +# Table name: daily_feeds +# +# id :integer not null, primary key +# channel_id :integer +# date :date +# calculation :string(20) +# result :string(255) +# field :integer +# + +class DailyFeed < ActiveRecord::Base + belongs_to :channel + + self.include_root_in_json = false + + # update a feed if it exists, or else create it + def self.my_create_or_update(attributes) + # try to get daily feed + daily_feed = DailyFeed.where(attributes).first + # if there is an existing daily feed + if daily_feed.present? + # update it + daily_feed.update_attributes(attributes) + # else create it + else + daily_feed = DailyFeed.create(attributes) + end + end + + # gets the calculation type + def self.calculation_type(params) + output = nil + output = 'timescale' if params[:timescale].present? + output = 'sum' if params[:sum].present? + output = 'average' if params[:average].present? + output = 'median' if params[:median].present? + return output + end + + # checks to see if this is a daily feed + def self.valid_params(params) + (params[:timescale] == '1440' || params[:sum] == '1440' || params[:average] == '1440' || params[:median] == '1440') ? true : false + end + +end diff --git a/app/models/error_response.rb b/app/models/error_response.rb new file mode 100644 index 0000000..8cea7f8 --- /dev/null +++ b/app/models/error_response.rb @@ -0,0 +1,41 @@ +class ErrorResponse + + def initialize(error_code) + error_object = I18n.t(:error_codes)[error_code] + @error_code = error_code.to_s + @http_status = error_object[:http_status] + @message = error_object[:message] + @details = error_object[:details] + end + + # attributes that can be read + attr_reader :error_code, :http_status, :message, :details + + # custom json format + def as_json(options = nil) + { + :status => "#{http_status}", + :error => { + :error_code => error_code, + :message => message, + :details => details + } + } + end + + # custom xml format + def to_xml + output = "\n" + output += "\n" + output += " #{http_status}\n" + output += " \n" + output += " #{error_code}\n" + output += " #{message}\n" + output += "
#{details}
\n" + output += "
\n" + output += "
" + return output + end + +end + diff --git a/app/models/failedlogin.rb b/app/models/failedlogin.rb new file mode 100644 index 0000000..6116397 --- /dev/null +++ b/app/models/failedlogin.rb @@ -0,0 +1,14 @@ +# == Schema Information +# +# Table name: failedlogins +# +# id :integer not null, primary key +# login :string(255) +# password :string(255) +# ip_address :string(255) +# created_at :datetime +# updated_at :datetime +# + +class Failedlogin < ActiveRecord::Base +end diff --git a/app/models/feed.rb b/app/models/feed.rb index dca681c..f7a4563 100644 --- a/app/models/feed.rb +++ b/app/models/feed.rb @@ -1,33 +1,137 @@ -class Feed < ActiveRecord::Base - belongs_to :channel - - self.include_root_in_json = false - - attr_readonly :created_at - attr_protected :channel_id -end - - - - - # == Schema Information # # Table name: feeds # -# id :integer(4) not null, primary key -# channel_id :integer(4) -# raw_data :text -# field1 :text -# field2 :text -# field3 :text -# field4 :text -# field5 :text -# field6 :text -# field7 :text -# field8 :text +# id :integer not null, primary key +# channel_id :integer +# field1 :string(255) +# field2 :string(255) +# field3 :string(255) +# field4 :string(255) +# field5 :string(255) +# field6 :string(255) +# field7 :string(255) +# field8 :string(255) # created_at :datetime # updated_at :datetime -# entry_id :integer(4) +# entry_id :integer +# status :string(255) +# latitude :decimal(15, 10) +# longitude :decimal(15, 10) +# elevation :string(255) +# location :string(255) # +class Feed < ActiveRecord::Base + extend FeedHelper + belongs_to :channel + + after_commit :queue_react + delegate :queue_react, :to => :channel + + self.include_root_in_json = false + + attr_readonly :created_at + + # only output these fields for feed + def self.select_options(channel, params) + only = [:created_at] + only += [:entry_id] unless timeparam_valid?(params[:timescale]) or timeparam_valid?(params[:average]) or timeparam_valid?(params[:median]) or timeparam_valid?(params[:sum]) + only += [:field1] unless channel.field1.blank? or (params[:field_id] and !params[:field_id].index('1')) + only += [:field2] unless channel.field2.blank? or (params[:field_id] and !params[:field_id].index('2')) + only += [:field3] unless channel.field3.blank? or (params[:field_id] and !params[:field_id].index('3')) + only += [:field4] unless channel.field4.blank? or (params[:field_id] and !params[:field_id].index('4')) + only += [:field5] unless channel.field5.blank? or (params[:field_id] and !params[:field_id].index('5')) + only += [:field6] unless channel.field6.blank? or (params[:field_id] and !params[:field_id].index('6')) + only += [:field7] unless channel.field7.blank? or (params[:field_id] and !params[:field_id].index('7')) + only += [:field8] unless channel.field8.blank? or (params[:field_id] and !params[:field_id].index('8')) + + # add geolocation data if necessary + if params[:location] and params[:location].upcase == 'TRUE' + only += [:latitude] + only += [:longitude] + only += [:elevation] + only += [:location] + end + + # add status if necessary + only += [:status] if params[:status] and params[:status].upcase == 'TRUE' + return only + end + + # outputs feed info correctly, used by daily_feeds + def self.normalize_feeds(daily_feeds) + output = [] + hash = {} + + # for each daily feed + daily_feeds.each do |daily_feed| + # check if the feed already exists + existing_feed = hash[daily_feed['date']] + + # skip blank feeds + next if daily_feed['date'].blank? + + # if the feed exists + if existing_feed.present? + # add the new field + existing_feed["field#{daily_feed['field']}"] = daily_feed['result'] + # else add a new feed + else + new_feed = Feed.new(:created_at => daily_feed['date']) + # set the field attribute correctly + new_feed["field#{daily_feed['field']}"] = daily_feed['result'] + # add the feed + hash[daily_feed['date']] = new_feed + end + + end + + # turn the hash into an array + output = hash.values + + # sort by date + return output + end + + # custom json output + def as_json(options = {}) + super(options.merge(:except => [:updated_at, :id])) + end + + # check if a field value is a number + # usage: Feed.numeric?(field_value) + def self.numeric?(object) + true if Float(object) rescue false + end + + def field(number) + self.attributes["field#{number.to_i}"] + end + + # make sure any selected fields are greater than a minimum + def greater_than?(minimum) + output = true + self.attributes.each do |attribute| + # if this attribute is a numeric field with a value + if attribute[0].to_s.index('field') == 0 && attribute[1].present? && Feed.numeric?(attribute[1]) + output = false if attribute[1].to_f < minimum.to_f + end + end + return output + end + + # make sure any selected fields are less than a minimum + def less_than?(maximum) + output = true + self.attributes.each do |attribute| + # if this attribute is a numeric field with a value + if attribute[0].to_s.index('field') == 0 && attribute[1].present? && Feed.numeric?(attribute[1]) + output = false if attribute[1].to_f > maximum.to_f + end + end + return output + end + +end + diff --git a/app/models/feed_factory.rb b/app/models/feed_factory.rb new file mode 100644 index 0000000..e9bb221 --- /dev/null +++ b/app/models/feed_factory.rb @@ -0,0 +1,197 @@ +class FeedFactory < ApplicationController + include FeedHelper + + def initialize(options = {}) + @options = options # alias for params + @feeds = nil + @daily_feeds = nil + @output_feeds = nil + @rounded = false + @channel = Channel.find(options[:channel_id]) + @date_range = get_date_range(options) + @daily_date_range = @date_range.first.to_date..@date_range.last.to_date + @limit = calculate_limit + @use_daily_feed = DailyFeed.valid_params(options) # determine whether daily feed should be used + @calculation_type = DailyFeed.calculation_type(options) # set the calculation type + @feed_select_options = Feed.select_options(@channel, @options) + @cache_feeds = cache_feeds? + end + + # attributes that can be read + attr_reader :feeds, :daily_feeds, :limit, :use_daily_feed, :feed_select_options, :cache_feeds + + # calculate the limit that should be used + def calculate_limit + limit = 100 + limit = 8000 if @options[:results].present? || @options[:days].present? || @options[:start].present? || @options[:end].present? + limit = @options[:results].to_i if (@options[:results].present? && @options[:results].to_i < 8000) + return limit + end + + # determine if data should be cached + def cache_feeds? + cache = false + cache = true if (@channel.last_entry_id.present? && @channel.last_entry_id > 100 && @limit > 100) + cache = true if @options[:days].present? + return cache + end + + # if daily feeds exist, use that first, or else use regular feeds + def get_output_feeds + # get daily feeds + get_daily_feeds if @use_daily_feed == true + + # get feeds normally if no daily feeds + get_feeds if @daily_feeds.blank? + + # set minimum and maximum parameters, and round output feeds + format_output_feeds + + return @output_feeds + end + + # get feed for a date + def get_feed_data_for_date(date) + # get feeds for this date + feeds = Feed.where(:channel_id => @channel.id, :created_at => date..(date + 1.day)) + .select(@feed_select_options).order('created_at asc').load + + # calculate the feed + feed = calculate_feeds(feeds).first + + # add blank feed for this date if necessary + feed = Feed.new(:created_at => date) if feed.nil? + + return feed + end + + # add a daily feed for a specific date + def add_daily_feed_for_date(date) + # get the feed data + feed = get_feed_data_for_date(date) + + # for each attribute + @feed_select_options.each do |attr| + key = attr.to_s + # if this attribute is a field + if key.index('field') == 0 + # get the field number + field_number = key.sub('field', '').to_i + # add the feed; replace with Rails 4 create_or_update if appropriate + DailyFeed.my_create_or_update({:channel_id => @channel.id, :date => feed.created_at, :calculation => @calculation_type, :field => field_number, :result => feed[key]}) + end + end + + # add to existing daily feeds + @daily_feeds << feed + end + + # get feeds + def get_feeds + # get feed based on conditions + @feeds = Feed.where(:channel_id => @channel.id, :created_at => @date_range) + .select(@feed_select_options) + .order('created_at desc') + .limit(@limit) + .load + + # sort properly + @feeds.reverse! + + # calculate feeds + @feeds = calculate_feeds(@feeds) + end + + # gets daily feeds + def get_daily_feeds + sql_date_range = (@daily_date_range.first + 1.day)..(@daily_date_range.last + 1.day) + # if this is for a specific field + if @options[:field_id].present? + @daily_feeds = DailyFeed.where(:channel_id => @channel.id, :calculation => @calculation_type, :date => sql_date_range, :field => @options[:field_id]).order('date desc').load + # else get daily feeds for all fields + else + @daily_feeds = DailyFeed.where(:channel_id => @channel.id, :calculation => @calculation_type, :date => sql_date_range).order('date desc').load + end + + # normalize if there are daily feeds + @daily_feeds = Feed.normalize_feeds(@daily_feeds) if @daily_feeds.present? + + # get dates that are missing from daily feed + add_missing_daily_feeds + + # add todays data + add_daily_feed_for_today + + # sort correctly + @daily_feeds.sort!{ |x, y| x.created_at <=> y.created_at } + end + + # add feed data for today + def add_daily_feed_for_today + @daily_feeds << get_feed_data_for_date(Time.now.to_date) if @options[:days].present? + end + + # get dates that are missing from daily feed + def add_missing_daily_feeds + missing_dates = [] + current_date = @daily_date_range.first + 1.day + # if current date is older than channel date, set it to channel date + current_date = @channel.created_at.to_date if @date_range.first < @channel.created_at + end_date = @daily_date_range.last + + # get dates that exist in daily feeds + daily_feed_dates = {} + @daily_feeds.each { |feed| daily_feed_dates[feed.created_at.to_date] = true } + + # iterate through each date + while current_date < end_date + # add missing dates + missing_dates << current_date if daily_feed_dates[current_date] != true + # go to the next day + current_date += 1.day + end + + # add daily feeds for any missing days + missing_dates.each { |date| add_daily_feed_for_date(date) } + end + + # apply rounding and min/max + def format_output_feeds + # set output feeds + @output_feeds = (@daily_feeds.present? ? @daily_feeds : @feeds) + + # only get feeds that match min and max values + @output_feeds = @output_feeds.select{ |x| x.greater_than?(@options[:min]) } if @options[:min].present? + @output_feeds = @output_feeds.select{ |x| x.less_than?(@options[:max]) } if @options[:max].present? + + # round feeds if necessary + @output_feeds = object_round(@output_feeds, @options[:round].to_i) if @options[:round] && !@rounded + end + + # calculate feeds + def calculate_feeds(feeds) + # if a feed has data + if feeds.present? + # convert to timescales if necessary + if timeparam_valid?(@options[:timescale]) + feeds = feeds_into_timescales(feeds, @options) + # convert to sums if necessary + elsif timeparam_valid?(@options[:sum]) + feeds = feeds_into_sums(feeds, @options) + @rounded = true + # convert to averages if necessary + elsif timeparam_valid?(@options[:average]) + feeds = feeds_into_averages(feeds, @options) + @rounded = true + # convert to medians if necessary + elsif timeparam_valid?(@options[:median]) + feeds = feeds_into_medians(feeds, @options) + @rounded = true + end + end + + return feeds + end + +end + diff --git a/app/models/header.rb b/app/models/header.rb new file mode 100644 index 0000000..3455f1f --- /dev/null +++ b/app/models/header.rb @@ -0,0 +1,16 @@ +# == Schema Information +# +# Table name: headers +# +# id :integer not null, primary key +# name :string(255) +# value :string(255) +# created_at :datetime +# updated_at :datetime +# thinghttp_id :integer +# + +class Header < ActiveRecord::Base + belongs_to :thinghttp +end + diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 9bd88d9..9bb2b98 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -1,11 +1,11 @@ class Mailer < ActionMailer::Base - #default :from => 'support@thingspeak.com' + default :from => 'support@thingspeak.com' def password_reset(user, webpage) - @user = user - @webpage = webpage - mail(:to => @user.email, - :subject => t(:password_reset_subject)) - end + @user = user + @webpage = webpage + mail(:to => @user.email, + :subject => t(:password_reset_subject)) + end end diff --git a/app/models/pipe.rb b/app/models/pipe.rb new file mode 100644 index 0000000..ce91adf --- /dev/null +++ b/app/models/pipe.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: pipes +# +# id :integer not null, primary key +# name :string(255) not null +# url :string(255) not null +# slug :string(255) not null +# created_at :datetime +# updated_at :datetime +# parse :string(255) +# cache :integer +# + +class Pipe < ActiveRecord::Base + + # pagination variables + cattr_reader :per_page + @@per_page = 50 + +end + diff --git a/app/models/plugin.rb b/app/models/plugin.rb new file mode 100644 index 0000000..a91ab99 --- /dev/null +++ b/app/models/plugin.rb @@ -0,0 +1,134 @@ +# == Schema Information +# +# Table name: plugins +# +# id :integer not null, primary key +# name :string(255) +# user_id :integer +# html :text +# css :text +# js :text +# created_at :datetime +# updated_at :datetime +# private_flag :boolean default(TRUE) +# + +class Plugin < ActiveRecord::Base + belongs_to :user + has_many :plugin_window_details + has_many :windows, :through => :plugin_window_details, :source => :plugin_window + before_destroy { |record| record.windows.each { |window| window.delete } } + + def destroy_window + window_id = PluginWindowDetail.find_by_plugin_id(self.id).plugin_window_id + Window.delete(window_id) + end + + def private? + private_flag + end + + def public? + !private_flag + end + + def has_private_windows(channel_id) + has_private_windows = false + windows.each do |window| + + if window.private? && window.channel_id == channel_id + has_private_windows = true + + end + + end + + return has_private_windows + end + + def has_public_windows(channel_id) + has_public_windows = false + windows.each do |window| + has_public_windows = true if !window.private? && window.channel_id == channel_id + end + return has_public_windows + end + + #private_dashboard_visibility + def private_dashboard_windows(channel_id) + dashboard_windows channel_id, true + end + + def public_dashboard_windows(channel_id) + dashboard_windows channel_id, false + end + def dashboard_windows(channel_id, privacy) + dashboard_windows = [] + windows.each do |window| + if window.private_flag == privacy && !window.show_flag && channel_id == window.channel_id + dashboard_windows << window + end + end + dashboard_windows + end + + #public_dashboard_visibility + def public_window + public_window = nil + windows.each do |window| + if !window.private_flag # && !window.show_flag + public_window = window + end + end + unless public_window.nil? + public_window + else + nil + end + end + + def make_windows(channel_id, api_domain) + pluginWindows = [] + #create all the windows as appropriate + #Private plugins have one window.. + #Public plugins have a private/private windows, private/public window and a public window + if !has_public_windows(channel_id) && self.public? + windows << PluginWindow.new_from(self, channel_id, :public, api_domain) + else + update_windows(channel_id) + end + + if !has_private_windows(channel_id) + windows << Window.new_from(self, channel_id, :private, api_domain) + end + save + end + + def update_windows(channel_id) + + windows.each do |window| + window.name = self.name + window.save + end + + if has_public_windows(channel_id) && self.private? + windows.delete(public_window.destroy) unless public_window.nil? + end + + end + + def update_all_windows + channel_ids = Set.new + windows.each do |window| + window.name = self.name + channel_ids.add( window.channel_id) + window.save + end + channel_ids.each do |id| + if has_public_windows(id) && self.private? + windows.delete(public_window.destroy) unless public_window.nil? + end + end + end + +end diff --git a/app/models/plugin_window.rb b/app/models/plugin_window.rb new file mode 100644 index 0000000..f0308ec --- /dev/null +++ b/app/models/plugin_window.rb @@ -0,0 +1,23 @@ +# == Schema Information +# +# Table name: windows +# +# id :integer not null, primary key +# channel_id :integer +# position :integer +# created_at :datetime +# updated_at :datetime +# html :text +# col :integer +# title :string(255) +# wtype :string(255) +# name :string(255) +# type :string(255) +# private_flag :boolean default(FALSE) +# show_flag :boolean default(TRUE) +# + +class PluginWindow < Window + relate_to_details +end + diff --git a/app/models/plugin_window_detail.rb b/app/models/plugin_window_detail.rb new file mode 100644 index 0000000..f8d3d53 --- /dev/null +++ b/app/models/plugin_window_detail.rb @@ -0,0 +1,16 @@ +# == Schema Information +# +# Table name: plugin_window_details +# +# id :integer not null, primary key +# plugin_id :integer +# plugin_window_id :integer +# created_at :datetime +# updated_at :datetime +# + +class PluginWindowDetail < ActiveRecord::Base + belongs_to :plugin_window + belongs_to :plugin + +end diff --git a/app/models/portlet_window.rb b/app/models/portlet_window.rb new file mode 100644 index 0000000..d37ceda --- /dev/null +++ b/app/models/portlet_window.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: windows +# +# id :integer not null, primary key +# channel_id :integer +# position :integer +# created_at :datetime +# updated_at :datetime +# html :text +# col :integer +# title :string(255) +# wtype :string(255) +# name :string(255) +# type :string(255) +# private_flag :boolean default(FALSE) +# show_flag :boolean default(TRUE) +# + +class PortletWindow < Window + relate_to_details +end diff --git a/app/models/portlet_window_detail.rb b/app/models/portlet_window_detail.rb new file mode 100644 index 0000000..bed16ae --- /dev/null +++ b/app/models/portlet_window_detail.rb @@ -0,0 +1,12 @@ +# == Schema Information +# +# Table name: portlet_window_details +# +# id :integer not null, primary key +# portlet_window_id :integer +# created_at :datetime +# updated_at :datetime +# + +class PortletWindowDetail < ActiveRecord::Base +end diff --git a/app/models/tag.rb b/app/models/tag.rb new file mode 100644 index 0000000..357d167 --- /dev/null +++ b/app/models/tag.rb @@ -0,0 +1,19 @@ +# == Schema Information +# +# Table name: tags +# +# id :integer not null, primary key +# name :string(255) +# created_at :datetime +# updated_at :datetime +# + +class Tag < ActiveRecord::Base + has_many :taggings + has_many :channels, :through => :taggings + + validates_presence_of :name + + self.include_root_in_json = false + +end diff --git a/app/models/tagging.rb b/app/models/tagging.rb new file mode 100644 index 0000000..bcf8574 --- /dev/null +++ b/app/models/tagging.rb @@ -0,0 +1,15 @@ +# == Schema Information +# +# Table name: taggings +# +# id :integer not null, primary key +# tag_id :integer +# channel_id :integer +# created_at :datetime +# updated_at :datetime +# + +class Tagging < ActiveRecord::Base + belongs_to :tag + belongs_to :channel +end diff --git a/app/models/twitter_account.rb b/app/models/twitter_account.rb new file mode 100644 index 0000000..bbc14c7 --- /dev/null +++ b/app/models/twitter_account.rb @@ -0,0 +1,57 @@ +# == Schema Information +# +# Table name: twitter_accounts +# +# id :integer not null, primary key +# screen_name :string(255) +# user_id :integer +# twitter_id :integer +# token :string(255) +# secret :string(255) +# created_at :datetime +# updated_at :datetime +# api_key :string(17) not null +# + +class TwitterAccount < ActiveRecord::Base + include KeyUtilities + + belongs_to :user + has_many :reacts, :as => :actionable, :dependent => :restrict_with_exception + + # pagination variables + cattr_reader :per_page + @@per_page = 50 + + before_create :set_api_key + + def renew_api_key + self.update_attribute(:api_key, generate_api_key(16, 'twitter')) + end + + def tweet(status, opts = {}) + opts.delete('api_key') + opts.delete('controller') + opts.delete('action') + + client = TwitterOAuth::Client.new( + :consumer_key => CONSUMER_KEY, + :consumer_secret => CONSUMER_SECRET, + :token => self.token, + :secret => self.secret + ) + + client.update(status, opts) + + rescue Twitter::Error::Unauthorized + + end + + private + + def set_api_key + self.api_key = generate_api_key(16, 'twitter') + end +end + + diff --git a/app/models/user.rb b/app/models/user.rb index 200807d..b184864 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,26 +1,14 @@ -class User < ActiveRecord::Base - has_many :channels - has_many :api_keys - - acts_as_authentic - - def self.find_by_login_or_email(login) - User.find_by_login(login) || User.find_by_email(login) - end -end - - # == Schema Information # # Table name: users # -# id :integer(4) not null, primary key -# login :string(255) not null -# email :string(255) not null -# crypted_password :string(255) not null -# password_salt :string(255) not null -# persistence_token :string(255) not null -# perishable_token :string(255) not null +# id :integer not null, primary key +# login :string(255) not null +# email :string(255) not null +# crypted_password :string(255) not null +# password_salt :string(255) not null +# persistence_token :string(255) not null +# perishable_token :string(255) not null # current_login_at :datetime # last_login_at :datetime # current_login_ip :string(255) @@ -28,5 +16,78 @@ end # created_at :datetime # updated_at :datetime # time_zone :string(255) +# public_flag :boolean default(FALSE) +# bio :text +# website :string(255) +# api_key :string(16) # +####### NOTE ####### +# user.api_keys is a collection of channel api_keys (read and write) +# user.api_key is a single api_key that allows control of a user's account +#################### +class User < ActiveRecord::Base + include KeyUtilities + has_many :channels + has_many :twitter_accounts, :dependent => :destroy + has_many :thinghttps, :dependent => :destroy + has_many :tweetcontrols, :dependent => :destroy + has_many :reacts, :dependent => :destroy + has_many :scheduled_thinghttps, :dependent => :destroy + has_many :talkbacks, :dependent => :destroy + has_many :plugins + has_many :devices + has_many :api_keys + has_many :watchings, :dependent => :destroy + has_many :watched_channels, :through => :watchings, :source => :channel + has_many :comments + + acts_as_authentic + + self.include_root_in_json = false + + # pagination variables + cattr_reader :per_page + @@per_page = 50 + + # find a user using login or email + def self.find_by_login_or_email(login) + User.find_by_login(login) || User.find_by_email(login) + end + + # get user signups per day + def self.signups_per_day + sql = 'select DATE_FORMAT(created_at,"%Y-%m-%d") as day, count(id) as signups from users group by day' + days = ActiveRecord::Base.connection.execute(sql) + return days + end + + # for to_json or to_xml, return only the public attributes + def self.public_options(user) + output = { :only => [:id, :login, :created_at] } + + # if the profile is public + if user.public_flag == true + additional_options = { :only => [:website, :bio] } + # merge in the additional options by adding the values + output.merge!(additional_options){ |key, oldval, newval| oldval + newval } + end + + return output + end + + # for to_json or to_xml, return the correct private attributes + def self.private_options + { :only => [:id, :login, :created_at, :email, :website, :bio] } + end + + # set new api key + def set_new_api_key! + new_api_key = generate_api_key(16, 'user') + self.update_column(:api_key, new_api_key) + return new_api_key + end + +end + + diff --git a/app/models/user_session.rb b/app/models/user_session.rb index 457f515..c85f03e 100644 --- a/app/models/user_session.rb +++ b/app/models/user_session.rb @@ -1,7 +1,7 @@ class UserSession < Authlogic::Session::Base - find_by_login_method :find_by_login_or_email + find_by_login_method :find_by_login_or_email def to_key new_record? ? nil : [ self.send(self.class.primary_key) ] end -end \ No newline at end of file +end diff --git a/app/models/watching.rb b/app/models/watching.rb new file mode 100644 index 0000000..074db06 --- /dev/null +++ b/app/models/watching.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: watchings +# +# id :integer not null, primary key +# user_id :integer +# channel_id :integer +# created_at :datetime +# updated_at :datetime +# + +class Watching < ActiveRecord::Base + belongs_to :user + belongs_to :channel + + # check if the channel is being watched by this user + def self.check(user_id, channel_id) + @watching = Watching.find_by_user_id_and_channel_id(user_id, channel_id) + return @watching.nil? ? false : true + end + +end diff --git a/app/models/window.rb b/app/models/window.rb new file mode 100644 index 0000000..c8fa105 --- /dev/null +++ b/app/models/window.rb @@ -0,0 +1,50 @@ +# == Schema Information +# +# Table name: windows +# +# id :integer not null, primary key +# channel_id :integer +# position :integer +# created_at :datetime +# updated_at :datetime +# html :text +# col :integer +# title :string(255) +# wtype :string(255) +# name :string(255) +# type :string(255) +# private_flag :boolean default(FALSE) +# show_flag :boolean default(TRUE) +# + +class Window < ActiveRecord::Base + belongs_to :channel + + self.include_root_in_json = true + + def self.relate_to_details + class_eval <<-EOF + has_one :window_detail, :class_name => "#{self.name}Detail" + accepts_nested_attributes_for :window_detail + default_scope { includes(:window_detail) } + EOF + end + def private? + return private_flag + end + + def self.new_from( plugin, channel_id, privacy_flag, api_domain ) + window = PluginWindow.new + window.wtype = :plugin + window.position = 0 + window.col = 0 + window.title = "window_plugin" + window.name = plugin.name + window.private_flag = (privacy_flag == :private) + window.channel = Channel.find(channel_id) + window.html ="" + window.show_flag = false + window if window.save + + end +end diff --git a/app/views/api_keys/_index.html.erb b/app/views/api_keys/_index.html.erb new file mode 100644 index 0000000..c08ef8a --- /dev/null +++ b/app/views/api_keys/_index.html.erb @@ -0,0 +1,52 @@ +
+

<%= t(:api_key_write) %>

+ <%= @write_key %> +

+ + <%= button_to t(:api_key_write_new), channel_api_keys_path(@channel, :write => 1), :data => { :confirm => t(:confirm_new_api_key) } %> + +

+ +

<%= t(:api_key_read) %>

+ <% @read_keys.each do |read_key| %> + + + + + + + + + + + + + +
<%= t(:api_key_key) %>:<%= read_key %>
<%= t(:note) %>: + <%= form_for read_key, :as => :api_key, :url => channel_api_key_path(@channel, read_key), :html => {:method => 'put'} do |f| %> + <%= f.text_area :note, :cols => 30, :rows => 4 %> +
+
<%= f.submit t(:note_save) %>
+ <% end %> + <%= button_to t(:api_key_delete), channel_api_key_path(@channel, read_key), :method => 'delete', :data => { :confirm => t(:confirm_read_key_delete) } %>
+

+ + <% end %> + + <%= button_to t(:api_key_read_new), channel_api_keys_path(@channel, :write => 0) %> +
+
+
+ diff --git a/app/views/api_keys/index.html.erb b/app/views/api_keys/index.html.erb index 142d6fc..e89012f 100644 --- a/app/views/api_keys/index.html.erb +++ b/app/views/api_keys/index.html.erb @@ -1,43 +1,4 @@ -

- <%= link_to t(:channels), channels_path %> » - <%= link_to channel_path(@channel.id) do %> <%= t(:channel) %> <%= @channel.id %><% end %> » - <%= t(:api_keys) %> -

- -

<%= t(:api_key_write) %>

-<%= @write_key %> +
+<%= render :partial => "index" %> +
-

- -<%= button_to t(:api_key_write_new), channel_api_keys_path(@channel, :write => 1), :confirm => t(:confirm_new_api_key) %> - -

- -

<%= t(:api_key_read) %>

-<% @read_keys.each do |read_key| %> - - - - - - - - - - - - - -
<%= t(:api_key_key) %>:<%= read_key %>
<%= t(:note) %>: - <%= form_for read_key, :as => :api_key, :url => channel_api_key_path(@channel, read_key), :html => {:method => 'put'} do |f| %> - <%= f.text_area :note, :cols => 30, :rows => 4 %> -
-
<%= f.submit t(:note_save) %>
- <% end %> - <%= button_to t(:api_key_delete), channel_api_key_path(@channel, read_key) , :method => 'delete', :confirm => t(:confirm_read_key_delete) %>
-

- -<% end %> - -<%= button_to t(:api_key_read_new), channel_api_keys_path(@channel, :write => 0) %> -
diff --git a/app/views/apps/index.html.erb b/app/views/apps/index.html.erb new file mode 100644 index 0000000..e7925ef --- /dev/null +++ b/app/views/apps/index.html.erb @@ -0,0 +1,118 @@ +
+
+ + + +
+ +
+ <%= link_to thingtweets_path do %> + <%= image_tag 'thingtweet.png', :size => '104x104' %> +
+ <%= t(:thingtweet) %> + <% end %> +
+ +
+ <%= link_to thinghttp_index_path do %> + <%= image_tag 'thinghttp.png', :size => '104x104' %> +
+ <%= t(:thinghttp) %> + <% end %> +
+ +
+ <%= link_to tweetcontrol_index_path do %> + <%= image_tag 'tweetcontrol.png', :size => '104x104' %> +
+ <%= t(:tweetcontrol) %> + <% end %> +
+ +
+ <%= link_to reacts_path do %> + <%= image_tag 'react.png', :size => '104x104' %> +
+ <%= t(:react) %> + <% end %> +
+ +
+ <%= link_to talkbacks_path do %> + <%= image_tag 'talkback.png', :size => '104x104' %> +
+ <%= t(:talkback) %> + <% end %> +
+ + <% if is_admin? %> +
+ <%= link_to scheduled_thinghttps_path do %> + <%= image_tag 'scheduled_thinghttp.png', :size => '104x104' %> +
+ <%= t(:scheduled_thinghttp) %> + <% end %> +
+ <% end %> + +
+
+ + +
+ + + diff --git a/app/views/channels/_addportlet.html.erb b/app/views/channels/_addportlet.html.erb new file mode 100644 index 0000000..0aab268 --- /dev/null +++ b/app/views/channels/_addportlet.html.erb @@ -0,0 +1,2 @@ +
+ diff --git a/app/views/channels/_channelinfo.html.erb b/app/views/channels/_channelinfo.html.erb new file mode 100644 index 0000000..e6744ce --- /dev/null +++ b/app/views/channels/_channelinfo.html.erb @@ -0,0 +1,24 @@ +
+

<%= @channel.name %>

+
<%= @channel.list_tags %>
+
+

by <%= link_to @channel.user.login, user_profile_path(@channel.user.login) %>

+

<%= @channel.description %>

+

+
+ + diff --git a/app/views/channels/_devinfo.html.erb b/app/views/channels/_devinfo.html.erb new file mode 100644 index 0000000..44bb3b8 --- /dev/null +++ b/app/views/channels/_devinfo.html.erb @@ -0,0 +1,29 @@ +
+ + + + + + +
<%= @channel.name %> <%= t(:channel_feed) %>: + <%= link_to 'JSON', "#{@api_domain}channels/#{@channel.id}/feed.json", :target => "_blank" %> + <%= link_to 'XML', "#{@api_domain}channels/#{@channel.id}/feed.xml", :target => "_blank" %> + <%= link_to 'CSV', "#{@api_domain}channels/#{@channel.id}/feed.csv", :target => "_blank" %> +
+ + <% @channel.attribute_names.each do |attr| %> + <% if attr.index('field') and @channel[attr] and !@channel[attr].empty? %> + + + + + <% end %> + <% end %> + +
<%= t(:field) %> <%= attr[-1] %> <%= t(:data) %>: <%= @channel[attr] %> + <%= link_to 'JSON', "#{@api_domain}channels/#{@channel.id}/field/#{attr[-1]}.json", :target => "_blank" %> + <%= link_to 'XML', "#{@api_domain}channels/#{@channel.id}/field/#{attr[-1]}.xml", :target => "_blank" %> + <%= link_to 'CSV', "#{@api_domain}channels/#{@channel.id}/field/#{attr[-1]}.csv", :target => "_blank" %> +
+ +
diff --git a/app/views/channels/_edit.html.erb b/app/views/channels/_edit.html.erb new file mode 100644 index 0000000..0d4a397 --- /dev/null +++ b/app/views/channels/_edit.html.erb @@ -0,0 +1,174 @@ +
+<% flash.each do |name, msg| %> +
+

<%= msg %>

+
+
+<% end %> + <%= form_for @channel, :html => {:method => 'put'} do |c| %> + <% unless session[:errors].nil? + session[:errors].each do |attr, msg| + @channel.errors.add(attr, msg) + end + session[:errors] = nil %> + <% end %> + +

+ <%= error_messages_for 'channel', :header_message => t(:try_again), :message => t(:channel_error) %> +

+ + + + + + + + + + + + + + + + + + + <%= fields_for :tags do |t| %> + + + + + <% end %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<%= t(:channel_ranking) %><%= @channel.ranking %>%
<%= t(:channel_id) %><%= @channel.id %>
<%= t(:channel_name) %><%= c.text_field :name %>
<%= t(:channel_description) %><%= c.text_area :description, :cols => 30, :rows => 4 %>
<%= t(:tags) %><%= t.text_area :name, :cols => 30, :rows => 2, :value => @channel.list_tags %>
<%= t(:latitude) %><%= c.text_field :latitude %>
<%= t(:longitude) %><%= c.text_field :longitude %>
<%= t(:elevation) %><%= c.text_field :elevation %>
<%= t(:public) %><%= c.check_box :public_flag %>
<%= t(:channel_url) %><%= c.text_field :url %>
<%= t(:video_id) %> + <%= c.text_field :video_id, :class=>'video_narrow'%> + <%= c.radio_button :video_type, 'youtube' %> + <%= t(:youtube) %> + <%= c.radio_button :video_type, 'vimeo' %> + <%= t(:vimeo) %> +
<%= t(:field) %> 1<%= c.text_field :field1, :class => 'field' %>
<%= t(:field) %> 2<%= c.text_field :field2, :class => 'field' %>
<%= t(:field) %> 3<%= c.text_field :field3, :class => 'field' %>
<%= t(:field) %> 4<%= c.text_field :field4, :class => 'field' %>
<%= t(:field) %> 5<%= c.text_field :field5, :class => 'field' %>
<%= t(:field) %> 6<%= c.text_field :field6, :class => 'field' %>
<%= t(:field) %> 7<%= c.text_field :field7, :class => 'field' %>
<%= t(:field) %> 8<%= c.text_field :field8, :class => 'field' %>
<%= c.submit t(:channel_update) %>
+ <% end %> + +

+ +

<%= t(:channel_clear_message) %>

+ <%= button_to t(:channel_clear), { :controller => 'channels', :action => 'clear', :id => @channel.id }, :data => { :confirm => t(:confirm_channel_clear) } %> + +

+ +

<%= t(:channel_delete_message) %>

+ <%= button_to t(:channel_delete), channel_path(@channel.id), :method => 'delete', :data => { :confirm => t(:confirm_channel_delete) } %> +
+ + + diff --git a/app/views/channels/_import.html.erb b/app/views/channels/_import.html.erb new file mode 100644 index 0000000..4ee45e8 --- /dev/null +++ b/app/views/channels/_import.html.erb @@ -0,0 +1,48 @@ +
+ <%= t(:upload_select) %> +

+<% flash.each do |name, msg| %> +
+

<%= msg %>

+
+
+<% end %> + <%= form_for :upload, :url => upload_channel_path(@channel), :html => { :multipart => true } do |f| %> + <%= f.file_field :csv %> +

+ <%= t(:time_zone) %> + <%= time_zone_select 'feed', 'time_zone', nil, :default => 'UTC' %> +

+ <%= f.submit t(:upload), :disable_with => t(:uploading) %> + <% end %> + +
+ + diff --git a/app/views/channels/_list.html.erb b/app/views/channels/_list.html.erb new file mode 100644 index 0000000..e9d94da --- /dev/null +++ b/app/views/channels/_list.html.erb @@ -0,0 +1,23 @@ +
+ <% @channels.each do |channel| %> + + <% channel.ranking = channel.calc_ranking if channel.ranking.blank? %> +
+
+

+ <%= link_to channel.name, channel_path(channel.id), :id => "showsite_#{channel.id}" %> +

+

by <%= channel.user.login %>

+

<%= channel.description %>

+
+

+ <% channel.tags.each do |tag| %> + <%= tag.name %><% unless tag == channel.tags.last %>, <% end %> + <% end %> +

+
+
+ + <% end %> +
+ diff --git a/app/views/channels/_private_show.html.erb b/app/views/channels/_private_show.html.erb new file mode 100644 index 0000000..148b4f6 --- /dev/null +++ b/app/views/channels/_private_show.html.erb @@ -0,0 +1,31 @@ +<%= render :partial => 'channelinfo', :locals => { :zone => "private" } %> +
+ Channel Stats + + + +
Created<%= @channel.created_at %>
Updated<%= @channel.updated_at %>
+ <%= @channel.feeds.count %> Entries +
+
+
+
+
+ diff --git a/app/views/channels/_public_show.html.erb b/app/views/channels/_public_show.html.erb new file mode 100644 index 0000000..a54e24d --- /dev/null +++ b/app/views/channels/_public_show.html.erb @@ -0,0 +1,75 @@ +<% if @channel.public? %> + +<%= render :partial => 'channelinfo', :locals => { :zone => "public" } %> + +
+
+
+
+ + + + +<% else %> +
+

<%= t(:channel_not_public) %>

+
+<% end %> + diff --git a/app/views/channels/_socialbuttons.html.erb b/app/views/channels/_socialbuttons.html.erb new file mode 100644 index 0000000..661f562 --- /dev/null +++ b/app/views/channels/_socialbuttons.html.erb @@ -0,0 +1,26 @@ + + + diff --git a/app/views/channels/index.html.erb b/app/views/channels/index.html.erb index 6ea0d2d..d0011ba 100644 --- a/app/views/channels/index.html.erb +++ b/app/views/channels/index.html.erb @@ -1,25 +1,79 @@ -

<%= t(:channels) %>

-<% if @channels.length > 0 %> - - - - - - - <% @channels.each do |d| %> - - - - +
+
+ + + +
+ + <% if @channels.length > 0 %> + +
<%= t(:channel_id) %><%= t(:channel_name) %>
<%= link_to d.id, channel_path(d.id) %><%= link_to d.name, channel_path(d.id) %>
+ + <% @channels.each do |channel| %> + <% if !channel.social %> + + + + + + <% end %> + <% end %> + +
+

<%= link_to channel.name, channel_path(channel.id), :id => "showsite_#{channel.id}" %>

+
+ <%= channel.public_flag ? image_tag('icons/Unlocked.png', :title=> t(:public_true)) : image_tag('icons/Locked.png', :title=> t(:channel_not_public)) %> +
+ + +

<%= link_to t(:private_link), channel_path(channel.id, :anchor => 'privateview') %> | + <%= link_to t(:public_link), channel_path(channel.id, :anchor => 'publicview') %> | + <%= link_to t(:settings_link), channel_path(channel.id, :anchor => 'channelsettings') %> | + <%= link_to t(:api_key_link), channel_path(channel.id, :anchor => 'apikeys') %> | + <%= link_to t(:data_import_link), channel_path(channel.id, :anchor => 'dataimport') %>

<%= channel.description %>

+ +
+ <% end %> - - - -

- -<% end %> - -<%= form_for :channel do |d| %> - - <%= d.submit t(:channel_create) %> -<% end %> \ No newline at end of file + + <%= form_for :channel do |d| %> + + <%= d.submit t(:channel_create), :class => 'btn btn-primary' %> + <% end %> + + <% if is_admin? %> + +


+ + <% @channels.each do |c| %> + <% if c.social %> + <%= t(:social_channel) %>: <%= link_to c.name, (Rails.env == 'production') ? "http://www.socialsensornetwork.com/#{c.slug}" : "/s/#{c.slug}" %> +
+ <% end %> + <% end %> + +
+ + <%= link_to t(:social_channel_create), :controller => 'channels', :action => 'social_new' %> + <% end %> + +
+ + + + + + diff --git a/app/views/channels/private_show.html.erb b/app/views/channels/private_show.html.erb new file mode 100644 index 0000000..d5c7db8 --- /dev/null +++ b/app/views/channels/private_show.html.erb @@ -0,0 +1,133 @@ +<%= render :partial => "devinfo" %> +<%= render :partial => "addportlet" %> + +
+ + + +
+ +<%= render :partial => "socialbuttons" %> + +
+ + +
+ <%= render :partial => "private_show" %> +
+ +
+ <%= render :partial => "public_show" %> +
+ +
+ <%= render :partial => "edit" %> +
+ +
+ <%= render :partial => "api_keys/index" %> +
+ +
+ <%= render :partial => "import" %> +
+ + +
+ + + diff --git a/app/views/channels/public.html.erb b/app/views/channels/public.html.erb new file mode 100644 index 0000000..19d295a --- /dev/null +++ b/app/views/channels/public.html.erb @@ -0,0 +1,11 @@ +
+
+ + + <%= render :partial => 'list' %> +
+ <%= will_paginate @channels %> + +
+
+ diff --git a/app/views/channels/public_show.html.erb b/app/views/channels/public_show.html.erb new file mode 100644 index 0000000..91bd579 --- /dev/null +++ b/app/views/channels/public_show.html.erb @@ -0,0 +1,92 @@ +<%= render :partial => "devinfo" %> + +
+ + + +
+ +<%= render :partial=>"socialbuttons" %> + +
+ +
+ <%= render :partial => "public_show" %> +
+
+ + diff --git a/app/views/channels/social_feed.html.erb b/app/views/channels/social_feed.html.erb new file mode 100644 index 0000000..9c45f16 --- /dev/null +++ b/app/views/channels/social_feed.html.erb @@ -0,0 +1,93 @@ + + + + + + + +;'> +
+ + diff --git a/app/views/channels/social_new.html.erb b/app/views/channels/social_new.html.erb new file mode 100644 index 0000000..327ff78 --- /dev/null +++ b/app/views/channels/social_new.html.erb @@ -0,0 +1,107 @@ +
+

+ <%= link_to t(:channels), channels_path %> » + <%= t(:social_channel_new) %> +

+ + <%= form_for @channel, :url => { :action => 'social_create' } do |c| %> + <%= error_messages_for 'channel', :header_message => t(:try_again), :message => t(:channel_error) %> + + + + + + + + + + + + + + + <%= fields_for :tags do |t| %> + + + + + <% end %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<%= t(:channel_name) %><%= c.text_field :name %>
<%= t(:slug) %><%= c.text_field :slug %>
<%= t(:channel_directions) %><%= c.text_area :description, :cols => 30, :rows => 4 %>
<%= t(:tags) %><%= t.text_area :name, :cols => 30, :rows => 2, :value => @channel.list_tags %>
<%= t(:field) %> 1<%= c.text_field :field1 %>
<%= t(:field) %> 2<%= c.text_field :field2 %>
<%= t(:field) %> 3<%= c.text_field :field3 %>
<%= t(:field) %> 4<%= c.text_field :field4 %>
<%= t(:field) %> 5<%= c.text_field :field5 %>
<%= t(:field) %> 6<%= c.text_field :field6 %>
<%= t(:field) %> 7<%= c.text_field :field7 %>
<%= t(:field) %> 8<%= c.text_field :field8 %>
<%= t(:message_field) %><%= c.text_field :status %>
<%= c.submit t(:social_channel_create) %>
+ <% end %> + +
+ + + + \ No newline at end of file diff --git a/app/views/channels/social_show.html.erb b/app/views/channels/social_show.html.erb new file mode 100644 index 0000000..e3b095b --- /dev/null +++ b/app/views/channels/social_show.html.erb @@ -0,0 +1,308 @@ + + + + <%= @channel.name %> + + + + + +
+ +
+ + + +
+ +
+ Developers? + <%= link_to 'JSON', "#{@api_domain}channels/#{@channel.id}/feed.json?results=100&location=true&offset=0&round=2&status=true" %> + <%= link_to 'XML', "#{@api_domain}channels/#{@channel.id}/feed.xml?results=100&location=true&offset=0&round=2&status=true" %> + <%= link_to 'CSV', "#{@api_domain}channels/#{@channel.id}/feed.csv?results=100&location=true&offset=0&round=2&status=true" %> +
+ +
+ +
+ + + +
+ +
+

<%= @channel.name %>

+
+ +
+ + <% if !@channel.description.blank? %> +
<%= t(:channel_directions) %>: <%= @channel.description %>
+
+ <% end %> + + <%= form_tag "#{@post_url}" do %> + + <% @fields.each do |f| %> + + + + + <% end %> + <% if !@channel.status.blank? %> + + + + + <% end %> + + + + + + +
<%= @channel[f] %><%= text_field_tag "#{f}" %>
<%= @channel.status %>
<%= text_area_tag :status %>
+ <%= submit_tag t(:submit), :id => 'submit' %> + +
+ <% end %> + +

+ +
+ + + + <% @fields.each do |f| %> +

+ + <% end %> + + + +
+ +
+ + + +
+ +
+ + + + + + + + diff --git a/app/views/channels/watched.html.erb b/app/views/channels/watched.html.erb new file mode 100644 index 0000000..4cd8108 --- /dev/null +++ b/app/views/channels/watched.html.erb @@ -0,0 +1,18 @@ +
+
+ + + +
+ <% if @channels.empty? %> + <%= t(:watched_empty) %> +

+ <%= link_to t(:watched_find), public_channels_path %> + <% else %> + <%= render :partial => 'list' %> + <% end %> +
+ +
+
+ diff --git a/app/views/charts/_config.html.erb b/app/views/charts/_config.html.erb index 1fe5332..9d23d5f 100644 --- a/app/views/charts/_config.html.erb +++ b/app/views/charts/_config.html.erb @@ -1,126 +1,196 @@ -<% options = '×cale=10' if options.blank? %> -
-

<%= title %>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<%= t(:title) %>:
<%= t(:chart_xaxis) %>:
<%= t(:chart_yaxis) %>:
<%= t(:chart_color) %>:
<%= t(:chart_background_color) %>:
<%= t(:chart_type) %>: - -
+
<%= options %>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
<%= t(:days) %>:
<%= t(:timescale) %>:
<%= t(:average) %>:
<%= t(:median) %>:
<%= t(:sum) %>:
<%= t(:chart_round) %>:
<%= t(:width) %>:
<%= t(:height) %>:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + -
+ - + + + + + + + + +<% if displayconfig %> + + + + + + + + +<% end %> -

- <%= t(:chart_embed_code) %>: -
- - +
<%= t(:title) %>:
<%= t(:chart_xaxis) %>:
<%= t(:chart_yaxis) %>:
<%= t(:chart_color) %>:
<%= t(:chart_background_color) %>:
<%= t(:chart_type) %>: + +
<%= t(:chart_is_dynamic) %>: + +
<%= t(:days) %>:
<%= t(:results) %>:
<%= t(:width) %>:
<%= t(:height) %>:
-


+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<%= t(:timescale) %>: + +
<%= t(:average) %>: + +
<%= t(:median) %>: + +
<%= t(:sum) %>: + +
<%= t(:chart_round) %>:
<%= t(:chart_min) %>:
<%= t(:chart_max) %>:
+ +<% if displayconfig %> + <%= render :partial => 'charts/display', + :locals => { + :index => index, + :width => @width, + :height => @height, + :src => src, + :options => options + } + %> +<% end %> \ No newline at end of file + }); + + // event to capture update button click + $('#button<%= index %>').click(function() { + var width = <%= (@width) ? @width : 450 %>; + var height = <%= @height ? @height : 260 %>; + updateChart(<%= index %>, true, width, height, <%= @channel.id %>); + + }); + + + $('.mutuallyexclusive<%= index %>').change(function() { + selectedValue = $(this).val(); + $('.mutuallyexclusive<%= index %>').each(function () { + $(this).val(""); + }); + $(this).val(selectedValue); + }); + + + diff --git a/app/views/charts/_display.html.erb b/app/views/charts/_display.html.erb new file mode 100644 index 0000000..49fb42b --- /dev/null +++ b/app/views/charts/_display.html.erb @@ -0,0 +1,11 @@ +
+ + + +

+ + <%= t(:chart_embed_code) %>: +
+ + +


diff --git a/app/views/charts/index.html.erb b/app/views/charts/index.html.erb index 2e1fe33..c5c7e40 100644 --- a/app/views/charts/index.html.erb +++ b/app/views/charts/index.html.erb @@ -1,104 +1,66 @@ - +
+

+ <%= link_to t(:channels), channels_path %> » + <%= link_to channel_path(@channel.id) do %> <%= t(:channel) %> <%= @channel.id %><% end %> » + <%= t(:charts) %> +

+ + <% if !@channel.active? %> + <%= render :partial => 'config', + :locals => { + :displayconfig => true, + :title => t(:chart_example), + :src => "https://api.thingspeak.com/channels/3/charts/1", + :options => '×cale=60&round=2', + :index => 0, + :width => @width, + :height => @height + } + %> + +

<%= t(:chart_owned) %>

+ <% end %> + + <% @channel.attribute_names.each do |attr| %> + <% if attr.index('field') and @channel[attr] and !@channel[attr].empty? %> + <%= render :partial => 'config', + :locals => { + :displayconfig => true, + :title => "#{@channel.name} - #{@channel[attr]}", + :src => "#{@domain}channels/#{@channel_id}/charts/#{attr[-1]}", + :options => @channel["options#{attr[-1]}"], + :index => attr[-1], + :width => @width, + :height => @height + } + %> + + <% end %> + <% end %> +
-

- <%= link_to t(:channels), channels_path %> » - <%= link_to channel_path(@channel.id) do %> <%= t(:channel) %> <%= @channel.id %><% end %> » - <%= t(:charts) %> -

- -<%= render :partial => 'config', - :locals => { - :title => t(:chart_example), - :src => "https://api.thingspeak.com/channels/3/charts/1", - :options => '×cale=60&round=2', - :index => 0, - :width => @width, - :height => @height - } -%> - -

<%= t(:chart_owned) %>

- -<% @channel.attribute_names.each do |attr| %> - <% if attr.index('field') and @channel[attr] and !@channel[attr].empty? %> - - <%= render :partial => 'config', - :locals => { - :title => "#{@channel.name} - #{@channel[attr]}", - :src => "#{@domain}channels/#{@channel_id}/charts/#{attr[-1]}", - :options => @channel["options#{attr[-1]}"], - :index => attr[-1], - :width => @width, - :height => @height - } - %> - - <% end %> -<% end %> + \ No newline at end of file + diff --git a/app/views/charts/show.html.erb b/app/views/charts/show.html.erb index b279c01..d1d1245 100644 --- a/app/views/charts/show.html.erb +++ b/app/views/charts/show.html.erb @@ -1,89 +1,127 @@ - - - - - + <%= javascript_include_tag 'application' %> - $(document).ready(function() { - // blank array for holding chart data - var chartData = []; - // variable for the local date in milliseconds - var localDate; - // variable for the last date added to the chart - var last_date; + ;'>
+ diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb new file mode 100644 index 0000000..ee2ba90 --- /dev/null +++ b/app/views/comments/_comment.html.erb @@ -0,0 +1,45 @@ +
> +
+ + + + + +
+ <%= gravatar_tag User.find(comment.user_id), :default => 'wavatar', :secure => true %> + + <% if current_user %> +
+ <%= t(:comment_flag) %> +
+ <% end %> + <%= link_to User.find(comment.user_id).login, list_channels_path(User.find(comment.user_id).login) %> + <%= time_ago_in_words(comment.created_at) %> <%= t(:ago) %> +
+
+ <%= auto_link_urls(comment.body) %> +
+ <% if current_user %> + <% if comment.user == current_user %> + <%= link_to t(:delete), comment_path(comment), :method => :delete, :data => { :confirm => t(:confirm_comment_delete) } %> + <% else %> + <%= t(:comment_reply) %> + <% end %> + <% else %> + <%= link_to t(:comment_reply), channel_comments_path(@channel) %> + <% end %> + +
+
+ <%= render :partial => 'comments/comment', :collection => comment.children %> +
+ diff --git a/app/views/docs/_response.html.erb b/app/views/docs/_response.html.erb new file mode 100644 index 0000000..edff5c3 --- /dev/null +++ b/app/views/docs/_response.html.erb @@ -0,0 +1,5 @@ +
+ Response in: + TEXTJSONXML +
+ diff --git a/app/views/docs/index.html.erb b/app/views/docs/index.html.erb new file mode 100644 index 0000000..c88aa0d --- /dev/null +++ b/app/views/docs/index.html.erb @@ -0,0 +1,4 @@ +
+ welcome +
+ diff --git a/app/views/feed/debug.html.erb b/app/views/feed/debug.html.erb new file mode 100644 index 0000000..f36242c --- /dev/null +++ b/app/views/feed/debug.html.erb @@ -0,0 +1,11 @@ +<%= @count %> records processed +
+<%= @time_start %> => start controller +
+<%= @time_after_db %> => after database operations (<%= @time_after_db - @time_start %> seconds) +
+<%= @time_after_sort %> => after sorting (<%= @time_after_sort - @time_after_db %> seconds) +
+<%= @time_after_json %> => after to_json is processed (<%= @time_after_json - @time_after_sort %> seconds) +
+<%= Time.now %> => after view output (<%= Time.now - @time_after_json %> seconds) \ No newline at end of file diff --git a/app/views/feed/index.csv.erb b/app/views/feed/index.csv.erb index 0bbbd25..dac5bb8 100644 --- a/app/views/feed/index.csv.erb +++ b/app/views/feed/index.csv.erb @@ -1,2 +1,2 @@ -<% if @success %><%= CSV.generate_line @csv_headers %><% @feed_output.each do |feed| %><% row = [] %><% @csv_headers.each do |attr| %><% row.push(feed.send(attr)) %><% end %><%= CSV.generate_line row %><% end %><% else %>-1<% end %> +<% if @success %><%= CSV.generate_line @csv_headers %><% @feed_output.each do |feed| %><% row = [] %><% @csv_headers.each do |attr| %><% row.push(feed.send(attr)) %><% end %><%= CSV.generate_line(row).html_safe %><% end %><% else %>-1<% end %> diff --git a/app/views/feed/index.html.erb b/app/views/feed/index.html.erb index d19c639..088f036 100644 --- a/app/views/feed/index.html.erb +++ b/app/views/feed/index.html.erb @@ -1 +1 @@ -<%= render :partial => 'index.json.erb' %> \ No newline at end of file +<%= render :partial => 'feed/index.json.erb' %> \ No newline at end of file diff --git a/app/views/headers/_fields.html.erb b/app/views/headers/_fields.html.erb new file mode 100644 index 0000000..a2810a3 --- /dev/null +++ b/app/views/headers/_fields.html.erb @@ -0,0 +1,14 @@ +
+
+
+ <%= t(:thinghttp_header_name) %> + <%= header.text_field :name, :class => 'form-control input-sm' %> +
+ <%= t(:thinghttp_header_value) %> + <%= header.text_field :value, :class => 'form-control input-sm' %> + <%= header.link_to_remove t(:thinghttp_header_remove) %> +
+
+
+
+ diff --git a/app/views/layouts/_footer.html.erb b/app/views/layouts/_footer.html.erb new file mode 100644 index 0000000..e04d0c8 --- /dev/null +++ b/app/views/layouts/_footer.html.erb @@ -0,0 +1,20 @@ + + diff --git a/app/views/layouts/_ga.html.erb b/app/views/layouts/_ga.html.erb new file mode 100644 index 0000000..0f10532 --- /dev/null +++ b/app/views/layouts/_ga.html.erb @@ -0,0 +1,12 @@ + + diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb index 0aaa2ff..86e1ebd 100644 --- a/app/views/layouts/_header.html.erb +++ b/app/views/layouts/_header.html.erb @@ -1,12 +1,68 @@ -
- <% if current_user %> - <%= link_to t(:signout), logout_path, :method => 'delete' %> - <% else %> - - <%= link_to t(:signup), new_user_path %> - - <%= link_to t(:signin), login_path %> - <% end %> + - diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c6d20f8..9929d8c 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,16 +1,34 @@ - - <%= @title.nil? ? (@menu.nil? ? t(:application_name) : @menu.capitalize + ' - ' + t(:application_name)) : @title + ' - ' + t(:application_name) %> - <%= stylesheet_link_tag "application" %> - <%= javascript_include_tag "application" %> - <%= csrf_meta_tag %> - - -
- - -
<%= yield %>
-
- + + <%= @title.nil? ? (@menu.nil? ? 'ThingSpeak' : @menu.capitalize + ' - ThingSpeak') : @title + ' - ThingSpeak' %> + + <%= stylesheet_link_tag 'application' %> + + + + + <%= javascript_include_tag 'application' %> + + <%= csrf_meta_tag %> + <% if Rails.env == 'production' %> + <%= render 'layouts/ga' %> + <% end %> + + <%= yield :head %> + + + + +
+ <%= render 'layouts/header' %> +
+ <%= yield %> +
+
+ + <%= render 'layouts/footer' %> + + + diff --git a/app/views/mailer/password_reset.html.erb b/app/views/mailer/password_reset.html.erb index 3707c0e..e22845e 100644 --- a/app/views/mailer/password_reset.html.erb +++ b/app/views/mailer/password_reset.html.erb @@ -5,13 +5,13 @@

- <%= t(:password_reset_message1) %> -
- <%= t(:password_reset_message2) %> -
- <%= t(:password_reset_message3) %> -

- <%= @webpage %> + <%= t(:password_reset_message1) %> +
+ <%= t(:password_reset_message2) %> +
+ <%= t(:password_reset_message3) %> +

+ <%= @webpage %>

\ No newline at end of file diff --git a/app/views/maps/channel_show.html.erb b/app/views/maps/channel_show.html.erb new file mode 100644 index 0000000..c875a7a --- /dev/null +++ b/app/views/maps/channel_show.html.erb @@ -0,0 +1,44 @@ + + + + + + + + +
+ + \ No newline at end of file diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb new file mode 100644 index 0000000..687256e --- /dev/null +++ b/app/views/maps/show.html.erb @@ -0,0 +1,119 @@ + + + + + + + + +
+ + diff --git a/app/views/pages/about.html.erb b/app/views/pages/about.html.erb new file mode 100644 index 0000000..9a586d2 --- /dev/null +++ b/app/views/pages/about.html.erb @@ -0,0 +1 @@ +

<%= t(:about) %>

\ No newline at end of file diff --git a/app/views/pages/export.html.erb b/app/views/pages/export.html.erb new file mode 100644 index 0000000..70c5af6 --- /dev/null +++ b/app/views/pages/export.html.erb @@ -0,0 +1,116 @@ +

export test

+
+ + + + +
+ +
diff --git a/app/views/pages/features.html.erb b/app/views/pages/features.html.erb new file mode 100644 index 0000000..b573795 --- /dev/null +++ b/app/views/pages/features.html.erb @@ -0,0 +1,22 @@ +

<%= t(:features) %>

+ +
All-purpose Data Storage and Retrieval
+

You use ThingSpeak to Send and Receive "data" via simple HTTP requests, much like going to a web page and filling out a form. Data can be from anything -- Blood Sugar Levels measured by a glucose meter, Server Usage and Uptime reported by servers, or Location Info from a mobile phone. Once the data is in ThingSpeak, you can build applications that retrieve the data, use the data for process decision making, and reporting.

+

Data is stored in a ThingSpeak Channel. Each channel allows you to store up to 8 fields of data up to 255 alphanumeric characters; 4 dedicated location fields for Location Description, Latitude, Longitude, and Elevation; Status Update to augment the data; and a Time Date Stamp to time code each piece of incoming data.

+
Data Importing
+

Do you already have a bunch of data collected from data acquisition devices, server logs, or sensors? Then you can use the ThingSpeak Importer to bring in your existing data and leverage the ThingSpeak API and Charts to share with and connect to applications instantly.

+
Dynamic Charting
+

When you need to visualize your data, ThingSpeak has dynamic charts and an API to make customizations. The charts are perfect for displaying sensor data over time and finding some meaning behind the data. ThingSpeak Charts work on all desktop browsers, iPhones, and Android devices by using JavaScript instead of Flash. The chart types supported are Line, Bar, Column, and Step. You can set colors, sizing, and labels to allow the charts to fit perfectly into your web page or web application.

+
Data Processing
+

When pulling data out of ThingSpeak, you can process the data to get it ready for your application. You can also filter the data by setting minimum and maximum value thresholds. Processing options include time scaling, summing, averaging, and median.

+
Integration with Twitter
+

Often enough you will find times where you want to share significant data across social networks like Twitter. You can have your garage door Tweet, + "You left your garage door open" or have your house, say "Today's Power Use was 6150 watts." The ThingSpeak API has Twitter baked in, so you can send status updates to Twitter along with storing your data in a ThingSpeak Channel at the same time.

+
Fully Localized
+

ThingSpeak supports over 40 time zones and time offsets for locations that support Day Light Savings. When charts and data are presented to users, we format times and dates using the viewer's time zone. The user interface for ThingSpeak currently supports English and Brazilian Portuguese languages automatically, but the localization file is available for translation into other languages. ThingSpeak numerical data supports commas used as decimals, for example, it's getting 38,2 degrees in here, for our friends in Brazil and many other countries.

+
Privacy Options for Open Data
+

We respect your privacy. You can choose to make your data public or private. Over 95% of ThingSpeak Channels are private meaning that the data is not publicly accessible without API keys and user authentication. You can control who has access to your data and build applications that are open to those that you choose. We don't sell your data to third-parties. You can even run ThingSpeak on a private network at your facility or home and build tightly secured applications for your organization's needs.

+
Open Source for Open Source
+

The ThingSpeak API is available on GitHub for download and installation on your own servers. You can also take the source code and make changes and contribute new features. ThingSpeak is a modern Ruby on Rails 3.0 application and includes everything to get started including, a full web application, User Management, API Key Management, Channel Management, and Charting. The license for ThingSpeak is under GPLv3 for open source use and can be licensed from ioBridge for closed source applications. ThingSpeak has been installed on over 500 servers and licenced commercially since its release on GitHub in March 2011. Contact ioBridge for licensing options for commercial use. ThingSpeak will be powering many new services and products coming to market in 2012.

+

<%= image_tag 'GitHub_ThingSpeak_API.jpg', :size => '300x288' %>

+ diff --git a/app/views/pages/headers.html.erb b/app/views/pages/headers.html.erb new file mode 100644 index 0000000..dba94f3 --- /dev/null +++ b/app/views/pages/headers.html.erb @@ -0,0 +1,7 @@ + +<% for header in request.env.select {|k,v| k.match("^HTTP.*")} %> + + + +<% end %> +
<%=header[0].split('_',2)[1]%><%=header[1]%>
diff --git a/app/views/pages/home.html.erb b/app/views/pages/home.html.erb index 9a5b16a..5b327a6 100644 --- a/app/views/pages/home.html.erb +++ b/app/views/pages/home.html.erb @@ -1,5 +1,230 @@ -<% if current_user %> - <%= t(:homepage_logged_in) %> -<% else %> - <%= t(:homepage) %> -<% end %> \ No newline at end of file + + +
+
+ <%= image_tag 'front.png', :size => '854x144' %> +
+
+ +


+ + + +


+ +
+ +
+ +

+

    +
  • Open Source API
  • +
  • Real-time data collection
  • +
  • Data processing
  • +
  • Data visualizations
  • +
  • Location-awareness
  • +
  • Status context
  • +
  • Application infrastructure
  • +
  • Twitter proxy
  • +
  • Apps
  • +
  • Plugins
  • +
  • <%= link_to '... more', features_pages_path %>
  • +
+

+
+ +
+ +

+

    +
  • Sensor monitoring
  • +
  • Energy monitoring
  • +
  • Connecting devices and systems
  • +
  • Geo location tracking
  • +
  • Interfacing with social networks
  • +
  • RFID transactions
  • +
+

+ +

+

    +
  • Application developers
  • +
  • Product integrators
  • +
  • Web designers
  • +
+

+
+ +
+ +
+ If you are ready to get started, <%= link_to t(:signup), new_account_path %> for a free user account. +
+ +

+

+

+
+ +
+ +


+ +
+
+ +
+

latest news <%= image_tag 'icon_rss.gif' %>

+
+ + <% cache("blog-posts-on-homepage", :expires_in => 10.minutes) do %> + <%= raw blog_entries %> + <% end %> +
+ +
+
+ diff --git a/app/views/pages/social_home.html.erb b/app/views/pages/social_home.html.erb new file mode 100644 index 0000000..7786c8f --- /dev/null +++ b/app/views/pages/social_home.html.erb @@ -0,0 +1,145 @@ + + + + The Social Sensor Network + + + + +
+ +
+ + + +
+ +
+ + <% link_to 'irs-refund/' do %> + + <% end %> +

the social sensor network is forming.

+

We have one thing in common. At almost all times we are connected to the web.
+ The Social Sensor Network allows everyone to report and share data in an open and meaningful way.

+ +
+ +
+ + + + + + + + + + +
+ + + +
+
+ + demo channels + +
+ + IRS Refunds + Frozen Online Poker Money + +
+ + + + diff --git a/app/views/pipes/index.html.erb b/app/views/pipes/index.html.erb new file mode 100644 index 0000000..bda2e6c --- /dev/null +++ b/app/views/pipes/index.html.erb @@ -0,0 +1,19 @@ +

Pipes

+<%= link_to 'New Pipe', new_pipe_path %> + +

+ + + + <% @pipes.each do |m| %> + > + + + + + + + <% end %> +
IDNameSlugURLDate
<%= link_to m.id, channel_path(m.id) %><%= link_to m.name, channel_path(m.id) %><%= link_to m.slug, channel_path(m.id) %><%= m.url %><%= raw(m.created_at.strftime("%m/%d/%Y %I:%M%p")) %>
+
+<%= will_paginate @pipes %> diff --git a/app/views/pipes/new.html.erb b/app/views/pipes/new.html.erb new file mode 100644 index 0000000..b9de776 --- /dev/null +++ b/app/views/pipes/new.html.erb @@ -0,0 +1,30 @@ +

Add New Pipe

+ +<%= form_for @pipe, :url => pipes_path do |f| %> + + + + + + + + + + + + + + + + + + + + + + + + + +
Name<%= f.text_field :name %>
Slug<%= f.text_field :slug %>
URL<%= f.text_field :url %>
Parse String<%= f.text_field :parse %>
Minutes to Cache<%= f.text_field :cache %>
<%= f.submit 'Create Pipe' %>
+<% end %> \ No newline at end of file diff --git a/app/views/plugins/_plugins.html.erb b/app/views/plugins/_plugins.html.erb new file mode 100644 index 0000000..0694770 --- /dev/null +++ b/app/views/plugins/_plugins.html.erb @@ -0,0 +1,8 @@ +<% if @plugin_windows.blank? %> +

All plugins are attached to a window.

+<% else %> +

Click a rectangle to view that Plugin in a dashboard window.

+<% @plugin_windows.each do |plugin| %> +
<%= plugin.name %>
+<% end %> +<% end %> diff --git a/app/views/plugins/default.css b/app/views/plugins/default.css new file mode 100644 index 0000000..6508946 --- /dev/null +++ b/app/views/plugins/default.css @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/app/views/plugins/default.html b/app/views/plugins/default.html new file mode 100644 index 0000000..071c44c --- /dev/null +++ b/app/views/plugins/default.html @@ -0,0 +1,13 @@ + + + + %%PLUGIN_CSS%% + %%PLUGIN_JAVASCRIPT%% + + + + + my plugin + + + \ No newline at end of file diff --git a/app/views/plugins/default.js b/app/views/plugins/default.js new file mode 100644 index 0000000..f4a722e --- /dev/null +++ b/app/views/plugins/default.js @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/app/views/plugins/edit.html.erb b/app/views/plugins/edit.html.erb new file mode 100644 index 0000000..a3fd2f9 --- /dev/null +++ b/app/views/plugins/edit.html.erb @@ -0,0 +1,109 @@ +
+ + + + <%= form_for @plugin, :html => {:method => 'put', :class => 'form-horizontal'} do |c| %> + <%= error_messages_for 'plugin', :header_message => t(:try_again), :message => t(:plugin_error) %> + + +
+
+
+ +
+
+
+ +
+ +
<%= c.text_field :name, :class => 'form-control' %>
+
+ +
+ +
<%= c.text_area :html, :class => 'form-control', :rows => 14 %>
+
+ +
+ +
<%= c.text_area :css, :class => 'form-control', :rows => 14 %>
+
+ +
+ +
<%= c.text_area :js, :class => 'form-control', :rows => 14 %>
+
+ +
+ +

<%= c.submit t(:plugin_edit), :class => 'btn btn-primary' %>

+
+ + <% end %> + +

+ +

<%= t(:plugin_delete_message) %>

+ <%= button_to t(:plugin_delete), plugin_path(@plugin.id), :method => 'delete', :data => { :confirm => t(:confirm_plugin_delete) }, :class => 'btn btn-danger' %> + +
+ + + diff --git a/app/views/plugins/index.html.erb b/app/views/plugins/index.html.erb new file mode 100644 index 0000000..e51e6ba --- /dev/null +++ b/app/views/plugins/index.html.erb @@ -0,0 +1,43 @@ +
+
+ + + + <% if @plugins.length > 0 %> + + + + + + + <% @plugins.each do |p| %> + + + + + <% end %> + +
<%= t(:plugin_name) %><%= t(:action) %>
<%= link_to p.name, plugin_path(p.id) %><%= link_to t(:edit), edit_plugin_path(p.id) %>
+ +

+ <% end %> + + <%= form_for :plugin do |p| %> + + <%= p.submit t(:plugin_create), :class => 'btn btn-primary' %> + <% end %> +
+ + + +
+ diff --git a/app/views/plugins/show.html.erb b/app/views/plugins/show.html.erb new file mode 100644 index 0000000..4931261 --- /dev/null +++ b/app/views/plugins/show.html.erb @@ -0,0 +1 @@ +<%= raw(@output) %> \ No newline at end of file diff --git a/app/views/status/_recent.html.erb b/app/views/status/_recent.html.erb new file mode 100644 index 0000000..a5b1adc --- /dev/null +++ b/app/views/status/_recent.html.erb @@ -0,0 +1,46 @@ + + + <%= stylesheet_link_tag 'application' %> + + <%= javascript_include_tag 'application' %> + + + +
+<% @statuses.each do |r| %> +
<%= r.status %>
<%= r.created_at %>
+
+<% end %> +
+ + + diff --git a/app/views/tags/show.html.erb b/app/views/tags/show.html.erb new file mode 100644 index 0000000..2ce51e5 --- /dev/null +++ b/app/views/tags/show.html.erb @@ -0,0 +1,24 @@ +<%= form_for :tag, :url => tags_path do |t| %> + + + + + + +
<%= t(:tags_search) %>:<%= t.text_field :name %><%= t.submit t(:submit) %>
+
+ + <% if @tag_name %> + <% if @results %> + + <% @results.each do |channel| %> + <%= link_to channel.name, channel_path(channel.id) %> +
+ <% end %> + + <% else %> + <%= t(:search_empty) %> + <% end %> + <% end %> + +<% end %> \ No newline at end of file diff --git a/app/views/user_sessions/new.html.erb b/app/views/user_sessions/new.html.erb index c3b80ac..28d0ff4 100644 --- a/app/views/user_sessions/new.html.erb +++ b/app/views/user_sessions/new.html.erb @@ -1,13 +1,57 @@ -
<%= render :partial => 'users/login' %>
-
- <% if @failed %> -

<%= t(:signin_failure) %>

- <%= t(:signin_try_again) %> - <% else %> -
- <%= t(:signin_please) %> -
-
- <%= @mail_message %> - <% end %> +
+ + + + <% if @failed %><%= t(:signin_try_again) %>

<% end %> + <% if @mail_message.present? %><%= @mail_message %>

<% end %> + + <%= form_for @user_session, :url => user_session_path, :html => { :id => 'loginform', :class => 'form-horizontal' } do |f| %> + + <%= f.hidden_field :remember_me, :value => false %> + +
+ +
<%= f.text_field :login, :value => cookies['user_id'], :class => 'form-control' %>
+
+ +
+ +
+ <%= f.password_field :password, :class => 'form-control' %> + <%= link_to t(:forgot), forgot_password_path, :id => 'forgot_password' %> +
+
+ +
+
+
+ +
+
+
+ +
+

<%= f.submit t(:signin), :class => 'btn btn-primary' %>

+
+ <% end %> +
+ + + + diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 98e651b..6244891 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -1,62 +1,54 @@ -

- <%= link_to t(:myaccount), account_path %> » - <%= t(:account_edit) %> -

+
-<%= form_for @user, :url => account_path do |f| %> - <%= error_messages_for 'user', :header_message => t(:try_again), :message => t(:account_error_edit) %> + + <%= form_for @user, :url => account_path, :html => {:class => 'form-horizontal'} do |f| %> + <%= error_messages_for 'user', :header_message => t(:try_again), :message => t(:account_error_edit) %> - - - - - - - - - - - - +
+ +
<%= f.text_field :login, :class => 'form-control' %>
+
- - - - - - - - - - - - - - - - -
-
<%= f.label :login, t(:userid) %>
-
- <%= f.text_field :login %> -
-
<%= f.label t(:email) %>
-
- <%= f.text_field :email %> -
<%= t(:time_zone) %><%= time_zone_select 'user', 'time_zone', nil, :default => 'Eastern Time (US & Canada)' %>
-
<%= f.label :password, raw(t(:password_change_raw)) %>
-
- <%= f.password_field :password %> -
- <%= f.label :password_confirmation, raw(t(:password_confirmation_raw)) %> - - <%= f.password_field :password_confirmation %> +
+ +
<%= f.text_field :email, :class => 'form-control' %>
+
+ +
+ +
+

+ <%= time_zone_select 'user', 'time_zone', nil, {:default => 'Eastern Time (US & Canada)'}, {:class => 'form-control'} %> +

+
+
+ +
+ +
<%= f.password_field :password, :class => 'form-control' %>
+
+ + +
+ +
<%= f.password_field :password_confirmation, :class => 'form-control' %>
+
+ +
+ +
<%= f.password_field :password_current, :class => 'form-control' %>
+
+ +
+

<%= f.submit t(:account_update), :class => 'btn btn-primary' %>

+
+ + <% end %> + + -
- <%= raw(t(:password_current_raw)) %> - - -
<%= f.submit t(:account_update) %>
-<% end %> \ No newline at end of file diff --git a/app/views/users/edit_profile.html.erb b/app/views/users/edit_profile.html.erb new file mode 100644 index 0000000..991a58d --- /dev/null +++ b/app/views/users/edit_profile.html.erb @@ -0,0 +1,43 @@ +
+ + + + + <%= form_for @user, :url => update_profile_path, :html => {:class => 'form-horizontal'} do |f| %> + + +
+
+
+ +
+
+
+ +
+ +
<%= f.text_field :website, :class => 'form-control' %>
+
+ + +
+ +
<%= f.text_area :bio, :class => 'form-control', :rows => 4 %>
+
+ + +
+ +

<%= f.submit t(:profile_update), :class => 'btn btn-primary' %>

+
+ + <% end %> + +
+ diff --git a/app/views/users/forgot_password.html.erb b/app/views/users/forgot_password.html.erb index 19f27a9..966f287 100644 --- a/app/views/users/forgot_password.html.erb +++ b/app/views/users/forgot_password.html.erb @@ -1,11 +1,30 @@ -

<%= t(:password_forgot) %>

-<%= t(:password_forgot_message) %> -

-<%= form_for :user, :url => resetpassword_path do |f| %> - - <%= f.text_field :login %> - <%= f.submit t(:submit) %> -<% end %> +
+ + + + <%= t(:password_forgot_message) %> + +

+ + <%= form_for @user, :url => { :controller => 'mailer', :action => 'resetpassword' }, :html => {:class => 'form-horizontal' } do |f| %> + + +
+ +
<%= f.text_field :login, :class => 'form-control' %>
+
+ + +
+

<%= f.submit t(:submit), :class => 'btn btn-primary' %>

+
+ + <% end %> + +
+ + \ No newline at end of file + document.getElementById('user_login').focus(); + + diff --git a/app/views/users/list_channels.html.erb b/app/views/users/list_channels.html.erb new file mode 100644 index 0000000..7ce8826 --- /dev/null +++ b/app/views/users/list_channels.html.erb @@ -0,0 +1,19 @@ +

<%= t(:user_public_channels) %> <%= @user.login %>

+ +<% if @channels.present? && @channels.count > 0 %> + + + <% @channels.each do |m| %> + > + + + + + <% end %> +
<%= t(:channel_name) %><%= t(:channel_description) %><%= t(:tags) %>
<%= link_to m.name, channel_path(m.id) %><%= m.description %><%= m.list_tags %>
+
+ <%= will_paginate @channels %> +<% else %> + <%= t(:user_no_public_channels) %> +<% end %> + diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index 6650c37..f5c0407 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -1,51 +1,49 @@ -

<%= t(:signup_header) %>

-
-<%= form_for @user, :url => account_path do |f| %> - <%= error_messages_for 'user', :header_message => t(:try_again), :message => t(:account_error) %> - - - - - - - - - - - - - - - - - - - - - - - - - -
-
<%= f.label :login, t(:userid) %>
-
- <%= f.text_field :login %> -
-
<%= f.label t(:email) %>
-
- <%= f.text_field :email %> -
<%= t(:time_zone) %><%= time_zone_select 'user', 'time_zone', nil, :default => 'Eastern Time (US & Canada)' %>
-
<%= f.label t(:password) %>
-
- <%= f.password_field :password %> -
- <%= f.label :password_confirmation, raw(t(:password_confirmation_raw)) %> - - <%= f.password_field :password_confirmation %> -
<%= f.submit t(:create_account) %>
-<% end %> +
+ + + + <%= form_for @user, :url => account_path, :html => {:class => 'form-horizontal'} do |f| %> + <%= error_messages_for 'user', :header_message => t(:try_again), :message => t(:account_error) %> + + +
+ +
<%= f.text_field :login, :class => 'form-control' %>
+
+ +
+ +
<%= f.text_field :email, :class => 'form-control' %>
+
+ +
+ +
+

+ <%= time_zone_select 'user', 'time_zone', nil, {:default => 'Eastern Time (US & Canada)'}, {:class => 'form-control'} %> +

+
+
+ +
+ +
<%= f.password_field :password, :class => 'form-control' %>
+
+ +
+ +
<%= f.password_field :password_confirmation, :class => 'form-control' %>
+
+ +
+ +

<%= f.submit t(:create_account), :id => "user_submit", :class => 'btn btn-primary' %>

+
+ + <% end %> +
\ No newline at end of file + document.getElementById('user_login').focus(); + + diff --git a/app/views/users/profile.html.erb b/app/views/users/profile.html.erb new file mode 100644 index 0000000..6a79c93 --- /dev/null +++ b/app/views/users/profile.html.erb @@ -0,0 +1,19 @@ +<% if @user.public_flag == true %> + +
+

+ <%= gravatar_tag @user, :default => 'wavatar', :secure => true %> +
+ +

<%= t(:profile_for) %> <%= @user.login %>

+ <%= link_to t(:channels_public_view), list_channels_path(@user.login) %> +

+ <%= t(:member_since) %> <%= @user.created_at.strftime('%B %-d, %Y') %> +

+ <%= t(:profile_website) %>: <%= link_to @user.website, @user.website %> +

+ <%= t(:profile_bio) %>: <%= @user.bio %> + +<% else %> + <%= t(:profile_not_public) %> +<% end %> \ No newline at end of file diff --git a/app/views/users/reset_password.html.erb b/app/views/users/reset_password.html.erb index 0e7e26c..3a1c0df 100644 --- a/app/views/users/reset_password.html.erb +++ b/app/views/users/reset_password.html.erb @@ -1,34 +1,35 @@ <% if @valid_link %> -

<%= t(:password_new) %>

- <%= form_for @user, :url => change_password_user_path(@user) do |f| %> - <%= error_messages_for 'user', :header_message => t(:try_again), :message => t(:password_new_error) %> - - - - - - - - - - - - - -
-
<%= f.label :password %>
-
- <%= f.password_field :password %> -
- <%= t(:password_new_choose) %> -
- <%= f.label :password_confirmation, raw(t(:password_confirmation_raw)) %> - - <%= f.password_field :password_confirmation %> -
- <%= t(:password_new_confirmation) %> -
<%= f.submit t(:submit) %>
- <% end %> +

<%= t(:password_new) %>

+ <%= form_for @user, :url => { :controller => 'users', :action => 'change_password', :id => @user.id } do |f| %> + <%= error_messages_for 'user', :header_message => t(:try_again), :message => t(:password_new_error) %> + + + + + + + + + + + + + +
+
<%= f.label :password %>
+
+ <%= f.password_field :password %> +
+ <%= t(:password_new_choose) %> +
+ <%= f.label :password_confirmation, raw(t(:password_confirmation)) %> + + <%= f.password_field :password_confirmation %> +
+ <%= t(:password_new_confirmation) %> +
<%= f.submit t(:submit) %>
+ <% end %> <% else %> - <%= t(:password_link_expired) %> -<% end %> \ No newline at end of file + <%= t(:password_link_expired) %> +<% end %> + diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index df22620..5d26e5b 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,20 +1,56 @@ -

<%= t(:account_info) %>

+
-<%= link_to t(:account_edit), edit_account_path %> + -

+
+ <%= link_to t(:account_edit), edit_account_path, :class => 'btn btn-primary btn-sm' %> +

+ + + + + + + + + + + + + + + + + + +
<%= t(:userid) %><%= @user.login %>
<%= t(:email) %><%= @user.email %>
<%= t(:time_zone) %><%= @user.time_zone %>
<%= t(:api_key) %> + <%= @user.api_key %>
+ <%= button_to t(:api_key_new), user_new_api_key_path, :data => { :confirm => t(:confirm_new_user_api_key) }, :class => 'btn btn-primary btn-sm' %> +
+
+ +

+ +
+ <%= link_to t(:profile_edit), edit_profile_path, :class => 'btn btn-primary btn-sm' %> +

+ <%= link_to t(:profile_view), user_profile_path(@user.login) %> +

+ <% if @user.public_flag %> + + + + + + + + + +
<%= t(:profile_website) %><%= @user.website %>
<%= t(:profile_bio) %><%= @user.bio %>
+ <% else %> + <%= t(:profile_not_public_me) %> + <% end %> + +
+
- - - - - - - - - - - - - -
<%= t(:userid) %><%= @user.login %>
<%= t(:email) %><%= @user.email %>
<%= t(:time_zone) %><%= @user.time_zone %>
diff --git a/app/views/windows/_hidden_windows.html.erb b/app/views/windows/_hidden_windows.html.erb new file mode 100644 index 0000000..0c61408 --- /dev/null +++ b/app/views/windows/_hidden_windows.html.erb @@ -0,0 +1,104 @@ + +
+ + +
+ <% if @windows.blank? %> +

<%= t("portlets_all_displayed") %>

+ <% else %> +

<%= t("portlets_add") %>

+ <% @windows.each do |window| %> +
+ <%= window.title %> +
+ <% end %> + <% end %> +
+ +
+ diff --git a/autotest/discover.rb b/autotest/discover.rb new file mode 100644 index 0000000..f421dc5 --- /dev/null +++ b/autotest/discover.rb @@ -0,0 +1,2 @@ +Autotest.add_discovery { "rails" } +Autotest.add_discovery { "rspec2" } diff --git a/config/application.rb b/config/application.rb index cc909aa..1ee183e 100644 --- a/config/application.rb +++ b/config/application.rb @@ -2,25 +2,23 @@ require File.expand_path('../boot', __FILE__) require 'rails/all' -if defined?(Bundler) - # If you precompile assets before deploying to production, use this line - # Bundler.require *Rails.groups(:assets => %w(development test)) - # If you want your assets lazily compiled in production, use this line - Bundler.require(:default, :assets, Rails.env) -end +Bundler.require(:default, Rails.env) module Thingspeak class Application < Rails::Application - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers - # -- all .rb files in that directory are automatically loaded. # Custom directories with classes and modules you want to be autoloadable. + # config.autoload_paths += %W(#{config.root}/extras) config.autoload_paths += %W(#{config.root}/lib) - # Only load the plugins named here, in the order given (default is alphabetical). - # :all can be used as a placeholder for all plugins not explicitly named. - # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + # fix invalid utf8 characters + config.middleware.insert_before "Rack::Runtime", Rack::UTF8Sanitizer + + # allow xml params + config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::XmlParamsParser + + # allow frames to work + config.action_dispatch.default_headers = { 'X-Frame-Options' => 'ALLOWALL' } # Activate observers that should always be running. # config.active_record.observers = :cacher, :garbage_collector, :forum_observer @@ -29,23 +27,18 @@ module Thingspeak # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' + # must be placed before other config.i18n lines + config.i18n.enforce_available_locales = false + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] config.i18n.default_locale = :en - # JavaScript files you want as :defaults (application.js is always included). - # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) - # Configure the default encoding used in templates for Ruby 1.9. config.encoding = "utf-8" # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password] - - # Enable the asset pipeline - config.assets.enabled = true - - # Version of your assets, change this if you want to expire all your assets - config.assets.version = '1.0' end end + diff --git a/config/database.yml.local b/config/database.yml.local new file mode 100644 index 0000000..e11affd --- /dev/null +++ b/config/database.yml.local @@ -0,0 +1,50 @@ +# MySQL. Versions 4.1 and 5.0 are recommended. +# +# Install the MySQL driver: +# gem install mysql +# On Mac OS X: +# sudo gem install mysql -- --with-mysql-dir=/usr/local/mysql +# On Mac OS X Leopard: +# sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config +# This sets the ARCHFLAGS environment variable to your native architecture +# On Windows: +# gem install mysql +# Choose the win32 build. +# Install MySQL and put its /bin directory on your path. +# +# And be sure to use new-style password hashing: +# http://dev.mysql.com/doc/refman/5.0/en/old-client.html +development: + adapter: mysql2 + encoding: utf8 + reconnect: false + database: thingspeak_development + pool: 5 + username: thing + password: "speak" +# socket: /var/lib/mysql/mysql.sock + socket: /var/run/mysqld/mysqld.sock + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + adapter: mysql2 + encoding: utf8 + reconnect: false + database: thingspeak_test + pool: 5 + username: thing + password: "speak" +# socket: /var/lib/mysql/mysql.sock + socket: /var/run/mysqld/mysqld.sock + +production: + adapter: mysql2 + encoding: utf8 + reconnect: true + database: thingspeak_production + pool: 5 + username: root + password: "notimplemented" + socket: /var/run/mysqld/mysqld.sock diff --git a/config/environments/development.rb b/config/environments/development.rb index a2d2c25..45af11d 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -6,8 +6,9 @@ Thingspeak::Application.configure do # since you don't have to restart the webserver when you make code changes. config.cache_classes = false - # Log error messages when you accidentally call methods on nil. - config.whiny_nils = true + config.eager_load = false + + config.assets.prefix = "/dev-assets" # Show full error reports and disable caching config.consider_all_requests_local = true @@ -19,20 +20,7 @@ Thingspeak::Application.configure do # Print deprecation notices to the Rails logger config.active_support.deprecation = :log - # Only use best-standards-support built into browsers - config.action_dispatch.best_standards_support = :builtin - - # Raise exception on mass assignment protection for Active Record models - config.active_record.mass_assignment_sanitizer = :strict - - # Log the query plan for queries taking more than this (works - # with SQLite, MySQL, and PostgreSQL) - config.active_record.auto_explain_threshold_in_seconds = 0.5 - - # Do not compress assets - config.assets.compress = false - - # Expands the lines which load the assets config.assets.debug = true + end diff --git a/config/environments/test.rb b/config/environments/test.rb index 8ccb53b..c480996 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -7,8 +7,7 @@ Thingspeak::Application.configure do # and recreated between test runs. Don't rely on the data there! config.cache_classes = true - # Log error messages when you accidentally call methods on nil. - config.whiny_nils = true + config.eager_load = false # Show full error reports and disable caching config.consider_all_requests_local = true @@ -31,12 +30,8 @@ Thingspeak::Application.configure do # config.active_record.schema_format = :sql # Print deprecation notices to the stderr - config.active_support.deprecation = :stderr - - # Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets - config.assets.allow_debugging = true - - # Configure static asset server for tests with Cache-Control for performance + config.active_support.deprecation = :notify config.serve_static_assets = true - config.static_cache_control = "public, max-age=3600" + end + diff --git a/config/initializers/constants.rb b/config/initializers/constants.rb index 451657a..f6b070f 100644 --- a/config/initializers/constants.rb +++ b/config/initializers/constants.rb @@ -2,5 +2,28 @@ # set to false to only allow updates via HTTP POST GET_SUPPORT = true +# rate limit channel updates +RATE_LIMIT = false + +# number of seconds to wait before a channel can be updated again +RATE_LIMIT_FREQUENCY = '15' + +# main production server to handle all requests (can be a proxy) +APPLICATION_IP_ADDRESS = '127.0.0.1' + +# domain for the API +API_DOMAIN = 'http://127.0.0.1:3000/' + +# get api key from HTTP headers if this value is present +HTTP_HEADER_API_KEY_NAME = 'THINGSPEAKAPIKEY' + +# Twitter api credentials +CONSUMER_KEY = '' +CONSUMER_SECRET = '' + +# reset password base url +RESET_PASSWORD_URL = 'http://127.0.0.1:3000//users/reset_password/' + # allow only these additional locales (use downcase, easier to parse) -ALLOWED_LOCALES = ['pt-br','it'] \ No newline at end of file +ALLOWED_LOCALES = ['pt-br','it'] + diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb index ffcd463..c0f7b9e 100644 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -4,4 +4,5 @@ # If you change this key, all old signed cookies will become invalid! # Make sure the secret is at least 30 characters and all random, # no regular words or you'll be exposed to dictionary attacks. -Thingspeak::Application.config.secret_token = '44a84c8a4b53e95aecc92b38a267eaef3853d876968ad30f0b21023922b9dbaed1976e8a29884121e124720bfe3a13f8b1b0078f94f840866f83fc9bfbd75f73' +Thingspeak::Application.config.secret_key_base = '8dbb2d4ce6ad0f87b886c4bf796b1f8f94268837776ae730f2fa2724ef1643e0eb3d4a814a01512e9e73902ea88d5553e367e321d44522bc802153369ebe4cf9' + diff --git a/config/initializers/timestamp_json_override.rb b/config/initializers/timestamp_json_override.rb new file mode 100644 index 0000000..e48eff1 --- /dev/null +++ b/config/initializers/timestamp_json_override.rb @@ -0,0 +1,11 @@ +#Changing the as_json method to remove the milliseconds from TimeWithZone to_json result (just like in Rails 3) +class ActiveSupport::TimeWithZone + def as_json(options = {}) + if ActiveSupport::JSON::Encoding.use_standard_json_time_format + xmlschema + else + %(#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)}) + end + end +end + diff --git a/config/locales/en.yml b/config/locales/en.yml index d31ccf4..4e040dd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -7,8 +7,9 @@ en: formats: pretty: "%a, %b %e at %l:%M %p" about: "About" + account: "Account" account_changes: "Confirm account changes" - account_edit: "Edit Account Information" + account_edit: "Edit Account" account_error: "There were some problems creating your account:" account_error_edit: "There were some problems editing your account:" account_info: "Account Information" @@ -21,6 +22,7 @@ en: api_key: "API Key" api_key_delete: "Delete API Key" api_key_key: "Key" + api_key_new: "Generate New API Key" api_key_read: "Read API Keys" api_key_read_new: "Generate New Read API Key" api_key_write: "Write API Key" @@ -39,6 +41,7 @@ en: channel_create: "Create New Channel" channel_edit: "Edit Channel" channel_error: "There were some problems creating your channel:" + channel_update_success: "The Channel was updated." channel_feed: "Channel Feed" channel_default_field: "Field Label" channel_default_name: "Channel" @@ -47,7 +50,10 @@ en: channel_description: "Description" channel_directions: "Directions" channel_id: "Channel ID" + channel_log_to: "Log to Channel" + channel_logged_to: "Logged to Channel" channel_name: "Name" + channel_ranking: "Percentage Complete" channel_not_public: "This channel is not public." channel_permission: "You don't have permission to view that channel!" channel_public: "Viewing public channel" @@ -56,9 +62,15 @@ en: channel_url: "URL" channels: "Channels" channels_my: "My Channels" + channels_public: "Public Channels" channels_public_view: "View Public Channels" + channel_being_cleared: "This channel is currently being cleared. Any data you post to this channel before clearing is complete may be deleted." + channel_video_type_blank: "Either Youtube, or Vimeo, is required if a Video ID is specified." chart: "Chart" + chart_max: "Max" + chart_min: "Min" chart_background_color: "Background" + chart_is_dynamic: "Dynamic?" chart_embed_code: "Embed Code" chart_example: "Example Chart" chart_color: "Color" @@ -66,7 +78,7 @@ en: chart_owned: "Your Charts" chart_round: "Rounding" chart_type: "Type" - chart_update: "Update" + chart_update: "Update Chart" chart_xaxis: "X-Axis" chart_yaxis: "Y-Axis" charts: "Charts" @@ -84,9 +96,12 @@ en: confirm_device_random_mac: "Are you sure you want to generate a random MAC address for this device?" confirm_device_unique_mac: "Are you sure you want to generate a unique MAC address for this device?" confirm_new_api_key: "Are you sure you want to generate a new write API key?" + confirm_new_talkback_key: "Are you sure you want to generate a new TalkBack API key?" confirm_new_thinghttp_key: "Are you sure you want to generate a new ThingHTTP API key?" confirm_new_thingtweet_key: "Are you sure you want to generate a new ThingTweet API key?" + confirm_new_user_api_key: "Are you sure you want to generate a new API key?" confirm_plugin_delete: "Are you sure you want to delete this plugin?" + confirm_talkback_delete: "Are you sure you want to delete this TalkBack?" confirm_thinghttp_delete: "Are you sure you want to delete this ThingHTTP?" confirm_tweetcontrol_delete: "Are you sure you want to delete this TweetControl?" confirm_twitter_delete: "Are you sure you want to unlink this Twitter account?" @@ -95,6 +110,8 @@ en: data: "Data" days: "Days" delete: "delete" + developer_info: "Developer Info" + device: "Device" device_create: "Add New Device" device_custom_mac: "Enter Custom MAC Address" device_default_name: "Device" @@ -107,6 +124,7 @@ en: device_local_ip_address: "Local IP Address" device_local_port: "Local Port" device_mac: "MAC Address" + device_mac_invalid: "Invalid MAC Address." device_model: "Model" device_port: "Public Port Number" device_random_mac: "Generate Random MAC Address" @@ -123,11 +141,13 @@ en: email: "Email" email_form_add: "Add Email" featured_channels: "Featured Channels" + selected_channels: "Channels" features: "Features" field: "Field" footer: "This is the footer message." forgot: "Forgot your password?" forum: "Forum" + for_more_information: "More Information" generate_thingtweet_arduino_code: "Generate ThingTweet Arduino Code" height: "Height" home: "Home" @@ -140,16 +160,16 @@ en: median: "Median" member_since: "Member since" message_field: "Message Field" - myaccount: "Account" + myaccount: "My Account" mychannels: "My Channels" new: "New" + news: "News" note: "Note" note_save: "Save Note" password: "Password" - password_change_raw: "Change
Password" + password_change: "Change Password" password_confirmation: "Password Confirmation" - password_confirmation_raw: "Password
Confirmation" - password_current_raw: "Current
Password" + password_current: "Current Password" password_forgot: "Forgot your password?" password_forgot_message: "Enter your email address below and we'll send you a link where you can reset your password." password_incorrect: "Your current password was not entered correctly." @@ -178,6 +198,7 @@ en: plugin_name: "Name" plugin_permission: "You don't have permission to access this plugin!" plugins: "Plugins" + plugin_private_flag: "Private?" profile_bio: "Bio" profile_edit: "Edit Public Profile" profile_for: "Profile for" @@ -189,11 +210,73 @@ en: public: "Make Public?" public_header: "Public?" public_profile: "Public Profile" - public_true: "Yes" + public_true: "This channel is public" questions: "Questions" + react: "React" + react_header_name: "Name" + react_new_button: "Create New React" + react_delete_confirm: "Are you sure you wish to delete this condition?" + react_thinghttp_error: "'%{thinghttp_name}' request doesn't belong to you" + react_channel_error: "'%{channel_name}' request doesn't belong to you" + react_invalid_error: "%{value} is not a valid value" + react_invalid_number_error: "%{value} is not a value field number" + react_invalid_condition_error: "%{value} is not a valid condition" + react_invalid_condition_type_error: "%{value} is not a valid condition type" + react_twitter_account_required: "You need to add a twitter account to enable tweeting" + react_add_twitter_account: "Add a twitter account" + react_thinghttp_required: "You need to add a ThingHTTP request " + react_add_thinghttp_req: "Add ThingHTTP request" + react_tweet_cant_be_blank: "The tweet can't be blank" + react_type_string: "String" + react_type_status: "Status" + react_type_numeric: "Numeric" + react_type_geo: "Geo" + react_type_nodata: "No Data Check" + react_when_insert: "On Data Insertion" + react_when_10m: "Every 10 minutes" + react_when_30m: "Every 30 minutes" + react_when_60m: "Every 60 minutes" + react_condition_prefix: "If channel" + react_condition_field: "field" + react_condition_contains: "contains" + react_condition_begins: "starts with" + react_condition_ends: "ends with" + react_condition_gt: "is greater than" + react_condition_gte: "is greater than or equal to" + react_condition_lt: "is less than" + react_condition_lte: "is less than or equal to" + react_condition_eq: "is equal to" + react_condition_ne: "is not equal to" + react_condition_within: "is within" + react_condition_further: "is further than" + react_condition_nodata_prefix: "has not been updated for" + react_condition_nodata_suffix: "minutes" + react_condition_geo: "km from" + react_latitude: "latitude" + react_longitude: "longitude" + react_delete: "Delete this React" + react_twitter_delete_warning1: "Cannot delete this twitter account as it is used by %{reacts_count}: %{reacts_list}" + react_twitter_delete_warning2: "Please delete or modify this react before unlinking this twitter account." + react_thinghttp_delete_warning1: "Cannot delete this ThingHTTP as it is used by %{reacts_count}: %{reacts_list}" + react_thinghttp_delete_warning2: "Please delete or modify this react before unlinking this ThingHTTP." + react_default_name: "React" + react_label_condition: "Condition" + react_label_test_frequency: "Test Frequency" + react_label_react_name: "React Name" + react_label_condition_type: "Condition Type" + react_label_action: "Action" + react_label_options: "Options" + react_action_tweet_prefix: "then tweet" + react_action_tweet_suffix: "using Twitter account" + react_action_thinghttp_prefix: "then perform ThingHTTP" + react_option_run_first_time: "Run action only the first time the condition is met" + react_option_run_every_time: "Run action each time condition is met" + react_create_button: "Create React" + react_save_button: "Create React" remember_me: "Remember my User ID" results: "Results" rss: "RSS Feed" + save: "Save" saved: "Saved." saved_error: "Error while saving data." search_empty: "No search results were found." @@ -216,10 +299,42 @@ en: social_channel_error_slug_exists: "Slug is already taken." social_channel_new: "New Social Channel" social_saved: "Submitted, thank you!" + status_messages: "Status Messages" submit: "Submit" sum: "Sum" + scheduled_thinghttp: "Scheduled ThingHTTP" + scheduled_thinghttp_header_name: "name" + scheduled_thinghttp_new_button: "New Scheduled ThingHTTP" + scheduled_thinghttp_delete_confirm: "Are you sure you wish to delete this scheduled ThingHTTP?" + scheduled_thinghttp_label_name: "Name" + scheduledthinghttp_label_frequency: "Frequency" + scheduled_thinghttp_save_button: "Save Scheduled ThingHTTP" + scheduled_thinghttp_create_button: "Create Scheduled ThingHTTP" + scheduledthinghttp_default_name: "Scheduled ThingHTTP" + scheduled_thinghttp_thinghttp_error: "'%{thinghttp_name}' request doesn't belong to you" + scheduled_thinghttp_channel_error: "'%{channel_name}' channel doesn't belong to you" + scheduled_thinghttp_label_rule: "Rule" + scheduled_thinghttp_field_error: "Not a valid field" + support: "Support" + help_scheduled_thinghttp_edit: "" + tag: "tag" tags: "Tags" tags_search: "Search Channels" + talkback: "TalkBack" + talkback_command_add: "Add a new command" + talkback_command_command_string: "Command string" + talkback_command_id: "Command ID" + talkback_command_position: "Position" + talkback_command_remove: "Remove command" + talkback_commands: "Commands" + talkback_create: "New TalkBack" + talkback_delete: "Delete TalkBack" + talkback_delete_message: "Want to delete this TalkBack?" + talkback_edit: "Edit TalkBack" + talkback_id: "TalkBack ID" + talkback_name: "Name" + talkback_new_api_key: "Regenerate API Key" + talkback_update: "Update TalkBack" thinghttp: "ThingHTTP" thinghttp_auth_name: "HTTP Auth Username" thinghttp_auth_pass: "HTTP Auth Password" @@ -256,6 +371,7 @@ en: tos: "Terms of Service" tos_agree: "By signing up, you agree to the" try_again: "Please try again!" + tutorials: "Tutorials" tweetcontrol: "TweetControl" tweetcontrol_delete: "Delete TweetControl" tweetcontrol_delete_message: "Want to delete this TweetControl?" @@ -263,7 +379,7 @@ en: tweetcontrol_new: "Create New TweetControl" tweetcontrol_edit: "Update TweetControl" tweetcontrol_thinghttp: "ThingHTTP Action" - tweetcontrol_trigger: "Hashtag Trigger" + tweetcontrol_trigger: "Trigger" twitter_accounts: "Current Twitter accounts" twitter_delete: "Unlink Account" twitter_failure: "Twitter failure." @@ -271,10 +387,13 @@ en: twitter_link_account: "Link Twitter Account" twitter_link_success: "has been successfully linked to ThingTweet." twitter_new_api_key: "Regenerate API Key" - twitter_screen_name: "Twitter Screen Name" + twitter_screen_name: "Twitter Account" upload: "Upload" upload_select: "Upload a CSV file to import data into this channel" uploading: "uploading file..." + upload_successful: "Upload successful." + upload_no_file: "Please specify a file to be uploaded." + upload_no_data: "The uploaded file was empty." url: "URL" user: "User" user_no_public_channels: "This user has no public channels." @@ -288,16 +407,26 @@ en: watched_empty: "You aren't watching any channels." watched_find: "Find some channels to watch." watched_view: "View Watched Channels" + public_link: "Public" + private_link: "Private" + settings_link: "Settings" + api_key_link: "API Key" + data_import_link: "Data Import" + width: "Width" youtube: "YouTube" # help section help: "Help" + help_api_documentation: "API documentation" + help_apps_talkback: "Allow devices to execute queued commands." help_apps_thinghttp: "Create custom POSTs or GETs to other webservices and retrieve the data." help_apps_thingtweet: "Link your Twitter account to ThingSpeak and send Twitter messages using our simple API." help_apps_tweetcontrol: "Listen to commands from Twitter and then perform an action." + help_apps_react: "Perform actions when conditions are met by your data in your channels." help_channel: "Create a channel -- it can be for a device, app, or anything that can send data to ThingSpeak." help_channel_clear: "Clicking on the \"Clear Channel\" button will delete ALL feed data associated with this channel, but will leave the channel's info intact." + help_channel_ranking: "Completeness will help your channel appear higher in the list of public channels." help_channel_feed: "Viewing Data" help_channel_fields: "Add up to 8 fields that can be tracked. A field must be added before it can store data." help_channel_import: "Select a CSV file on your hard drive and import all of its data directly into this channel. Your CSV file should contain a date field in the first column. If your data doesn't contain timezone info, select one appropriately." @@ -320,13 +449,225 @@ en: help_plugins: "Plugins allow you to create custom HTML, JavaScript, and CSS files that can be used to parse and display your data." help_social_channel: "Create a new social channel which will be accessible at:" help_social_channel_public: "All social channels are public. Use the Message Field to allow users to enter other data, such as a message to go along with their submission." + help_talkback: "Send queued commands to your devices with TalkBack." + help_talkback_index: "Create a TalkBack and add some commands. Your device can then execute the stored commands, and those commands will be removed from the queue." + help_talkback_channel: "If a channel log is set, executed commands will be automatically logged to the 'status' field of that channel." + help_talkback_commands_1: "Commands can be added here or" + help_talkback_commands_2: "via the API" + help_talkback_show: "To learn more about using TalkBack, we suggest checking out our" help_thinghttp: "Use ThingHTTP to access other APIs or webpages and parse the responses. You can create and save a full HTTP request to any URL, and then easily access it by using your ThingHTTP API key." help_thinghttp_edit: "Create your custom HTTP request on this page. For example, try the following options:" help_thinghttp_example: "This will send your HTTP GET request to Google Finance and parse the response for an element having an ID of ref_626307_c, which corresponds to the S&P 500 current price change for the day." help_thinghttp_show: "You can now send your ThingHTTP request and view the response using the following URL:" help_thingtweet: "ThingTweet acts as a proxy to Twitter so that your devices can update Twitter statuses without having to implement Open Authentication (OAuth)." - help_tweetcontrol: "Use TweetControl to listen to specific hashtags from Twitter, and then perform customized actions." - help_tweetcontrol_edit: "Fill in the Twitter screen name and a hashtag to listen for." - help_tweetcontrol_hashtag: "The hashtag #thingspeak must also be present in the Twitter status, for example:" - help_tweetcontrol_thinghttp: "Select a ThingHTTP request to use with this TweetControl. The ThingHTTP request will be executed when the TweetControl is triggered." + help_tweetcontrol: "Use TweetControl to listen to specific trigger words from Twitter, and then process a ThingHTTP request." + help_tweetcontrol_edit: "Select Anonymous TweetControl to allow anyone to trigger your TweetControl or fill in a specfic Twitter Account." + help_tweetcontrol_hashtag: "To trigger a TweetControl, you need to send a Twitter Status Update with at least the hashtag #thingspeak and the trigger word, for example:" + help_tweetcontrol_thinghttp: "Select a ThingHTTP request to use with this TweetControl. The ThingHTTP request will be executed when the TweetControl is triggered." + help_tweetcontrol_trigger: "Fill in a trigger to listen for." help_options: "more help" + help_react: "React allow you to trigger a ThingHTTP request or send a tweet using ThingTweet when your ThingSpeak Channel meets a certain condition. " + help_react_create: "Create your React condition here." + help_react_edit: "Update your React condition here." + help_react_edit1: "Select a condition type to correspond with the type of data you wish to check and set your condition values." + help_react_edit2: "Use the Test Frequency setting to choose to test your condition on every insert or on a periodic basis." + help_react_edit3: "Select ThingTweet or ThingHTTP as the action to be performed if the condition is met." + + # unsorted + window_map: "Channel Location" + window_status: "Channel Status Updates" + window_channel_video: "Channel Video" + window_field_chart: "Field %{field_number} Chart" + window_plugin: "%{name} (Plugin)" + portlets_available: "Available Windows" + private_view: "Private View" + public_view: "Public View" + channel_settings: "Channel Settings" + data_import: "Data Import" + portlets_all_displayed: "All available windows are being displayed" + portlets_add: "Click a rectangle to add that windows to the dashboard" + add_portlets: "Add Windows" + + # documentation error headers + error_code: "Error Code" + error_http_status: "HTTP Status" + error_message: "Message" + error_details: "Details" + + # errors + error_codes: + error_auth_required: + message: "Authorization Required" + http_status: 401 + details: "Please make sure that your API key is correct." + error_resource_not_found: + message: "Resource Not Found" + http_status: 404 + details: "The requested resource was not found. Please check the URL and try again." + error_method_invalid: + message: "Method Not Allowed" + http_status: 405 + details: "Please use the proper HTTP method for this request." + error_no_action: + message: "No Action Performed" + http_status: 421 + details: "The server attempted to process your request, but has no action to perform." + error_too_many_requests: + message: "Too Many Requests" + http_status: 429 + details: "Please wait before making another request." + + number: + # Used in number_with_delimiter() + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: "." + # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: "," + # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) + precision: 3 + # If set to true, precision will mean the number of significant digits instead + # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2) + significant: false + # If set, the zeros after the decimal separator will always be stripped (eg.: 1.200 will be 1.2) + strip_insignificant_zeros: false + + # Used in number_to_currency() + currency: + format: + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) + format: "%u%n" + unit: "$" + # These five are to override number.format and are optional + separator: "." + delimiter: "," + precision: 2 + significant: false + strip_insignificant_zeros: false + + # Used in number_to_percentage() + percentage: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + # precision: + # significant: false + # strip_insignificant_zeros: false + format: "%n%" + + # Used in number_to_precision() + precision: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + # precision: + # significant: false + # strip_insignificant_zeros: false + + # Used in number_to_human_size() and number_to_human() + human: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + precision: 3 + significant: true + strip_insignificant_zeros: true + # Used in number_to_human_size() + storage_units: + # Storage units output formatting. + # %u is the storage unit, %n is the number (default: 2 MB) + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + # Used in number_to_human() + decimal_units: + format: "%n %u" + # Decimal units output formatting + # By default we will only quantify some of the exponents + # but the commented ones might be defined or overridden + # by the user. + units: + # femto: Quadrillionth + # pico: Trillionth + # nano: Billionth + # micro: Millionth + # mili: Thousandth + # centi: Hundredth + # deci: Tenth + unit: "" + # ten: + # one: Ten + # other: Tens + # hundred: Hundred + thousand: Thousand + million: Million + billion: Billion + trillion: Trillion + quadrillion: Quadrillion + + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + prompts: + year: "Year" + month: "Month" + day: "Day" + hour: "Hour" + minute: "Minute" + second: "Seconds" + + helpers: + select: + # Default value for :prompt => true in FormOptionsHelper + prompt: "Please select" + + # Default translation keys for submit and button FormHelper + submit: + create: 'Create %{model}' + update: 'Update %{model}' + submit: 'Save %{model}' + diff --git a/config/locales/it.yml b/config/locales/it.yml index 6c96e2a..566c0fa 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -365,6 +365,11 @@ it: watched_empty: "Non sta guardando alcun canale." watched_find: "Trova qualche canale da guardare." watched_view: "Visualizza i Canali Visti" + public_link: "Public" + private_link: "Private" + settings_link: "Settings" + api_key_link: "API Key" + data_import_link: "Data Import" width: "Larghezza" youtube: "YouTube" @@ -413,7 +418,7 @@ it: help_react: "React allow you to trigger a ThingHTTP request or send a tweet using ThingTweet when your ThingSpeak Channel meets a certain condition. " help_react_create: "Create your React condition here." help_react_edit: "Update your React condition here." - help_react_edit1: "Select a condtion type to corespond with the type of data you wish to check and set your condition values." + help_react_edit1: "Select a condition type to correspond with the type of data you wish to check and set your condition values." help_react_edit2: "Use the Test Frequency setting to choose to test your condition on every insert or on a periodic basis." help_react_edit3: "Select ThingTweet or ThingHTTP as the action to be performed if the condition is met." window_map: "Mappa" @@ -582,4 +587,4 @@ it: submit: create: 'Create %{model}' update: 'Update %{model}' - submit: 'Save %{model}' + submit: 'Save %{model}' \ No newline at end of file diff --git a/config/locales/pt-br.yml b/config/locales/pt-br.yml index e3acf74..e699922 100644 --- a/config/locales/pt-br.yml +++ b/config/locales/pt-br.yml @@ -39,6 +39,7 @@ channel_create: "Criar novo canal" channel_edit: "Editar Canal" channel_error: "Ocorreram alguns problemas ao criar seu canal:" + channel_update_success: "The Channel was updated." channel_feed: "Dados do Canal" channel_default_field: "Rótulo do campo" channel_default_name: "Canal" @@ -48,7 +49,8 @@ channel_directions: "Direções" channel_id: "ID do canal" channel_name: "Nome" - channel_not_public: "Este canal é público." + channel_ranking: "Percentage Complete" + channel_not_public: "Este canal não é público." channel_permission: "Você não tem permissão para visualizar este canal!" channel_public: "Visualizar canal público" channel_public_view: "Visualização Pública" @@ -57,7 +59,12 @@ channels: "Canais" channels_my: "Meus Canais" channels_public_view: "Visualizar canais públicos" + channel_being_cleared: "This channel is currently being cleared. Any data you post to this channel before clearing is complete may be deleted." + channel_video_type_blank: "Ou Youtube, ou Vimeo, é necessário se Video ID é especificado." chart: "Gráfico" + chart_max: "Máximo" + chart_min: "Mínimo" + chart_is_dynamic: "Dinâmico" chart_background_color: "Cor do fundo" chart_embed_code: "Código para embutir" chart_example: "Gráfico de exemplo" @@ -66,7 +73,7 @@ chart_owned: "Seus gráficos" chart_round: "Arredondamento" chart_type: "Tipo" - chart_update: "Atualizar" + chart_update: "Atualizar gráficos" chart_xaxis: "Eixo X" chart_yaxis: "Eixo Y" charts: "Gráficos" @@ -95,6 +102,7 @@ data: "Dados" days: "Dias" delete: "apagar" + device: "Device" device_create: "Adicionar um novo dispositivo" device_custom_mac: "Digitar um endereço MAC personalizado" device_default_name: "Dispositivo" @@ -107,6 +115,7 @@ device_local_ip_address: "Endereço IP Local" device_local_port: "Porta Local" device_mac: "Endereço MAC" + device_mac_invalid: "Invalid MAC Address." device_model: "Modelo" device_port: "Número da porta pública" device_random_mac: "Gerar endereço MAC aleatório" @@ -128,6 +137,7 @@ footer: "Esta é a mensagem de rodapé." forgot: "Esqueceu sua senha?" forum: "Fórum" + for_more_information: "Para Mais Informações" generate_thingtweet_arduino_code: "Gerar código Arduino para o ThingTweet" height: "Altura" home: "Início" @@ -177,7 +187,9 @@ plugin_js: "JavaScript" plugin_name: "Nome" plugin_permission: "Você não tem permissão para apagar isto!" + plugin_private_flag: "Private only?" plugins: "Plugins" + plugin_private_flag: "Private?" profile_bio: "Biografia" profile_edit: "Editar perfil público" profile_for: "Perfil de" @@ -189,8 +201,69 @@ public: "Tornar Público?" public_header: "Público?" public_profile: "Perfil Público" - public_true: "Sim" + public_true: "Este canal é público." questions: "Perguntas" + react: "React" + react_header_name: "Name" + react_new_button: "Create New React" + react_delete_confirm: "Are you sure you wish to delete this condition?" + react_thinghttp_error: "'%{thinghttp_name}' request doesn't belong to you" + react_channel_error: "'%{channel_name}' request doesn't belong to you" + react_invalid_error: "%{value} is not a valid value" + react_invalid_number_error: "%{value} is not a value field number" + react_invalid_condition_error: "%{value} is not a valid condition" + react_invalid_condition_type_error: "%{value} is not a valid condition type" + react_twitter_account_required: "You need to add a twitter account to enable tweeting" + react_add_twitter_account: "Add a twitter account" + react_thinghttp_required: "You need to add a ThingHTTP request " + react_add_thinghttp_req: "Add ThingHTTP request" + react_tweet_cant_be_blank: "The tweet can't be blank" + react_type_string: "String" + react_type_status: "Status" + react_type_numeric: "Numeric" + react_type_geo: "Geo" + react_type_nodata: "No Data Check" + react_when_insert: "On Data Insertion" + react_when_10m: "Every 10 minutes" + react_when_30m: "Every 30 minutes" + react_when_60m: "Every 60 minutes" + react_condition_prefix: "If channel" + react_condition_field: "field" + react_condition_contains: "contains" + react_condition_begins: "starts with" + react_condition_ends: "ends with" + react_condition_gt: "is greater than" + react_condition_gte: "is greater than or equal to" + react_condition_lt: "is less than" + react_condition_lte: "is less than or equal to" + react_condition_eq: "is equal to" + react_condition_ne: "is not equal to" + react_condition_within: "is within" + react_condition_further: "is further than" + react_condition_nodata_prefix: "has not been updated for" + react_condition_nodata_suffix: "minutes" + react_condition_geo: "km from" + react_latitude: "latitude" + react_longitude: "longitude" + react_delete: "Delete this React" + react_twitter_delete_warning1: "Cannot delete this twitter account as it is used by %{reacts_count}: %{reacts_list}" + react_twitter_delete_warning2: "Please delete or modify this react before unlinking this twitter account." + react_thinghttp_delete_warning1: "Cannot delete this ThingHTTP as it is used by %{reacts_count}: %{reacts_list}" + react_thinghttp_delete_warning2: "Please delete or modify this react before unlinking this ThingHTTP." + react_default_name: "React" + react_label_condition: "Condition" + react_label_test_frequency: "Test Frequency" + react_label_react_name: "React Name" + react_label_condition_type: "Condition Type" + react_label_action: "Action" + react_label_options: "Options" + react_action_tweet_prefix: "then tweet" + react_action_tweet_suffix: "using Twitter account" + react_action_thinghttp_prefix: "then perform thinghttp" + react_option_run_first_time: "Run action only the first time the condition is met" + react_option_run_every_time: "Run action each time condition is met" + react_create_button: "Create React" + react_save_button: "Create React" remember_me: "Lembrar meu Login" results: "Resultados" rss: "RSS Feed" @@ -216,6 +289,7 @@ social_channel_error_slug_exists: "Slug já foi usado." social_channel_new: "Novo canal social" social_saved: "Enviado, obrigado!" + status_messages: "Status Messages" submit: "Enviar" sum: "Soma" tags: "Tags" @@ -275,6 +349,9 @@ upload: "Upload" upload_select: "Faça o upload de um arquivo CSV para importar dados para este canal" uploading: "fazendo upload..." + upload_successful: "Upload successful." + upload_no_file: "Please specify a file to be uploaded." + upload_no_data: "The uploaded file was empty." url: "URL" user: "Login" user_no_public_channels: "Este usuário não possui canais públicos." @@ -288,6 +365,11 @@ watched_empty: "Você não está monitorando nenhum canal." watched_find: "Encontrar algum canal para monitorar." watched_view: "Ver canais monitorados" + public_link: "Públicos" + private_link: "Private" + settings_link: "Settings" + api_key_link: "API Key" + data_import_link: "Data Import" width: "Largura" youtube: "YouTube" @@ -296,8 +378,10 @@ help_apps_thinghttp: "Crie POSTs ou GETs personalizados para outros webservices e receba os dados." help_apps_thingtweet: "Conecte sua conta do Twitter ao ThingSpeak e envie mensagens para o Twitter usando nossa API." help_apps_tweetcontrol: "Receba comandos via Twitter e execute ações." + help_apps_react: "Perform actions when conditions are met by your data in your channels." help_channel: "Crie um canal, pode ser para um dispositivo, aplicação ou qualquer outra coisa que envie dados para o ThingSpeak." help_channel_clear: "Clicando em \"Limpar Canal\" todos os registros recebidos por este canal serão apagados, porém as informações do canal permanecerão intactas." + help_channel_ranking: "Completeness will help your channel appear higher in the list of public channels." help_channel_feed: "Como ver os dados enviados" help_channel_fields: "Adiciona até 8 campos de registro. Você deve adicionar um campo antes de armazenar os dados." help_channel_import: "Seleciona um arquivo CSV do seu disco rígido e importe todos os dados diretamente para este canal. Seu arquivo CSV deve conter, no primeiro campo, a data do registro. Se seus dados não contém a zona horária, selecione o timezone correto." @@ -326,7 +410,182 @@ help_thinghttp_show: "Você pode enviar sua chamada via ThingHTTP com a seguinte URL:" help_thingtweet: "ThingTweet atua como um proxy para o Twitter. Assim seus dispositivos podem atualizar o status do Twitter sem precisar implementar o Open Authentication (OAuth)." help_tweetcontrol: "Use o TweetControl para monitorar hashtags específicas do Twitter, e então realizar ações personalizadas." - help_tweetcontrol_edit: "Preencha o login do Twitter e a hashtag que você deseja monitorar." + help_tweetcontrol_edit: "Preencha o login do Twitter." help_tweetcontrol_hashtag: "A hashtag #thingspeak deve estar presente no status do Twitter, por exemplo:" help_tweetcontrol_thinghttp: "Selecione uma chamada ThingHTTP para ser usada por este TweetControl. A chamada ThingHTTP será executada quando o TweetControl for disparado." + help_tweetcontrol_trigger: "Preencha a hashtag que você deseja monitorar." help_options: "mais ajuda" + help_react: "React allow you to trigger a ThingHTTP request or send a tweet using ThingTweet when your ThingSpeak Channel meets a certain condition. " + help_react_create: "Create your React condition here." + help_react_edit: "Update your React condition here." + help_react_edit1: "Select a condition type to correspond with the type of data you wish to check and set your condition values." + help_react_edit2: "Use the Test Frequency setting to choose to test your condition on every insert or on a periodic basis." + help_react_edit3: "Select ThingTweet or ThingHTTP as the action to be performed if the condition is met." + window_map: "Channel Location" + window_status: "Channel Status Updates" + window_channel_video: "Channel Video" + window_field_chart: "Field Chart" + window_plugin: "%{name} (Plugin)" + portlets_available: "Available Portlets" + private_view: "Private View" + public_view: "Public View" + channel_settings: "Channel Settings" + data_import: "Data Import" + portlets_all_displayed: "All available portlets are being displayed" + portlets_add: "Click a rectangle to add that portlet to the dashboard" + add_portlets: "Add Windows" + + + number: + # Used in number_with_delimiter() + # These are also the defaults for 'currency', 'percentage', 'precision', and 'human' + format: + # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5) + separator: "." + # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three) + delimiter: "," + # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00) + precision: 3 + # If set to true, precision will mean the number of significant digits instead + # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2) + significant: false + # If set, the zeros after the decimal separator will always be stripped (eg.: 1.200 will be 1.2) + strip_insignificant_zeros: false + + # Used in number_to_currency() + currency: + format: + # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00) + format: "%u%n" + unit: "$" + # These five are to override number.format and are optional + separator: "." + delimiter: "," + precision: 2 + significant: false + strip_insignificant_zeros: false + + # Used in number_to_percentage() + percentage: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + # precision: + # significant: false + # strip_insignificant_zeros: false + format: "%n%" + + # Used in number_to_precision() + precision: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + # precision: + # significant: false + # strip_insignificant_zeros: false + + # Used in number_to_human_size() and number_to_human() + human: + format: + # These five are to override number.format and are optional + # separator: + delimiter: "" + precision: 3 + significant: true + strip_insignificant_zeros: true + # Used in number_to_human_size() + storage_units: + # Storage units output formatting. + # %u is the storage unit, %n is the number (default: 2 MB) + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + # Used in number_to_human() + decimal_units: + format: "%n %u" + # Decimal units output formatting + # By default we will only quantify some of the exponents + # but the commented ones might be defined or overridden + # by the user. + units: + # femto: Quadrillionth + # pico: Trillionth + # nano: Billionth + # micro: Millionth + # mili: Thousandth + # centi: Hundredth + # deci: Tenth + unit: "" + # ten: + # one: Ten + # other: Tens + # hundred: Hundred + thousand: Thousand + million: Million + billion: Billion + trillion: Trillion + quadrillion: Quadrillion + + # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words() + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + prompts: + year: "Year" + month: "Month" + day: "Day" + hour: "Hour" + minute: "Minute" + second: "Seconds" + + helpers: + select: + # Default value for :prompt => true in FormOptionsHelper + prompt: "Please select" + + # Default translation keys for submit and button FormHelper + submit: + create: 'Create %{model}' + update: 'Update %{model}' + submit: 'Save %{model}' \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index ffe55d2..0fb04c1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,52 +1,204 @@ Thingspeak::Application.routes.draw do + # main data posts using this route - match 'update', :to => 'channels#post_data', :as => 'update', :via => ((GET_SUPPORT) ? ['get', 'post'] : 'post') + match 'update', :to => 'channels#post_data', :via => ((GET_SUPPORT) ? [:get, :post] : :post) + match 's/update', :to => 'channels#post_data', :via => [:get, :post] # handle subdomain routes - match '/', :to => 'subdomains#index', :constraints => { :subdomain => 'api' } - match 'crossdomain', :to => 'subdomains#crossdomain', :constraints => { :subdomain => 'api' } - match 'crossdomain', :to => 'subdomains#crossdomain' + get '/', :to => 'subdomains#index', :constraints => { :subdomain => 'api' } + get 'crossdomain', :to => 'subdomains#crossdomain', :constraints => { :subdomain => 'api' } root :to => 'pages#home' - resource :user_session - resource 'account', :to => 'users' - resources :users do - member do - get :reset_password - put :change_password - end + resource :pages do collection do - get :forgot_password + get :home + get :features + get :about + get :headers + get :social_home end end + match 'users/reset_password/:id', :to => 'users#reset_password', :as => 'reset_password', :via => [:get, :post] + patch 'users/change_password/:id', :to => 'users#change_password' + post 'mailer/resetpassword', :to => 'mailer#resetpassword' + + # public user profiles + match 'account/edit_profile' => 'users#edit_profile', :as => 'edit_profile', :via => [:get, :post] + patch 'account/update_profile' => 'users#update_profile', :as => 'update_profile' + # users paths + post 'users/new_api_key' => 'users#new_api_key', :as => 'user_new_api_key' + get 'users/:id/channels(.:format)' => 'users#list_channels', :as => 'list_channels', :constraints => { :id => /.*/ } + get 'users/:glob' => 'users#profile', :as => 'user_profile', :constraints => { :glob => /.*/ } + + resource :user_session + resource 'account', :to => 'users' + resources :users + + # social channels + get 's/' => 'pages#social_home' + get 's/:slug' => 'channels#social_show', :constraints => { :slug => /.*/ } + get 'channels/social_new' => 'channels#social_new' + + # search + resources :tags + # specific feeds - match 'channels/:channel_id/feed(s)(.:format)' => 'feed#index' - match 'channels/:channel_id/field(s)/:field_id(.:format)' => 'feed#index' - match 'channels/:channel_id/field(s)/:field_id/:id(.:format)' => 'feed#show' - match 'channels/:channel_id/feed(s)/entry/:id(.:format)' => 'feed#show' + get 'channels/:channel_id/feed(s)(.:format)' => 'feed#index' + get 'channels/:channel_id/field(s)/:field_id(.:format)' => 'feed#index' + get 'channels/:channel_id/field(s)/:field_id/:id(.:format)' => 'feed#show' + get 'channels/:channel_id/feed(s)/last_average(.:format)' => 'feed#last_average' + get 'channels/:channel_id/feed(s)/last_median(.:format)' => 'feed#last_median' + get 'channels/:channel_id/feed(s)/last_sum(.:format)' => 'feed#last_sum' + get 'channels/:channel_id/feed/entry/:id(.:format)' => 'feed#show' # not sure why this doesn't work with (s) + get 'channels/:channel_id/feeds/entry/:id(.:format)' => 'feed#show' # not sure why this doesn't work with (s) + get 'channels/:channel_id/social_feed' => 'channels#social_feed' + get 'channels/:channel_id/feed(s)/debug' => 'feed#debug' - # import - match 'channels/:channel_id/import' => 'channels#import', :as => 'channel_import' - match 'channels/:channel_id/upload' => 'channels#upload' + # maps + get 'channels/:channel_id/maps/channel_show' => 'maps#channel_show' + get 'channels/:channel_id/status/recent' => 'status#recent' - # nest feeds into channels + # nest the following controllers inside channels resources :channels do + collection do + get :public + get :watched + end member do get :import post :upload post :clear + put :watch end resources :feed + resources :feeds, :to => 'feed' resources :api_keys, :except => [:show, :edit] resources :status - resources :statuses, :to => 'statuses' + resources :statuses, :to => 'status' resources :charts + resources :maps + resources :channels + resources :tags + resources :comments + resources :windows, :only => [:index, :update] do + member do + get :iframe + get :html + put :hide + put :display + end + end end - match 'login' => 'user_sessions#new', :as => :login, :via => :get - match 'logout' => 'user_sessions#destroy', :as => :logout, :via => :delete - match 'mailer/resetpassword', :to => 'mailer#resetpassword', :as => :resetpassword, :via => :post + get 'channels/:channel_id/private_windows' => 'windows#private_windows' + get 'channels/:channel_id/hidden_windows' => 'windows#hidden_windows' + match 'channels/:channel_id/windows' => 'windows#update', :via => [:post, :put] + + resources :comments do + member do + post :vote + end + end + + resources :plugins do + collection do + get 'private_plugins' + get 'public_plugins' + end + end + + resources :devices do + member do + get :thingtweet_arduino_code + get :thingtweet_arduino_select_thingtweet + post :add_mac_address + put :ajax_update + end + end + + resources :pipes + + # twitter status update (version 1) + match 'apps/thingtweet/1/statuses/update(.:format)' => 'thingtweets#update', :via => [:get, :post] + match 'apps/thingtweet/1/statuses/update_debug(.:format)' => 'thingtweets#update_debug', :via => [:get, :post] + + + # thinghttp action + match 'apps/thinghttp/send_request' => 'thinghttp#send_request', :via => [:get, :post] + + # process responses for tweetcontrol + match 'apps/tweetcontrol/process_response' => 'tweetcontrol#process_response', :via => [:get, :post] + + # apps and nested controllers + scope 'apps' do + resources :thingtweets do + collection do + get :authorize_response + end + member do + put :new_api_key + end + end + resources :thinghttp do + resources :header + member do + put :new_api_key + end + end + resources :talkbacks do + member do + put :new_api_key + end + end + resources :tweetcontrol + resources :reacts + resources :scheduled_thinghttps + end + + # talkback api + delete 'talkbacks/:id/commands', :to => 'commands#destroy_all' + delete 'talkbacks/:id/commands/destroy_all', :to => 'commands#destroy_all' + resources :talkbacks do + resources :commands do + collection do + match :execute, :via => [:post, :get] + delete :destroy_all + end + end + end + + resources :apps, :only => ['index'] + + get 'admin', :to => 'admin#index', :as => 'admin' + namespace :admin do + resources :users + resources :channels + resources :twitter_accounts + resources :thinghttps + resources :devices + resources :failedlogins + resources :emails + end + + # app shortcuts + get 'apps/thingtweet', :to => 'thingtweets#index' + get 'apps/react', :to => 'react#index' + + # docs + get 'docs(/:action)', :to => 'docs' + + # users + match 'login' => 'user_sessions#new', :as => :login, :via => [:get, :post] + match 'logout' => 'user_sessions#destroy', :as => :logout, :via => [:get, :post] + match 'forgot_password', :to => 'users#forgot_password', :as => 'forgot_password', :via => [:get, :post] + + # add support for CORS preflighting (matches any OPTIONS route up to 4 levels deep) + # examples: /talkbacks, /talkbacks/4, /talkbacks/4/commands, /talkbacks/4/commands/6 + match '/:foo(/:foo(/:foo)(/:foo))', :to => 'cors#preflight', :via => 'options' + + #match ':controller(/:action(/:id(.:format)))', :via => :all end + diff --git a/db/migrate/20101111054358_create_users.rb b/db/migrate/20101111054358_create_users.rb new file mode 100644 index 0000000..9be2b76 --- /dev/null +++ b/db/migrate/20101111054358_create_users.rb @@ -0,0 +1,29 @@ +class CreateUsers < ActiveRecord::Migration + def self.up + create_table :users do |t| + + t.string :login, :null => false # optional, you can use email instead, or both + t.string :email, :null => false # optional, you can use login instead, or both + t.string :crypted_password, :null => false # optional, see below + t.string :password_salt, :null => false # optional, but highly recommended + t.string :persistence_token, :null => false # required + #t.string :single_access_token, :null => false # optional, see Authlogic::Session::Params + t.string :perishable_token, :null => false # optional, see Authlogic::Session::Perishability + + # Magic columns, just like ActiveRecord's created_at and updated_at. These are automatically maintained by Authlogic if they are present. + #t.integer :login_count, :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns + #t.integer :failed_login_count, :null => false, :default => 0 # optional, see Authlogic::Session::MagicColumns + #t.datetime :last_request_at # optional, see Authlogic::Session::MagicColumns + t.datetime :current_login_at # optional, see Authlogic::Session::MagicColumns + t.datetime :last_login_at # optional, see Authlogic::Session::MagicColumns + t.string :current_login_ip # optional, see Authlogic::Session::MagicColumns + t.string :last_login_ip + + t.timestamps + end + end + + def self.down + drop_table :users + end +end diff --git a/db/migrate/20101116224140_create_api_keys.rb b/db/migrate/20101116224140_create_api_keys.rb new file mode 100644 index 0000000..6e74b48 --- /dev/null +++ b/db/migrate/20101116224140_create_api_keys.rb @@ -0,0 +1,18 @@ +class CreateApiKeys < ActiveRecord::Migration + def self.up + create_table :api_keys do |t| + t.string :api_key, :limit => 16 + t.integer :device_id + t.integer :feed_id + t.integer :user_id + t.boolean :write_flag, :default => 0 + t.boolean :public_flag, :default => 0 + + t.timestamps + end + end + + def self.down + drop_table :api_keys + end +end diff --git a/db/migrate/20101116225014_add_indexes_to_api_key.rb b/db/migrate/20101116225014_add_indexes_to_api_key.rb new file mode 100644 index 0000000..a9a518f --- /dev/null +++ b/db/migrate/20101116225014_add_indexes_to_api_key.rb @@ -0,0 +1,11 @@ +class AddIndexesToApiKey < ActiveRecord::Migration + def self.up + add_index :api_keys, :api_key, :unique => true + add_index :api_keys, :device_id + end + + def self.down + remove_index :api_keys, :device_id + remove_index :api_keys, :api_key + end +end diff --git a/db/migrate/20101117005031_remove_feed_id_from_api_key.rb b/db/migrate/20101117005031_remove_feed_id_from_api_key.rb new file mode 100644 index 0000000..a01fee8 --- /dev/null +++ b/db/migrate/20101117005031_remove_feed_id_from_api_key.rb @@ -0,0 +1,9 @@ +class RemoveFeedIdFromApiKey < ActiveRecord::Migration + def self.up + remove_column :api_keys, :feed_id + end + + def self.down + add_column :api_keys, :feed_id, :integer + end +end diff --git a/db/migrate/20101117211040_create_feeds.rb b/db/migrate/20101117211040_create_feeds.rb new file mode 100644 index 0000000..75bad85 --- /dev/null +++ b/db/migrate/20101117211040_create_feeds.rb @@ -0,0 +1,22 @@ +class CreateFeeds < ActiveRecord::Migration + def self.up + create_table :feeds do |t| + t.integer :device_id + t.text :raw_data + t.text :data1 + t.text :data2 + t.text :data3 + t.text :data4 + t.text :data5 + t.text :data6 + t.text :data7 + t.text :data8 + + t.timestamps + end + end + + def self.down + drop_table :feeds + end +end diff --git a/db/migrate/20101117211209_add_index_to_feeds.rb b/db/migrate/20101117211209_add_index_to_feeds.rb new file mode 100644 index 0000000..9353632 --- /dev/null +++ b/db/migrate/20101117211209_add_index_to_feeds.rb @@ -0,0 +1,9 @@ +class AddIndexToFeeds < ActiveRecord::Migration + def self.up + add_index :feeds, :device_id + end + + def self.down + remove_index :feeds, :device_id + end +end diff --git a/db/migrate/20101118061100_add_time_zone_to_user.rb b/db/migrate/20101118061100_add_time_zone_to_user.rb new file mode 100644 index 0000000..fddfa9c --- /dev/null +++ b/db/migrate/20101118061100_add_time_zone_to_user.rb @@ -0,0 +1,9 @@ +class AddTimeZoneToUser < ActiveRecord::Migration + def self.up + add_column :users, :time_zone, :string + end + + def self.down + remove_column :users, :time_zone + end +end diff --git a/db/migrate/20101119231040_add_entry_id_to_feeds.rb b/db/migrate/20101119231040_add_entry_id_to_feeds.rb new file mode 100644 index 0000000..97b8e08 --- /dev/null +++ b/db/migrate/20101119231040_add_entry_id_to_feeds.rb @@ -0,0 +1,9 @@ +class AddEntryIdToFeeds < ActiveRecord::Migration + def self.up + add_column :feeds, :entry_id, :integer + end + + def self.down + remove_column :feeds, :entry_id + end +end diff --git a/db/migrate/20101123073857_add_note_to_api_keys.rb b/db/migrate/20101123073857_add_note_to_api_keys.rb new file mode 100644 index 0000000..965d896 --- /dev/null +++ b/db/migrate/20101123073857_add_note_to_api_keys.rb @@ -0,0 +1,9 @@ +class AddNoteToApiKeys < ActiveRecord::Migration + def self.up + add_column :api_keys, :note, :string + end + + def self.down + remove_column :api_keys, :note + end +end diff --git a/db/migrate/20101207175152_change_feed_data_to_fields.rb b/db/migrate/20101207175152_change_feed_data_to_fields.rb new file mode 100644 index 0000000..ff16cea --- /dev/null +++ b/db/migrate/20101207175152_change_feed_data_to_fields.rb @@ -0,0 +1,23 @@ +class ChangeFeedDataToFields < ActiveRecord::Migration + def self.up + rename_column :feeds, :data1, :field1 + rename_column :feeds, :data2, :field2 + rename_column :feeds, :data3, :field3 + rename_column :feeds, :data4, :field4 + rename_column :feeds, :data5, :field5 + rename_column :feeds, :data6, :field6 + rename_column :feeds, :data7, :field7 + rename_column :feeds, :data8, :field8 + end + + def self.down + rename_column :feeds, :field1, :data1 + rename_column :feeds, :field2, :data2 + rename_column :feeds, :field3, :data3 + rename_column :feeds, :field4, :data4 + rename_column :feeds, :field5, :data5 + rename_column :feeds, :field6, :data6 + rename_column :feeds, :field7, :data7 + rename_column :feeds, :field8, :data8 + end +end diff --git a/db/migrate/20101210151518_add_status_to_feeds.rb b/db/migrate/20101210151518_add_status_to_feeds.rb new file mode 100644 index 0000000..fe265ea --- /dev/null +++ b/db/migrate/20101210151518_add_status_to_feeds.rb @@ -0,0 +1,9 @@ +class AddStatusToFeeds < ActiveRecord::Migration + def self.up + add_column :feeds, :status, :string + end + + def self.down + remove_column :feeds, :status + end +end diff --git a/db/migrate/20101217193433_add_field_options_to_channels.rb b/db/migrate/20101217193433_add_field_options_to_channels.rb new file mode 100644 index 0000000..db31fea --- /dev/null +++ b/db/migrate/20101217193433_add_field_options_to_channels.rb @@ -0,0 +1,23 @@ +class AddFieldOptionsToChannels < ActiveRecord::Migration + def self.up + add_column :channels, :options1, :text + add_column :channels, :options2, :text + add_column :channels, :options3, :text + add_column :channels, :options4, :text + add_column :channels, :options5, :text + add_column :channels, :options6, :text + add_column :channels, :options7, :text + add_column :channels, :options8, :text + end + + def self.down + remove_column :channels, :options1 + remove_column :channels, :options2 + remove_column :channels, :options3 + remove_column :channels, :options4 + remove_column :channels, :options5 + remove_column :channels, :options6 + remove_column :channels, :options7 + remove_column :channels, :options8 + end +end diff --git a/db/migrate/20101218173400_create_tags.rb b/db/migrate/20101218173400_create_tags.rb new file mode 100644 index 0000000..7cbedff --- /dev/null +++ b/db/migrate/20101218173400_create_tags.rb @@ -0,0 +1,15 @@ +class CreateTags < ActiveRecord::Migration + def self.up + create_table :tags do |t| + t.string :name + + t.timestamps + end + + add_index :tags, :name + end + + def self.down + drop_table :tags + end +end diff --git a/db/migrate/20101218174125_create_taggings.rb b/db/migrate/20101218174125_create_taggings.rb new file mode 100644 index 0000000..513d4a6 --- /dev/null +++ b/db/migrate/20101218174125_create_taggings.rb @@ -0,0 +1,16 @@ +class CreateTaggings < ActiveRecord::Migration + def self.up + create_table :taggings do |t| + t.integer :tag_id + t.integer :channel_id + + t.timestamps + end + add_index :taggings, :tag_id + add_index :taggings, :channel_id + end + + def self.down + drop_table :taggings + end +end diff --git a/db/migrate/20110119170853_add_geolocation_to_feed.rb b/db/migrate/20110119170853_add_geolocation_to_feed.rb new file mode 100644 index 0000000..964db23 --- /dev/null +++ b/db/migrate/20110119170853_add_geolocation_to_feed.rb @@ -0,0 +1,13 @@ +class AddGeolocationToFeed < ActiveRecord::Migration + def self.up + add_column :feeds, :latitude, :decimal, :precision => 15, :scale => 10 + add_column :feeds, :longitude, :decimal, :precision => 15, :scale => 10 + add_column :feeds, :elevation, :string + end + + def self.down + remove_column :feeds, :latitude + remove_column :feeds, :longitude + remove_column :feeds, :elevation + end +end diff --git a/db/migrate/20110126140659_create_twitters.rb b/db/migrate/20110126140659_create_twitters.rb new file mode 100644 index 0000000..a11ed8e --- /dev/null +++ b/db/migrate/20110126140659_create_twitters.rb @@ -0,0 +1,23 @@ +class CreateTwitters < ActiveRecord::Migration + def self.up + create_table :twitters do |t| + t.string :screen_name + t.integer :user_id + t.integer :twitter_id + t.string :token + t.string :secret + + t.timestamps + end + + add_index :twitters, :user_id + add_index :twitters, :twitter_id + end + + def self.down + remove_index :twitters, :user_id + remove_index :twitters, :twitter_id + + drop_table :twitters + end +end diff --git a/db/migrate/20110126144150_add_api_key_to_twitters.rb b/db/migrate/20110126144150_add_api_key_to_twitters.rb new file mode 100644 index 0000000..77b5ca8 --- /dev/null +++ b/db/migrate/20110126144150_add_api_key_to_twitters.rb @@ -0,0 +1,11 @@ +class AddApiKeyToTwitters < ActiveRecord::Migration + def self.up + add_column :twitters, :api_key, :string, :limit => 16 + add_index :twitters, :api_key + end + + def self.down + remove_index :twitters, :api_key + remove_column :twitters, :api_key + end +end diff --git a/db/migrate/20110217135144_create_headers.rb b/db/migrate/20110217135144_create_headers.rb new file mode 100644 index 0000000..2bacc6b --- /dev/null +++ b/db/migrate/20110217135144_create_headers.rb @@ -0,0 +1,14 @@ +class CreateHeaders < ActiveRecord::Migration + def self.up + create_table :headers do |t| + t.string :name + t.string :value + + t.timestamps + end + end + + def self.down + drop_table :headers + end +end diff --git a/db/migrate/20110225042321_create_plugins.rb b/db/migrate/20110225042321_create_plugins.rb new file mode 100644 index 0000000..65ef7fb --- /dev/null +++ b/db/migrate/20110225042321_create_plugins.rb @@ -0,0 +1,21 @@ +class CreatePlugins < ActiveRecord::Migration + def self.up + create_table :plugins do |t| + t.string :name + t.integer :user_id + t.text :html + t.text :css + t.text :js + + t.timestamps + end + + add_index :plugins, :user_id + end + + def self.down + remove_index :plugins, :user_id + + drop_table :plugins + end +end diff --git a/db/migrate/20110227025236_change_feed_fields_to_strings.rb b/db/migrate/20110227025236_change_feed_fields_to_strings.rb new file mode 100644 index 0000000..41b98d7 --- /dev/null +++ b/db/migrate/20110227025236_change_feed_fields_to_strings.rb @@ -0,0 +1,23 @@ +class ChangeFeedFieldsToStrings < ActiveRecord::Migration + def self.up + change_column :feeds, :field1, :string + change_column :feeds, :field2, :string + change_column :feeds, :field3, :string + change_column :feeds, :field4, :string + change_column :feeds, :field5, :string + change_column :feeds, :field6, :string + change_column :feeds, :field7, :string + change_column :feeds, :field8, :string + end + + def self.down + change_column :feeds, :field1, :text + change_column :feeds, :field2, :text + change_column :feeds, :field3, :text + change_column :feeds, :field4, :text + change_column :feeds, :field5, :text + change_column :feeds, :field6, :text + change_column :feeds, :field7, :text + change_column :feeds, :field8, :text + end +end diff --git a/db/migrate/20110227025649_change_channel_fields_to_strings.rb b/db/migrate/20110227025649_change_channel_fields_to_strings.rb new file mode 100644 index 0000000..19e70f2 --- /dev/null +++ b/db/migrate/20110227025649_change_channel_fields_to_strings.rb @@ -0,0 +1,39 @@ +class ChangeChannelFieldsToStrings < ActiveRecord::Migration + def self.up + change_column :channels, :field1, :string + change_column :channels, :field2, :string + change_column :channels, :field3, :string + change_column :channels, :field4, :string + change_column :channels, :field5, :string + change_column :channels, :field6, :string + change_column :channels, :field7, :string + change_column :channels, :field8, :string + change_column :channels, :options1, :string + change_column :channels, :options2, :string + change_column :channels, :options3, :string + change_column :channels, :options4, :string + change_column :channels, :options5, :string + change_column :channels, :options6, :string + change_column :channels, :options7, :string + change_column :channels, :options8, :string + end + + def self.down + change_column :channels, :field1, :text + change_column :channels, :field2, :text + change_column :channels, :field3, :text + change_column :channels, :field4, :text + change_column :channels, :field5, :text + change_column :channels, :field6, :text + change_column :channels, :field7, :text + change_column :channels, :field8, :text + change_column :channels, :options1, :text + change_column :channels, :options2, :text + change_column :channels, :options3, :text + change_column :channels, :options4, :text + change_column :channels, :options5, :text + change_column :channels, :options6, :text + change_column :channels, :options7, :text + change_column :channels, :options8, :text + end +end diff --git a/db/migrate/20110227211312_add_created_at_index_to_feeds.rb b/db/migrate/20110227211312_add_created_at_index_to_feeds.rb new file mode 100644 index 0000000..7a34df0 --- /dev/null +++ b/db/migrate/20110227211312_add_created_at_index_to_feeds.rb @@ -0,0 +1,9 @@ +class AddCreatedAtIndexToFeeds < ActiveRecord::Migration + def self.up + add_index :feeds, :created_at + end + + def self.down + remove_index :feeds, :created_at + end +end diff --git a/db/migrate/20110227221002_add_double_index_to_feeds.rb b/db/migrate/20110227221002_add_double_index_to_feeds.rb new file mode 100644 index 0000000..327ec7a --- /dev/null +++ b/db/migrate/20110227221002_add_double_index_to_feeds.rb @@ -0,0 +1,13 @@ +class AddDoubleIndexToFeeds < ActiveRecord::Migration + def self.up + remove_index :feeds, :channel_id + remove_index :feeds, :created_at + add_index :feeds, [:channel_id, :created_at] + end + + def self.down + remove_index :feeds, [:channel_id, :created_at] + add_index :feeds, :channel_id + add_index :feeds, :created_at + end +end diff --git a/db/migrate/20110329204643_add_channel_id_entry_id_index_to_feeds.rb b/db/migrate/20110329204643_add_channel_id_entry_id_index_to_feeds.rb new file mode 100644 index 0000000..6f15a3c --- /dev/null +++ b/db/migrate/20110329204643_add_channel_id_entry_id_index_to_feeds.rb @@ -0,0 +1,9 @@ +class AddChannelIdEntryIdIndexToFeeds < ActiveRecord::Migration + def self.up + add_index :feeds, [:channel_id, :entry_id] + end + + def self.down + remove_index :feeds, [:channel_id, :entry_id] + end +end diff --git a/db/migrate/20110405211741_create_pipes.rb b/db/migrate/20110405211741_create_pipes.rb new file mode 100644 index 0000000..50ade73 --- /dev/null +++ b/db/migrate/20110405211741_create_pipes.rb @@ -0,0 +1,19 @@ +class CreatePipes < ActiveRecord::Migration + def self.up + create_table :pipes do |t| + t.string :name, :null => false + t.string :url, :null => false + t.string :slug, :null => false, :unique => true + + t.timestamps + end + + add_index :pipes, :slug + end + + def self.down + remove_index :pipes, :slug + + drop_table :pipes + end +end diff --git a/db/migrate/20110406220648_add_fields_to_pipes.rb b/db/migrate/20110406220648_add_fields_to_pipes.rb new file mode 100644 index 0000000..b77e37c --- /dev/null +++ b/db/migrate/20110406220648_add_fields_to_pipes.rb @@ -0,0 +1,11 @@ +class AddFieldsToPipes < ActiveRecord::Migration + def self.up + add_column :pipes, :parse, :string + add_column :pipes, :cache, :integer + end + + def self.down + remove_column :pipes, :parse + remove_column :pipes, :cache + end +end diff --git a/db/migrate/20110407034539_add_social_to_channels.rb b/db/migrate/20110407034539_add_social_to_channels.rb new file mode 100644 index 0000000..68f4f43 --- /dev/null +++ b/db/migrate/20110407034539_add_social_to_channels.rb @@ -0,0 +1,15 @@ +class AddSocialToChannels < ActiveRecord::Migration + def self.up + add_column :channels, :social, :boolean, :default => 0 + add_column :channels, :slug, :string + + add_index :channels, :slug + end + + def self.down + remove_index :channels, :slug + + remove_column :channels, :slug + remove_column :channels, :social + end +end diff --git a/db/migrate/20110409071450_add_location_to_feeds.rb b/db/migrate/20110409071450_add_location_to_feeds.rb new file mode 100644 index 0000000..cb9f76a --- /dev/null +++ b/db/migrate/20110409071450_add_location_to_feeds.rb @@ -0,0 +1,9 @@ +class AddLocationToFeeds < ActiveRecord::Migration + def self.up + add_column :feeds, :location, :string, :after => :elevation + end + + def self.down + remove_column :feeds, :location + end +end diff --git a/db/migrate/20110409221058_add_status_to_channels.rb b/db/migrate/20110409221058_add_status_to_channels.rb new file mode 100644 index 0000000..df0ae8c --- /dev/null +++ b/db/migrate/20110409221058_add_status_to_channels.rb @@ -0,0 +1,9 @@ +class AddStatusToChannels < ActiveRecord::Migration + def self.up + add_column :channels, :status, :string + end + + def self.down + remove_column :channels, :status + end +end diff --git a/db/migrate/20110419173839_add_url_to_channel.rb b/db/migrate/20110419173839_add_url_to_channel.rb new file mode 100644 index 0000000..4a378b0 --- /dev/null +++ b/db/migrate/20110419173839_add_url_to_channel.rb @@ -0,0 +1,9 @@ +class AddUrlToChannel < ActiveRecord::Migration + def self.up + add_column :channels, :url, :string + end + + def self.down + remove_column :channels, :status + end +end diff --git a/db/migrate/20110425145717_create_comments.rb b/db/migrate/20110425145717_create_comments.rb new file mode 100644 index 0000000..0153fb1 --- /dev/null +++ b/db/migrate/20110425145717_create_comments.rb @@ -0,0 +1,17 @@ +class CreateComments < ActiveRecord::Migration + def self.up + create_table :comments do |t| + t.integer :parent_id + t.text :body + t.integer :flags + t.integer :user_id + t.string :ip_address + + t.timestamps + end + end + + def self.down + drop_table :comments + end +end diff --git a/db/migrate/20110427021512_add_channel_id_to_comments.rb b/db/migrate/20110427021512_add_channel_id_to_comments.rb new file mode 100644 index 0000000..1aa49b2 --- /dev/null +++ b/db/migrate/20110427021512_add_channel_id_to_comments.rb @@ -0,0 +1,9 @@ +class AddChannelIdToComments < ActiveRecord::Migration + def self.up + add_column :comments, :channel_id, :integer + end + + def self.down + remove_column :comments, :channel_id + end +end diff --git a/db/migrate/20110427021659_add_indices_to_comments.rb b/db/migrate/20110427021659_add_indices_to_comments.rb new file mode 100644 index 0000000..b72a3ea --- /dev/null +++ b/db/migrate/20110427021659_add_indices_to_comments.rb @@ -0,0 +1,9 @@ +class AddIndicesToComments < ActiveRecord::Migration + def self.up + add_index :comments, :channel_id + end + + def self.down + remove_index :comments, :channel_id + end +end diff --git a/db/migrate/20110428182848_create_watchings.rb b/db/migrate/20110428182848_create_watchings.rb new file mode 100644 index 0000000..7124a00 --- /dev/null +++ b/db/migrate/20110428182848_create_watchings.rb @@ -0,0 +1,18 @@ +class CreateWatchings < ActiveRecord::Migration + def self.up + create_table :watchings do |t| + t.integer :user_id + t.integer :channel_id + + t.timestamps + end + + add_index :watchings, [:user_id, :channel_id] + end + + def self.down + remove_index :watchings, [:user_id, :channel_id] + + drop_table :watchings + end +end diff --git a/db/migrate/20110428225855_add_video_fields_to_channels.rb b/db/migrate/20110428225855_add_video_fields_to_channels.rb new file mode 100644 index 0000000..50b4f8b --- /dev/null +++ b/db/migrate/20110428225855_add_video_fields_to_channels.rb @@ -0,0 +1,11 @@ +class AddVideoFieldsToChannels < ActiveRecord::Migration + def self.up + add_column :channels, :video_id, :string + add_column :channels, :video_type, :string + end + + def self.down + remove_column :channels, :video_id + remove_column :channels, :video_type + end +end diff --git a/db/migrate/20110513192617_add_fields_to_users.rb b/db/migrate/20110513192617_add_fields_to_users.rb new file mode 100644 index 0000000..24cc6fc --- /dev/null +++ b/db/migrate/20110513192617_add_fields_to_users.rb @@ -0,0 +1,13 @@ +class AddFieldsToUsers < ActiveRecord::Migration + def self.up + add_column :users, :public_flag, :boolean, :default => false + add_column :users, :bio, :text + add_column :users, :website, :string + end + + def self.down + remove_column :users, :website + remove_column :users, :bio + remove_column :users, :public_flag + end +end diff --git a/db/migrate/20110528172838_create_failedlogins.rb b/db/migrate/20110528172838_create_failedlogins.rb new file mode 100644 index 0000000..e5b6817 --- /dev/null +++ b/db/migrate/20110528172838_create_failedlogins.rb @@ -0,0 +1,15 @@ +class CreateFailedlogins < ActiveRecord::Migration + def self.up + create_table :failedlogins do |t| + t.string :login + t.string :password + t.string :ip_address + + t.timestamps + end + end + + def self.down + drop_table :failedlogins + end +end diff --git a/db/migrate/20111209111008_rename_twitters_table.rb b/db/migrate/20111209111008_rename_twitters_table.rb new file mode 100644 index 0000000..1e5b154 --- /dev/null +++ b/db/migrate/20111209111008_rename_twitters_table.rb @@ -0,0 +1,9 @@ +class RenameTwittersTable < ActiveRecord::Migration + def self.up + rename_table :twitters, :twitter_accounts + end + + def self.down + rename_table :twitter_accounts, :twitters + end +end diff --git a/db/migrate/20111220200743_add_index_to_channels.rb b/db/migrate/20111220200743_add_index_to_channels.rb new file mode 100644 index 0000000..3004233 --- /dev/null +++ b/db/migrate/20111220200743_add_index_to_channels.rb @@ -0,0 +1,11 @@ +class AddIndexToChannels < ActiveRecord::Migration + def self.up + add_index :channels, :user_id + add_index :channels, [:public_flag, :last_entry_id, :updated_at], :name => 'channels_public_viewable' + end + + def self.down + remove_index :channels, :user_id + remove_index :channels, :name => 'channels_public_viewable' + end +end diff --git a/db/migrate/20111220205057_add_index_to_user_logins.rb b/db/migrate/20111220205057_add_index_to_user_logins.rb new file mode 100644 index 0000000..994a90c --- /dev/null +++ b/db/migrate/20111220205057_add_index_to_user_logins.rb @@ -0,0 +1,9 @@ +class AddIndexToUserLogins < ActiveRecord::Migration + def self.up + add_index :users, :login + end + + def self.down + remove_index :users, :login + end +end diff --git a/db/migrate/20111222205615_add_index_to_headers_table.rb b/db/migrate/20111222205615_add_index_to_headers_table.rb new file mode 100644 index 0000000..fb8e2a7 --- /dev/null +++ b/db/migrate/20111222205615_add_index_to_headers_table.rb @@ -0,0 +1,9 @@ +class AddIndexToHeadersTable < ActiveRecord::Migration + def self.up + add_index :headers, :thinghttp_id + end + + def self.down + remove_index :headers, :thinghttp_id + end +end diff --git a/db/migrate/20120209003458_create_windows.rb b/db/migrate/20120209003458_create_windows.rb new file mode 100644 index 0000000..e6b632b --- /dev/null +++ b/db/migrate/20120209003458_create_windows.rb @@ -0,0 +1,15 @@ +class CreateWindows < ActiveRecord::Migration + def self.up + create_table :windows do |t| + t.integer :channel_id + t.integer :plugin_id + t.integer :position + + t.timestamps + end + end + + def self.down + drop_table :windows + end +end diff --git a/db/migrate/20120213011639_add_html_to_window.rb b/db/migrate/20120213011639_add_html_to_window.rb new file mode 100644 index 0000000..14c57f6 --- /dev/null +++ b/db/migrate/20120213011639_add_html_to_window.rb @@ -0,0 +1,9 @@ +class AddHtmlToWindow < ActiveRecord::Migration + def self.up + add_column :windows, :html, :text + end + + def self.down + remove_column :windows, :html + end +end diff --git a/db/migrate/20120215111613_add_index_to_users.rb b/db/migrate/20120215111613_add_index_to_users.rb new file mode 100644 index 0000000..fc62737 --- /dev/null +++ b/db/migrate/20120215111613_add_index_to_users.rb @@ -0,0 +1,9 @@ +class AddIndexToUsers < ActiveRecord::Migration + def self.up + add_index :users, :email + end + + def self.down + remove_index :users, :email + end +end diff --git a/db/migrate/20120215111708_add_clearing_flag_to_channel.rb b/db/migrate/20120215111708_add_clearing_flag_to_channel.rb new file mode 100644 index 0000000..96588f1 --- /dev/null +++ b/db/migrate/20120215111708_add_clearing_flag_to_channel.rb @@ -0,0 +1,9 @@ +class AddClearingFlagToChannel < ActiveRecord::Migration + def self.up + add_column :channels, :clearing, :boolean, :null => false, :default => false + end + + def self.down + remove_column :channels, :clearing + end +end diff --git a/db/migrate/20120220015055_add_col_to_windows.rb b/db/migrate/20120220015055_add_col_to_windows.rb new file mode 100644 index 0000000..61fbe89 --- /dev/null +++ b/db/migrate/20120220015055_add_col_to_windows.rb @@ -0,0 +1,11 @@ +class AddColToWindows < ActiveRecord::Migration + def self.up + add_column :windows, :col, :integer + add_column :windows, :title, :string + end + + def self.down + remove_column :windows, :title + remove_column :windows, :col + end +end diff --git a/db/migrate/20120220031559_remove_plugin_id_from_window.rb b/db/migrate/20120220031559_remove_plugin_id_from_window.rb new file mode 100644 index 0000000..e02b8fa --- /dev/null +++ b/db/migrate/20120220031559_remove_plugin_id_from_window.rb @@ -0,0 +1,9 @@ +class RemovePluginIdFromWindow < ActiveRecord::Migration + def self.up + remove_column :windows, :plugin_id + end + + def self.down + add_column :windows, :plugin_id, :string + end +end diff --git a/db/migrate/20120220035936_add_wtype_to_windows.rb b/db/migrate/20120220035936_add_wtype_to_windows.rb new file mode 100644 index 0000000..29e2ac6 --- /dev/null +++ b/db/migrate/20120220035936_add_wtype_to_windows.rb @@ -0,0 +1,9 @@ +class AddWtypeToWindows < ActiveRecord::Migration + def self.up + add_column :windows, :wtype, :string + end + + def self.down + remove_column :windows, :wtype + end +end diff --git a/db/migrate/20120227002240_add_name_to_window.rb b/db/migrate/20120227002240_add_name_to_window.rb new file mode 100644 index 0000000..54cc667 --- /dev/null +++ b/db/migrate/20120227002240_add_name_to_window.rb @@ -0,0 +1,9 @@ +class AddNameToWindow < ActiveRecord::Migration + def self.up + add_column :windows, :name, :string + end + + def self.down + remove_column :windows, :name + end +end diff --git a/db/migrate/20120317011252_create_chart_window_details.rb b/db/migrate/20120317011252_create_chart_window_details.rb new file mode 100644 index 0000000..f0cbfcd --- /dev/null +++ b/db/migrate/20120317011252_create_chart_window_details.rb @@ -0,0 +1,14 @@ +class CreateChartWindowDetails < ActiveRecord::Migration + def self.up + create_table :chart_window_details do |t| + t.integer :chart_window_id + t.integer :field_number + + t.timestamps + end + end + + def self.down + drop_table :chart_window_details + end +end diff --git a/db/migrate/20120319001841_create_portlet_window_details.rb b/db/migrate/20120319001841_create_portlet_window_details.rb new file mode 100644 index 0000000..0e70e3d --- /dev/null +++ b/db/migrate/20120319001841_create_portlet_window_details.rb @@ -0,0 +1,13 @@ +class CreatePortletWindowDetails < ActiveRecord::Migration + def self.up + create_table :portlet_window_details do |t| + t.integer :portlet_window_id + + t.timestamps + end + end + + def self.down + drop_table :portlet_window_details + end +end diff --git a/db/migrate/20120321013341_add_type_to_window.rb b/db/migrate/20120321013341_add_type_to_window.rb new file mode 100644 index 0000000..da47c6f --- /dev/null +++ b/db/migrate/20120321013341_add_type_to_window.rb @@ -0,0 +1,9 @@ +class AddTypeToWindow < ActiveRecord::Migration + def self.up + add_column :windows, :type, :string + end + + def self.down + remove_column :windows, :type + end +end diff --git a/db/migrate/20120323173306_add_options_to_chart_window_details.rb b/db/migrate/20120323173306_add_options_to_chart_window_details.rb new file mode 100644 index 0000000..e469462 --- /dev/null +++ b/db/migrate/20120323173306_add_options_to_chart_window_details.rb @@ -0,0 +1,9 @@ +class AddOptionsToChartWindowDetails < ActiveRecord::Migration + def self.up + add_column :chart_window_details, :options, :string + end + + def self.down + remove_column :chart_window_details, :options + end +end diff --git a/db/migrate/20120331221037_add_private_flag_to_windows.rb b/db/migrate/20120331221037_add_private_flag_to_windows.rb new file mode 100644 index 0000000..355625a --- /dev/null +++ b/db/migrate/20120331221037_add_private_flag_to_windows.rb @@ -0,0 +1,9 @@ +class AddPrivateFlagToWindows < ActiveRecord::Migration + def self.up + add_column :windows, :private_flag, :boolean, :default => false + end + + def self.down + remove_column :windows, :private_flag + end +end diff --git a/db/migrate/20120521003815_add_show_flag_to_windows.rb b/db/migrate/20120521003815_add_show_flag_to_windows.rb new file mode 100644 index 0000000..08f0f27 --- /dev/null +++ b/db/migrate/20120521003815_add_show_flag_to_windows.rb @@ -0,0 +1,9 @@ +class AddShowFlagToWindows < ActiveRecord::Migration + def self.up + add_column :windows, :show_flag, :boolean, :default => true + end + + def self.down + remove_column :windows, :show_flag + end +end diff --git a/db/migrate/20120709152043_add_private_flag_to_plugins.rb b/db/migrate/20120709152043_add_private_flag_to_plugins.rb new file mode 100644 index 0000000..44d8754 --- /dev/null +++ b/db/migrate/20120709152043_add_private_flag_to_plugins.rb @@ -0,0 +1,9 @@ +class AddPrivateFlagToPlugins < ActiveRecord::Migration + def self.up + add_column :plugins, :private_flag, :boolean, :default => true + end + + def self.down + remove_column :plugins, :private_flag + end +end diff --git a/db/migrate/20120716160028_create_plugin_window_details.rb b/db/migrate/20120716160028_create_plugin_window_details.rb new file mode 100644 index 0000000..bba01e4 --- /dev/null +++ b/db/migrate/20120716160028_create_plugin_window_details.rb @@ -0,0 +1,14 @@ +class CreatePluginWindowDetails < ActiveRecord::Migration + def self.up + create_table :plugin_window_details do |t| + t.integer :plugin_id + t.integer :plugin_window_id + + t.timestamps + end + end + + def self.down + drop_table :plugin_window_details + end +end diff --git a/db/migrate/20120821145951_add_ranking_to_channel.rb b/db/migrate/20120821145951_add_ranking_to_channel.rb new file mode 100644 index 0000000..7b27c21 --- /dev/null +++ b/db/migrate/20120821145951_add_ranking_to_channel.rb @@ -0,0 +1,9 @@ +class AddRankingToChannel < ActiveRecord::Migration + def self.up + add_column :channels, :ranking, :integer + end + + def self.down + remove_column :channels, :ranking + end +end diff --git a/db/migrate/20120907024520_add_index_to_channel.rb b/db/migrate/20120907024520_add_index_to_channel.rb new file mode 100644 index 0000000..63f1549 --- /dev/null +++ b/db/migrate/20120907024520_add_index_to_channel.rb @@ -0,0 +1,8 @@ +class AddIndexToChannel < ActiveRecord::Migration + def self.up + add_index(:channels, :ranking) + end + + def self.down + end +end diff --git a/db/migrate/20130618221922_change_api_key.rb b/db/migrate/20130618221922_change_api_key.rb new file mode 100644 index 0000000..ecf8d09 --- /dev/null +++ b/db/migrate/20130618221922_change_api_key.rb @@ -0,0 +1,6 @@ +class ChangeApiKey < ActiveRecord::Migration + def change + change_column :twitter_accounts, :api_key, :string + end + +end diff --git a/db/migrate/20130621124211_change_api_key_limit.rb b/db/migrate/20130621124211_change_api_key_limit.rb new file mode 100644 index 0000000..523fe47 --- /dev/null +++ b/db/migrate/20130621124211_change_api_key_limit.rb @@ -0,0 +1,6 @@ +class ChangeApiKeyLimit < ActiveRecord::Migration + def change + change_column :twitter_accounts, :api_key, :string, :limit => 17, :null => false + end + +end diff --git a/db/migrate/20131203192610_add_indexes_to_portlets.rb b/db/migrate/20131203192610_add_indexes_to_portlets.rb new file mode 100644 index 0000000..32eadf2 --- /dev/null +++ b/db/migrate/20131203192610_add_indexes_to_portlets.rb @@ -0,0 +1,7 @@ +class AddIndexesToPortlets < ActiveRecord::Migration + def change + add_index :windows, :channel_id + add_index :portlet_window_details, :portlet_window_id + end +end + diff --git a/db/migrate/20131203194235_add_index_to_chart_window_details.rb b/db/migrate/20131203194235_add_index_to_chart_window_details.rb new file mode 100644 index 0000000..49e97c1 --- /dev/null +++ b/db/migrate/20131203194235_add_index_to_chart_window_details.rb @@ -0,0 +1,6 @@ +class AddIndexToChartWindowDetails < ActiveRecord::Migration + def change + add_index :chart_window_details, :chart_window_id + end +end + diff --git a/db/migrate/20131203194541_add_persistence_index_to_users.rb b/db/migrate/20131203194541_add_persistence_index_to_users.rb new file mode 100644 index 0000000..7fee8b9 --- /dev/null +++ b/db/migrate/20131203194541_add_persistence_index_to_users.rb @@ -0,0 +1,6 @@ +class AddPersistenceIndexToUsers < ActiveRecord::Migration + def change + add_index :users, :persistence_token + end +end + diff --git a/db/migrate/20131203195328_add_index_to_plugin_window_details.rb b/db/migrate/20131203195328_add_index_to_plugin_window_details.rb new file mode 100644 index 0000000..bb121ed --- /dev/null +++ b/db/migrate/20131203195328_add_index_to_plugin_window_details.rb @@ -0,0 +1,6 @@ +class AddIndexToPluginWindowDetails < ActiveRecord::Migration + def change + add_index :plugin_window_details, :plugin_window_id + end +end + diff --git a/db/migrate/20131218181245_add_api_key_to_users.rb b/db/migrate/20131218181245_add_api_key_to_users.rb new file mode 100644 index 0000000..42f148b --- /dev/null +++ b/db/migrate/20131218181245_add_api_key_to_users.rb @@ -0,0 +1,6 @@ +class AddApiKeyToUsers < ActiveRecord::Migration + def change + add_column :users, :api_key, :string, :limit => 16 + end +end + diff --git a/db/migrate/20131218191938_add_index_on_api_keys_to_user.rb b/db/migrate/20131218191938_add_index_on_api_keys_to_user.rb new file mode 100644 index 0000000..867b3a6 --- /dev/null +++ b/db/migrate/20131218191938_add_index_on_api_keys_to_user.rb @@ -0,0 +1,6 @@ +class AddIndexOnApiKeysToUser < ActiveRecord::Migration + def change + add_index :users, :api_key + end +end + diff --git a/db/migrate/20140121232049_create_daily_feeds.rb b/db/migrate/20140121232049_create_daily_feeds.rb new file mode 100644 index 0000000..26ef8e3 --- /dev/null +++ b/db/migrate/20140121232049_create_daily_feeds.rb @@ -0,0 +1,15 @@ +class CreateDailyFeeds < ActiveRecord::Migration + def change + create_table :daily_feeds do |t| + t.integer :channel_id + t.date :date + t.string :calculation, :limit => 20 + t.string :result + + t.timestamps + end + + add_index :daily_feeds, [:channel_id, :date] + end +end + diff --git a/db/migrate/20140122222754_remove_timestamps_from_daily_feeds.rb b/db/migrate/20140122222754_remove_timestamps_from_daily_feeds.rb new file mode 100644 index 0000000..b56d426 --- /dev/null +++ b/db/migrate/20140122222754_remove_timestamps_from_daily_feeds.rb @@ -0,0 +1,12 @@ +class RemoveTimestampsFromDailyFeeds < ActiveRecord::Migration + def up + remove_column :daily_feeds, :created_at + remove_column :daily_feeds, :updated_at + end + + def down + add_column :daily_feeds, :created_at, :datetime + add_column :daily_feeds, :updated_at, :datetime + end +end + diff --git a/db/migrate/20140122223014_add_field_to_daily_feeds.rb b/db/migrate/20140122223014_add_field_to_daily_feeds.rb new file mode 100644 index 0000000..b07077b --- /dev/null +++ b/db/migrate/20140122223014_add_field_to_daily_feeds.rb @@ -0,0 +1,6 @@ +class AddFieldToDailyFeeds < ActiveRecord::Migration + def change + add_column :daily_feeds, :field, :integer, :limit => 1 + end +end + diff --git a/db/migrate/20140130213435_remove_raw_data_from_feeds.rb b/db/migrate/20140130213435_remove_raw_data_from_feeds.rb new file mode 100644 index 0000000..48493bd --- /dev/null +++ b/db/migrate/20140130213435_remove_raw_data_from_feeds.rb @@ -0,0 +1,6 @@ +class RemoveRawDataFromFeeds < ActiveRecord::Migration + def change + remove_column :feeds, :raw_data + end +end + diff --git a/db/migrate/20140203191645_change_twitter_accounts_twitter_id.rb b/db/migrate/20140203191645_change_twitter_accounts_twitter_id.rb new file mode 100644 index 0000000..2489b2a --- /dev/null +++ b/db/migrate/20140203191645_change_twitter_accounts_twitter_id.rb @@ -0,0 +1,6 @@ +class ChangeTwitterAccountsTwitterId < ActiveRecord::Migration + def change + change_column :twitter_accounts, :twitter_id, :integer, :limit => 8 + end +end + diff --git a/db/schema.rb b/db/schema.rb index db637f9..a78c55a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,3 +1,4 @@ +# encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -8,29 +9,29 @@ # from scratch. The latter is a flawed and unsustainable approach (the more migrations # you'll amass, the slower it'll run and the greater likelihood for issues). # -# It's strongly recommended to check this file into your version control system. +# It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(:version => 20110329210210) do +ActiveRecord::Schema.define(version: 20140203191645) do - create_table "api_keys", :force => true do |t| - t.string "api_key", :limit => 16 + create_table "api_keys", force: true do |t| + t.string "api_key", limit: 16 t.integer "channel_id" t.integer "user_id" - t.boolean "write_flag", :default => false + t.boolean "write_flag", default: false t.datetime "created_at" t.datetime "updated_at" t.string "note" end - add_index "api_keys", ["api_key"], :name => "index_api_keys_on_api_key", :unique => true - add_index "api_keys", ["channel_id"], :name => "index_api_keys_on_channel_id" + add_index "api_keys", ["api_key"], name: "index_api_keys_on_api_key", unique: true, using: :btree + add_index "api_keys", ["channel_id"], name: "index_api_keys_on_channel_id", using: :btree - create_table "channels", :force => true do |t| + create_table "channels", force: true do |t| t.integer "user_id" t.string "name" t.string "description" - t.decimal "latitude", :precision => 15, :scale => 10 - t.decimal "longitude", :precision => 15, :scale => 10 + t.decimal "latitude", precision: 15, scale: 10 + t.decimal "longitude", precision: 15, scale: 10 t.string "field1" t.string "field2" t.string "field3" @@ -51,7 +52,7 @@ ActiveRecord::Schema.define(:version => 20110329210210) do t.datetime "updated_at" t.string "elevation" t.integer "last_entry_id" - t.boolean "public_flag", :default => false + t.boolean "public_flag", default: false t.string "options1" t.string "options2" t.string "options3" @@ -60,11 +61,93 @@ ActiveRecord::Schema.define(:version => 20110329210210) do t.string "options6" t.string "options7" t.string "options8" + t.boolean "social", default: false + t.string "slug" + t.string "status" + t.string "url" + t.string "video_id" + t.string "video_type" + t.boolean "clearing", default: false, null: false + t.integer "ranking" end - create_table "feeds", :force => true do |t| + add_index "channels", ["public_flag", "last_entry_id", "updated_at"], name: "channels_public_viewable", using: :btree + add_index "channels", ["ranking"], name: "index_channels_on_ranking", using: :btree + add_index "channels", ["slug"], name: "index_channels_on_slug", using: :btree + add_index "channels", ["user_id"], name: "index_channels_on_user_id", using: :btree + + create_table "chart_window_details", force: true do |t| + t.integer "chart_window_id" + t.integer "field_number" + t.datetime "created_at" + t.datetime "updated_at" + t.string "options" + end + + add_index "chart_window_details", ["chart_window_id"], name: "index_chart_window_details_on_chart_window_id", using: :btree + + create_table "commands", force: true do |t| + t.string "command_string" + t.integer "position" + t.integer "talkback_id" + t.datetime "executed_at" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "commands", ["talkback_id", "executed_at"], name: "index_commands_on_talkback_id_and_executed_at", using: :btree + + create_table "comments", force: true do |t| + t.integer "parent_id" + t.text "body" + t.integer "flags" + t.integer "user_id" + t.string "ip_address" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "channel_id" + end + + add_index "comments", ["channel_id"], name: "index_comments_on_channel_id", using: :btree + + create_table "daily_feeds", force: true do |t| + t.integer "channel_id" + t.date "date" + t.string "calculation", limit: 20 + t.string "result" + t.integer "field", limit: 1 + end + + add_index "daily_feeds", ["channel_id", "date"], name: "index_daily_feeds_on_channel_id_and_date", using: :btree + + create_table "devices", force: true do |t| + t.integer "user_id" + t.string "title" + t.string "model" + t.string "ip_address" + t.integer "port" + t.string "mac_address" + t.datetime "created_at" + t.datetime "updated_at" + t.string "local_ip_address" + t.integer "local_port" + t.string "default_gateway" + t.string "subnet_mask" + end + + add_index "devices", ["mac_address"], name: "index_devices_on_mac_address", using: :btree + add_index "devices", ["user_id"], name: "index_devices_on_user_id", using: :btree + + create_table "failedlogins", force: true do |t| + t.string "login" + t.string "password" + t.string "ip_address" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "feeds", force: true do |t| t.integer "channel_id" - t.text "raw_data" t.string "field1" t.string "field2" t.string "field3" @@ -77,21 +160,200 @@ ActiveRecord::Schema.define(:version => 20110329210210) do t.datetime "updated_at" t.integer "entry_id" t.string "status" - t.decimal "latitude", :precision => 15, :scale => 10 - t.decimal "longitude", :precision => 15, :scale => 10 + t.decimal "latitude", precision: 15, scale: 10 + t.decimal "longitude", precision: 15, scale: 10 t.string "elevation" + t.string "location" end - add_index "feeds", ["channel_id", "created_at"], :name => "index_feeds_on_channel_id_and_created_at" - add_index "feeds", ["channel_id", "entry_id"], :name => "index_feeds_on_channel_id_and_entry_id" + add_index "feeds", ["channel_id", "created_at"], name: "index_feeds_on_channel_id_and_created_at", using: :btree + add_index "feeds", ["channel_id", "entry_id"], name: "index_feeds_on_channel_id_and_entry_id", using: :btree - create_table "users", :force => true do |t| - t.string "login", :null => false - t.string "email", :null => false - t.string "crypted_password", :null => false - t.string "password_salt", :null => false - t.string "persistence_token", :null => false - t.string "perishable_token", :null => false + create_table "headers", force: true do |t| + t.string "name" + t.string "value" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "thinghttp_id" + end + + add_index "headers", ["thinghttp_id"], name: "index_headers_on_thinghttp_id", using: :btree + + create_table "pipes", force: true do |t| + t.string "name", null: false + t.string "url", null: false + t.string "slug", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "parse" + t.integer "cache" + end + + add_index "pipes", ["slug"], name: "index_pipes_on_slug", using: :btree + + create_table "plugin_window_details", force: true do |t| + t.integer "plugin_id" + t.integer "plugin_window_id" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "plugin_window_details", ["plugin_window_id"], name: "index_plugin_window_details_on_plugin_window_id", using: :btree + + create_table "plugins", force: true do |t| + t.string "name" + t.integer "user_id" + t.text "html" + t.text "css" + t.text "js" + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "private_flag", default: true + end + + add_index "plugins", ["user_id"], name: "index_plugins_on_user_id", using: :btree + + create_table "portlet_window_details", force: true do |t| + t.integer "portlet_window_id" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "portlet_window_details", ["portlet_window_id"], name: "index_portlet_window_details_on_portlet_window_id", using: :btree + + create_table "reacts", force: true do |t| + t.integer "user_id" + t.string "name" + t.string "react_type", limit: 10 + t.integer "run_interval" + t.boolean "run_on_insertion", default: true, null: false + t.datetime "last_run_at" + t.integer "channel_id" + t.integer "field_number" + t.string "condition", limit: 15 + t.string "condition_value" + t.float "condition_lat" + t.float "condition_long" + t.float "condition_elev" + t.integer "actionable_id" + t.boolean "last_result", default: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "actionable_type", default: "Thinghttp" + t.string "action_value" + t.string "latest_value" + t.boolean "activated", default: true + t.boolean "run_action_every_time", default: false + end + + add_index "reacts", ["channel_id", "run_on_insertion"], name: "index_reacts_on_channel_id_and_run_on_insertion", using: :btree + add_index "reacts", ["channel_id"], name: "index_reacts_on_channel_id", using: :btree + add_index "reacts", ["run_interval"], name: "index_reacts_on_run_interval", using: :btree + add_index "reacts", ["user_id"], name: "index_reacts_on_user_id", using: :btree + + create_table "scheduled_thinghttps", force: true do |t| + t.integer "user_id" + t.string "name" + t.boolean "activated", default: true, null: false + t.integer "run_interval" + t.integer "thinghttp_id" + t.integer "channel_id" + t.string "field_name" + t.datetime "last_run_at" + t.string "last_result" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "scheduled_thinghttps", ["activated", "run_interval"], name: "index_scheduled_thinghttps_on_activated_and_run_interval", using: :btree + add_index "scheduled_thinghttps", ["user_id"], name: "index_scheduled_thinghttps_on_user_id", using: :btree + + create_table "taggings", force: true do |t| + t.integer "tag_id" + t.integer "channel_id" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "taggings", ["channel_id"], name: "index_taggings_on_channel_id", using: :btree + add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree + + create_table "tags", force: true do |t| + t.string "name" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "tags", ["name"], name: "index_tags_on_name", using: :btree + + create_table "talkbacks", force: true do |t| + t.string "api_key", limit: 16 + t.datetime "created_at" + t.datetime "updated_at" + t.integer "user_id" + t.string "name" + t.integer "channel_id" + end + + add_index "talkbacks", ["api_key"], name: "index_talkbacks_on_api_key", using: :btree + add_index "talkbacks", ["user_id"], name: "index_talkbacks_on_user_id", using: :btree + + create_table "thinghttps", force: true do |t| + t.integer "user_id" + t.string "api_key", limit: 16 + t.text "url" + t.string "auth_name" + t.string "auth_pass" + t.string "method" + t.string "content_type" + t.string "http_version" + t.string "host" + t.text "body" + t.datetime "created_at" + t.datetime "updated_at" + t.string "name" + t.string "parse" + end + + add_index "thinghttps", ["api_key"], name: "index_thinghttps_on_api_key", using: :btree + add_index "thinghttps", ["user_id"], name: "index_thinghttps_on_user_id", using: :btree + + create_table "tweetcontrols", force: true do |t| + t.string "screen_name" + t.string "trigger" + t.string "control_type" + t.integer "control_key" + t.string "control_string" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "user_id" + end + + add_index "tweetcontrols", ["screen_name"], name: "index_tweetcontrols_on_screen_name", using: :btree + add_index "tweetcontrols", ["user_id"], name: "index_tweetcontrols_on_user_id", using: :btree + + create_table "twitter_accounts", force: true do |t| + t.string "screen_name" + t.integer "user_id" + t.integer "twitter_id", limit: 8 + t.string "token" + t.string "secret" + t.datetime "created_at" + t.datetime "updated_at" + t.string "api_key", limit: 17, null: false + end + + add_index "twitter_accounts", ["api_key"], name: "index_twitters_on_api_key", using: :btree + add_index "twitter_accounts", ["twitter_id"], name: "index_twitters_on_twitter_id", using: :btree + add_index "twitter_accounts", ["user_id"], name: "index_twitters_on_user_id", using: :btree + + create_table "users", force: true do |t| + t.string "login", null: false + t.string "email", null: false + t.string "crypted_password", null: false + t.string "password_salt", null: false + t.string "persistence_token", null: false + t.string "perishable_token", null: false t.datetime "current_login_at" t.datetime "last_login_at" t.string "current_login_ip" @@ -99,6 +361,41 @@ ActiveRecord::Schema.define(:version => 20110329210210) do t.datetime "created_at" t.datetime "updated_at" t.string "time_zone" + t.boolean "public_flag", default: false + t.text "bio" + t.string "website" + t.string "api_key", limit: 16 end + add_index "users", ["api_key"], name: "index_users_on_api_key", using: :btree + add_index "users", ["email"], name: "index_users_on_email", using: :btree + add_index "users", ["login"], name: "index_users_on_login", using: :btree + add_index "users", ["persistence_token"], name: "index_users_on_persistence_token", using: :btree + + create_table "watchings", force: true do |t| + t.integer "user_id" + t.integer "channel_id" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "watchings", ["user_id", "channel_id"], name: "index_watchings_on_user_id_and_channel_id", using: :btree + + create_table "windows", force: true do |t| + t.integer "channel_id" + t.integer "position" + t.datetime "created_at" + t.datetime "updated_at" + t.text "html" + t.integer "col" + t.string "title" + t.string "wtype" + t.string "name" + t.string "type" + t.boolean "private_flag", default: false + t.boolean "show_flag", default: true + end + + add_index "windows", ["channel_id"], name: "index_windows_on_channel_id", using: :btree + end diff --git a/lib/api_keys.rb b/lib/api_keys.rb new file mode 100644 index 0000000..0fcace5 --- /dev/null +++ b/lib/api_keys.rb @@ -0,0 +1,11 @@ +module ApiKeys + def api_index (channel_id) + if current_user && !current_user.channels.find_by_id(channel_id).nil? + @channel = current_user.channels.find(channel_id) + end + if current_user && current_user.id == @channel.user_id + @write_key = @channel.api_keys.write_keys.first + @read_keys = @channel.api_keys.read_keys + end + end +end diff --git a/lib/key_utilities.rb b/lib/key_utilities.rb index 6071c57..7781288 100644 --- a/lib/key_utilities.rb +++ b/lib/key_utilities.rb @@ -1,14 +1,18 @@ module KeyUtilities - + # generates a database unique api key - def generate_api_key(size = 16) + def generate_api_key(size = 16, type = 'channel') alphanumerics = ('0'..'9').to_a + ('A'..'Z').to_a - k = (0..(size - 1)).map {alphanumerics[Kernel.rand(36)]}.join - + new_key = (1..size).map {alphanumerics[Kernel.rand(36)]}.join + # if key exists in database, regenerate key - k = generate_api_key if ApiKey.find_by_api_key(k) - - # output the key - k + new_key = generate_api_key if type == 'channel' and ApiKey.find_by_api_key(new_key) + new_key = generate_api_key(16, 'user') if type == 'user' and User.find_by_api_key(new_key) + new_key = generate_api_key(16, 'twitter') if type == 'twitter' and TwitterAccount.find_by_api_key(new_key) + new_key = generate_api_key(16, 'thinghttp') if type == 'thinghttp' and Thinghttp.find_by_api_key(new_key) + new_key = generate_api_key(16, 'talkback') if type == 'talkback' and Talkback.find_by_api_key(new_key) + return new_key end + end + diff --git a/public/500.html b/public/500.html index b80307f..dacf26f 100644 --- a/public/500.html +++ b/public/500.html @@ -5,12 +5,7 @@ @@ -18,9 +13,11 @@ +

We're sorry, but something went wrong.

-

We've been notified about this issue and we'll take a look at it shortly.

+
+

Please send an email to support@thingspeak.com if this problem persists.

diff --git a/public/assets/GitHub_ThingSpeak_API-f39bba3caddbf4af63e208b8552a98ac.jpg b/public/assets/GitHub_ThingSpeak_API-f39bba3caddbf4af63e208b8552a98ac.jpg new file mode 100644 index 0000000..5d77b0a Binary files /dev/null and b/public/assets/GitHub_ThingSpeak_API-f39bba3caddbf4af63e208b8552a98ac.jpg differ diff --git a/public/assets/ThingSpeak_Logo-3139b15204b5af565fca3a5f342ef19c.png b/public/assets/ThingSpeak_Logo-3139b15204b5af565fca3a5f342ef19c.png new file mode 100644 index 0000000..78a4d45 Binary files /dev/null and b/public/assets/ThingSpeak_Logo-3139b15204b5af565fca3a5f342ef19c.png differ diff --git a/public/assets/ThingSpeak_Logo.png b/public/assets/ThingSpeak_Logo.png new file mode 100644 index 0000000..78a4d45 Binary files /dev/null and b/public/assets/ThingSpeak_Logo.png differ diff --git a/public/assets/application-1369f895a819b8f9cb3fdb98c04ee8e0.js b/public/assets/application-1369f895a819b8f9cb3fdb98c04ee8e0.js new file mode 100644 index 0000000..9e6428d --- /dev/null +++ b/public/assets/application-1369f895a819b8f9cb3fdb98c04ee8e0.js @@ -0,0 +1,6 @@ +function openDialogCenter(t){t.dialog("open");var e=getDimensions(t.parent());t.dialog({position:[e[0],e[1]]})}function getDimensions(t){var e=new Array(2);return e[0]=$(window).width()/2-t.width()/2,e[1]=$(window).height()/2-t.height()/2,e}function updateChart(t,e,i,n,r,s){var i=i,n=n,o=$("#iframe"+t).attr("default_src");o||(o=$("#iframe"+t).attr("src")),src=o.split("?")[0],"line"!=$("#type_"+t).val()&&0==$("#timescale_"+t).val().length&&0==$("#average_"+t).val().length&&0==$("#median_"+t).val().length&&0==$("#sum_"+t).val().length&&$("#timescale_"+t).val(30);var a=[];$(".chart_options"+t).each(function(){var t=$(this).val(),e=$(this).attr("id"),i=e.split("_")[0];t.length>0&&a.push([i,t])});for(var l="";a.length>0;){var h=a.pop();"width"==h[0]&&(i=parseInt(h[1])),"height"==h[0]&&(n=parseInt(h[1])),("type"!=h[0]||"line"!=h[1])&&(l+="&"+h[0]+"="+encodeURIComponent(h[1]))}l.length>0&&(src+="?"+l.substring(1)),e&&t>0&&s?$.update("/channels/"+r+"/charts/"+t,{newOptions:{options:l}}):e&&t>0&&$.update("/channels/"+r+"/charts/"+t,{options:l}),$("#embed"+t).val(''),$("#iframe"+t).attr("src",src),$("#iframe"+t).attr("width",i),$("#iframe"+t).attr("height",n)}function updateSelectValues(){selectedValue=$(this).val(),$(".mutuallyexclusive"+index).each(function(){$(this).val("")}),$(this).val(selectedValue)}function setupChartForm(t){return function(e,i){i.length>0&&$("#"+i.split("=")[0]+"_"+t).val(decodeURIComponent(i.split("=")[1]))}}function setupColumns(t,e){$(sortColumnSetup(t,e)),$(".column").disableSelection()}function createWindowsWithData(t,e,i,n){for(var r in t){for(var s in t[r])var o=s;if(t[r].chart_window&&(a=t[r].chart_window),t[r].plugin_window&&(a=t[r].plugin_window),t[r].portlet_window&&(a=t[r].portlet_window),"undefined"==a)var a=t[r].portlet_window?t[r].portlet_window:t[r].chart_window;colId=a.col,title=a.title;var l=a.html;if(t[r].chart_window){var h=a.id;$("body").append("
")}var c=addWindow(n,colId,a.id,o,title,l);c.each(decoratePortlet(e)),c.find(".ui-toggle").click(uiToggleClick),c.find(".ui-view").click(uiViewClick(i)),c.find(".ui-edit").click(uiEditClick(i)),c.find(".ui-close").click(uiCloseClick(i))}}function addWindow(t,e,i,n,r,s){if($("#"+t+"_dialog"+e).append('
'+r+'
'+s+"
"),$("#portlet_"+i).length>1)throw"Portlet count doesn't match what's expected";return $("#portlet_"+i)}function sortColumnSetup(t,e){$(".column").sortable({opacity:.6,helper:function(){return $("
Drop to re-position
")},connectWith:".column",update:updatePortletPositions(t,e)})}function getPortletArray(t){var e=new Array,n=t.split("&");for(i in n)val=n[i].split("=")[1],e.push(val);return e}function uiToggleClick(){$(this).toggleClass("ui-icon-minusthick").toggleClass("ui-icon-plusthick"),$(this).parents(".portlet:first").find(".portlet-content").toggle()}!function(t,e){t.rails!==e&&t.error("jquery-ujs has already been loaded!");var i,n=t(document);t.rails=i={linkClickSelector:"a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]",buttonClickSelector:"button[data-remote]",inputChangeSelector:"select[data-remote], input[data-remote], textarea[data-remote]",formSubmitSelector:"form",formInputClickSelector:"form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])",disableSelector:"input[data-disable-with], button[data-disable-with], textarea[data-disable-with]",enableSelector:"input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled",requiredInputSelector:"input[name][required]:not([disabled]),textarea[name][required]:not([disabled])",fileInputSelector:"input[type=file]",linkDisableSelector:"a[data-disable-with]",CSRFProtection:function(e){var i=t('meta[name="csrf-token"]').attr("content");i&&e.setRequestHeader("X-CSRF-Token",i)},fire:function(e,i,n){var r=t.Event(i);return e.trigger(r,n),r.result!==!1},confirm:function(t){return confirm(t)},ajax:function(e){return t.ajax(e)},href:function(t){return t.attr("href")},handleRemote:function(n){var r,s,o,a,l,h,c,d;if(i.fire(n,"ajax:before")){if(a=n.data("cross-domain"),l=a===e?null:a,h=n.data("with-credentials")||null,c=n.data("type")||t.ajaxSettings&&t.ajaxSettings.dataType,n.is("form")){r=n.attr("method"),s=n.attr("action"),o=n.serializeArray();var u=n.data("ujs:submit-button");u&&(o.push(u),n.data("ujs:submit-button",null))}else n.is(i.inputChangeSelector)?(r=n.data("method"),s=n.data("url"),o=n.serialize(),n.data("params")&&(o=o+"&"+n.data("params"))):n.is(i.buttonClickSelector)?(r=n.data("method")||"get",s=n.data("url"),o=n.serialize(),n.data("params")&&(o=o+"&"+n.data("params"))):(r=n.data("method"),s=i.href(n),o=n.data("params")||null);d={type:r||"GET",data:o,dataType:c,beforeSend:function(t,r){return r.dataType===e&&t.setRequestHeader("accept","*/*;q=0.5, "+r.accepts.script),i.fire(n,"ajax:beforeSend",[t,r])},success:function(t,e,i){n.trigger("ajax:success",[t,e,i])},complete:function(t,e){n.trigger("ajax:complete",[t,e])},error:function(t,e,i){n.trigger("ajax:error",[t,e,i])},crossDomain:l},h&&(d.xhrFields={withCredentials:h}),s&&(d.url=s);var p=i.ajax(d);return n.trigger("ajax:send",p),p}return!1},handleMethod:function(n){var r=i.href(n),s=n.data("method"),o=n.attr("target"),a=t("meta[name=csrf-token]").attr("content"),l=t("meta[name=csrf-param]").attr("content"),h=t('
'),c='';l!==e&&a!==e&&(c+=''),o&&h.attr("target",o),h.hide().append(c).appendTo("body"),h.submit()},disableFormElements:function(e){e.find(i.disableSelector).each(function(){var e=t(this),i=e.is("button")?"html":"val";e.data("ujs:enable-with",e[i]()),e[i](e.data("disable-with")),e.prop("disabled",!0)})},enableFormElements:function(e){e.find(i.enableSelector).each(function(){var e=t(this),i=e.is("button")?"html":"val";e.data("ujs:enable-with")&&e[i](e.data("ujs:enable-with")),e.prop("disabled",!1)})},allowAction:function(t){var e,n=t.data("confirm"),r=!1;return n?(i.fire(t,"confirm")&&(r=i.confirm(n),e=i.fire(t,"confirm:complete",[r])),r&&e):!0},blankInputs:function(e,i,n){var r,s,o=t(),a=i||"input,textarea",l=e.find(a);return l.each(function(){if(r=t(this),s=r.is("input[type=checkbox],input[type=radio]")?r.is(":checked"):r.val(),!s==!n){if(r.is("input[type=radio]")&&l.filter('input[type=radio]:checked[name="'+r.attr("name")+'"]').length)return!0;o=o.add(r)}}),o.length?o:!1},nonBlankInputs:function(t,e){return i.blankInputs(t,e,!0)},stopEverything:function(e){return t(e.target).trigger("ujs:everythingStopped"),e.stopImmediatePropagation(),!1},disableElement:function(t){t.data("ujs:enable-with",t.html()),t.html(t.data("disable-with")),t.bind("click.railsDisable",function(t){return i.stopEverything(t)})},enableElement:function(t){t.data("ujs:enable-with")!==e&&(t.html(t.data("ujs:enable-with")),t.removeData("ujs:enable-with")),t.unbind("click.railsDisable")}},i.fire(n,"rails:attachBindings")&&(t.ajaxPrefilter(function(t,e,n){t.crossDomain||i.CSRFProtection(n)}),n.delegate(i.linkDisableSelector,"ajax:complete",function(){i.enableElement(t(this))}),n.delegate(i.linkClickSelector,"click.rails",function(n){var r=t(this),s=r.data("method"),o=r.data("params");if(!i.allowAction(r))return i.stopEverything(n);if(r.is(i.linkDisableSelector)&&i.disableElement(r),r.data("remote")!==e){if(!(!n.metaKey&&!n.ctrlKey||s&&"GET"!==s||o))return!0;var a=i.handleRemote(r);return a===!1?i.enableElement(r):a.error(function(){i.enableElement(r)}),!1}return r.data("method")?(i.handleMethod(r),!1):void 0}),n.delegate(i.buttonClickSelector,"click.rails",function(e){var n=t(this);return i.allowAction(n)?(i.handleRemote(n),!1):i.stopEverything(e)}),n.delegate(i.inputChangeSelector,"change.rails",function(e){var n=t(this);return i.allowAction(n)?(i.handleRemote(n),!1):i.stopEverything(e)}),n.delegate(i.formSubmitSelector,"submit.rails",function(n){var r=t(this),s=r.data("remote")!==e,o=i.blankInputs(r,i.requiredInputSelector),a=i.nonBlankInputs(r,i.fileInputSelector);if(!i.allowAction(r))return i.stopEverything(n);if(o&&r.attr("novalidate")==e&&i.fire(r,"ajax:aborted:required",[o]))return i.stopEverything(n);if(s){if(a){setTimeout(function(){i.disableFormElements(r)},13);var l=i.fire(r,"ajax:aborted:file",[a]);return l||setTimeout(function(){i.enableFormElements(r)},13),l}return i.handleRemote(r),!1}setTimeout(function(){i.disableFormElements(r)},13)}),n.delegate(i.formInputClickSelector,"click.rails",function(e){var n=t(this);if(!i.allowAction(n))return i.stopEverything(e);var r=n.attr("name"),s=r?{name:r,value:n.val()}:null;n.closest("form").data("ujs:submit-button",s)}),n.delegate(i.formSubmitSelector,"ajax:beforeSend.rails",function(e){this==e.target&&i.disableFormElements(t(this))}),n.delegate(i.formSubmitSelector,"ajax:complete.rails",function(e){this==e.target&&i.enableFormElements(t(this))}),t(function(){var e=t("meta[name=csrf-token]").attr("content"),i=t("meta[name=csrf-param]").attr("content");t('form input[name="'+i+'"]').val(e)}))}(jQuery),function(t){t.cookie=function(e,i,n){if(arguments.length>1&&(!/Object/.test(Object.prototype.toString.call(i))||null===i||void 0===i)){if(n=t.extend({},n),(null===i||void 0===i)&&(n.expires=-1),"number"==typeof n.expires){var r=n.expires,s=n.expires=new Date;s.setDate(s.getDate()+r)}return i=String(i),document.cookie=[encodeURIComponent(e),"=",n.raw?i:encodeURIComponent(i),n.expires?"; expires="+n.expires.toUTCString():"",n.path?"; path="+n.path:"",n.domain?"; domain="+n.domain:"",n.secure?"; secure":""].join("")}n=i||{};for(var o,a=n.raw?function(t){return t}:decodeURIComponent,l=document.cookie.split("; "),h=0;o=l[h]&&l[h].split("=");h++)if(a(o[0])===e)return a(o[1]||"");return null}}(jQuery),function(){function t(t,e){var i;t||(t={});for(i in e)t[i]=e[i];return t}function e(){var t,e,i=arguments,n={},r=function(t,e){var i,n;"object"!=typeof t&&(t={});for(n in e)e.hasOwnProperty(n)&&(i=e[n],t[n]=i&&"object"==typeof i&&"[object Array]"!==Object.prototype.toString.call(i)&&"number"!=typeof i.nodeType?r(t[n]||{},i):e[n]);return t};for(i[0]===!0&&(n=i[1],i=Array.prototype.slice.call(i,2)),e=i.length,t=0;e>t;t++)n=r(n,i[t]);return n}function i(t,e){return parseInt(t,e||10)}function n(t){return"string"==typeof t}function r(t){return"object"==typeof t}function s(t){return"[object Array]"===Object.prototype.toString.call(t)}function o(t){return"number"==typeof t}function a(t){return le.log(t)/le.LN10}function l(t){return le.pow(10,t)}function h(t,e){for(var i=t.length;i--;)if(t[i]===e){t.splice(i,1);break}}function c(t){return t!==_&&null!==t}function d(t,e,i){var s,o;if(n(e))c(i)?t.setAttribute(e,i):t&&t.getAttribute&&(o=t.getAttribute(e));else if(c(e)&&r(e))for(s in e)t.setAttribute(s,e[s]);return o}function u(t){return s(t)?t:[t]}function p(){var t,e,i=arguments,n=i.length;for(t=0;n>t;t++)if(e=i[t],"undefined"!=typeof e&&null!==e)return e}function f(e,i){we&&i&&i.opacity!==_&&(i.filter="alpha(opacity="+100*i.opacity+")"),t(e.style,i)}function g(e,i,n,r,s){return e=oe.createElement(e),i&&t(e,i),s&&f(e,{padding:0,border:Be,margin:0}),n&&f(e,n),r&&r.appendChild(e),e}function m(e,i){var n=function(){};return n.prototype=new e,t(n.prototype,i),n}function y(t,e,n,r){var s=X.lang,t=+t||0,o=-1===e?(t.toString().split(".")[1]||"").length:isNaN(e=fe(e))?2:e,e=void 0===n?s.decimalPoint:n,r=void 0===r?s.thousandsSep:r,s=0>t?"-":"",n=String(i(t=fe(t).toFixed(o))),a=n.length>3?n.length%3:0;return s+(a?n.substr(0,a)+r:"")+n.substr(a).replace(/(\d{3})(?=\d)/g,"$1"+r)+(o?e+fe(t-n).toFixed(o).slice(2):"")}function v(t,e){return Array((e||2)+1-String(t).length).join(0)+t}function x(t,e,i){var n=t[e];t[e]=function(){var t=Array.prototype.slice.call(arguments);return t.unshift(n),i.apply(this,t)}}function b(t,e){for(var i,n,r,s,o,a="{",l=!1,h=[];-1!==(a=t.indexOf(a));){if(i=t.slice(0,a),l){for(n=i.split(":"),r=n.shift().split("."),o=r.length,i=e,s=0;o>s;s++)i=i[r[s]];n.length&&(n=n.join(":"),r=/\.([0-9])/,s=X.lang,o=void 0,/f$/.test(n)?(o=(o=n.match(r))?o[1]:-1,i=y(i,o,s.decimalPoint,n.indexOf(",")>-1?s.thousandsSep:"")):i=G(n,i))}h.push(i),t=t.slice(a+1),a=(l=!l)?"}":"{"}return h.push(t),h.join("")}function w(t){return le.pow(10,ce(le.log(t)/le.LN10))}function k(t,e,i,n){var r,i=p(i,1);for(r=t/i,e||(e=[1,2,2.5,5,10],n&&n.allowDecimals===!1&&(1===i?e=[1,2,5,10]:.1>=i&&(e=[1/i]))),n=0;nn;n++)t[n].ss_i=n;for(t.sort(function(t,n){return i=e(t,n),0===i?t.ss_i-n.ss_i:i}),n=0;r>n;n++)delete t[n].ss_i}function C(t){for(var e=t.length,i=t[0];e--;)t[e]i&&(i=t[e]);return i}function A(t,e){for(var i in t)t[i]&&t[i]!==e&&t[i].destroy&&t[i].destroy(),delete t[i]}function L(t){W||(W=g(ze)),t&&W.appendChild(t),W.innerHTML=""}function M(t,e){var i="Highcharts error #"+t+": www.highcharts.com/errors/"+t;if(e)throw i;ae.console&&console.log(i)}function I(t){return parseFloat(t.toPrecision(14))}function D(t,e){$=p(t,e.animation)}function E(){var t=X.global.useUTC,e=t?"getUTC":"get",i=t?"setUTC":"set";q=6e4*(t&&X.global.timezoneOffset||0),V=t?Date.UTC:function(t,e,i,n,r,s){return new Date(t,e,p(i,1),p(n,0),p(r,0),p(s,0)).getTime()},U=e+"Minutes",Z=e+"Hours",K=e+"Day",Q=e+"Date",J=e+"Month",te=e+"FullYear",ee=i+"Minutes",ie=i+"Hours",ne=i+"Date",re=i+"Month",se=i+"FullYear"}function O(){}function R(t,e,i,n){this.axis=t,this.pos=e,this.type=i||"",this.isNew=!0,!i&&!n&&this.addLabel()}function z(){this.init.apply(this,arguments)}function B(t,e,i,n,r,s){var o=t.chart.inverted;this.axis=t,this.isNegative=i,this.options=e,this.x=n,this.total=null,this.points={},this.stack=r,this.percent="percent"===s,this.alignOptions={align:e.align||(o?i?"left":"right":"center"),verticalAlign:e.verticalAlign||(o?"middle":i?"bottom":"top"),y:p(e.y,o?4:i?14:-6),x:p(e.x,o?i?-6:6:0)},this.textAlign=e.textAlign||(o?i?"right":"left":"center")}function F(){this.init.apply(this,arguments)}function N(){this.init.apply(this,arguments)}var _,H,W,X,G,$,Y,j,V,q,U,Z,K,Q,J,te,ee,ie,ne,re,se,oe=document,ae=window,le=Math,he=le.round,ce=le.floor,de=le.ceil,ue=le.max,pe=le.min,fe=le.abs,ge=le.cos,me=le.sin,ye=le.PI,ve=2*ye/360,xe=navigator.userAgent,be=ae.opera,we=/msie/i.test(xe)&&!be,ke=8===oe.documentMode,Se=/AppleWebKit/.test(xe),Te=/Firefox/.test(xe),Ce=/(Mobile|Android|Windows Phone)/.test(xe),Pe="http://www.w3.org/2000/svg",Ae=!!oe.createElementNS&&!!oe.createElementNS(Pe,"svg").createSVGRect,Le=Te&&parseInt(xe.split("Firefox/")[1],10)<4,Me=!Ae&&!we&&!!oe.createElement("canvas").getContext,Ie=oe.documentElement.ontouchstart!==_,De={},Ee=0,Oe=function(){},Re=[],ze="div",Be="none",Fe=/^[0-9]+$/,Ne="rgba(192,192,192,"+(Ae?1e-4:.002)+")",_e="stroke-width",He={};ae.Highcharts=ae.Highcharts?M(16,!0):{},G=function(e,i,n){if(!c(i)||isNaN(i))return"Invalid date";var r,e=p(e,"%Y-%m-%d %H:%M:%S"),s=new Date(i-q),o=s[Z](),a=s[K](),l=s[Q](),h=s[J](),d=s[te](),u=X.lang,f=u.weekdays,s=t({a:f[a].substr(0,3),A:f[a],d:v(l),e:l,b:u.shortMonths[h],B:u.months[h],m:v(h+1),y:d.toString().substr(2,2),Y:d,H:v(o),I:v(o%12||12),l:o%12||12,M:v(s[U]()),p:12>o?"AM":"PM",P:12>o?"am":"pm",S:v(s.getSeconds()),L:v(he(i%1e3),3)},Highcharts.dateFormats);for(r in s)for(;-1!==e.indexOf("%"+r);)e=e.replace("%"+r,"function"==typeof s[r]?s[r](i):s[r]);return n?e.substr(0,1).toUpperCase()+e.substr(1):e},S.prototype={wrapColor:function(t){this.color>=t&&(this.color=0)},wrapSymbol:function(t){this.symbol>=t&&(this.symbol=0)}},j=function(){for(var t=0,e=arguments,i=e.length,n={};i>t;t++)n[e[t++]]=e[t];return n}("millisecond",1,"second",1e3,"minute",6e4,"hour",36e5,"day",864e5,"week",6048e5,"month",26784e5,"year",31556952e3),Y={init:function(t,e,i){var n,r,s,e=e||"",o=t.shift,a=e.indexOf("C")>-1,l=a?7:3,e=e.split(" "),i=[].concat(i),h=function(t){for(n=t.length;n--;)"M"===t[n]&&t.splice(n+1,0,t[n+1],t[n+2],t[n+1],t[n+2])};if(a&&(h(e),h(i)),t.isArea&&(r=e.splice(e.length-6,6),s=i.splice(i.length-6,6)),o<=i.length/l&&e.length===i.length)for(;o--;)i=[].concat(i).splice(0,l).concat(i);if(t.shift=0,e.length)for(t=i.length;e.lengthi)for(;s--;)n=parseFloat(t[s]),r[s]=isNaN(n)?t[s]:i*parseFloat(e[s]-n)+n;else r=e;return r}},function(e){ae.HighchartsAdapter=ae.HighchartsAdapter||e&&{init:function(t){var i,r=e.fx,s=r.step,o=e.Tween,a=o&&o.propHooks;i=e.cssHooks.opacity,e.extend(e.easing,{easeOutQuad:function(t,e,i,n,r){return-n*(e/=r)*(e-2)+i}}),e.each(["cur","_default","width","height","opacity"],function(t,e){var i,n=s;"cur"===e?n=r.prototype:"_default"===e&&o&&(n=a[e],e="set"),(i=n[e])&&(n[e]=function(n){var r,n=t?n:this;return"align"!==n.prop?(r=n.elem,r.attr?r.attr(n.prop,"cur"===e?_:n.now):i.apply(this,arguments)):void 0})}),x(i,"get",function(t,e,i){return e.attr?e.opacity||0:t.call(this,e,i)}),i=function(e){var i,n=e.elem;e.started||(i=t.init(n,n.d,n.toD),e.start=i[0],e.end=i[1],e.started=!0),n.attr("d",t.step(e.start,e.end,e.pos,n.toD))},o?a.d={set:i}:s.d=i,this.each=Array.prototype.forEach?function(t,e){return Array.prototype.forEach.call(t,e)}:function(t,e){for(var i=0,n=t.length;n>i;i++)if(e.call(t[i],t[i],i,t)===!1)return i},e.fn.highcharts=function(){var t,e,i="Chart",r=arguments;return n(r[0])&&(i=r[0],r=Array.prototype.slice.call(r,1)),t=r[0],t!==_&&(t.chart=t.chart||{},t.chart.renderTo=this[0],new Highcharts[i](t,r[1]),e=this),t===_&&(e=Re[d(this[0],"data-highcharts-chart")]),e}},getScript:e.getScript,inArray:e.inArray,adapterRun:function(t,i){return e(t)[i]()},grep:e.grep,map:function(t,e){for(var i=[],n=0,r=t.length;r>n;n++)i[n]=e.call(t[n],t[n],n,t);return i},offset:function(t){return e(t).offset()},addEvent:function(t,i,n){e(t).bind(i,n)},removeEvent:function(t,i,n){var r=oe.removeEventListener?"removeEventListener":"detachEvent";oe[r]&&t&&!t[r]&&(t[r]=function(){}),e(t).unbind(i,n)},fireEvent:function(i,n,r,s){var o,a=e.Event(n),l="detached"+n;!we&&r&&(delete r.layerX,delete r.layerY),t(a,r),i[n]&&(i[l]=i[n],i[n]=null),e.each(["preventDefault","stopPropagation"],function(t,e){var i=a[e];a[e]=function(){try{i.call(a)}catch(t){"preventDefault"===e&&(o=!0)}}}),e(i).trigger(a),i[l]&&(i[n]=i[l],i[l]=null),s&&!a.isDefaultPrevented()&&!o&&s(a)},washMouseEvent:function(t){var e=t.originalEvent||t;return e.pageX===_&&(e.pageX=t.pageX,e.pageY=t.pageY),e},animate:function(t,i,n){var r=e(t);t.style||(t.style={}),i.d&&(t.toD=i.d,i.d=1),r.stop(),i.opacity!==_&&t.attr&&(i.opacity+="px"),r.animate(i,n)},stop:function(t){e(t).stop()}}}(ae.jQuery);var We=ae.HighchartsAdapter,Xe=We||{};We&&We.init.call(We,Y);var Ge=Xe.adapterRun,$e=Xe.getScript,Ye=Xe.inArray,je=Xe.each,Ve=Xe.grep,qe=Xe.offset,Ue=Xe.map,Ze=Xe.addEvent,Ke=Xe.removeEvent,Qe=Xe.fireEvent,Je=Xe.washMouseEvent,ti=Xe.animate,ei=Xe.stop,Xe={enabled:!0,x:0,y:15,style:{color:"#666",cursor:"default",fontSize:"11px",lineHeight:"14px"}};X={colors:"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/3.0.8/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/3.0.8/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#274b6d",fontSize:"16px"}},subtitle:{text:"",align:"center",style:{color:"#4d759e"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1e3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:e(Xe,{align:"center",enabled:!1,formatter:function(){return null===this.y?"":y(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1e3}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#274b6d",fontSize:"12px"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:Ae,backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'{point.key}
',pointFormat:'{series.name}: {point.y}
',shadow:!0,snap:Ce?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"ThingSpeak.com",href:"https://thingspeak.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#D62020",fontSize:"9px"}}};var ii=X.plotOptions,We=ii.line;E();var ni=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,ri=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,si=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,oi=function(t){var n,r,s=[];return function(t){t&&t.stops?r=Ue(t.stops,function(t){return oi(t[1])}):(n=ni.exec(t))?s=[i(n[1]),i(n[2]),i(n[3]),parseFloat(n[4],10)]:(n=ri.exec(t))?s=[i(n[1],16),i(n[2],16),i(n[3],16),1]:(n=si.exec(t))&&(s=[i(n[1]),i(n[2]),i(n[3]),1])}(t),{get:function(i){var n;return r?(n=e(t),n.stops=[].concat(n.stops),je(r,function(t,e){n.stops[e]=[n.stops[e][0],t.get(i)]})):n=s&&!isNaN(s[0])?"rgb"===i?"rgb("+s[0]+","+s[1]+","+s[2]+")":"a"===i?s[3]:"rgba("+s.join(",")+")":t,n},brighten:function(t){if(r)je(r,function(e){e.brighten(t)});else if(o(t)&&0!==t){var e;for(e=0;3>e;e++)s[e]+=i(255*t),s[e]<0&&(s[e]=0),s[e]>255&&(s[e]=255)}return this},rgba:s,setOpacity:function(t){return s[3]=t,this}}};O.prototype={init:function(t,e){this.element="span"===e?g(e):oe.createElementNS(Pe,e),this.renderer=t,this.attrSetters={}},opacity:1,animate:function(t,i,n){i=p(i,$,!0),ei(this),i?(i=e(i),n&&(i.complete=n),ti(this,t,i)):(this.attr(t),n&&n())},attr:function(t,e){var r,s,o,a,l,h,u,f=this.element,g=f.nodeName.toLowerCase(),m=this.renderer,y=this.attrSetters,v=this.shadows,x=this;if(n(t)&&c(e)&&(r=t,t={},t[r]=e),n(t))r=t,"circle"===g?r={x:"cx",y:"cy"}[r]||r:"strokeWidth"===r&&(r="stroke-width"),x=d(f,r)||this[r]||0,"d"!==r&&"visibility"!==r&&"fill"!==r&&(x=parseFloat(x));else{for(r in t)if(l=!1,s=t[r],o=y[r]&&y[r].call(this,s,r),o!==!1){if(o!==_&&(s=o),"d"===r)s&&s.join&&(s=s.join(" ")),/(NaN| {2}|^$)/.test(s)&&(s="M 0 0");else if("x"===r&&"text"===g)for(o=0;os&&(s=0),this[r]=s,"text"===r?(s!==this.textStr&&delete this.bBox,this.textStr=s,this.added&&m.buildText(this)):l||d(f,r,s)}u&&this.updateTransform()}return x},addClass:function(t){var e=this.element,i=d(e,"class")||"";return-1===i.indexOf(t)&&d(e,"class",i+" "+t),this},symbolAttr:function(t){var e=this;je("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(i){e[i]=p(t[i],e[i])}),e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})},clip:function(t){return this.attr("clip-path",t?"url("+this.renderer.url+"#"+t.id+")":Be)},crisp:function(t,e,i,n,r){var s,o,a={},l={},t=t||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;o=he(t)%2/2,l.x=ce(e||this.x||0)+o,l.y=ce(i||this.y||0)+o,l.width=ce((n||this.width||0)-2*o),l.height=ce((r||this.height||0)-2*o),l.strokeWidth=t;for(s in l)this[s]!==l[s]&&(this[s]=a[s]=l[s]);return a},css:function(e){var n,r=this.element,s=this.textWidth=e&&e.width&&"text"===r.nodeName.toLowerCase()&&i(e.width),o="",a=function(t,e){return"-"+e.toLowerCase()};if(e&&e.color&&(e.fill=e.color),this.styles=e=t(this.styles,e),s&&delete e.width,we&&!Ae)f(this.element,e);else{for(n in e)o+=n.replace(/([A-Z])/g,a)+":"+e[n]+";";d(r,"style",o)}return s&&this.added&&this.renderer.buildText(this),this},on:function(t,e){var i=this,n=i.element;return Ie&&"click"===t?(n.ontouchstart=function(t){i.touchEventFired=Date.now(),t.preventDefault(),e.call(n,t)},n.onclick=function(t){(-1===xe.indexOf("Android")||Date.now()-(i.touchEventFired||0)>1100)&&e.call(n,t)}):n["on"+t]=e,this},setRadialReference:function(t){return this.element.radialReference=t,this},translate:function(t,e){return this.attr({translateX:t,translateY:e})},invert:function(){return this.inverted=!0,this.updateTransform(),this},updateTransform:function(){var t=this.translateX||0,e=this.translateY||0,i=this.scaleX,n=this.scaleY,r=this.inverted,s=this.rotation;r&&(t+=this.attr("width"),e+=this.attr("height")),t=["translate("+t+","+e+")"],r?t.push("rotate(90) scale(-1,1)"):s&&t.push("rotate("+s+" "+(this.x||0)+" "+(this.y||0)+")"),(c(i)||c(n))&&t.push("scale("+p(i,1)+" "+p(n,1)+")"),t.length&&d(this.element,"transform",t.join(" "))},toFront:function(){var t=this.element;return t.parentNode.appendChild(t),this},align:function(t,e,i){var r,s,o,a,l={};return s=this.renderer,o=s.alignedObjects,t?(this.alignOptions=t,this.alignByTranslate=e,(!i||n(i))&&(this.alignTo=r=i||"renderer",h(o,this),o.push(this),i=null)):(t=this.alignOptions,e=this.alignByTranslate,r=this.alignTo),i=p(i,s[r],s),r=t.align,s=t.verticalAlign,o=(i.x||0)+(t.x||0),a=(i.y||0)+(t.y||0),("right"===r||"center"===r)&&(o+=(i.width-(t.width||0))/{right:1,center:2}[r]),l[e?"translateX":"x"]=he(o),("bottom"===s||"middle"===s)&&(a+=(i.height-(t.height||0))/({bottom:1,middle:2}[s]||1)),l[e?"translateY":"y"]=he(a),this[this.placed?"animate":"attr"](l),this.placed=!0,this.alignAttr=l,this},getBBox:function(){var e,i,n=this.bBox,r=this.renderer,s=this.rotation;e=this.element;var o=this.styles,a=s*ve;i=this.textStr;var l;if((""===i||Fe.test(i))&&(l=i.length+"|"+o.fontSize+"|"+o.fontFamily,n=r.cache[l]),!n){if(e.namespaceURI===Pe||r.forExport){try{n=e.getBBox?t({},e.getBBox()):{width:e.offsetWidth,height:e.offsetHeight}}catch(h){}(!n||n.width<0)&&(n={width:0,height:0})}else n=this.htmlGetBBox();r.isSVG&&(e=n.width,i=n.height,we&&o&&"11px"===o.fontSize&&"22.7"===i.toPrecision(3)&&(n.height=i=14),s&&(n.width=fe(i*me(a))+fe(e*ge(a)),n.height=fe(i*ge(a))+fe(e*me(a)))),this.bBox=n,l&&(r.cache[l]=n)}return n},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(t){var e=this;e.animate({opacity:0},{duration:t||150,complete:function(){e.hide()}})},add:function(t){var e,n=this.renderer,r=t||n,s=r.element||n.box,o=s.childNodes,a=this.element,l=d(a,"zIndex");if(t&&(this.parentGroup=t),this.parentInverted=t&&t.inverted,void 0!==this.textStr&&n.buildText(this),l&&(r.handleZ=!0,l=i(l)),r.handleZ)for(r=0;rl||!c(l)&&c(n))){s.insertBefore(a,t),e=!0;break}return e||s.appendChild(a),this.added=!0,Qe(this,"add"),this},safeRemoveChild:function(t){var e=t.parentNode;e&&e.removeChild(t)},destroy:function(){var t,e,i=this,n=i.element||{},r=i.shadows,s=i.renderer.isSVG&&"SPAN"===n.nodeName&&i.parentGroup;if(n.onclick=n.onmouseout=n.onmouseover=n.onmousemove=n.point=null,ei(i),i.clipPath&&(i.clipPath=i.clipPath.destroy()),i.stops){for(e=0;e=n;n++)r=c.cloneNode(0),s=2*o+1-2*n,d(r,{isShadow:"true",stroke:t.color||"black","stroke-opacity":a*n,"stroke-width":s,transform:"translate"+l,fill:Be}),i&&(d(r,"height",ue(d(r,"height")-s,0)),r.cutHeight=s),e?e.element.appendChild(r):c.parentNode.insertBefore(r,c),h.push(r);this.shadows=h}return this}};var ai=function(){this.init.apply(this,arguments)};ai.prototype={Element:O,init:function(t,e,i,n){var r,s,o=location;r=this.createElement("svg").attr({version:"1.1"}),s=r.element,t.appendChild(s),-1===t.innerHTML.indexOf("xmlns")&&d(s,"xmlns",Pe),this.isSVG=!0,this.box=s,this.boxWrapper=r,this.alignedObjects=[],this.url=(Te||Se)&&oe.getElementsByTagName("base").length?o.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"",this.createElement("desc").add().element.appendChild(oe.createTextNode("Created with Highcharts 3.0.8")),this.defs=this.createElement("defs").add(),this.forExport=n,this.gradients={},this.cache={},this.setSize(e,i,!1);var a;Te&&t.getBoundingClientRect&&(this.subPixelFix=e=function(){f(t,{left:0,top:0}),a=t.getBoundingClientRect(),f(t,{left:de(a.left)-a.left+"px",top:de(a.top)-a.top+"px"})},e(),Ze(ae,"resize",e))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var t=this.defs;return this.box=null,this.boxWrapper=this.boxWrapper.destroy(),A(this.gradients||{}),this.gradients=null,t&&(this.defs=t.destroy()),this.subPixelFix&&Ke(ae,"resize",this.subPixelFix),this.alignedObjects=null},createElement:function(t){var e=new this.Element;return e.init(this,t),e},draw:function(){},buildText:function(t){for(var e=t.element,n=this,r=n.forExport,s=p(t.textStr,"").toString().replace(/<(b|strong)>/g,'').replace(/<(i|em)>/g,'').replace(//g,"").split(//g),o=e.childNodes,a=/style="([^"]+)"/,l=/href="(http[^"]+)"/,h=d(e,"x"),c=t.styles,u=t.textWidth,g=c&&c.lineHeight,m=o.length;m--;)e.removeChild(o[m]); +u&&!t.added&&this.box.appendChild(e),""===s[s.length-1]&&s.pop(),je(s,function(s,o){var p,m=0,s=s.replace(//g,"|||");p=s.split("|||"),je(p,function(s){if(""!==s||1===p.length){var y,v={},x=oe.createElementNS(Pe,"tspan");if(a.test(s)&&(y=s.match(a)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),d(x,"style",y)),l.test(s)&&!r&&(d(x,"onclick",'location.href="'+s.match(l)[1]+'"'),f(x,{cursor:"pointer"})),s=(s.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">")," "!==s&&(x.appendChild(oe.createTextNode(s)),m?v.dx=0:v.x=h,d(x,v),!m&&o&&(!Ae&&r&&f(x,{display:"block"}),d(x,"dy",g||n.fontMetrics(/px$/.test(x.style.fontSize)?x.style.fontSize:c.fontSize).h,Se&&x.offsetHeight)),e.appendChild(x),m++,u))for(var b,w,s=s.replace(/([^\^])-/g,"$1- ").split(" "),v=s.length>1&&"nowrap"!==c.whiteSpace,k=t._clipHeight,S=[],T=i(g||16),C=1;v&&(s.length||S.length);)delete t.bBox,b=t.getBBox(),w=b.width,!Ae&&n.forExport&&(w=n.measureSpanWidth(x.firstChild.data,t.styles)),b=w>u,b&&1!==s.length?(x.removeChild(x.firstChild),S.unshift(s.pop())):(s=S,S=[],s.length&&(C++,k&&C*T>k?(s=["..."],t.attr("title",t.textStr)):(x=oe.createElementNS(Pe,"tspan"),d(x,{dy:T,x:h}),y&&d(x,"style",y),e.appendChild(x),w>u&&(u=w)))),s.length&&x.appendChild(oe.createTextNode(s.join(" ").replace(/- /g,"-")))}})})},button:function(i,n,r,s,o,a,l,h,c){var d,u,p,f,g,m,y=this.label(i,n,r,c,null,null,null,null,"button"),v=0,i={x1:0,y1:0,x2:0,y2:1},o=e({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:i,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},o);return p=o.style,delete o.style,a=e(o,{stroke:"#68A",fill:{linearGradient:i,stops:[[0,"#FFF"],[1,"#ACF"]]}},a),f=a.style,delete a.style,l=e(o,{stroke:"#68A",fill:{linearGradient:i,stops:[[0,"#9BD"],[1,"#CDF"]]}},l),g=l.style,delete l.style,h=e(o,{style:{color:"#CCC"}},h),m=h.style,delete h.style,Ze(y.element,we?"mouseover":"mouseenter",function(){3!==v&&y.attr(a).css(f)}),Ze(y.element,we?"mouseout":"mouseleave",function(){3!==v&&(d=[o,a,l][v],u=[p,f,g][v],y.attr(d).css(u))}),y.setState=function(t){(y.state=v=t)?2===t?y.attr(l).css(g):3===t&&y.attr(h).css(m):y.attr(o).css(p)},y.on("click",function(){3!==v&&s.call(y)}).attr(o).css(t({cursor:"default"},p))},crispLine:function(t,e){return t[1]===t[4]&&(t[1]=t[4]=he(t[1])-e%2/2),t[2]===t[5]&&(t[2]=t[5]=he(t[2])+e%2/2),t},path:function(e){var i={fill:Be};return s(e)?i.d=e:r(e)&&t(i,e),this.createElement("path").attr(i)},circle:function(t,e,i){return t=r(t)?t:{x:t,y:e,r:i},this.createElement("circle").attr(t)},arc:function(t,e,i,n,s,o){return r(t)&&(e=t.y,i=t.r,n=t.innerR,s=t.start,o=t.end,t=t.x),t=this.symbol("arc",t||0,e||0,i||0,i||0,{innerR:n||0,start:s||0,end:o||0}),t.r=i,t},rect:function(t,e,i,n,s,o){return s=r(t)?t.r:s,s=this.createElement("rect").attr({rx:s,ry:s,fill:Be}),s.attr(r(t)?t:s.crisp(o,t,e,ue(i,0),ue(n,0)))},setSize:function(t,e,i){var n=this.alignedObjects,r=n.length;for(this.width=t,this.height=e,this.boxWrapper[p(i,!0)?"animate":"attr"]({width:t,height:e});r--;)n[r].align()},g:function(t){var e=this.createElement("g");return c(t)?e.attr({"class":"highcharts-"+t}):e},image:function(e,i,n,r,s){var o={preserveAspectRatio:Be};return arguments.length>1&&t(o,{x:i,y:n,width:r,height:s}),o=this.createElement("image").attr(o),o.element.setAttributeNS?o.element.setAttributeNS("http://www.w3.org/1999/xlink","href",e):o.element.setAttribute("hc-svg-href",e),o},symbol:function(e,i,n,r,s,o){var a,l,h,c=this.symbols[e],c=c&&c(he(i),he(n),r,s,o),d=/^url\((.*?)\)$/;return c?(a=this.path(c),t(a,{symbolName:e,x:i,y:n,width:r,height:s}),o&&t(a,o)):d.test(e)&&(h=function(t,e){t.element&&(t.attr({width:e[0],height:e[1]}),t.alignByTranslate||t.translate(he((r-e[0])/2),he((s-e[1])/2)))},l=e.match(d)[1],e=De[l],a=this.image(l).attr({x:i,y:n}),a.isImg=!0,e?h(a,e):(a.attr({width:0,height:0}),g("img",{onload:function(){h(a,De[l]=[this.width,this.height])},src:l}))),a},symbols:{circle:function(t,e,i,n){var r=.166*i;return["M",t+i/2,e,"C",t+i+r,e,t+i+r,e+n,t+i/2,e+n,"C",t-r,e+n,t-r,e,t+i/2,e,"Z"]},square:function(t,e,i,n){return["M",t,e,"L",t+i,e,t+i,e+n,t,e+n,"Z"]},triangle:function(t,e,i,n){return["M",t+i/2,e,"L",t+i,e+n,t,e+n,"Z"]},"triangle-down":function(t,e,i,n){return["M",t,e,"L",t+i,e,t+i/2,e+n,"Z"]},diamond:function(t,e,i,n){return["M",t+i/2,e,"L",t+i,e+n/2,t+i/2,e+n,t,e+n/2,"Z"]},arc:function(t,e,i,n,r){var s=r.start,i=r.r||i||n,o=r.end-.001,n=r.innerR,a=r.open,l=ge(s),h=me(s),c=ge(o),o=me(o),r=r.end-st?t+4:he(1.2*t),e=he(.8*t);return{h:t,b:e}},label:function(i,n,r,s,o,a,l,h,d){function u(){var t,i;t=P.element.style,y=(void 0===v||void 0===x||C.styles.textAlign)&&P.getBBox(),C.width=(v||y.width||0)+2*L+M,C.height=(x||y.height||0)+2*L,k=L+T.fontMetrics(t&&t.fontSize).b,S&&(m||(t=he(-A*L),i=h?-k:0,C.box=m=s?T.symbol(s,t,i,C.width,C.height,D):T.rect(t,i,C.width,C.height,0,D[_e]),m.add(C)),m.isImg||m.attr(e({width:C.width,height:C.height},D)),D=null)}function p(){var t,e=C.styles,e=e&&e.textAlign,i=M+L*(1-A);t=h?0:k,!c(v)||"center"!==e&&"right"!==e||(i+={center:.5,right:1}[e]*(v-y.width)),(i!==P.x||t!==P.y)&&P.attr({x:i,y:t}),P.x=i,P.y=t}function f(t,e){m?m.attr(t,e):D[t]=e}function g(){P.add(C),C.attr({text:i,x:n,y:r}),m&&c(o)&&C.attr({anchorX:o,anchorY:a})}var m,y,v,x,b,w,k,S,T=this,C=T.g(d),P=T.text("",0,0,l).attr({zIndex:1}),A=0,L=3,M=0,I=0,D={},l=C.attrSetters;Ze(C,"add",g),l.width=function(t){return v=t,!1},l.height=function(t){return x=t,!1},l.padding=function(t){return c(t)&&t!==L&&(L=t,p()),!1},l.paddingLeft=function(t){return c(t)&&t!==M&&(M=t,p()),!1},l.align=function(t){return A={left:0,center:.5,right:1}[t],!1},l.text=function(t,e){return P.attr(e,t),u(),p(),!1},l[_e]=function(t,e){return S=!0,I=t%2/2,f(e,t),!1},l.stroke=l.fill=l.r=function(t,e){return"fill"===e&&(S=!0),f(e,t),!1},l.anchorX=function(t,e){return o=t,f(e,t+I-b),!1},l.anchorY=function(t,e){return a=t,f(e,t-w),!1},l.x=function(t){return C.x=t,t-=A*((v||y.width)+L),b=he(t),C.attr("translateX",b),!1},l.y=function(t){return w=C.y=he(t),C.attr("translateY",w),!1};var E=C.css;return t(C,{css:function(t){if(t){var i={},t=e(t);je("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow".split(","),function(e){t[e]!==_&&(i[e]=t[e],delete t[e])}),P.css(i)}return E.call(C,t)},getBBox:function(){return{width:y.width+2*L,height:y.height+2*L,x:y.x-L,y:y.y-L}},shadow:function(t){return m&&m.shadow(t),C},destroy:function(){Ke(C,"add",g),Ke(C.element,"mouseenter"),Ke(C.element,"mouseleave"),P&&(P=P.destroy()),m&&(m=m.destroy()),O.prototype.destroy.call(C),C=T=u=p=f=g=null}})}},H=ai,t(O.prototype,{htmlCss:function(e){var i=this.element;return(i=e&&"SPAN"===i.tagName&&e.width)&&(delete e.width,this.textWidth=i,this.updateTransform()),this.styles=t(this.styles,e),f(this.element,e),this},htmlGetBBox:function(){var t=this.element,e=this.bBox;return e||("text"===t.nodeName&&(t.style.position="absolute"),e=this.bBox={x:t.offsetLeft,y:t.offsetTop,width:t.offsetWidth,height:t.offsetHeight}),e},htmlUpdateTransform:function(){if(this.added){var t=this.renderer,e=this.element,n=this.translateX||0,r=this.translateY||0,s=this.x||0,o=this.y||0,a=this.textAlign||"left",l={left:0,center:.5,right:1}[a],h=this.shadows;if(f(e,{marginLeft:n,marginTop:r}),h&&je(h,function(t){f(t,{marginLeft:n+1,marginTop:r+1})}),this.inverted&&je(e.childNodes,function(i){t.invertChild(i,e)}),"SPAN"===e.tagName){var d,u=this.rotation,g=i(this.textWidth),m=[u,a,e.innerHTML,this.textWidth].join(",");m!==this.cTT&&(d=t.fontMetrics(e.style.fontSize).b,c(u)&&this.setSpanRotation(u,l,d),h=p(this.elemWidth,e.offsetWidth),h>g&&/[ \-]/.test(e.textContent||e.innerText)&&(f(e,{width:g+"px",display:"block",whiteSpace:"normal"}),h=g),this.getSpanCorrection(h,d,l,u,a)),f(e,{left:s+(this.xCorr||0)+"px",top:o+(this.yCorr||0)+"px"}),Se&&(d=e.offsetHeight),this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(t,e,i){var n={},r=we?"-ms-transform":Se?"-webkit-transform":Te?"MozTransform":be?"-o-transform":"";n[r]=n.transform="rotate("+t+"deg)",n[r+(Te?"Origin":"-origin")]=100*e+"% "+i+"px",f(this.element,n)},getSpanCorrection:function(t,e,i){this.xCorr=-t*i,this.yCorr=-e}}),t(ai.prototype,{html:function(e,i,n){var r=X.chart.style,s=this.createElement("span"),o=s.attrSetters,a=s.element,l=s.renderer;return o.text=function(t){return t!==a.innerHTML&&delete this.bBox,a.innerHTML=t,!1},o.x=o.y=o.align=o.rotation=function(t,e){return"align"===e&&(e="textAlign"),s[e]=t,s.htmlUpdateTransform(),!1},s.attr({text:e,x:he(i),y:he(n)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:r.fontFamily,fontSize:r.fontSize}),s.css=s.htmlCss,l.isSVG&&(s.add=function(e){var i,n=l.box.parentNode,r=[];if(this.parentGroup=e){if(i=e.div,!i){for(;e;)r.push(e),e=e.parentGroup;je(r.reverse(),function(e){var r;i=e.div=e.div||g(ze,{className:d(e.element,"class")},{position:"absolute",left:(e.translateX||0)+"px",top:(e.translateY||0)+"px"},i||n),r=i.style,t(e.attrSetters,{translateX:function(t){r.left=t+"px"},translateY:function(t){r.top=t+"px"},visibility:function(t,e){r[e]=t}})})}}else i=n;return i.appendChild(a),s.added=!0,s.alignOnAdd&&s.htmlUpdateTransform(),s}),s}});var li;if(!Ae&&!Me){Highcharts.VMLElement=li={init:function(t,e){var i=["<",e,' filled="f" stroked="f"'],n=["position: ","absolute",";"],r=e===ze;("shape"===e||r)&&n.push("left:0;top:0;width:1px;height:1px;"),n.push("visibility: ",r?"hidden":"visible"),i.push(' style="',n.join(""),'"/>'),e&&(i=r||"span"===e||"img"===e?i.join(""):t.prepVML(i),this.element=g(i)),this.renderer=t,this.attrSetters={}},add:function(t){var e=this.renderer,i=this.element,n=e.box,n=t?t.element||t:n;return t&&t.inverted&&e.invertChild(i,n),n.appendChild(i),this.added=!0,this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform(),Qe(this,"add"),this},updateTransform:O.prototype.htmlUpdateTransform,setSpanRotation:function(){var t=this.rotation,e=ge(t*ve),i=me(t*ve);f(this.element,{filter:t?["progid:DXImageTransform.Microsoft.Matrix(M11=",e,", M12=",-i,", M21=",i,", M22=",e,", sizingMethod='auto expand')"].join(""):Be})},getSpanCorrection:function(t,e,i,n,r){var s,o=n?ge(n*ve):1,a=n?me(n*ve):0,l=p(this.elemHeight,this.element.offsetHeight);this.xCorr=0>o&&-t,this.yCorr=0>a&&-l,s=0>o*a,this.xCorr+=a*e*(s?1-i:i),this.yCorr-=o*e*(n?s?i:1-i:1),r&&"left"!==r&&(this.xCorr-=t*i*(0>o?-1:1),n&&(this.yCorr-=l*i*(0>a?-1:1)),f(this.element,{textAlign:r}))},pathToVML:function(t){for(var e=t.length,i=[];e--;)o(t[e])?i[e]=he(10*t[e])-5:"Z"===t[e]?i[e]="x":(i[e]=t[e],!t.isArc||"wa"!==t[e]&&"at"!==t[e]||(i[e+5]===i[e+7]&&(i[e+7]+=t[e+7]>t[e+5]?1:-1),i[e+6]===i[e+8]&&(i[e+8]+=t[e+8]>t[e+6]?1:-1)));return i.join(" ")||"x"},attr:function(t,e){var i,r,s,a,l,h=this.element||{},u=h.style,p=h.nodeName,f=this.renderer,m=this.symbolName,y=this.shadows,v=this.attrSetters,x=this;if(n(t)&&c(e)&&(i=t,t={},t[i]=e),n(t))i=t,x="strokeWidth"===i||"stroke-width"===i?this.strokeweight:this[i];else for(i in t)if(r=t[i],l=!1,s=v[i]&&v[i].call(this,r,i),s!==!1&&null!==r){if(s!==_&&(r=s),m&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(i))a||(this.symbolAttr(t),a=!0),l=!0;else if("d"===i){if(r=r||[],this.d=r.join(" "),h.path=r=this.pathToVML(r),y)for(s=y.length;s--;)y[s].path=y[s].cutOff?this.cutOffPath(r,y[s].cutOff):r;l=!0}else if("visibility"===i){if(y)for(s=y.length;s--;)y[s].style[i]=r;"DIV"===p&&(r="hidden"===r?"-999em":0,ke||(u[i]=r?"visible":"hidden"),i="top"),u[i]=r,l=!0}else"zIndex"===i?(r&&(u[i]=r),l=!0):-1!==Ye(i,["x","y","width","height"])?(this[i]=r,"x"===i||"y"===i?i={x:"left",y:"top"}[i]:r=ue(0,r),this.updateClipping?(this[i]=r,this.updateClipping()):u[i]=r,l=!0):"class"===i&&"DIV"===p?h.className=r:"stroke"===i?(r=f.color(r,h,i),i="strokecolor"):"stroke-width"===i||"strokeWidth"===i?(h.stroked=r?!0:!1,i="strokeweight",this[i]=r,o(r)&&(r+="px")):"dashstyle"===i?((h.getElementsByTagName("stroke")[0]||g(f.prepVML([""]),null,null,h))[i]=r||"solid",this.dashstyle=r,l=!0):"fill"===i?"SPAN"===p?u.color=r:"IMG"!==p&&(h.filled=r!==Be?!0:!1,r=f.color(r,h,i,this),i="fillcolor"):"opacity"===i?l=!0:"shape"===p&&"rotation"===i?(this[i]=h.style[i]=r,h.style.left=-he(me(r*ve)+1)+"px",h.style.top=he(ge(r*ve))+"px"):("translateX"===i||"translateY"===i||"rotation"===i)&&(this[i]=r,this.updateTransform(),l=!0);l||(ke?h[i]=r:d(h,i,r))}return x},clip:function(t){var e,i=this;return t?(e=t.members,h(e,i),e.push(i),i.destroyClip=function(){h(e,i)},t=t.getCSS(i)):(i.destroyClip&&i.destroyClip(),t={clip:ke?"inherit":"rect(auto)"}),i.css(t)},css:O.prototype.htmlCss,safeRemoveChild:function(t){t.parentNode&&L(t)},destroy:function(){return this.destroyClip&&this.destroyClip(),O.prototype.destroy.apply(this)},on:function(t,e){return this.element["on"+t]=function(){var t=ae.event;t.target=t.srcElement,e(t)},this},cutOffPath:function(t,e){var n,t=t.split(/[ ,]/);return n=t.length,(9===n||11===n)&&(t[n-4]=t[n-2]=i(t[n-2])-10*e),t.join(" ")},shadow:function(t,e,n){var r,s,o,a,l,h,c,d=[],u=this.element,f=this.renderer,m=u.style,y=u.path;if(y&&"string"!=typeof y.value&&(y="x"),l=y,t){for(h=p(t.width,3),c=(t.opacity||.15)/h,r=1;3>=r;r++)a=2*h+1-2*r,n&&(l=this.cutOffPath(y.value,a+.5)),o=[''],s=g(f.prepVML(o),null,{left:i(m.left)+p(t.offsetX,1),top:i(m.top)+p(t.offsetY,1)}),n&&(s.cutOff=a+1),o=[''],g(f.prepVML(o),null,null,s),e?e.element.appendChild(s):u.parentNode.insertBefore(s,u),d.push(s);this.shadows=d}return this}},li=m(O,li);var hi={Element:li,isIE8:xe.indexOf("MSIE 8.0")>-1,init:function(t,e,i){var n,r;if(this.alignedObjects=[],n=this.createElement(ze),r=n.element,r.style.position="relative",t.appendChild(n.element),this.isVML=!0,this.box=r,this.boxWrapper=n,this.cache={},this.setSize(e,i,!1),!oe.namespaces.hcv){oe.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{oe.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(s){oe.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(e,i,n,s){var o=this.createElement(),a=r(e);return t(o,{members:[],left:(a?e.x:e)+1,top:(a?e.y:i)+1,width:(a?e.width:n)-1,height:(a?e.height:s)-1,getCSS:function(e){var i=e.element,n=i.nodeName,e=e.inverted,r=this.top-("shape"===n?i.offsetTop:0),s=this.left,i=s+this.width,o=r+this.height,r={clip:"rect("+he(e?s:r)+"px,"+he(e?o:i)+"px,"+he(e?i:o)+"px,"+he(e?r:s)+"px)"};return!e&&ke&&"DIV"===n&&t(r,{width:i+"px",height:o+"px"}),r},updateClipping:function(){je(o.members,function(t){t.css(o.getCSS(t))})}})},color:function(t,e,i,n){var r,s,o,a=this,l=/^rgba/,h=Be;if(t&&t.linearGradient?o="gradient":t&&t.radialGradient&&(o="pattern"),o){var c,d,u,p,f,m,y,v,x=t.linearGradient||t.radialGradient,b="",t=t.stops,w=[],k=function(){s=[''],g(a.prepVML(s),null,null,e)};if(u=t[0],v=t[t.length-1],u[0]>0&&t.unshift([0,u[1]]),v[0]<1&&t.push([1,v[1]]),je(t,function(t,e){l.test(t[1])?(r=oi(t[1]),c=r.get("rgb"),d=r.get("a")):(c=t[1],d=1),w.push(100*t[0]+"% "+c),e?(f=d,m=c):(p=d,y=c)}),"fill"===i)if("gradient"===o)i=x.x1||x[0]||0,t=x.y1||x[1]||0,u=x.x2||x[2]||0,x=x.y2||x[3]||0,b='angle="'+(90-180*le.atan((x-t)/(u-i))/ye)+'"',k();else{var S,h=x.r,T=2*h,C=2*h,P=x.cx,A=x.cy,L=e.radialReference,h=function(){L&&(S=n.getBBox(),P+=(L[0]-S.x)/S.width-.5,A+=(L[1]-S.y)/S.height-.5,T*=L[2]/S.width,C*=L[2]/S.height),b='src="'+X.global.VMLRadialGradientURL+'" size="'+T+","+C+'" origin="0.5,0.5" position="'+P+","+A+'" color2="'+y+'" ',k()};n.added?h():Ze(n,"add",h),h=m}else h=c}else l.test(t)&&"IMG"!==e.tagName?(r=oi(t),s=["<",i,' opacity="',r.get("a"),'"/>'],g(this.prepVML(s),null,null,e),h=r.get("rgb")):(h=e.getElementsByTagName(i),h.length&&(h[0].opacity=1,h[0].type="solid"),h=t);return h},prepVML:function(t){var e=this.isIE8,t=t.join("");return e?(t=t.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),t=-1===t.indexOf('style="')?t.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):t.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):t=t.replace("<","1&&s.attr({x:e,y:i,width:n,height:r}),s},rect:function(t,e,i,n,s,o){var a=this.symbol("rect");return a.r=r(t)?t.r:s,a.attr(r(t)?t:a.crisp(o,t,e,ue(i,0),ue(n,0)))},invertChild:function(t,e){var n=e.style;f(t,{flip:"x",left:i(n.width)-1,top:i(n.height)-1,rotation:-90})},symbols:{arc:function(t,e,i,n,r){var s=r.start,o=r.end,a=r.r||i||n,i=r.innerR,n=ge(s),l=me(s),h=ge(o),c=me(o);return o-s===0?["x"]:(s=["wa",t-a,e-a,t+a,e+a,t+a*n,e+a*l,t+a*h,e+a*c],r.open&&!i&&s.push("e","M",t,e),s.push("at",t-i,e-i,t+i,e+i,t+i*h,e+i*c,t+i*n,e+i*l,"x","e"),s.isArc=!0,s)},circle:function(t,e,i,n,r){return r&&(i=n=2*r.r),r&&r.isCircle&&(t-=i/2,e-=n/2),["wa",t,e,t+i,e+n,t+i,e+n/2,t+i,e+n/2,"e"]},rect:function(t,e,i,n,r){var s,o=t+i,a=e+n;return c(r)&&r.r?(s=pe(r.r,i,n),o=["M",t+s,e,"L",o-s,e,"wa",o-2*s,e,o,e+2*s,o-s,e,o,e+s,"L",o,a-s,"wa",o-2*s,a-2*s,o,a,o,a-s,o-s,a,"L",t+s,a,"wa",t,a-2*s,t+2*s,a,t+s,a,t,a-s,"L",t,e+s,"wa",t,e,t+2*s,e+2*s,t,e+s,t+s,e,"x","e"]):o=ai.prototype.symbols.square.apply(0,arguments),o}}};Highcharts.VMLRenderer=li=function(){this.init.apply(this,arguments)},li.prototype=e(ai.prototype,hi),H=li}ai.prototype.measureSpanWidth=function(t,e){var i,n=oe.createElement("span");return i=oe.createTextNode(t),n.appendChild(i),f(n,e),this.box.appendChild(n),i=n.offsetWidth,L(n),i};var ci;Me&&(Highcharts.CanVGRenderer=li=function(){Pe="http://www.w3.org/1999/xhtml"},li.prototype.symbols={},ci=function(){function t(){var t,i=e.length;for(t=0;i>t;t++)e[t]();e=[]}var e=[];return{push:function(i,n){0===e.length&&$e(n,t),e.push(i)}}}(),H=li),R.prototype={addLabel:function(){var e,i=this.axis,n=i.options,r=i.chart,s=i.horiz,a=i.categories,h=i.names,d=this.pos,u=n.labels,f=i.tickPositions,s=s&&a&&!u.step&&!u.staggerLines&&!u.rotation&&r.plotWidth/f.length||!s&&(r.margin[3]||.33*r.chartWidth),g=d===f[0],m=d===f[f.length-1],h=a?p(a[d],h[d],d):d,a=this.label,y=f.info;i.isDatetimeAxis&&y&&(e=n.dateTimeLabelFormats[y.higherRanks[d]||y.unitName]),this.isFirst=g,this.isLast=m,n=i.labelFormatter.call({axis:i,chart:r,isFirst:g,isLast:m,dateTimeLabelFormat:e,value:i.isLog?I(l(h)):h}),d=s&&{width:ue(1,he(s-2*(u.padding||10)))+"px"},d=t(d,u.style),c(a)?a&&a.attr({text:n}).css(d):(e={align:i.labelAlign},o(u.rotation)&&(e.rotation=u.rotation),s&&u.ellipsis&&(e._clipHeight=i.len/f.length),this.label=c(n)&&u.enabled?r.renderer.text(n,0,0,u.useHTML).attr(e).css(d).add(i.labelGroup):null)},getLabelSize:function(){var t=this.label,e=this.axis;return t?t.getBBox()[e.horiz?"height":"width"]:0},getLabelSides:function(){var t=this.label.getBBox(),e=this.axis,i=e.horiz,n=e.options.labels,t=i?t.width:t.height,e=i?t*{left:0,center:.5,right:1}[e.labelAlign]-n.x:t;return[-e,t-e]},handleOverflow:function(t,e){var i,n=!0,r=this.axis,s=this.isFirst,o=this.isLast,a=r.horiz?e.x:e.y,l=r.reversed,h=r.tickPositions,c=this.getLabelSides(),d=c[0],c=c[1],u=r.pos,p=u+r.len,f=this.label.line||0,g=r.labelEdge,m=r.justifyLabels&&(s||o);return g[f]===_||a+d>g[f]?g[f]=a+c:m||(n=!1),m&&(i=(r=r.ticks[h[t+(s?1:-1)]])&&r.label.xy&&r.label.xy.x+r.getLabelSides()[s?0:1],h=i,s&&!l||o&&l?u>a+d&&(a=u-d,r&&a+c>h&&(n=!1)):a+c>p&&(a=p-c,r&&h>a+d&&(n=!1)),e.x=a),n},getPosition:function(t,e,i,n){var r=this.axis,s=r.chart,o=n&&s.oldChartHeight||s.chartHeight;return{x:t?r.translate(e+i,null,null,n)+r.transB:r.left+r.offset+(r.opposite?(n&&s.oldChartWidth||s.chartWidth)-r.right-r.left:0),y:t?o-r.bottom+r.offset-(r.opposite?r.height:0):o-r.translate(e+i,null,null,n)-r.transB}},getLabelPosition:function(t,e,i,n,r,s,o,a){var l=this.axis,h=l.transA,d=l.reversed,u=l.staggerLines,p=l.chart.renderer.fontMetrics(r.style.fontSize).b,f=r.rotation,t=t+r.x-(s&&n?s*h*(d?-1:1):0),e=e+r.y-(s&&!n?s*h*(d?1:-1):0);return f&&2===l.side&&(e-=p-p*ge(f*ve)),!c(r.y)&&!f&&(e+=p-i.getBBox().height/2),u&&(i.line=o/(a||1)%u,e+=i.line*(l.labelOffset/u)),{x:t,y:e}},getMarkPath:function(t,e,i,n,r,s){return s.crispLine(["M",t,e,"L",t+(r?0:-i),e+(r?i:0)],n)},render:function(t,e,i){var n=this.axis,r=n.options,s=n.chart.renderer,o=n.horiz,a=this.type,l=this.label,h=this.pos,c=r.labels,d=this.gridLine,u=a?a+"Grid":"grid",f=a?a+"Tick":"tick",g=r[u+"LineWidth"],m=r[u+"LineColor"],y=r[u+"LineDashStyle"],v=r[f+"Length"],u=r[f+"Width"]||0,x=r[f+"Color"],b=r[f+"Position"],f=this.mark,w=c.step,k=!0,S=n.tickmarkOffset,T=this.getPosition(o,h,S,e),C=T.x,T=T.y,P=o&&C===n.pos+n.len||!o&&T===n.pos?-1:1;this.isActive=!0,g&&(h=n.getPlotLinePath(h+S,g*P,e,!0),d===_&&(d={stroke:m,"stroke-width":g},y&&(d.dashstyle=y),a||(d.zIndex=1),e&&(d.opacity=0),this.gridLine=d=g?s.path(h).attr(d).add(n.gridGroup):null),!e&&d&&h&&d[this.isNew?"attr":"animate"]({d:h,opacity:i})),u&&v&&("inside"===b&&(v=-v),n.opposite&&(v=-v),a=this.getMarkPath(C,T,v,u*P,o,s),f?f.animate({d:a,opacity:i}):this.mark=s.path(a).attr({stroke:x,"stroke-width":u,opacity:i}).add(n.axisGroup)),l&&!isNaN(C)&&(l.xy=T=this.getLabelPosition(C,T,l,o,c,S,t,w),this.isFirst&&!this.isLast&&!p(r.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(r.showLastLabel,1)?k=!1:!n.isRadial&&!c.step&&!c.rotation&&!e&&0!==i&&(k=this.handleOverflow(t,T)),w&&t%w&&(k=!1),k&&!isNaN(T.y)?(T.opacity=i,l[this.isNew?"attr":"animate"](T),this.isNew=!1):l.attr("y",-9999))},destroy:function(){A(this,this.axis)}};var di=function(t,e){this.axis=t,e&&(this.options=e,this.id=e.id)};di.prototype={render:function(){var t,i=this,n=i.axis,r=n.horiz,s=(n.pointRange||0)/2,o=i.options,l=o.label,h=i.label,d=o.width,u=o.to,f=o.from,g=c(f)&&c(u),m=o.value,y=o.dashStyle,v=i.svgElem,x=[],b=o.color,w=o.zIndex,k=o.events,S=n.chart.renderer;if(n.isLog&&(f=a(f),u=a(u),m=a(m)),d)x=n.getPlotLinePath(m,d),s={stroke:b,"stroke-width":d},y&&(s.dashstyle=y);else{if(!g)return;f=ue(f,n.min-s),u=pe(u,n.max+s),x=n.getPlotBandPath(f,u,o),s={fill:b},o.borderWidth&&(s.stroke=o.borderColor,s["stroke-width"]=o.borderWidth)}if(c(w)&&(s.zIndex=w),v)x?v.animate({d:x},null,v.onGetPath):(v.hide(),v.onGetPath=function(){v.show()},h&&(i.label=h=h.destroy()));else if(x&&x.length&&(i.svgElem=v=S.path(x).attr(s).add(),k))for(t in o=function(t){v.on(t,function(e){k[t].apply(i,[e])})},k)o(t);return l&&c(l.text)&&x&&x.length&&n.width>0&&n.height>0?(l=e({align:r&&g&&"center",x:r?!g&&4:10,verticalAlign:!r&&g&&"middle",y:r?g?16:10:g?6:-4,rotation:r&&!g&&90},l),h||(i.label=h=S.text(l.text,0,0,l.useHTML).attr({align:l.textAlign||l.align,rotation:l.rotation,zIndex:w}).css(l.style).add()),n=[x[1],x[4],p(x[6],x[1])],x=[x[2],x[5],p(x[7],x[2])],r=C(n),g=C(x),h.align(l,!1,{x:r,y:g,width:P(n)-r,height:P(x)-g}),h.show()):h&&h.hide(),i},destroy:function(){h(this.axis.plotLinesAndBands,this),delete this.axis,A(this)}},z.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:Xe,lineColor:"#C0D0E0",lineWidth:1,minPadding:.01,maxPadding:.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:.05,minPadding:.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return y(this.total,-1)},style:Xe.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},title:{rotation:0}},init:function(t,e){var i=e.isX;this.horiz=t.inverted?!i:i,this.coll=(this.isXAxis=i)?"xAxis":"yAxis",this.opposite=e.opposite,this.side=e.side||(this.horiz?this.opposite?0:2:this.opposite?1:3),this.setOptions(e);var n=this.options,r=n.type;this.labelFormatter=n.labels.formatter||this.defaultLabelFormatter,this.userOptions=e,this.minPixelPadding=0,this.chart=t,this.reversed=n.reversed,this.zoomEnabled=n.zoomEnabled!==!1,this.categories=n.categories||"category"===r,this.names=[],this.isLog="logarithmic"===r,this.isDatetimeAxis="datetime"===r,this.isLinked=c(n.linkedTo),this.tickmarkOffset=this.categories&&"between"===n.tickmarkPlacement?.5:0,this.ticks={},this.labelEdge=[],this.minorTicks={},this.plotLinesAndBands=[],this.alternateBands={},this.len=0,this.minRange=this.userMinRange=n.minRange||n.maxZoom,this.range=n.range,this.offset=n.offset||0,this.stacks={},this.oldStacks={},this.stackExtremes={},this.min=this.max=null,this.crosshair=p(n.crosshair,u(t.options.tooltip.crosshairs)[i?0:1],!1);var s,n=this.options.events;-1===Ye(this,t.axes)&&(t.axes.push(this),t[this.coll].push(this)),this.series=this.series||[],t.inverted&&i&&this.reversed===_&&(this.reversed=!0),this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(s in n)Ze(this,s,n[s]);this.isLog&&(this.val2lin=a,this.lin2val=l)},setOptions:function(t){this.options=e(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],e(X[this.coll],t))},defaultLabelFormatter:function(){var t,e=this.axis,i=this.value,n=e.categories,r=this.dateTimeLabelFormat,s=X.lang.numericSymbols,o=s&&s.length,a=e.options.labels.format,e=e.isLog?i:e.tickInterval;if(a)t=b(a,this);else if(n)t=i;else if(r)t=G(r,i);else if(o&&e>=1e3)for(;o--&&t===_;)n=Math.pow(1e3,o+1),e>=n&&null!==s[o]&&(t=y(i/n,-1)+s[o]);return t===_&&(t=i>=1e4?y(i,0):y(i,-1,_,"")),t},getSeriesExtremes:function(){var t=this,e=t.chart;t.hasVisibleSeries=!1,t.dataMin=t.dataMax=null,t.stackExtremes={},t.buildStacks(),je(t.series,function(i){if(i.visible||!e.options.chart.ignoreHiddenSeries){var n;n=i.options.threshold;var r;t.hasVisibleSeries=!0,t.isLog&&0>=n&&(n=null),t.isXAxis?(n=i.xData,n.length&&(t.dataMin=pe(p(t.dataMin,n[0]),C(n)),t.dataMax=ue(p(t.dataMax,n[0]),P(n)))):(i.getExtremes(),r=i.dataMax,i=i.dataMin,c(i)&&c(r)&&(t.dataMin=pe(p(t.dataMin,i),i),t.dataMax=ue(p(t.dataMax,r),r)),c(n)&&(t.dataMin>=n?(t.dataMin=n,t.ignoreMinPadding=!0):t.dataMaxt||t>h+this.width)&&(a=!0)):(t=h,i=u-this.right,(c>s||s>c+this.height)&&(a=!0)),a&&!n?null:l.renderer.crispLine(["M",t,s,"L",i,o],e||1)},getLinearTickPositions:function(t,e,i){for(var n,e=I(ce(e/t)*t),i=I(de(i/t)*t),r=[];i>=e&&(r.push(e),e=I(e+t),e!==n);)n=e;return r},getMinorTickPositions:function(){var t,e=this.options,i=this.tickPositions,n=this.minorTickInterval,r=[];if(this.isLog)for(t=i.length,e=1;t>e;e++)r=r.concat(this.getLogTickPositions(n,i[e-1],i[e],!0));else if(this.isDatetimeAxis&&"auto"===e.minorTickInterval)r=r.concat(this.getTimeTicks(this.normalizeTimeTickInterval(n),this.min,this.max,e.startOfWeek)),r[0]=this.minRange;if(this.isXAxis&&this.minRange===_&&!this.isLog&&(c(o.min)||c(o.max)?this.minRange=null:(je(this.series,function(t){for(r=t.xData,i=s=t.xIncrement?1:r.length-1;i>0;i--)n=r[i]-r[i-1],(e===_||e>n)&&(e=n)}),this.minRange=pe(5*e,this.dataMax-this.dataMin))),l-al-a&&(t[0]=l-d,t[1]=p(o.min,l-d),a=P(t))}this.min=a,this.max=l},setAxisTranslation:function(t){var e,i=this.max-this.min,r=0,s=0,o=0,a=this.linkedParent,l=!!this.categories,h=this.transA;(this.isXAxis||l)&&(a?(s=a.minPointOffset,o=a.pointRangePadding):je(this.series,function(t){var a=ue(t.pointRange,+l),h=t.options.pointPlacement,d=t.closestPointRange;a>i&&(a=0),r=ue(r,a),s=ue(s,n(h)?0:a/2),o=ue(o,"on"===h?0:a),!t.noSharedTooltip&&c(d)&&(e=c(e)?pe(e,d):d)}),a=this.ordinalSlope&&e?this.ordinalSlope/e:1,this.minPointOffset=s*=a,this.pointRangePadding=o*=a,this.pointRange=pe(r,i),this.closestPointRange=e),t&&(this.oldTransA=h),this.translationSlope=this.transA=h=this.len/(i+o||1),this.transB=this.horiz?this.left:this.bottom,this.minPixelPadding=h*s},setTickPositions:function(t){var e,i=this,n=i.chart,r=i.options,s=i.isLog,o=i.isDatetimeAxis,l=i.isXAxis,h=i.isLinked,d=i.options.tickPositioner,u=r.maxPadding,f=r.minPadding,g=r.tickInterval,m=r.minTickInterval,y=r.tickPixelInterval,v=i.categories;h?(i.linkedParent=n[i.coll][r.linkedTo],n=i.linkedParent.getExtremes(),i.min=p(n.min,n.dataMin),i.max=p(n.max,n.dataMax),r.type!==i.linkedParent.options.type&&M(11,1)):(i.min=p(i.userMin,r.min,i.dataMin),i.max=p(i.userMax,r.max,i.dataMax)),s&&(!t&&pe(i.min,p(i.dataMin,i.min))<=0&&M(10,1),i.min=I(a(i.min)),i.max=I(a(i.max))),i.range&&c(i.max)&&(i.userMin=i.min=ue(i.min,i.max-i.range),i.userMax=i.max,i.range=null),i.beforePadding&&i.beforePadding(),i.adjustForMinRange(),!v&&!i.usePercentage&&!h&&c(i.min)&&c(i.max)&&(n=i.max-i.min)&&(c(r.min)||c(i.userMin)||!f||!(i.dataMin<0)&&i.ignoreMinPadding||(i.min-=n*f),c(r.max)||c(i.userMax)||!u||!(i.dataMax>0)&&i.ignoreMaxPadding||(i.max+=n*u)),i.min===i.max||void 0===i.min||void 0===i.max?i.tickInterval=1:h&&!g&&y===i.linkedParent.options.tickPixelInterval?i.tickInterval=i.linkedParent.tickInterval:(i.tickInterval=p(g,v?1:(i.max-i.min)*y/ue(i.len,y)),!c(g)&&i.lenue(2*i.len,200)&&M(19,!0),t=o?i.getTimeTicks(i.normalizeTimeTickInterval(i.tickInterval,r.units),i.min,i.max,r.startOfWeek,i.ordinalPositions,i.closestPointRange,!0):s?i.getLogTickPositions(i.tickInterval,i.min,i.max):i.getLinearTickPositions(i.tickInterval,i.min,i.max),e&&t.splice(1,t.length-2),i.tickPositions=t),h||(s=t[0],o=t[t.length-1],h=i.minPointOffset||0,r.startOnTick?i.min=s:i.min-h>s&&t.shift(),r.endOnTick?i.max=o:i.max+h(e[n]||0)&&this.options.alignTicks!==!1&&(e[n]=i.length),t.maxTicks=e},adjustTickAmount:function(){var t=this._maxTicksKey,e=this.tickPositions,i=this.chart.maxTicks;if(i&&i[t]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1&&this.min!==_){var n=this.tickAmount,r=e.length;if(this.tickAmount=t=i[t],t>r){for(;e.length=this.dataMax&&(e=_)),this.displayBtn=t!==_||e!==_,this.setExtremes(t,e,!1,_,{trigger:"zoom"}),!0},setAxisSize:function(){var t,e,i=this.chart,n=this.options,r=n.offsetLeft||0,s=n.offsetRight||0,o=this.horiz;this.left=e=p(n.left,i.plotLeft+r),this.top=t=p(n.top,i.plotTop),this.width=r=p(n.width,i.plotWidth-r+s),this.height=n=p(n.height,i.plotHeight),this.bottom=i.chartHeight-n-t,this.right=i.chartWidth-r-e,this.len=ue(o?r:n,0),this.pos=o?e:t},getExtremes:function(){var t=this.isLog;return{min:t?I(l(this.min)):this.min,max:t?I(l(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(t){var e=this.isLog,i=e?l(this.min):this.min,e=e?l(this.max):this.max;return i>t||null===t?t=i:t>e&&(t=e),this.translate(t,0,1,0,1)},autoLabelAlign:function(t){return t=(p(t,0)-90*this.side+720)%360,t>15&&165>t?"right":t>195&&345>t?"left":"center"},getOffset:function(){var t,e,i,n,r,s,o,a=this,l=a.chart,h=l.renderer,d=a.options,u=a.tickPositions,f=a.ticks,g=a.horiz,m=a.side,y=l.inverted?[1,0,3,2][m]:m,v=0,x=0,b=d.title,w=d.labels,k=0,S=l.axisOffset,T=l.clipOffset,C=[-1,1,1,-1][m],P=1,A=p(w.maxStaggerLines,5);if(a.hasData=t=a.hasVisibleSeries||c(a.min)&&c(a.max)&&!!u,a.showAxis=l=t||p(d.showEmpty,!0),a.staggerLines=a.horiz&&w.staggerLines,a.axisGroup||(a.gridGroup=h.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=h.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=h.g("axis-labels").attr({zIndex:w.zIndex||7}).add()),t||a.isLinked){if(a.labelAlign=p(w.align||a.autoLabelAlign(w.rotation)),je(u,function(t){f[t]?f[t].addLabel():f[t]=new R(a,t)}),a.horiz&&!a.staggerLines&&A&&!w.rotation){for(i=a.reversed?[].concat(u).reverse():u;A>P;){for(t=[],n=!1,w=0;w1&&(a.staggerLines=P)}je(u,function(t){(0===m||2===m||{1:"left",3:"right"}[m]===a.labelAlign)&&(k=ue(f[t].getLabelSize(),k))}),a.staggerLines&&(k*=a.staggerLines,a.labelOffset=k)}else for(i in f)f[i].destroy(),delete f[i];b&&b.text&&b.enabled!==!1&&(a.axisTitle||(a.axisTitle=h.text(b.text,0,0,b.useHTML).attr({zIndex:7,rotation:b.rotation||0,align:b.textAlign||{low:"left",middle:"center",high:"right"}[b.align]}).css(b.style).add(a.axisGroup),a.axisTitle.isNew=!0),l&&(v=a.axisTitle.getBBox()[g?"height":"width"],x=p(b.margin,g?5:10),e=b.offset),a.axisTitle[l?"show":"hide"]()),a.offset=C*p(d.offset,S[m]),a.axisTitleMargin=p(e,k+x+(2!==m&&k&&C*d.labels[g?"y":"x"])),S[m]=ue(S[m],a.axisTitleMargin+v+C*a.offset),T[y]=ue(T[y],2*ce(d.lineWidth/2))},getLinePath:function(t){var e=this.chart,i=this.opposite,n=this.offset,r=this.horiz,s=this.left+(i?this.width:0)+n,n=e.chartHeight-this.bottom-(i?this.height:0)+n;return i&&(t*=-1),e.renderer.crispLine(["M",r?this.left:s,r?n:this.top,"L",r?e.chartWidth-this.right:s,r?n:e.chartHeight-this.bottom],t)},getTitlePosition:function(){var t=this.horiz,e=this.left,n=this.top,r=this.len,s=this.options.title,o=t?e:n,a=this.opposite,l=this.offset,h=i(s.style.fontSize||12),r={low:o+(t?0:r),middle:o+r/2,high:o+(t?r:0)}[s.align],e=(t?n+this.height:e)+(t?1:-1)*(a?-1:1)*this.axisTitleMargin+(2===this.side?h:0);return{x:t?r:e+(a?this.width:0)+l+(s.x||0),y:t?e-(a?this.height:0)+l:r+(s.y||0)}},render:function(){var t,e,i,n=this,r=n.horiz,s=n.reversed,o=n.chart,a=o.renderer,h=n.options,d=n.isLog,u=n.isLinked,p=n.tickPositions,f=n.axisTitle,g=n.stacks,m=n.ticks,y=n.minorTicks,v=n.alternateBands,x=h.stackLabels,b=h.alternateGridColor,w=n.tickmarkOffset,k=h.lineWidth,S=o.hasRendered&&c(n.oldMin)&&!isNaN(n.oldMin),T=n.hasData,C=n.showAxis,P=n.justifyLabels=!n.staggerLines&&r&&"justify"===h.labels.overflow;if(n.labelEdge.length=0,je([m,y,v],function(t){for(var e in t)t[e].isActive=!1}),(T||u)&&(n.minorTickInterval&&!n.categories&&je(n.getMinorTickPositions(),function(t){y[t]||(y[t]=new R(n,t,"minor")),S&&y[t].isNew&&y[t].render(null,!0),y[t].render(null,!1,1)}),p.length&&(t=p.slice(),(r&&s||!r&&!s)&&t.reverse(),P&&(t=t.slice(1).concat([t[0]])),je(t,function(e,i){P&&(i=i===t.length-1?0:i+1),(!u||e>=n.min&&e<=n.max)&&(m[e]||(m[e]=new R(n,e)),S&&m[e].isNew&&m[e].render(i,!0,.1),m[e].render(i,!1,1))}),w&&0===n.min&&(m[-1]||(m[-1]=new R(n,-1,null,!0)),m[-1].render(-1))),b&&je(p,function(t,r){r%2===0&&t=.5)t=he(t),o=this.getLinearTickPositions(t,e,i);else if(t>=.08)for(var h,c,d,u,f,s=ce(e),r=t>.3?[1,2,4]:t>.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];i+1>s&&!f;s++)for(c=r.length,h=0;c>h&&!f;h++)d=a(l(s)*r[h]),d>e&&(!n||i>=u)&&o.push(u),u>i&&(f=!0),u=d;else e=l(e),i=l(i),t=r[n?"minorTickInterval":"tickInterval"],t=p("auto"===t?null:t,this._minorAutoInterval,(i-e)*(r.tickPixelInterval/(n?5:1))/((n?s/this.tickPositions.length:s)||1)),t=k(t,null,w(t)),o=Ue(this.getLinearTickPositions(t,e,i),a),n||(this._minorAutoInterval=t/5);return n||(this.tickInterval=t),o},z.prototype.getTimeTicks=function(e,i,n,r){var s,o=[],a={},l=X.global.useUTC,h=new Date(i-q),d=e.unitRange,u=e.count;if(c(i)){d>=j.second&&(h.setMilliseconds(0),h.setSeconds(d>=j.minute?0:u*ce(h.getSeconds()/u))),d>=j.minute&&h[ee](d>=j.hour?0:u*ce(h[U]()/u)),d>=j.hour&&h[ie](d>=j.day?0:u*ce(h[Z]()/u)),d>=j.day&&h[ne](d>=j.month?1:u*ce(h[Q]()/u)),d>=j.month&&(h[re](d>=j.year?0:u*ce(h[J]()/u)),s=h[te]()),d>=j.year&&(s-=s%u,h[se](s)),d===j.week&&h[ne](h[Q]()-h[K]()+p(r,1)),i=1,q&&(h=new Date(h.getTime()+q)),s=h[te]();for(var r=h.getTime(),f=h[J](),g=h[Q](),m=l?q:(864e5+6e4*h.getTimezoneOffset())%864e5;n>r;)o.push(r),d===j.year?r=V(s+i*u,0):d===j.month?r=V(s,f+i*u):l||d!==j.day&&d!==j.week?r+=d*u:r=V(s,f,g+i*u*(d===j.day?1:7)),i++;o.push(r),je(Ve(o,function(t){return d<=j.hour&&t%j.day===m}),function(t){a[t]="day"})}return o.info=t(e,{higherRanks:a,totalRange:d*u}),o},z.prototype.normalizeTimeTickInterval=function(t,e){var i,n=e||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],r=n[n.length-1],s=j[r[0]],o=r[1];for(i=0;it&&(o=[1,2,5]),n=k(t/s,o,"year"===r[0]?ue(w(t/s),1):1),{unitRange:s,count:n,unitName:r[0]}},B.prototype={destroy:function(){A(this,this.axis)},render:function(t){var e=this.options,i=e.format,i=i?b(i,this):e.formatter.call(this);this.label?this.label.attr({text:i,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(i,0,0,e.useHTML).css(e.style).attr({align:this.textAlign,rotation:e.rotation,visibility:"hidden"}).add(t)},setOffset:function(t,e){var i=this.axis,n=i.chart,r=n.inverted,s=this.isNegative,o=i.translate(this.percent?100:this.total,0,0,0,1),i=i.translate(0),i=fe(o-i),a=n.xAxis[0].translate(this.x)+t,l=n.plotHeight,s={x:r?s?o:o-i:a,y:r?l-a-e:s?l-o-i:l-o,width:r?i:e,height:r?e:i};(r=this.label)&&(r.align(this.alignOptions,null,s),s=r.alignAttr,r.attr({visibility:this.options.crop===!1||n.isInsidePlot(s.x,s.y)?Ae?"inherit":"visible":"hidden"}))}},F.prototype={init:function(t,e){var n=e.borderWidth,r=e.style,s=i(r.padding);this.chart=t,this.options=e,this.crosshairs=[],this.now={x:0,y:0},this.isHidden=!0,this.label=t.renderer.label("",0,0,e.shape,null,null,e.useHTML,null,"tooltip").attr({padding:s,fill:e.backgroundColor,"stroke-width":n,r:e.borderRadius,zIndex:8}).css(r).css({padding:0}).add().attr({y:-999}),Me||this.label.shadow(e.shadow),this.shared=e.shared},destroy:function(){this.label&&(this.label=this.label.destroy()),clearTimeout(this.hideTimer),clearTimeout(this.tooltipTimeout)},move:function(e,i,n,r){var s=this,o=s.now,a=s.options.animation!==!1&&!s.isHidden;t(o,{x:a?(2*o.x+e)/3:e,y:a?(o.y+i)/2:i,anchorX:a?(2*o.anchorX+n)/3:n,anchorY:a?(o.anchorY+r)/2:r}),s.label.attr(o),a&&(fe(e-o.x)>1||fe(i-o.y)>1)&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){s&&s.move(e,i,n,r)},32))},hide:function(){var t,e=this;clearTimeout(this.hideTimer),this.isHidden||(t=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){e.label.fadeOut(),e.isHidden=!0},p(this.options.hideDelay,500)),t&&je(t,function(t){t.setState()}),this.chart.hoverPoints=null)},getAnchor:function(t,e){var i,n,r=this.chart,s=r.inverted,o=r.plotTop,a=0,l=0,t=u(t);return i=t[0].tooltipPos,this.followPointer&&e&&(e.chartX===_&&(e=r.pointer.normalize(e)),i=[e.chartX-r.plotLeft,e.chartY-o]),i||(je(t,function(t){n=t.series.yAxis,a+=t.plotX,l+=(t.plotLow?(t.plotLow+t.plotHigh)/2:t.plotY)+(!s&&n?n.top-o:0)}),a/=t.length,l/=t.length,i=[s?r.plotWidth-l:a,this.shared&&!s&&t.length>1&&e?e.chartY-o:s?r.plotHeight-a:l]),Ue(i,he)},getPosition:function(t,e,i){var n,r=this.chart,s=r.plotLeft,o=r.plotTop,a=r.plotWidth,l=r.plotHeight,h=p(this.options.distance,12),c=i.plotX,i=i.plotY,r=c+s+(r.inverted?h:-t-h),d=i-e+o+15;return 7>r&&(r=s+ue(c,0)+h),r+t>s+a&&(r-=r+t-(s+a),d=i-e+o-h,n=!0),o+5>d&&(d=o+5,n&&i>=d&&d+e>=i&&(d=i+o+h)),d+e>o+l&&(d=ue(o,o+l-e-h)),{x:r,y:d}},defaultFormatter:function(t){var e,i=this.points||u(this),n=i[0].series;return e=[n.tooltipHeaderFormatter(i[0])],je(i,function(t){n=t.series,e.push(n.tooltipFormatter&&n.tooltipFormatter(t)||t.point.tooltipFormatter(n.tooltipOptions.pointFormat))}),e.push(t.options.footerFormat||""),e.join("")},refresh:function(t,e){var i,n,r,s=this.chart,o=this.label,a=this.options,l={},h=[];r=a.formatter||this.defaultFormatter;var c,l=s.hoverPoints,d=this.shared;clearTimeout(this.hideTimer),this.followPointer=u(t)[0].series.tooltipOptions.followPointer,n=this.getAnchor(t,e),i=n[0],n=n[1],!d||t.series&&t.series.noSharedTooltip?l=t.getLabelConfig():(s.hoverPoints=t,l&&je(l,function(t){t.setState()}),je(t,function(t){t.setState("hover"),h.push(t.getLabelConfig())}),l={x:t[0].category,y:t[0].y},l.points=h,t=t[0]),r=r.call(l,this),l=t.series,r===!1?this.hide():(this.isHidden&&(ei(o),o.attr("opacity",1).show()),o.attr({text:r}),c=a.borderColor||t.color||l.color||"#606060",o.attr({stroke:c}),this.updatePosition({plotX:i,plotY:n}),this.isHidden=!1),Qe(s,"tooltipRefresh",{text:r,x:i+s.plotLeft,y:n+s.plotTop,borderColor:c})},updatePosition:function(t){var e=this.chart,i=this.label,i=(this.options.positioner||this.getPosition).call(this,i.width,i.height,t);this.move(he(i.x),he(i.y),t.plotX+e.plotLeft,t.plotY+e.plotTop)}};var ui=Highcharts.Pointer=function(t,e){this.init(t,e)};if(ui.prototype={init:function(t,e){var i,n=e.chart,r=n.events,s=Me?"":n.zoomType,n=t.inverted;this.options=e,this.chart=t,this.zoomX=i=/x/.test(s),this.zoomY=s=/y/.test(s),this.zoomHor=i&&!n||s&&n,this.zoomVert=s&&!n||i&&n,this.runChartClick=r&&!!r.click,this.pinchDown=[],this.lastValidTouch={},e.tooltip.enabled&&(t.tooltip=new F(t,e.tooltip)),this.setDOMEvents()},normalize:function(e,i){var n,r,e=e||ae.event;return e.target||(e.target=e.srcElement),e=Je(e),r=e.touches?e.touches.item(0):e,i||(this.chartPosition=i=qe(this.chart.container)),r.pageX===_?(n=ue(e.x,e.clientX-i.left),r=e.y):(n=r.pageX-i.left,r=r.pageY-i.top),t(e,{chartX:he(n),chartY:he(r)})},getCoordinates:function(t){var e={xAxis:[],yAxis:[]};return je(this.chart.axes,function(i){e[i.isXAxis?"xAxis":"yAxis"].push({axis:i,value:i.toValue(t[i.horiz?"chartX":"chartY"])})}),e},getIndex:function(t){var e=this.chart;return e.inverted?e.plotHeight+e.plotTop-t.chartY:t.chartX-e.plotLeft},runPointActions:function(t){var e,i,n,r,s=this,o=s.chart,a=o.series,l=o.tooltip,h=o.hoverPoint,c=o.hoverSeries,d=o.chartWidth,u=s.getIndex(t);if(l&&s.options.tooltip.shared&&(!c||!c.noSharedTooltip)){for(i=[],n=a.length,r=0;n>r;r++)a[r].visible&&a[r].options.enableMouseTracking!==!1&&!a[r].noSharedTooltip&&a[r].tooltipPoints.length&&(e=a[r].tooltipPoints[u])&&e.series&&(e._dist=fe(u-e.clientX),d=pe(d,e._dist),i.push(e));for(n=i.length;n--;)i[n]._dist>d&&i.splice(n,1);i.length&&i[0].clientX!==s.hoverX&&(l.refresh(i,t),s.hoverX=i[0].clientX)}c&&c.tracker?(e=c.tooltipPoints[u])&&e!==h&&e.onMouseOver(t):l&&l.followPointer&&!l.isHidden&&(a=l.getAnchor([{}],t),l.updatePosition({plotX:a[0],plotY:a[1]})),l&&!s._onDocumentMouseMove&&(s._onDocumentMouseMove=function(t){s.onDocumentMouseMove(t)},Ze(oe,"mousemove",s._onDocumentMouseMove)),je(o.axes,function(i){i.drawCrosshair(t,p(h,e))})},reset:function(t){var e=this.chart,i=e.hoverSeries,n=e.hoverPoint,r=e.tooltip,s=r&&r.shared?e.hoverPoints:n;(t=t&&r&&s)&&u(s)[0].plotX===_&&(t=!1),t?(r.refresh(s),n&&n.setState(n.state,!0)):(n&&n.onMouseOut(),i&&i.onMouseOut(),r&&r.hide(),this._onDocumentMouseMove&&(Ke(oe,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null),je(e.axes,function(t){t.hideCrosshair()}),this.hoverX=null)},scaleGroups:function(t,e){var i,n=this.chart;je(n.series,function(r){i=t||r.getPlotBox(),r.xAxis&&r.xAxis.zoomEnabled&&(r.group.attr(i),r.markerGroup&&(r.markerGroup.attr(i),r.markerGroup.clip(e?n.clipRect:null)),r.dataLabelsGroup&&r.dataLabelsGroup.attr(i))}),n.clipRect.attr(e||n.clipBox)},pinchTranslate:function(t,e,i,n,r,s,o,a){t&&this.pinchTranslateDirection(!0,i,n,r,s,o,a),e&&this.pinchTranslateDirection(!1,i,n,r,s,o,a)},pinchTranslateDirection:function(t,e,i,n,r,s,o,a){var l,h,c,d=this.chart,u=t?"x":"y",p=t?"X":"Y",f="chart"+p,g=t?"width":"height",m=d["plot"+(t?"Left":"Top")],y=a||1,v=d.inverted,x=d.bounds[t?"h":"v"],b=1===e.length,w=e[0][f],k=i[0][f],S=!b&&e[1][f],T=!b&&i[1][f],i=function(){!b&&fe(w-S)>20&&(y=a||fe(k-T)/fe(w-S)),h=(m-k)/y+w,l=d["plot"+(t?"Width":"Height")]/y};i(),e=h,ex.max&&(e=x.max-l,c=!0),c?(k-=.8*(k-o[u][0]),b||(T-=.8*(T-o[u][1])),i()):o[u]=[k,T],v||(s[u]=h-m,s[g]=l),s=v?1/y:y,r[g]=l,r[u]=e,n[v?t?"scaleY":"scaleX":"scale"+p]=y,n["translate"+p]=s*m+(k-s*w)},pinch:function(e){var i=this,n=i.chart,r=i.pinchDown,s=n.tooltip&&n.tooltip.options.followTouchMove,o=e.touches,a=o.length,l=i.lastValidTouch,h=i.zoomHor||i.pinchHor,c=i.zoomVert||i.pinchVert,d=h||c,u=i.selectionMarker,p={},f=1===a&&(i.inClass(e.target,"highcharts-tracker")&&n.runTrackerClick||n.runChartClick),g={};(d||s)&&!f&&e.preventDefault(),Ue(o,function(t){return i.normalize(t)}),"touchstart"===e.type?(je(o,function(t,e){r[e]={chartX:t.chartX,chartY:t.chartY}}),l.x=[r[0].chartX,r[1]&&r[1].chartX],l.y=[r[0].chartY,r[1]&&r[1].chartY],je(n.axes,function(t){if(t.zoomEnabled){var e=n.bounds[t.horiz?"h":"v"],i=t.minPixelPadding,r=t.toPixels(t.dataMin),s=t.toPixels(t.dataMax),o=pe(r,s),r=ue(r,s);e.min=pe(t.pos,o-i),e.max=ue(t.pos+t.len,r+i)}})):r.length&&(u||(i.selectionMarker=u=t({destroy:Oe},n.plotBox)),i.pinchTranslate(h,c,r,o,p,u,g,l),i.hasPinched=d,i.scaleGroups(p,g),!d&&s&&1===a&&this.runPointActions(i.normalize(e)))},dragStart:function(t){var e=this.chart;e.mouseIsDown=t.type,e.cancelClick=!1,e.mouseDownX=this.mouseDownX=t.chartX,e.mouseDownY=this.mouseDownY=t.chartY},drag:function(t){var e,i=this.chart,n=i.options.chart,r=t.chartX,s=t.chartY,o=this.zoomHor,a=this.zoomVert,l=i.plotLeft,h=i.plotTop,c=i.plotWidth,d=i.plotHeight,u=this.mouseDownX,p=this.mouseDownY;l>r?r=l:r>l+c&&(r=l+c),h>s?s=h:s>h+d&&(s=h+d),this.hasDragged=Math.sqrt(Math.pow(u-r,2)+Math.pow(p-s,2)),this.hasDragged>10&&(e=i.isInsidePlot(u-l,p-h),i.hasCartesianSeries&&(this.zoomX||this.zoomY)&&e&&!this.selectionMarker&&(this.selectionMarker=i.renderer.rect(l,h,o?1:c,a?1:d,0).attr({fill:n.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add()),this.selectionMarker&&o&&(r-=u,this.selectionMarker.attr({width:fe(r),x:(r>0?0:r)+u})),this.selectionMarker&&a&&(r=s-p,this.selectionMarker.attr({height:fe(r),y:(r>0?0:r)+p})),e&&!this.selectionMarker&&n.panning&&i.pan(t,n.panning))},drop:function(e){var i=this.chart,n=this.hasPinched;if(this.selectionMarker){var r,s={xAxis:[],yAxis:[],originalEvent:e.originalEvent||e},o=this.selectionMarker,a=o.x,l=o.y;(this.hasDragged||n)&&(je(i.axes,function(t){if(t.zoomEnabled){var e=t.horiz,i=t.toValue(e?a:l),e=t.toValue(e?a+o.width:l+o.height);!isNaN(i)&&!isNaN(e)&&(s[t.coll].push({axis:t,min:pe(i,e),max:ue(i,e)}),r=!0)}}),r&&Qe(i,"selection",s,function(e){i.zoom(t(e,n?{animation:!1}:null))})),this.selectionMarker=this.selectionMarker.destroy(),n&&this.scaleGroups()}i&&(f(i.container,{cursor:i._cursor}),i.cancelClick=this.hasDragged>10,i.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(t){t=this.normalize(t),t.preventDefault&&t.preventDefault(),this.dragStart(t)},onDocumentMouseUp:function(t){this.drop(t)},onDocumentMouseMove:function(t){var e=this.chart,i=this.chartPosition,n=e.hoverSeries,t=this.normalize(t,i);i&&n&&!this.inClass(t.target,"highcharts-tracker")&&!e.isInsidePlot(t.chartX-e.plotLeft,t.chartY-e.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset(),this.chartPosition=null},onContainerMouseMove:function(t){var e=this.chart,t=this.normalize(t);"mousedown"===e.mouseIsDown&&this.drag(t),(this.inClass(t.target,"highcharts-tracker")||e.isInsidePlot(t.chartX-e.plotLeft,t.chartY-e.plotTop))&&!e.openMenu&&this.runPointActions(t)},inClass:function(t,e){for(var i;t;){if(i=d(t,"class")){if(-1!==i.indexOf(e))return!0;if(-1!==i.indexOf("highcharts-container"))return!1}t=t.parentNode}},onTrackerMouseOut:function(t){var e=this.chart.hoverSeries,t=t.relatedTarget||t.toElement,i=t.point&&t.point.series;!e||e.options.stickyTracking||this.inClass(t,"highcharts-tooltip")||i===e||e.onMouseOut()},onContainerClick:function(e){var i,n,r,s=this.chart,o=s.hoverPoint,a=s.plotLeft,l=s.plotTop,h=s.inverted,e=this.normalize(e);e.cancelBubble=!0,s.cancelClick||(o&&this.inClass(e.target,"highcharts-tracker")?(i=this.chartPosition,n=o.plotX,r=o.plotY,t(o,{pageX:i.left+a+(h?s.plotWidth-r:n),pageY:i.top+l+(h?s.plotHeight-n:r)}),Qe(o.series,"click",t(e,{point:o})),s.hoverPoint&&o.firePointEvent("click",e)):(t(e,this.getCoordinates(e)),s.isInsidePlot(e.chartX-a,e.chartY-l)&&Qe(s,"click",e)))},onContainerTouchStart:function(t){var e=this.chart;1===t.touches.length?(t=this.normalize(t),e.isInsidePlot(t.chartX-e.plotLeft,t.chartY-e.plotTop)?(this.runPointActions(t),this.pinch(t)):this.reset()):2===t.touches.length&&this.pinch(t)},onContainerTouchMove:function(t){(1===t.touches.length||2===t.touches.length)&&this.pinch(t)},onDocumentTouchEnd:function(t){this.drop(t)},setDOMEvents:function(){var t,e=this,i=e.chart.container;this._events=t=[[i,"onmousedown","onContainerMouseDown"],[i,"onmousemove","onContainerMouseMove"],[i,"onclick","onContainerClick"],[i,"mouseleave","onContainerMouseLeave"],[oe,"mouseup","onDocumentMouseUp"]],Ie&&t.push([i,"ontouchstart","onContainerTouchStart"],[i,"ontouchmove","onContainerTouchMove"],[oe,"touchend","onDocumentTouchEnd"]),je(t,function(t){e["_"+t[2]]=function(i){e[t[2]](i)},0===t[1].indexOf("on")?t[0][t[1]]=e["_"+t[2]]:Ze(t[0],t[1],e["_"+t[2]])})},destroy:function(){var t=this;je(t._events,function(e){0===e[1].indexOf("on")?e[0][e[1]]=null:Ke(e[0],e[1],t["_"+e[2]])}),delete t._events,clearInterval(t.tooltipTimeout)}},Xe=Highcharts.TrackerMixin={drawTrackerPoint:function(){var t=this,e=t.chart,i=e.pointer,n=t.options.cursor,r=n&&{cursor:n},s=function(i){var n,r=i.target;for(e.hoverSeries!==t&&t.onMouseOver();r&&!n;)n=r.point,r=r.parentNode;n!==_&&n!==e.hoverPoint&&n.onMouseOver(i)};je(t.points,function(t){t.graphic&&(t.graphic.element.point=t),t.dataLabel&&(t.dataLabel.element.point=t)}),t._hasTracking||(je(t.trackerGroups,function(e){t[e]&&(t[e].addClass("highcharts-tracker").on("mouseover",s).on("mouseout",function(t){i.onTrackerMouseOut(t)}).css(r),Ie)&&t[e].on("touchstart",s)}),t._hasTracking=!0)},drawTrackerGraph:function(){var t,e=this,i=e.options,n=i.trackByArea,r=[].concat(n?e.areaPath:e.graphPath),s=r.length,o=e.chart,a=o.pointer,l=o.renderer,h=o.options.tooltip.snap,c=e.tracker,d=i.cursor,u=d&&{cursor:d},d=e.singlePoints,p=function(){o.hoverSeries!==e&&e.onMouseOver()};if(s&&!n)for(t=s+1;t--;)"M"===r[t]&&r.splice(t+1,0,r[t+1]-h,r[t+2],"L"),(t&&"M"===r[t]||t===s)&&r.splice(t,0,"L",r[t-2]+h,r[t-1]);for(t=0;te-6&&e+n-6>s?"":Be}))}))},renderTitle:function(){var t=this.padding,e=this.options.title,i=0;e.text&&(this.title||(this.title=this.chart.renderer.label(e.text,t-3,t-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(e.style).add(this.group)),t=this.title.getBBox(),i=t.height,this.offsetWidth=t.width,this.contentGroup.attr({translateY:i})),this.titleHeight=i},renderItem:function(t){var i,n=this,r=n.chart,s=r.renderer,o=n.options,a="horizontal"===o.layout,l=n.symbolWidth,h=o.symbolPadding,c=n.itemStyle,d=n.itemHiddenStyle,u=n.padding,f=a?p(o.itemDistance,8):0,m=!o.rtl,y=o.width,v=o.itemMarginBottom||0,x=n.itemMarginTop,w=n.initialItemX,k=t.legendItem,S=t.series&&t.series.drawLegendSymbol?t.series:t,T=S.options,T=T&&T.showCheckbox,C=o.useHTML;!k&&(t.legendGroup=s.g("legend-item").attr({zIndex:1}).add(n.scrollGroup),S.drawLegendSymbol(n,t),t.legendItem=k=s.text(o.labelFormat?b(o.labelFormat,t):o.labelFormatter.call(t),m?l+h:-h,n.baseline,C).css(e(t.visible?c:d)).attr({align:m?"left":"right",zIndex:2}).add(t.legendGroup),(C?k:t.legendGroup).on("mouseover",function(){t.setState("hover"),k.css(n.options.itemHoverStyle)}).on("mouseout",function(){k.css(t.visible?c:d),t.setState()}).on("click",function(e){var i=function(){t.setVisible()},e={browserEvent:e};t.firePointEvent?t.firePointEvent("legendItemClick",e,i):Qe(t,"legendItemClick",e,i)}),n.colorizeItem(t,t.visible),T)&&(t.checkbox=g("input",{type:"checkbox",checked:t.selected,defaultChecked:t.selected},o.itemCheckboxStyle,r.container),Ze(t.checkbox,"click",function(e){Qe(t,"checkboxClick",{checked:e.target.checked},function(){t.select()})})),s=k.getBBox(),i=t.legendItemWidth=o.itemWidth||t.legendItemWidth||l+h+s.width+f+(T?20:0),o=i,n.itemHeight=l=he(t.legendItemHeight||s.height),a&&n.itemX-w+o>(y||r.chartWidth-2*u-w)&&(n.itemX=w,n.itemY+=x+n.lastLineHeight+v,n.lastLineHeight=0),n.maxItemWidth=ue(n.maxItemWidth,o),n.lastItemY=x+n.itemY+v,n.lastLineHeight=ue(l,n.lastLineHeight),t._legendItemPos=[n.itemX,n.itemY],a?n.itemX+=o:(n.itemY+=x+l+v,n.lastLineHeight=l),n.offsetWidth=y||ue((a?n.itemX-w-f:o)+u,n.offsetWidth)},getAllItems:function(){var t=[];return je(this.chart.series,function(e){var i=e.options;p(i.showInLegend,c(i.linkedTo)?!1:_,!0)&&(t=t.concat(e.legendItems||("point"===i.legendType?e.data:e)))}),t},render:function(){var e,i,n,r,s=this,o=s.chart,a=o.renderer,l=s.group,h=s.box,c=s.options,d=s.padding,u=c.borderWidth,p=c.backgroundColor;s.itemX=s.initialItemX,s.itemY=s.initialItemY,s.offsetWidth=0,s.lastItemY=0,l||(s.group=l=a.g("legend").attr({zIndex:7}).add(),s.contentGroup=a.g().attr({zIndex:1}).add(l),s.scrollGroup=a.g().add(s.contentGroup)),s.renderTitle(),e=s.getAllItems(),T(e,function(t,e){return(t.options&&t.options.legendIndex||0)-(e.options&&e.options.legendIndex||0)}),c.reversed&&e.reverse(),s.allItems=e,s.display=i=!!e.length,je(e,function(t){s.renderItem(t)}),n=c.width||s.offsetWidth,r=s.lastItemY+s.lastLineHeight+s.titleHeight,r=s.handleOverflow(r),(u||p)&&(n+=d,r+=d,h?n>0&&r>0&&(h[h.isNew?"attr":"animate"](h.crisp(null,null,null,n,r)),h.isNew=!1):(s.box=h=a.rect(0,0,n,r,c.borderRadius,u||0).attr({stroke:c.borderColor,"stroke-width":u||0,fill:p||Be}).add(l).shadow(c.shadow),h.isNew=!0),h[i?"show":"hide"]()),s.legendWidth=n,s.legendHeight=r,je(e,function(t){s.positionItem(t)}),i&&l.align(t({width:n,height:r},c),!0,"spacingBox"),o.isResizing||this.positionCheckboxes()},handleOverflow:function(t){var e,i,n=this,r=this.chart,s=r.renderer,o=this.options,a=o.y,a=r.spacingBox.height+("top"===o.verticalAlign?-a:a)-this.padding,l=o.maxHeight,h=this.clipRect,c=o.navigation,d=p(c.animation,!0),u=c.arrowSize||12,f=this.nav,g=this.pages,m=this.allItems; +return"horizontal"===o.layout&&(a/=2),l&&(a=pe(a,l)),g.length=0,t>a&&!o.useHTML?(this.clipHeight=e=a-20-this.titleHeight-this.padding,this.currentPage=p(this.currentPage,1),this.fullHeight=t,je(m,function(t,n){var r=t._legendItemPos[1],s=he(t.legendItem.bBox.height),o=g.length;(!o||r-g[o-1]>e)&&g.push(i||r),n===m.length-1&&r+s-g[o-1]>e&&g.push(r),r!==i&&(i=r)}),h||(h=n.clipRect=s.clipRect(0,this.padding,9999,0),n.contentGroup.clip(h)),h.attr({height:e}),f||(this.nav=f=s.g().attr({zIndex:1}).add(this.group),this.up=s.symbol("triangle",0,0,u,u).on("click",function(){n.scroll(-1,d)}).add(f),this.pager=s.text("",15,10).css(c.style).add(f),this.down=s.symbol("triangle-down",0,0,u,u).on("click",function(){n.scroll(1,d)}).add(f)),n.scroll(0),t=a):f&&(h.attr({height:r.chartHeight}),f.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0),t},scroll:function(t,e){var i=this.pages,n=i.length,r=this.currentPage+t,s=this.clipHeight,o=this.options.navigation,a=o.activeColor,o=o.inactiveColor,l=this.pager,h=this.padding;r>n&&(r=n),r>0&&(e!==_&&D(e,this.chart),this.nav.attr({translateX:h,translateY:s+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:1===r?o:a}).css({cursor:1===r?"default":"pointer"}),l.attr({text:r+"/"+n}),this.down.attr({x:18+this.pager.getBBox().width,fill:r===n?o:a}).css({cursor:r===n?"default":"pointer"}),i=-i[r-1]+this.initialItemY,this.scrollGroup.animate({translateY:i}),this.currentPage=r,this.positionCheckboxes(i))}},li=Highcharts.LegendSymbolMixin={drawRectangle:function(t,e){var i=t.options.symbolHeight||12;e.legendSymbol=this.chart.renderer.rect(0,t.baseline-5-i/2,t.symbolWidth,i,p(t.options.symbolRadius,2)).attr({zIndex:3}).add(e.legendGroup)},drawLineMarker:function(t){var e,i=this.options,n=i.marker;e=t.symbolWidth;var r,s=this.chart.renderer,o=this.legendGroup,t=t.baseline-he(.3*s.fontMetrics(t.options.itemStyle.fontSize).b);i.lineWidth&&(r={"stroke-width":i.lineWidth},i.dashStyle&&(r.dashstyle=i.dashStyle),this.legendLine=s.path(["M",0,t,"L",e,t]).attr(r).add(o)),n&&n.enabled&&(i=n.radius,this.legendSymbol=e=s.symbol(this.symbol,e/2-i,t-i,2*i,2*i).add(o),e.isMarker=!0)}},/Trident\/7\.0/.test(xe)&&x(fi.prototype,"positionItem",function(t,e){var i=this,n=function(){e._legendItemPos&&t.call(i,e)};i.chart.renderer.forExport?n():setTimeout(n)}),N.prototype={init:function(t,i){var n,r=t.series;t.series=null,n=e(X,t),n.series=t.series=r,this.userOptions=t,r=n.chart,this.margin=this.splashArray("margin",r),this.spacing=this.splashArray("spacing",r);var s=r.events;this.bounds={h:{},v:{}},this.callback=i,this.isResizing=0,this.options=n,this.axes=[],this.series=[],this.hasCartesianSeries=r.showAxes;var o,a=this;if(a.index=Re.length,Re.push(a),r.reflow!==!1&&Ze(a,"load",function(){a.initReflow()}),s)for(o in s)Ze(a,o,s[o]);a.xAxis=[],a.yAxis=[],a.animation=Me?!1:p(r.animation,!0),a.pointCount=0,a.counters=new S,a.firstRender()},initSeries:function(t){var e=this.options.chart;return(e=He[t.type||e.type||e.defaultSeriesType])||M(17,!0),e=new e,e.init(this,t),e},isInsidePlot:function(t,e,i){var n=i?e:t,t=i?t:e;return n>=0&&n<=this.plotWidth&&t>=0&&t<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&je(this.axes,function(t){t.adjustTickAmount()}),this.maxTicks=null},redraw:function(e){var i,n,r=this.axes,s=this.series,o=this.pointer,a=this.legend,l=this.isDirtyLegend,h=this.isDirtyBox,c=s.length,d=c,u=this.renderer,p=u.isHidden(),f=[];for(D(e,this),p&&this.cloneRenderTo(),this.layOutTitles();d--;)if(e=s[d],e.options.stacking&&(i=!0,e.isDirty)){n=!0;break}if(n)for(d=c;d--;)e=s[d],e.options.stacking&&(e.isDirty=!0);je(s,function(t){t.isDirty&&"point"===t.options.legendType&&(l=!0)}),l&&a.options.enabled&&(a.render(),this.isDirtyLegend=!1),i&&this.getStacks(),this.hasCartesianSeries&&(this.isResizing||(this.maxTicks=null,je(r,function(t){t.setScale()})),this.adjustTickAmounts(),this.getMargins(),je(r,function(t){t.isDirty&&(h=!0)}),je(r,function(e){e.isDirtyExtremes&&(e.isDirtyExtremes=!1,f.push(function(){Qe(e,"afterSetExtremes",t(e.eventArgs,e.getExtremes())),delete e.eventArgs})),(h||i)&&e.redraw()})),h&&this.drawChartBox(),je(s,function(t){t.isDirty&&t.visible&&(!t.isCartesian||t.xAxis)&&t.redraw()}),o&&o.reset&&o.reset(!0),u.draw(),Qe(this,"redraw"),p&&this.cloneRenderTo(!0),je(f,function(t){t.call()})},get:function(t){var e,i,n=this.axes,r=this.series;for(e=0;epe(l.dataMin,l.min)&&o=18&&25>=e&&(e=15)),n&&(n.css({width:(r.width||o)+"px"}).align(t({y:e+s.margin},r),!1,"spacingBox"),!r.floating&&!r.verticalAlign&&(e=de(e+n.getBBox().height))),this.titleOffset=e},getChartSize:function(){var t=this.options.chart,e=this.renderToClone||this.renderTo;this.containerWidth=Ge(e,"width"),this.containerHeight=Ge(e,"height"),this.chartWidth=ue(0,t.width||this.containerWidth||600),this.chartHeight=ue(0,p(t.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(t){var e=this.renderToClone,i=this.container;t?e&&(this.renderTo.appendChild(i),L(e),delete this.renderToClone):(i&&i.parentNode===this.renderTo&&this.renderTo.removeChild(i),this.renderToClone=e=this.renderTo.cloneNode(0),f(e,{position:"absolute",top:"-9999px",display:"block"}),oe.body.appendChild(e),i&&e.appendChild(i))},getContainer:function(){var e,r,s,o,a=this.options.chart;this.renderTo=e=a.renderTo,o="highcharts-"+Ee++,n(e)&&(this.renderTo=e=oe.getElementById(e)),e||M(13,!0),r=i(d(e,"data-highcharts-chart")),!isNaN(r)&&Re[r]&&Re[r].destroy(),d(e,"data-highcharts-chart",this.index),e.innerHTML="",e.offsetWidth||this.cloneRenderTo(),this.getChartSize(),r=this.chartWidth,s=this.chartHeight,this.container=e=g(ze,{className:"highcharts-container"+(a.className?" "+a.className:""),id:o},t({position:"relative",overflow:"hidden",width:r+"px",height:s+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},a.style),this.renderToClone||e),this._cursor=e.style.cursor,this.renderer=a.forExport?new ai(e,r,s,!0):new H(e,r,s),Me&&this.renderer.create(this,e,r,s)},getMargins:function(){var t,e=this.spacing,i=this.legend,n=this.margin,r=this.options.legend,s=p(r.margin,10),o=r.x,a=r.y,l=r.align,h=r.verticalAlign,d=this.titleOffset;this.resetMargins(),t=this.axisOffset,d&&!c(n[0])&&(this.plotTop=ue(this.plotTop,d+this.options.title.margin+e[0])),i.display&&!r.floating&&("right"===l?c(n[1])||(this.marginRight=ue(this.marginRight,i.legendWidth-o+s+e[1])):"left"===l?c(n[3])||(this.plotLeft=ue(this.plotLeft,i.legendWidth+o+s+e[3])):"top"===h?c(n[0])||(this.plotTop=ue(this.plotTop,i.legendHeight+a+s+e[0])):"bottom"!==h||c(n[2])||(this.marginBottom=ue(this.marginBottom,i.legendHeight-a+s+e[2]))),this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin),this.extraTopMargin&&(this.plotTop+=this.extraTopMargin),this.hasCartesianSeries&&je(this.axes,function(t){t.getOffset()}),c(n[3])||(this.plotLeft+=t[3]),c(n[0])||(this.plotTop+=t[0]),c(n[2])||(this.marginBottom+=t[2]),c(n[1])||(this.marginRight+=t[1]),this.setChartSize()},reflow:function(t){var e=this,i=e.options.chart,n=e.renderTo,r=i.width||Ge(n,"width"),s=i.height||Ge(n,"height"),i=t?t.target:ae,n=function(){e.container&&(e.setSize(r,s,!1),e.hasUserSize=null)};e.hasUserSize||!r||!s||i!==ae&&i!==oe||((r!==e.containerWidth||s!==e.containerHeight)&&(clearTimeout(e.reflowTimeout),t?e.reflowTimeout=setTimeout(n,100):n()),e.containerWidth=r,e.containerHeight=s)},initReflow:function(){var t=this,e=function(e){t.reflow(e)};Ze(ae,"resize",e),Ze(t,"destroy",function(){Ke(ae,"resize",e)})},setSize:function(t,e,i){var n,r,s,o=this;o.isResizing+=1,s=function(){o&&Qe(o,"endResize",null,function(){o.isResizing-=1})},D(i,o),o.oldChartHeight=o.chartHeight,o.oldChartWidth=o.chartWidth,c(t)&&(o.chartWidth=n=ue(0,he(t)),o.hasUserSize=!!n),c(e)&&(o.chartHeight=r=ue(0,he(e))),($?ti:f)(o.container,{width:n+"px",height:r+"px"},$),o.setChartSize(!0),o.renderer.setSize(n,r,i),o.maxTicks=null,je(o.axes,function(t){t.isDirty=!0,t.setScale()}),je(o.series,function(t){t.isDirty=!0}),o.isDirtyLegend=!0,o.isDirtyBox=!0,o.getMargins(),o.redraw(i),o.oldChartHeight=null,Qe(o,"resize"),$===!1?s():setTimeout(s,$&&$.duration||500)},setChartSize:function(t){var e,i,n,r,s=this.inverted,o=this.renderer,a=this.chartWidth,l=this.chartHeight,h=this.options.chart,c=this.spacing,d=this.clipOffset;this.plotLeft=e=he(this.plotLeft),this.plotTop=i=he(this.plotTop),this.plotWidth=n=ue(0,he(a-e-this.marginRight)),this.plotHeight=r=ue(0,he(l-i-this.marginBottom)),this.plotSizeX=s?r:n,this.plotSizeY=s?n:r,this.plotBorderWidth=h.plotBorderWidth||0,this.spacingBox=o.spacingBox={x:c[3],y:c[0],width:a-c[3]-c[1],height:l-c[0]-c[2]},this.plotBox=o.plotBox={x:e,y:i,width:n,height:r},a=2*ce(this.plotBorderWidth/2),s=de(ue(a,d[3])/2),o=de(ue(a,d[0])/2),this.clipBox={x:s,y:o,width:ce(this.plotSizeX-ue(a,d[1])/2-s),height:ce(this.plotSizeY-ue(a,d[2])/2-o)},t||je(this.axes,function(t){t.setAxisSize(),t.setAxisTranslation()})},resetMargins:function(){var t=this.spacing,e=this.margin;this.plotTop=p(e[0],t[0]),this.marginRight=p(e[1],t[1]),this.marginBottom=p(e[2],t[2]),this.plotLeft=p(e[3],t[3]),this.axisOffset=[0,0,0,0],this.clipOffset=[0,0,0,0]},drawChartBox:function(){var t,e=this.options.chart,i=this.renderer,n=this.chartWidth,r=this.chartHeight,s=this.chartBackground,o=this.plotBackground,a=this.plotBorder,l=this.plotBGImage,h=e.borderWidth||0,c=e.backgroundColor,d=e.plotBackgroundColor,u=e.plotBackgroundImage,p=e.plotBorderWidth||0,f=this.plotLeft,g=this.plotTop,m=this.plotWidth,y=this.plotHeight,v=this.plotBox,x=this.clipRect,b=this.clipBox;t=h+(e.shadow?8:0),(h||c)&&(s?s.animate(s.crisp(null,null,null,n-t,r-t)):(s={fill:c||Be},h&&(s.stroke=e.borderColor,s["stroke-width"]=h),this.chartBackground=i.rect(t/2,t/2,n-t,r-t,e.borderRadius,h).attr(s).add().shadow(e.shadow))),d&&(o?o.animate(v):this.plotBackground=i.rect(f,g,m,y,0).attr({fill:d}).add().shadow(e.plotShadow)),u&&(l?l.animate(v):this.plotBGImage=i.image(u,f,g,m,y).add()),x?x.animate({width:b.width,height:b.height}):this.clipRect=i.clipRect(b),p&&(a?a.animate(a.crisp(null,f,g,m,y)):this.plotBorder=i.rect(f,g,m,y,0,-p).attr({stroke:e.plotBorderColor,"stroke-width":p,zIndex:1}).add()),this.isDirtyBox=!1},propFromSeries:function(){var t,e,i,n=this,r=n.options.chart,s=n.options.series;je(["inverted","angular","polar"],function(o){for(t=He[r.type||r.defaultSeriesType],i=n[o]||r[o]||t&&t.prototype[o],e=s&&s.length;!i&&e--;)(t=He[s[e].type])&&t.prototype[o]&&(i=!0);n[o]=i})},linkSeries:function(){var t=this,e=t.series;je(e,function(t){t.linkedSeries.length=0}),je(e,function(e){var i=e.options.linkedTo;n(i)&&(i=":previous"===i?t.series[e.index-1]:t.get(i))&&(i.linkedSeries.push(e),e.linkedParent=i)})},render:function(){var e,n=this,r=n.axes,s=n.renderer,o=n.options,a=o.labels,l=o.credits;n.setTitle(),n.legend=new fi(n,o.legend),n.getStacks(),je(r,function(t){t.setScale()}),n.getMargins(),n.maxTicks=null,je(r,function(t){t.setTickPositions(!0),t.setMaxTicks()}),n.adjustTickAmounts(),n.getMargins(),n.drawChartBox(),n.hasCartesianSeries&&je(r,function(t){t.render()}),n.seriesGroup||(n.seriesGroup=s.g("series-group").attr({zIndex:3}).add()),je(n.series,function(t){t.translate(),t.setTooltipPoints(),t.render()}),a.items&&je(a.items,function(e){var r=t(a.style,e.style),o=i(r.left)+n.plotLeft,l=i(r.top)+n.plotTop+12;delete r.left,delete r.top,s.text(e.html,o,l).attr({zIndex:2}).css(r).add()}),l.enabled&&!n.credits&&(e=l.href,n.credits=s.text(l.text,0,0).on("click",function(){e&&(location.href=e)}).attr({align:l.position.align,zIndex:8}).css(l.style).add().align(l.position)),n.hasRendered=!0},destroy:function(){var t,e=this,i=e.axes,n=e.series,r=e.container,s=r&&r.parentNode;for(Qe(e,"destroy"),Re[e.index]=_,e.renderTo.removeAttribute("data-highcharts-chart"),Ke(e),t=i.length;t--;)i[t]=i[t].destroy();for(t=n.length;t--;)n[t]=n[t].destroy();je("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(t){var i=e[t];i&&i.destroy&&(e[t]=i.destroy())}),r&&(r.innerHTML="",Ke(r),s&&L(r));for(t in e)delete e[t]},isReadyToRender:function(){var t=this;return!Ae&&ae==ae.top&&"complete"!==oe.readyState||Me&&!ae.canvg?(Me?ci.push(function(){t.firstRender()},t.options.global.canvasToolsURL):oe.attachEvent("onreadystatechange",function(){oe.detachEvent("onreadystatechange",t.firstRender),"complete"===oe.readyState&&t.firstRender()}),!1):!0},firstRender:function(){var t=this,e=t.options,i=t.callback;t.isReadyToRender()&&(t.getContainer(),Qe(t,"init"),t.resetMargins(),t.setChartSize(),t.propFromSeries(),t.getAxes(),je(e.series||[],function(e){t.initSeries(e)}),t.linkSeries(),Qe(t,"beforeRender"),t.pointer=new ui(t,e),t.render(),t.renderer.draw(),i&&i.apply(t,[t]),je(t.callbacks,function(e){e.apply(t,[t])}),t.cloneRenderTo(!0),Qe(t,"load"))},splashArray:function(t,e){var i=e[t],i=r(i)?i:[i,i,i,i];return[p(e[t+"Top"],i[0]),p(e[t+"Right"],i[1]),p(e[t+"Bottom"],i[2]),p(e[t+"Left"],i[3])]}},N.prototype.callbacks=[];var hi=Highcharts.CenteredSeriesMixin={getCenter:function(){var t,e,n=this.options,r=this.chart,s=2*(n.slicedOffset||0),o=r.plotWidth-2*s,a=r.plotHeight-2*s,r=n.center,n=[p(r[0],"50%"),p(r[1],"50%"),n.size||"100%",n.innerSize||0],l=pe(o,a);return Ue(n,function(n,r){return e=/%$/.test(n),t=2>r||2===r&&e,(e?[o,a,l,l][r]*i(n)/100:n)+(t?s:0)})}},gi=function(){};gi.prototype={init:function(t,e,i){return this.series=t,this.applyOptions(e,i),this.pointAttr={},t.options.colorByPoint&&(e=t.options.colors||t.chart.options.colors,this.color=this.color||e[t.colorCounter++],t.colorCounter===e.length)&&(t.colorCounter=0),t.chart.pointCount++,this},applyOptions:function(e,i){var n=this.series,r=n.pointValKey,e=gi.prototype.optionsToObject.call(this,e);return t(this,e),this.options=this.options?t(this.options,e):e,r&&(this.y=this[r]),this.x===_&&n&&(this.x=i===_?n.autoIncrement():i),this},optionsToObject:function(t){var e={},i=this.series,n=i.pointArrayMap||["y"],r=n.length,o=0,a=0;if("number"==typeof t||null===t)e[n[0]]=t;else if(s(t))for(t.length>r&&(i=typeof t[0],"string"===i?e.name=t[0]:"number"===i&&(e.x=t[0]),o++);r>a;)e[n[a++]]=t[o++];else"object"==typeof t&&(e=t,t.dataLabels&&(i._hasPointLabels=!0),t.marker&&(i._hasPointMarkers=!0));return e},destroy:function(){var t,e=this.series.chart,i=e.hoverPoints;e.pointCount--,i&&(this.setState(),h(i,this),!i.length)&&(e.hoverPoints=null),this===e.hoverPoint&&this.onMouseOut(),(this.graphic||this.dataLabel)&&(Ke(this),this.destroyElements()),this.legendItem&&e.legend.destroyItem(this);for(t in this)this[t]=null},destroyElements:function(){for(var t,e="graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),i=6;i--;)t=e[i],this[t]&&(this[t]=this[t].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(t,e){var i=this,n=i.series,r=n.chart,t=p(t,!i.selected);i.firePointEvent(t?"select":"unselect",{accumulate:e},function(){i.selected=i.options.selected=t,n.options.data[Ye(i,n.data)]=i.options,i.setState(t&&"select"),e||je(r.getSelectedPoints(),function(t){t.selected&&t!==i&&(t.selected=t.options.selected=!1,n.options.data[Ye(t,n.data)]=t.options,t.setState(""),t.firePointEvent("unselect"))})})},onMouseOver:function(t){var e=this.series,i=e.chart,n=i.tooltip,r=i.hoverPoint;r&&r!==this&&r.onMouseOut(),this.firePointEvent("mouseOver"),n&&(!n.shared||e.noSharedTooltip)&&n.refresh(this,t),this.setState("hover"),i.hoverPoint=this},onMouseOut:function(){var t=this.series.chart,e=t.hoverPoints;e&&-1!==Ye(this,e)||(this.firePointEvent("mouseOut"),this.setState(),t.hoverPoint=null)},tooltipFormatter:function(t){var e=this.series,i=e.tooltipOptions,n=p(i.valueDecimals,""),r=i.valuePrefix||"",s=i.valueSuffix||"";return je(e.pointArrayMap||["y"],function(e){e="{point."+e,(r||s)&&(t=t.replace(e+"}",r+e+"}"+s)),t=t.replace(e+"}",e+":,."+n+"f}")}),b(t,{point:this,series:this.series})},firePointEvent:function(t,e,i){var n=this,r=this.series.options;(r.point.events[t]||n.options&&n.options.events&&n.options.events[t])&&this.importEvents(),"click"===t&&r.allowPointSelect&&(i=function(t){n.select(null,t.ctrlKey||t.metaKey||t.shiftKey)}),Qe(this,t,e,i)},importEvents:function(){if(!this.hasImportedEvents){var t,i=e(this.series.options.point,this.options).events;this.events=i;for(t in i)Ze(this,t,i[t]);this.hasImportedEvents=!0}},setState:function(t,i){var n=this.plotX,r=this.plotY,s=this.series,o=s.options.states,a=ii[s.type].marker&&s.options.marker,l=a&&!a.enabled,h=a&&a.states[t],c=h&&h.enabled===!1,d=s.stateMarkerGraphic,u=this.marker||{},p=s.chart,f=this.pointAttr,t=t||"",i=i&&d;t===this.state&&!i||this.selected&&"select"!==t||o[t]&&o[t].enabled===!1||t&&(c||l&&!h.enabled)||t&&u.states&&u.states[t]&&u.states[t].enabled===!1||(this.graphic?(o=a&&this.graphic.symbolName&&f[t].r,this.graphic.attr(e(f[t],o?{x:n-o,y:r-o,width:2*o,height:2*o}:{}))):(t&&h&&(o=h.radius,u=u.symbol||s.symbol,d&&d.currentSymbol!==u&&(d=d.destroy()),d?d[i?"animate":"attr"]({x:n-o,y:r-o}):(s.stateMarkerGraphic=d=p.renderer.symbol(u,n-o,r-o,2*o,2*o).attr(f[t]).add(s.markerGroup),d.currentSymbol=u)),d&&d[t&&p.isInsidePlot(n,r,p.inverted)?"show":"hide"]()),this.state=t)}};var mi=function(){};mi.prototype={isCartesian:!0,type:"line",pointClass:gi,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],init:function(e,i){var n,r,s=this,o=e.series,a=function(t,e){return p(t.options.index,t._i)-p(e.options.index,e._i)};s.chart=e,s.options=i=s.setOptions(i),s.linkedSeries=[],s.bindAxes(),t(s,{name:i.name,state:"",pointAttr:{},visible:i.visible!==!1,selected:i.selected===!0}),Me&&(i.animation=!1),r=i.events;for(n in r)Ze(s,n,r[n]);(r&&r.click||i.point&&i.point.events&&i.point.events.click||i.allowPointSelect)&&(e.runTrackerClick=!0),s.getColor(),s.getSymbol(),je(s.parallelArrays,function(t){s[t+"Data"]=[]}),s.setData(i.data,!1),s.isCartesian&&(e.hasCartesianSeries=!0),o.push(s),s._i=o.length-1,T(o,a),this.yAxis&&T(this.yAxis.series,a),je(o,function(t,e){t.index=e,t.name=t.name||"Series "+(e+1)})},bindAxes:function(){var t,e=this,i=e.options,n=e.chart;je(e.axisTypes||[],function(r){je(n[r],function(n){t=n.options,(i[r]===t.index||i[r]!==_&&i[r]===t.id||i[r]===_&&0===t.index)&&(n.series.push(e),e[r]=n,n.isDirty=!0)}),!e[r]&&e.optionalAxis!==r&&M(18,!0)})},updateParallelArrays:function(t,e){var i=t.series,n=arguments;je(i.parallelArrays,"number"==typeof e?function(n){var r="y"===n&&i.toYData?i.toYData(t):t[n];i[n+"Data"][e]=r}:function(t){Array.prototype[e].apply(i[t+"Data"],Array.prototype.slice.call(n,2))})},autoIncrement:function(){var t=this.options,e=this.xIncrement,e=p(e,t.pointStart,0);return this.pointInterval=p(this.pointInterval,t.pointInterval,1),this.xIncrement=e+this.pointInterval,e},getSegments:function(){var t,e=-1,i=[],n=this.points,r=n.length;if(r)if(this.options.connectNulls){for(t=r;t--;)null===n[t].y&&n.splice(t,1);n.length&&(i=[n])}else je(n,function(t,s){null===t.y?(s>e+1&&i.push(n.slice(e+1,s)),e=s):s===r-1&&i.push(n.slice(e+1,s+1))});this.segments=i},setOptions:function(t){var i=this.chart,n=i.options.plotOptions,i=i.userOptions||{},r=i.plotOptions||{},s=n[this.type];return this.userOptions=t,n=e(s,n.series,t),this.tooltipOptions=e(X.tooltip,X.plotOptions[this.type].tooltip,i.tooltip,r.series&&r.series.tooltip,r[this.type]&&r[this.type].tooltip,t.tooltip),null===s.marker&&delete n.marker,n},getColor:function(){var t,e=this.options,i=this.userOptions,n=this.chart.options.colors,r=this.chart.counters;t=e.color||ii[this.type].color,t||e.colorByPoint||(c(i._colorIndex)?e=i._colorIndex:(i._colorIndex=r.color,e=r.color++),t=n[e]),this.color=t,r.wrapColor(n.length)},getSymbol:function(){var t=this.userOptions,e=this.options.marker,i=this.chart,n=i.options.symbols,i=i.counters;this.symbol=e.symbol,this.symbol||(c(t._symbolIndex)?t=t._symbolIndex:(t._symbolIndex=i.symbol,t=i.symbol++),this.symbol=n[t]),/^url/.test(this.symbol)&&(e.radius=0),i.wrapSymbol(n.length)},drawLegendSymbol:li.drawLineMarker,setData:function(t,e){var i,r=this,a=r.points,l=r.options,h=r.chart,c=null,d=r.xAxis,u=d&&!!d.categories;r.xIncrement=null,r.pointRange=u?1:l.pointRange,r.colorCounter=0;var t=t||[],f=t.length;i=l.turboThreshold;var g=this.xData,m=this.yData,y=r.pointArrayMap,y=y&&y.length;if(je(this.parallelArrays,function(t){r[t+"Data"].length=0}),i&&f>i){for(i=0;null===c&&f>i;)c=t[i],i++;if(o(c)){for(u=p(l.pointStart,0),l=p(l.pointInterval,1),i=0;f>i;i++)g[i]=u,m[i]=t[i],u+=l;r.xIncrement=u}else if(s(c))if(y)for(i=0;f>i;i++)l=t[i],g[i]=l[0],m[i]=l.slice(1,y+1);else for(i=0;f>i;i++)l=t[i],g[i]=l[0],m[i]=l[1];else M(12)}else for(i=0;f>i;i++)t[i]!==_&&(l={series:r},r.pointClass.prototype.applyOptions.apply(l,[t[i]]),r.updateParallelArrays(l,i),u&&l.name)&&(d.names[l.x]=l.name);for(n(m[0])&&M(14,!0),r.data=[],r.options.data=t,i=a&&a.length||0;i--;)a[i]&&a[i].destroy&&a[i].destroy();d&&(d.minRange=d.userMinRange),r.isDirty=r.isDirtyData=h.isDirtyBox=!0,p(e,!0)&&h.redraw(!1)},processData:function(t){var e,i=this.xData,n=this.yData,r=i.length;e=0;var s,o,a=this.xAxis,l=this.options,h=l.cropThreshold,c=this.isCartesian;if(c&&!this.isDirty&&!a.isDirty&&!this.yAxis.isDirty&&!t)return!1;for(c&&this.sorted&&(!h||r>h||this.forceCrop)&&(t=a.min,a=a.max,i[r-1]a?(i=[],n=[]):(i[0]a)&&(e=this.cropData(this.xData,this.yData,t,a),i=e.xData,n=e.yData,e=e.start,s=!0)),a=i.length-1;a>=0;a--)r=i[a]-i[a-1],r>0&&(o===_||o>r)?o=r:0>r&&this.requireSorting&&M(15);this.cropped=s,this.cropStart=e,this.processedXData=i,this.processedYData=n,null===l.pointRange&&(this.pointRange=o||1),this.closestPointRange=o},cropData:function(t,e,i,n){var r,s=t.length,o=0,a=s,l=p(this.cropShoulder,1);for(r=0;s>r;r++)if(t[r]>=i){o=ue(0,r-l);break}for(;s>r;r++)if(t[r]>n){a=r+l;break}return{xData:t.slice(o,a),yData:e.slice(o,a),start:o,end:a}},generatePoints:function(){var t,e,i,n,r=this.options.data,s=this.data,o=this.processedXData,a=this.processedYData,l=this.pointClass,h=o.length,c=this.cropStart||0,d=this.hasGroupedData,p=[];for(s||d||(s=[],s.length=r.length,s=this.data=s),n=0;h>n;n++)e=c+n,d?p[n]=(new l).init(this,[o[n]].concat(u(a[n]))):(s[e]?i=s[e]:r[e]!==_&&(s[e]=i=(new l).init(this,r[e],o[n])),p[n]=i);if(s&&(h!==(t=s.length)||d))for(n=0;t>n;n++)n===c&&!d&&(n+=h),s[n]&&(s[n].destroyElements(),s[n].plotX=_);this.data=s,this.points=p},setStackedPoints:function(){if(this.options.stacking&&(this.visible===!0||this.chart.options.chart.ignoreHiddenSeries===!1)){var t,e,i,n,r,s=this.processedXData,o=this.processedYData,a=[],l=o.length,h=this.options,c=h.threshold,d=h.stack,h=h.stacking,u=this.stackKey,p="-"+u,f=this.negStacks,g=this.yAxis,m=g.stacks,y=g.oldStacks;for(i=0;l>i;i++)n=s[i],r=o[i],e=(t=f&&c>r)?p:u,m[e]||(m[e]={}),m[e][n]||(y[e]&&y[e][n]?(m[e][n]=y[e][n],m[e][n].total=null):m[e][n]=new B(g,g.options.stackLabels,t,n,d,h)),e=m[e][n],e.points[this.index]=[e.cum||0],"percent"===h?(t=t?u:p,f&&m[t]&&m[t][n]?(t=m[t][n],e.total=t.total=ue(t.total,e.total)+fe(r)||0):e.total+=fe(r)||0):e.total+=r||0,e.cum=(e.cum||0)+(r||0),e.points[this.index].push(e.cum),a[i]=e.cum;"percent"===h&&(g.usePercentage=!0),this.stackedYData=a,g.oldStacks={}}},setPercentStacks:function(){var t=this,e=t.stackKey,i=t.yAxis.stacks;je([e,"-"+e],function(e){for(var n,r,s,o=t.xData.length;o--;)r=t.xData[o],n=(s=i[e]&&i[e][r])&&s.points[t.index],(r=n)&&(s=s.total?100/s.total:0,r[0]=I(r[0]*s),r[1]=I(r[1]*s),t.stackedYData[o]=r[1])})},getExtremes:function(t){var e,i=this.yAxis,n=this.processedXData,r=[],s=0;e=this.xAxis.getExtremes();var o,a,l,h,c=e.min,d=e.max,t=t||this.stackedYData||this.processedYData;for(e=t.length,h=0;e>h;h++)if(a=n[h],l=t[h],o=null!==l&&l!==_&&(!i.isLog||l.length||l>0),a=this.getExtremesFromAll||this.cropped||(n[h+1]||a)>=c&&(n[h-1]||a)<=d,o&&a)if(o=l.length)for(;o--;)null!==l[o]&&(r[s++]=l[o]);else r[s++]=l;this.dataMin=p(void 0,C(r)),this.dataMax=p(void 0,P(r))},translate:function(){this.processedXData||this.processData(),this.generatePoints();for(var t=this.options,e=t.stacking,i=this.xAxis,n=i.categories,r=this.yAxis,s=this.points,a=s.length,l=!!this.modifyValue,h=t.pointPlacement,d="between"===h||o(h),u=t.threshold,t=0;a>t;t++){var f=s[t],g=f.x,m=f.y,y=f.low,v=e&&r.stacks[(this.negStacks&&u>m?"-":"")+this.stackKey];r.isLog&&0>=m&&(f.y=m=null),f.plotX=i.translate(g,0,0,0,1,h,"flags"===this.type),e&&this.visible&&v&&v[g]&&(v=v[g],m=v.points[this.index],y=m[0],m=m[1],0===y&&(y=p(u,r.min)),r.isLog&&0>=y&&(y=null),f.total=f.stackTotal=v.total,f.percentage="percent"===e&&f.y/v.total*100,f.stackY=m,v.setOffset(this.pointXOffset||0,this.barW||0)),f.yBottom=c(y)?r.translate(y,0,1,0,1):null,l&&(m=this.modifyValue(m,f)),f.plotY="number"==typeof m&&1/0!==m?r.translate(m,0,1,0,1):_,f.clientX=d?i.translate(g,0,0,0,1):f.plotX,f.negative=f.y<(u||0),f.category=n&&n[f.x]!==_?n[f.x]:f.x}this.getSegments()},setTooltipPoints:function(t){var e,i,n,r,s=[],o=this.xAxis,a=o&&o.getExtremes(),l=o?o.tooltipLen||o.len:this.chart.plotSizeX,h=[];if(this.options.enableMouseTracking!==!1){for(t&&(this.tooltipPoints=null),je(this.segments||this.points,function(t){s=s.concat(t)}),o&&o.reversed&&(s=s.reverse()),this.orderTooltipPoints&&this.orderTooltipPoints(s),t=s.length,r=0;t>r;r++)if(o=s[r],e=o.x,e>=a.min&&e<=a.max)for(n=s[r+1],e=i===_?0:i+1,i=s[r+1]?pe(ue(0,ce((o.clientX+(n?n.wrappedClientX||n.clientX:l))/2)),l):l;e>=0&&i>=e;)h[e++]=o;this.tooltipPoints=h}},tooltipHeaderFormatter:function(t){var e,i=this.tooltipOptions,n=i.dateTimeLabelFormats,r=i.xDateFormat||n.year,s=this.xAxis,a=s&&"datetime"===s.options.type,i=i.headerFormat,s=s&&s.closestPointRange;if(a&&!r)if(s){for(e in j)if(j[e]>=s){r=n[e];break}}else r=n.day;return a&&r&&o(t.key)&&(i=i.replace("{point.key}","{point.key:"+r+"}")),b(i,{point:t,series:this})},onMouseOver:function(){var t=this.chart,e=t.hoverSeries;e&&e!==this&&e.onMouseOut(),this.options.events.mouseOver&&Qe(this,"mouseOver"),this.setState("hover"),t.hoverSeries=this},onMouseOut:function(){var t=this.options,e=this.chart,i=e.tooltip,n=e.hoverPoint;n&&n.onMouseOut(),this&&t.events.mouseOut&&Qe(this,"mouseOut"),i&&!t.stickyTracking&&(!i.shared||this.noSharedTooltip)&&i.hide(),this.setState(),e.hoverSeries=null},animate:function(e){var i,n=this,s=n.chart,o=s.renderer;i=n.options.animation;var a,l=s.clipBox,h=s.inverted;i&&!r(i)&&(i=ii[n.type].animation),a="_sharedClip"+i.duration+i.easing,e?(e=s[a],i=s[a+"m"],e||(s[a]=e=o.clipRect(t(l,{width:0})),s[a+"m"]=i=o.clipRect(-99,h?-s.plotLeft:-s.plotTop,99,h?s.chartWidth:s.chartHeight)),n.group.clip(e),n.markerGroup.clip(i),n.sharedClipKey=a):((e=s[a])&&(e.animate({width:s.plotSizeX},i),s[a+"m"].animate({width:s.plotSizeX+99},i)),n.animate=null,n.animationTimeout=setTimeout(function(){n.afterAnimate()},i.duration))},afterAnimate:function(){var t=this.chart,e=this.sharedClipKey,i=this.group;i&&this.options.clip!==!1&&(i.clip(t.clipRect),this.markerGroup.clip()),setTimeout(function(){e&&t[e]&&(t[e]=t[e].destroy(),t[e+"m"]=t[e+"m"].destroy())},100)},drawPoints:function(){var e,i,n,r,s,o,a,l,h,c,d=this.points,u=this.chart,f=this.options.marker,g=this.pointAttr[""],m=this.markerGroup;if(f.enabled||this._hasPointMarkers)for(r=d.length;r--;)s=d[r],i=ce(s.plotX),n=s.plotY,h=s.graphic,a=s.marker||{},e=f.enabled&&a.enabled===_||a.enabled,c=u.isInsidePlot(he(i),n,u.inverted),e&&n!==_&&!isNaN(n)&&null!==s.y?(e=s.pointAttr[s.selected?"select":""]||g,o=e.r,a=p(a.symbol,this.symbol),l=0===a.indexOf("url"),h?h.attr({visibility:c?Ae?"inherit":"visible":"hidden"}).animate(t({x:i-o,y:n-o},h.symbolName?{width:2*o,height:2*o}:{})):c&&(o>0||l)&&(s.graphic=u.renderer.symbol(a,i-o,n-o,2*o,2*o).attr(e).add(m))):h&&(s.graphic=h.destroy())},convertAttribs:function(t,e,i,n){var r,s,o=this.pointAttrToOptions,a={},t=t||{},e=e||{},i=i||{},n=n||{};for(r in o)s=o[r],a[r]=p(t[s],e[r],i[r],n[r]);return a},getAttribs:function(){var e,i=this,n=i.options,r=ii[i.type].marker?n.marker:n,s=r.states,o=s.hover,a=i.color;e={stroke:a,fill:a};var l,h,d=i.points||[],u=[],p=i.pointAttrToOptions;l=n.turboThreshold;var f,g=n.negativeColor,m=r.lineColor;if(n.marker?(o.radius=o.radius||r.radius+2,o.lineWidth=o.lineWidth||r.lineWidth+1):o.color=o.color||oi(o.color||a).brighten(o.brightness).get(),u[""]=i.convertAttribs(r,e),je(["hover","select"],function(t){u[t]=i.convertAttribs(s[t],u[""])}),i.pointAttr=u,a=d.length,!l||l>a)for(;a--;){if(l=d[a],(r=l.options&&l.options.marker||l.options)&&r.enabled===!1&&(r.radius=0),l.negative&&g&&(l.color=l.fillColor=g),e=n.colorByPoint||l.color,l.options)for(f in p)c(r[p[f]])&&(e=!0);e?(r=r||{},h=[],s=r.states||{},e=s.hover=s.hover||{},n.marker||(e.color=e.color||o.color||oi(l.color).brighten(e.brightness||o.brightness).get()),h[""]=i.convertAttribs(t({color:l.color,fillColor:l.color,lineColor:null===m?l.color:_},r),u[""]),h.hover=i.convertAttribs(s.hover,u.hover,h[""]),h.select=i.convertAttribs(s.select,u.select,h[""])):h=u,l.pointAttr=h}},destroy:function(){var t,e,i,n,r,s=this,o=s.chart,a=/AppleWebKit\/533/.test(xe),l=s.data||[];for(Qe(s,"destroy"),Ke(s),je(s.axisTypes||[],function(t){(r=s[t])&&(h(r.series,s),r.isDirty=r.forceRedraw=!0)}),s.legendItem&&s.chart.legend.destroyItem(s),e=l.length;e--;)(i=l[e])&&i.destroy&&i.destroy();s.points=null,clearTimeout(s.animationTimeout),je("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),function(e){s[e]&&(t=a&&"group"===e?"hide":"destroy",s[e][t]())}),o.hoverSeries===s&&(o.hoverSeries=null),h(o.series,s);for(n in s)delete s[n]},getSegmentPath:function(t){var e=this,i=[],n=e.options.step;return je(t,function(r,s){var o,a=r.plotX,l=r.plotY; +e.getPointSpline?i.push.apply(i,e.getPointSpline(t,r,s)):(i.push(s?"L":"M"),n&&s&&(o=t[s-1],"right"===n?i.push(o.plotX,l):"center"===n?i.push((o.plotX+a)/2,o.plotY,(o.plotX+a)/2,l):i.push(a,o.plotY)),i.push(r.plotX,r.plotY))}),i},getGraphPath:function(){var t,e=this,i=[],n=[];return je(e.segments,function(r){t=e.getSegmentPath(r),r.length>1?i=i.concat(t):n.push(r[0])}),e.singlePoints=n,e.graphPath=i},drawGraph:function(){var t=this,e=this.options,i=[["graph",e.lineColor||this.color]],n=e.lineWidth,r=e.dashStyle,s="square"!==e.linecap,o=this.getGraphPath(),a=e.negativeColor;a&&i.push(["graphNeg",a]),je(i,function(i,a){var l=i[0],h=t[l];h?(ei(h),h.animate({d:o})):n&&o.length&&(h={stroke:i[1],"stroke-width":n,zIndex:1},r?h.dashstyle=r:s&&(h["stroke-linecap"]=h["stroke-linejoin"]="round"),t[l]=t.chart.renderer.path(o).attr(h).add(t.group).shadow(!a&&e.shadow))})},clipNeg:function(){var t,e=this.options,i=this.chart,n=i.renderer,r=e.negativeColor||e.negativeFillColor,s=this.graph,o=this.area,a=this.posClip,l=this.negClip;t=i.chartWidth;var h=i.chartHeight,c=ue(t,h),d=this.yAxis;r&&(s||o)&&(r=he(d.toPixels(e.threshold||0,!0)),0>r&&(c-=r),e={x:0,y:0,width:c,height:r},c={x:0,y:r,width:c,height:c},i.inverted&&(e.height=c.y=i.plotWidth-r,n.isVML&&(e={x:i.plotWidth-r-i.plotLeft,y:0,width:t,height:h},c={x:r+i.plotLeft-t,y:0,width:i.plotLeft+r,height:t})),d.reversed?(i=c,t=e):(i=e,t=c),a?(a.animate(i),l.animate(t)):(this.posClip=a=n.clipRect(i),this.negClip=l=n.clipRect(t),s&&this.graphNeg&&(s.clip(a),this.graphNeg.clip(l)),o&&(o.clip(a),this.areaNeg.clip(l))))},invertGroups:function(){function t(){var t={width:e.yAxis.len,height:e.xAxis.len};je(["group","markerGroup"],function(i){e[i]&&e[i].attr(t).invert()})}var e=this,i=e.chart;e.xAxis&&(Ze(i,"resize",t),Ze(e,"destroy",function(){Ke(i,"resize",t)}),t(),e.invertGroups=t)},plotGroup:function(t,e,i,n,r){var s=this[t],o=!s;return o&&(this[t]=s=this.chart.renderer.g(e).attr({visibility:i,zIndex:n||.1}).add(r)),s[o?"attr":"animate"](this.getPlotBox()),s},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var t,e=this.chart,i=this.options,n=i.animation&&!!this.animate&&e.renderer.isSVG,r=this.visible?"visible":"hidden",s=i.zIndex,o=this.hasRendered,a=e.seriesGroup;t=this.plotGroup("group","series",r,s,a),this.markerGroup=this.plotGroup("markerGroup","markers",r,s,a),n&&this.animate(!0),this.getAttribs(),t.inverted=this.isCartesian?e.inverted:!1,this.drawGraph&&(this.drawGraph(),this.clipNeg()),this.drawDataLabels&&this.drawDataLabels(),this.visible&&this.drawPoints(),this.options.enableMouseTracking!==!1&&this.drawTracker(),e.inverted&&this.invertGroups(),i.clip!==!1&&!this.sharedClipKey&&!o&&t.clip(e.clipRect),n?this.animate():o||this.afterAnimate(),this.isDirty=this.isDirtyData=!1,this.hasRendered=!0},redraw:function(){var t=this.chart,e=this.isDirtyData,i=this.group,n=this.xAxis,r=this.yAxis;i&&(t.inverted&&i.attr({width:t.plotWidth,height:t.plotHeight}),i.animate({translateX:p(n&&n.left,t.plotLeft),translateY:p(r&&r.top,t.plotTop)})),this.translate(),this.setTooltipPoints(!0),this.render(),e&&Qe(this,"updatedData")},setState:function(t){var e=this.options,i=this.graph,n=this.graphNeg,r=e.states,e=e.lineWidth,t=t||"";this.state!==t&&(this.state=t,r[t]&&r[t].enabled===!1||(t&&(e=r[t].lineWidth||e+1),i&&!i.dashstyle&&(t={"stroke-width":e},i.attr(t),n&&n.attr(t))))},setVisible:function(t,e){var i,n=this,r=n.chart,s=n.legendItem,o=r.options.chart.ignoreHiddenSeries,a=n.visible;i=(n.visible=t=n.userOptions.visible=t===_?!a:t)?"show":"hide",je(["group","dataLabelsGroup","markerGroup","tracker"],function(t){n[t]&&n[t][i]()}),r.hoverSeries===n&&n.onMouseOut(),s&&r.legend.colorizeItem(n,t),n.isDirty=!0,n.options.stacking&&je(r.series,function(t){t.options.stacking&&t.visible&&(t.isDirty=!0)}),je(n.linkedSeries,function(e){e.setVisible(t,!1)}),o&&(r.isDirtyBox=!0),e!==!1&&r.redraw(),Qe(n,i)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(t){this.selected=t=t===_?!this.selected:t,this.checkbox&&(this.checkbox.checked=t),Qe(this,t?"select":"unselect")},drawTracker:Xe.drawTrackerGraph},t(N.prototype,{addSeries:function(t,e,i){var n,r=this;return t&&(e=p(e,!0),Qe(r,"addSeries",{options:t},function(){n=r.initSeries(t),r.isDirtyLegend=!0,r.linkSeries(),e&&r.redraw(i)})),n},addAxis:function(t,i,n,r){var s=i?"xAxis":"yAxis",o=this.options;new z(this,e(t,{index:this[s].length,isX:i})),o[s]=u(o[s]||{}),o[s].push(t),p(n,!0)&&this.redraw(r)},showLoading:function(e){var i=this.options,n=this.loadingDiv,r=i.loading;n||(this.loadingDiv=n=g(ze,{className:"highcharts-loading"},t(r.style,{zIndex:10,display:Be}),this.container),this.loadingSpan=g("span",null,r.labelStyle,n)),this.loadingSpan.innerHTML=e||i.lang.loading,this.loadingShown||(f(n,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),ti(n,{opacity:r.style.opacity},{duration:r.showDuration||0}),this.loadingShown=!0)},hideLoading:function(){var t=this.options,e=this.loadingDiv;e&&ti(e,{opacity:0},{duration:t.loading.hideDuration||100,complete:function(){f(e,{display:Be})}}),this.loadingShown=!1}}),t(gi.prototype,{update:function(t,e,i){var n,s=this,o=s.series,a=s.graphic,l=o.data,h=o.chart,c=o.options,e=p(e,!0);s.firePointEvent("update",{options:t},function(){s.applyOptions(t),r(t)&&(o.getAttribs(),a&&(t&&t.marker&&t.marker.symbol?s.graphic=a.destroy():a.attr(s.pointAttr[s.state||""])),t&&t.dataLabels&&s.dataLabel&&(s.dataLabel=s.dataLabel.destroy())),n=Ye(s,l),o.updateParallelArrays(s,n),c.data[n]=s.options,o.isDirty=o.isDirtyData=!0,!o.fixedBox&&o.hasCartesianSeries&&(h.isDirtyBox=!0),"point"===c.legendType&&h.legend.destroyItem(s),e&&h.redraw(i)})},remove:function(t,e){var i,n=this,r=n.series,s=r.points,o=r.chart,a=r.data;D(e,o),t=p(t,!0),n.firePointEvent("remove",null,function(){i=Ye(n,a),a.length===s.length&&s.splice(i,1),a.splice(i,1),r.options.data.splice(i,1),r.updateParallelArrays(n,"splice",i,1),n.destroy(),r.isDirty=!0,r.isDirtyData=!0,t&&o.redraw()})}}),t(mi.prototype,{addPoint:function(t,e,i,n){var r,s=this.options,o=this.data,a=this.graph,l=this.area,h=this.chart,c=this.xAxis&&this.xAxis.names,d=a&&a.shift||0,u=s.data,f=this.xData;if(D(n,h),i&&je([a,l,this.graphNeg,this.areaNeg],function(t){t&&(t.shift=d+1)}),l&&(l.isArea=!0),e=p(e,!0),n={series:this},this.pointClass.prototype.applyOptions.apply(n,[t]),a=n.x,l=f.length,this.requireSorting&&aa;)l--;this.updateParallelArrays(n,"splice",l),this.updateParallelArrays(n,l),c&&(c[a]=n.name),u.splice(l,0,t),r&&(this.data.splice(l,0,null),this.processData()),"point"===s.legendType&&this.generatePoints(),i&&(o[0]&&o[0].remove?o[0].remove(!1):(o.shift(),this.updateParallelArrays(n,"shift"),u.shift())),this.isDirtyData=this.isDirty=!0,e&&(this.getAttribs(),h.redraw())},remove:function(t,e){var i=this,n=i.chart,t=p(t,!0);i.isRemoving||(i.isRemoving=!0,Qe(i,"remove",null,function(){i.destroy(),n.isDirtyLegend=n.isDirtyBox=!0,n.linkSeries(),t&&n.redraw(e)})),i.isRemoving=!1},update:function(i,n){var r,s=this.chart,o=this.type,a=He[o].prototype,i=e(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},i);this.remove(!1);for(r in a)a.hasOwnProperty(r)&&(this[r]=_);t(this,He[i.type||o].prototype),this.init(s,i),p(n,!0)&&s.redraw(!1)}}),t(z.prototype,{update:function(i,n){var r=this.chart,i=r.options[this.coll][this.options.index]=e(this.userOptions,i);this.destroy(!0),this._addedPlotLB=this.userMin=this.userMax=_,this.init(r,t(i,{events:_})),r.isDirtyBox=!0,p(n,!0)&&r.redraw()},remove:function(t){var e=this.chart,i=this.coll;je(this.series,function(t){t.remove(!1)}),h(e.axes,this),h(e[i],this),e.options[i].splice(this.options.index,1),je(e[i],function(t,e){t.options.index=e}),this.destroy(),e.isDirtyBox=!0,p(t,!0)&&e.redraw()},setTitle:function(t,e){this.update({title:t},e)},setCategories:function(t,e){this.update({categories:t},e)}});var yi=m(mi);He.line=yi,ii.area=e(We,{threshold:0});var vi=m(mi,{type:"area",getSegments:function(){var t,e,i,n,r,s=[],o=[],a=[],l=this.xAxis,h=this.yAxis,c=h.stacks[this.stackKey],d={},u=this.points,p=this.options.connectNulls;if(this.options.stacking&&!this.cropped){for(n=0;n=0;e--)s=p(t[e].yBottom,o),et&&r>l?(r=ue(t,l),o=2*l-r):t>r&&l>r&&(r=pe(t,l),o=2*l-r),o>c&&o>l?(o=ue(c,l),r=2*l-o):c>o&&l>o&&(o=pe(c,l),r=2*l-o),e.rightContX=s,e.rightContY=o}return i?(e=["C",h.rightContX||h.plotX,h.rightContY||h.plotY,n||a,r||l,a,l],h.rightContX=h.rightContY=null):e=["M",a,l],e}}),He.spline=yi,ii.areaspline=e(ii.area),vi=vi.prototype,yi=m(yi,{type:"areaspline",closedStacks:!0,getSegmentPath:vi.getSegmentPath,closeSegment:vi.closeSegment,drawGraph:vi.drawGraph,drawLegendSymbol:li.drawRectangle}),He.areaspline=yi,ii.column=e(We,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0}),yi=m(mi,{type:"column",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){mi.prototype.init.apply(this,arguments);var t=this,e=t.chart;e.hasRendered&&je(e.series,function(e){e.type===t.type&&(e.isDirty=!0)})},getColumnMetrics:function(){var t,e,i=this,n=i.options,r=i.xAxis,s=i.yAxis,o=r.reversed,a={},l=0;n.grouping===!1?l=1:je(i.chart.series,function(n){var r=n.options,o=n.yAxis;n.type===i.type&&n.visible&&s.len===o.len&&s.pos===o.pos&&(r.stacking?(t=n.stackKey,a[t]===_&&(a[t]=l++),e=a[t]):r.grouping!==!1&&(e=l++),n.columnIndex=e)});var r=pe(fe(r.transA)*(r.ordinalSlope||n.pointRange||r.closestPointRange||1),r.len),h=r*n.groupPadding,d=(r-2*h)/l,u=n.pointWidth,n=c(u)?(d-u)/2:d*n.pointPadding,u=p(u,d-2*n);return i.columnMetrics={width:u,offset:n+(h+((o?l-(i.columnIndex||0):i.columnIndex)||0)*d-r/2)*(o?-1:1)}},translate:function(){var t=this.chart,e=this.options,i=e.borderWidth,n=this.yAxis,r=this.translatedThreshold=n.getThreshold(e.threshold),s=p(e.minPointLength,5),e=this.getColumnMetrics(),o=e.width,a=this.barW=de(ue(o,1+2*i)),l=this.pointXOffset=e.offset,h=-(i%2?.5:0),c=i%2?.5:1;t.renderer.isVML&&t.inverted&&(c+=1),mi.prototype.translate.apply(this),je(this.points,function(t){var e,i=p(t.yBottom,r),d=pe(ue(-999-i,t.plotY),n.len+999+i),u=t.plotX+l,f=a,g=pe(d,i),d=ue(d,i)-g;fe(d)s?i-s:r-(n.translate(t.y,0,1,0,1)<=r?s:0))),t.barX=u,t.pointWidth=o,i=fe(u)<.5,f=he(u+f)+h,u=he(u)+h,f-=u,e=fe(g)<.5,d=he(g+d)+c,g=he(g)+c,d-=g,i&&(u+=1,f-=1),e&&(g-=1,d+=1),t.shapeType="rect",t.shapeArgs={x:u,y:g,width:f,height:d}})},getSymbol:Oe,drawLegendSymbol:li.drawRectangle,drawGraph:Oe,drawPoints:function(){var t,i=this,n=this.chart,r=i.options,s=n.renderer,o=n.options.animationLimit||250;je(i.points,function(a){var l=a.plotY,h=a.graphic;l===_||isNaN(l)||null===a.y?h&&(a.graphic=h.destroy()):(t=a.shapeArgs,h?(ei(h),h[n.pointCount{series.name}
',pointFormat:"x: {point.x}
y: {point.y}
",followPointer:!0},stickyTracking:!1}),yi=m(mi,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],takeOrdinalPosition:!1,drawTracker:Xe.drawTrackerPoint,drawGraph:function(){this.options.lineWidth&&mi.prototype.drawGraph.call(this)},setTooltipPoints:Oe}),He.scatter=yi,ii.pie=e(We,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}}),We={type:"pie",isCartesian:!1,pointClass:m(gi,{init:function(){gi.prototype.init.apply(this,arguments);var e,i=this;return i.y<0&&(i.y=null),t(i,{visible:i.visible!==!1,name:p(i.name,"Slice")}),e=function(t){i.slice("select"===t.type)},Ze(i,"select",e),Ze(i,"unselect",e),i},setVisible:function(t){var e,i=this,n=i.series,r=n.chart;i.visible=i.options.visible=t=t===_?!i.visible:t,n.options.data[Ye(i,n.data)]=i.options,e=t?"show":"hide",je(["graphic","dataLabel","connector","shadowGroup"],function(t){i[t]&&i[t][e]()}),i.legendItem&&r.legend.colorizeItem(i,t),!n.isDirty&&n.options.ignoreHiddenPoint&&(n.isDirty=!0,r.redraw())},slice:function(t,e,i){var n=this.series;D(i,n.chart),p(e,!0),this.sliced=this.options.sliced=t=c(t)?t:!this.sliced,n.options.data[Ye(this,n.data)]=this.options,t=t?this.slicedTranslation:{translateX:0,translateY:0},this.graphic.animate(t),this.shadowGroup&&this.shadowGroup.animate(t)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:Oe,animate:function(t){var e=this,i=e.points,n=e.startAngleRad;t||(je(i,function(t){var i=t.graphic,t=t.shapeArgs;i&&(i.attr({r:e.center[3]/2,start:n,end:n}),i.animate({r:t.r,start:t.start,end:t.end},e.options.animation))}),e.animate=null)},setData:function(t,e){mi.prototype.setData.call(this,t,!1),this.processData(),this.generatePoints(),p(e,!0)&&this.chart.redraw()},generatePoints:function(){var t,e,i,n,r=0,s=this.options.ignoreHiddenPoint;for(mi.prototype.generatePoints.call(this),e=this.points,i=e.length,t=0;i>t;t++)n=e[t],r+=s&&!n.visible?0:n.y;for(this.total=r,t=0;i>t;t++)n=e[t],n.percentage=r>0?n.y/r*100:0,n.total=r},translate:function(t){this.generatePoints();var e,i,n,r,s,o=0,a=this.options,l=a.slicedOffset,h=l+a.borderWidth,c=a.startAngle||0,d=this.startAngleRad=ye/180*(c-90),c=(this.endAngleRad=ye/180*((a.endAngle||c+360)-90))-d,u=this.points,p=a.dataLabels.distance,a=a.ignoreHiddenPoint,f=u.length;for(t||(this.center=t=this.getCenter()),this.getX=function(e,i){return n=le.asin((e-t[1])/(t[2]/2+p)),t[0]+(i?-1:1)*ge(n)*(t[2]/2+p)},r=0;f>r;r++)s=u[r],e=d+o*c,(!a||s.visible)&&(o+=s.percentage/100),i=d+o*c,s.shapeType="arc",s.shapeArgs={x:t[0],y:t[1],r:t[2]/2,innerR:t[3]/2,start:he(1e3*e)/1e3,end:he(1e3*i)/1e3},n=(i+e)/2,n>.75*c&&(n-=2*ye),s.slicedTranslation={translateX:he(ge(n)*l),translateY:he(me(n)*l)},e=ge(n)*t[2]/2,i=me(n)*t[2]/2,s.tooltipPos=[t[0]+.7*e,t[1]+.7*i],s.half=-ye/2>n||n>ye/2?1:0,s.angle=n,h=pe(h,p/2),s.labelPos=[t[0]+e+ge(n)*p,t[1]+i+me(n)*p,t[0]+e+ge(n)*h,t[1]+i+me(n)*h,t[0]+e,t[1]+i,0>p?"center":s.half?"right":"left",n]},setTooltipPoints:Oe,drawGraph:null,drawPoints:function(){var e,i,n,r,s=this,o=s.chart.renderer,a=s.options.shadow;a&&!s.shadowGroup&&(s.shadowGroup=o.g("shadow").add(s.group)),je(s.points,function(l){i=l.graphic,r=l.shapeArgs,n=l.shadowGroup,a&&!n&&(n=l.shadowGroup=o.g("shadow").add(s.shadowGroup)),e=l.sliced?l.slicedTranslation:{translateX:0,translateY:0},n&&n.attr(e),i?i.animate(t(r,e)):l.graphic=i=o.arc(r).setRadialReference(s.center).attr(l.pointAttr[l.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(e).add(s.group).shadow(a,n),void 0!==l.visible&&l.setVisible(l.visible)})},sortByAngle:function(t,e){t.sort(function(t,i){return void 0!==t.angle&&(i.angle-t.angle)*e})},drawTracker:Xe.drawTrackerPoint,drawLegendSymbol:li.drawRectangle,getCenter:hi.getCenter,getSymbol:Oe},We=m(mi,We),He.pie=We,mi.prototype.drawDataLabels=function(){var i,n,r,s,o=this,a=o.options,l=a.cursor,h=a.dataLabels,a=o.points;(h.enabled||o._hasPointLabels)&&(o.dlProcessOptions&&o.dlProcessOptions(h),s=o.plotGroup("dataLabelsGroup","data-labels",o.visible?"visible":"hidden",h.zIndex||6),n=h,je(a,function(a){var d,u,f,g=a.dataLabel,m=a.connector,y=!0;if(i=a.options&&a.options.dataLabels,d=p(i&&i.enabled,n.enabled),g&&!d)a.dataLabel=g.destroy();else if(d){if(h=e(n,i),d=h.rotation,u=a.getLabelConfig(),r=h.format?b(h.format,u):h.formatter.call(u,h),h.style.color=p(h.color,h.style.color,o.color,"black"),g)c(r)?(g.attr({text:r}),y=!1):(a.dataLabel=g=g.destroy(),m&&(a.connector=m.destroy()));else if(c(r)){g={fill:h.backgroundColor,stroke:h.borderColor,"stroke-width":h.borderWidth,r:h.borderRadius||0,rotation:d,padding:h.padding,zIndex:1};for(f in g)g[f]===_&&delete g[f];g=a.dataLabel=o.chart.renderer[d?"text":"label"](r,0,-999,null,null,null,h.useHTML).attr(g).css(t(h.style,l&&{cursor:l})).add(s).shadow(h.shadow)}g&&o.alignDataLabel(a,g,h,null,y)}}))},mi.prototype.alignDataLabel=function(e,i,n,r,s){var o=this.chart,a=o.inverted,l=p(e.plotX,-999),h=p(e.plotY,-999),c=i.getBBox();(e=this.visible&&(e.series.forceDL||o.isInsidePlot(e.plotX,e.plotY,a)))&&(r=t({x:a?o.plotWidth-h:l,y:he(a?o.plotHeight-l:h),width:0,height:0},r),t(n,{width:c.width,height:c.height}),n.rotation?(a={align:n.align,x:r.x+n.x+r.width/2,y:r.y+n.y+r.height/2},i[s?"attr":"animate"](a)):(i.align(n,null,r),a=i.alignAttr,"justify"===p(n.overflow,"justify")?this.justifyDataLabel(i,n,a,c,r,s):p(n.crop,!0)&&(e=o.isInsidePlot(a.x,a.y)&&o.isInsidePlot(a.x+c.width,a.y+c.height)))),e||(i.attr({y:-999}),i.placed=!1)},mi.prototype.justifyDataLabel=function(t,e,i,n,r,s){var o,a,l=this.chart,h=e.align,c=e.verticalAlign;o=i.x,0>o&&("right"===h?e.align="left":e.x=-o,a=!0),o=i.x+n.width,o>l.plotWidth&&("left"===h?e.align="right":e.x=l.plotWidth-o,a=!0),o=i.y,0>o&&("bottom"===c?e.verticalAlign="top":e.y=-o,a=!0),o=i.y+n.height,o>l.plotHeight&&("top"===c?e.verticalAlign="bottom":e.y=l.plotHeight-o,a=!0),a&&(t.placed=!s,t.align(e,null,r))},He.pie&&(He.pie.prototype.drawDataLabels=function(){var t,e,i,n,r,s,o,a,l,h,c,d,u=this,f=u.data,g=u.chart,m=u.options.dataLabels,y=p(m.connectorPadding,10),v=p(m.connectorWidth,1),x=g.plotWidth,g=g.plotHeight,b=p(m.softConnector,!0),w=m.distance,k=u.center,S=k[2]/2,T=k[1],C=w>0,A=[[],[]],L=[0,0,0,0],M=function(t,e){return e.y-t.y};if(u.visible&&(m.enabled||u._hasPointLabels)){for(mi.prototype.drawDataLabels.apply(u),je(f,function(t){t.dataLabel&&t.visible&&A[t.half].push(t)}),c=0;!o&&f[c];)o=f[c]&&f[c].dataLabel&&(f[c].dataLabel.getBBox().height||21),c++;for(c=2;c--;){var I,f=[],D=[],E=A[c],O=E.length;if(u.sortByAngle(E,c-.5),w>0){for(d=T-S-w;T+S+w>=d;d+=o)f.push(d);if(r=f.length,O>r){for(t=[].concat(E),t.sort(M),d=O;d--;)t[d].rank=d;for(d=O;d--;)E[d].rank>=r&&E.splice(d,1);O=E.length}for(d=0;O>d;d++){t=E[d],s=t.labelPos,t=9999;var R,z;for(z=0;r>z;z++)R=fe(f[z]-s[1]),t>R&&(t=R,I=z);if(d>I&&null!==f[d])I=d;else for(O-d+I>r&&null!==f[d]&&(I=r-O+d);null===f[I];)I++;D.push({i:I,y:f[I]}),f[I]=null}D.sort(M)}for(d=0;O>d;d++)t=E[d],s=t.labelPos,n=t.dataLabel,h=t.visible===!1?"hidden":"visible",t=s[1],w>0?(r=D.pop(),I=r.i,l=r.y,(t>l&&null!==f[I+1]||l>t&&null!==f[I-1])&&(l=t)):l=t,a=m.justify?k[0]+(c?-1:1)*(S+w):u.getX(0===I||I===f.length-1?t:l,c),n._attr={visibility:h,align:s[6]},n._pos={x:a+m.x+({left:y,right:-y}[s[6]]||0),y:l+m.y-10},n.connX=a,n.connY=l,null===this.options.size&&(r=n.width,y>a-r?L[3]=ue(he(r-a+y),L[3]):a+r>x-y&&(L[1]=ue(he(a+r-x+y),L[1])),0>l-o/2?L[0]=ue(he(-l+o/2),L[0]):l+o/2>g&&(L[2]=ue(he(l+o/2-g),L[2])))}(0===P(L)||this.verifyDataLabelOverflow(L))&&(this.placeDataLabels(),C&&v&&je(this.points,function(t){e=t.connector,s=t.labelPos,(n=t.dataLabel)&&n._pos?(h=n._attr.visibility,a=n.connX,l=n.connY,i=b?["M",a+("left"===s[6]?5:-5),l,"C",a,l,2*s[2]-s[4],2*s[3]-s[5],s[2],s[3],"L",s[4],s[5]]:["M",a+("left"===s[6]?5:-5),l,"L",s[2],s[3],"L",s[4],s[5]],e?(e.animate({d:i}),e.attr("visibility",h)):t.connector=e=u.chart.renderer.path(i).attr({"stroke-width":v,stroke:m.connectorColor||t.color||"#606060",visibility:h}).add(u.group)):e&&(t.connector=e.destroy())}))}},He.pie.prototype.placeDataLabels=function(){je(this.points,function(t){var e,t=t.dataLabel;t&&((e=t._pos)?(t.attr(t._attr),t[t.moved?"animate":"attr"](e),t.moved=!0):t&&t.attr({y:-999}))})},He.pie.prototype.alignDataLabel=Oe,He.pie.prototype.verifyDataLabelOverflow=function(t){var e,i=this.center,n=this.options,r=n.center,s=n=n.minSize||80;return null!==r[0]?s=ue(i[2]-ue(t[1],t[3]),n):(s=ue(i[2]-t[1]-t[3],n),i[0]+=(t[3]-t[1])/2),null!==r[1]?s=ue(pe(s,i[2]-ue(t[0],t[2])),n):(s=ue(pe(s,i[2]-t[0]-t[2]),n),i[1]+=(t[0]-t[2])/2),sp(this.translatedThreshold,o.plotSizeY),c=p(n.inside,!!this.options.stacking);l&&(r=e(l),a&&(r={x:o.plotWidth-r.y-r.height,y:o.plotHeight-r.x-r.width,width:r.height,height:r.width}),!c)&&(a?(r.x+=h?0:r.width,r.width=0):(r.y+=h?r.height:0,r.height=0)),n.align=p(n.align,!a||c?"center":h?"right":"left"),n.verticalAlign=p(n.verticalAlign,a||c?"middle":h?"top":"bottom"),mi.prototype.alignDataLabel.call(this,t,i,n,r,s)}),t(Highcharts,{Axis:z,Chart:N,Color:oi,Point:gi,Tick:R,Tooltip:F,Renderer:H,Series:mi,SVGElement:O,SVGRenderer:ai,arrayMin:C,arrayMax:P,charts:Re,dateFormat:G,format:b,pathAnim:Y,getOptions:function(){return X},hasBidiBug:Le,isTouchDevice:Ce,numberFormat:y,seriesTypes:He,setOptions:function(t){return X=e(!0,X,t),E(),X},addEvent:Ze,removeEvent:Ke,createElement:g,discardElement:L,css:f,each:je,extend:t,map:Ue,merge:e,pick:p,splat:u,extendClass:m,pInt:i,wrap:x,svg:Ae,canvas:Me,vml:!Ae&&!Me,product:"Highcharts",version:"3.0.8"})}(),function(){var t=Highcharts,e=t.Chart,i=t.addEvent,n=t.createElement,r=t.discardElement,s=t.css,o=t.merge,a=t.each,l=t.extend,h=Math.max,c=document,d=window,u="ontouchstart"in c.documentElement,p=t.setOptions({lang:{downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",exportButtonTitle:"Export to raster or vector image",printButtonTitle:"Print the chart"}});p.navigation={menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF"},menuItemStyle:{padding:"0 5px",background:"none",color:"#303030",fontSize:u?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{align:"right",backgroundColor:{linearGradient:[0,0,0,20],stops:[[.4,"#F7F7F7"],[.6,"#E3E3E3"]]},borderColor:"#B0B0B0",borderRadius:3,borderWidth:1,height:20,hoverBorderColor:"#909090",hoverSymbolFill:"#81A7CF",hoverSymbolStroke:"#4572A5",symbolFill:"#E0E0E0",symbolStroke:"#A0A0A0",symbolX:11.5,symbolY:10.5,verticalAlign:"top",width:24,y:10}},p.exporting={type:"image/png",url:"http://export.highcharts.com/",width:800,buttons:{exportButton:{symbol:"exportIcon",x:-10,symbolFill:"#A8BF77",hoverSymbolFill:"#768F3E",_titleKey:"exportButtonTitle",menuItems:[{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]},printButton:{symbol:"printIcon",x:-36,symbolFill:"#B5C9DF",hoverSymbolFill:"#779ABF",_titleKey:"printButtonTitle",onclick:function(){this.print()}}}},l(e.prototype,{getSVG:function(t){var e,i,s,h,d,u,p=this,f=o(p.options,t);return c.createElementNS||(c.createElementNS=function(t,e){var i=c.createElement(e);return i.getBBox=function(){return p.renderer.Element.prototype.getBBox.apply({element:i})},i}),e=n("div",null,{position:"absolute",top:"-9999em",width:p.chartWidth+"px",height:p.chartHeight+"px"},c.body),l(f.chart,{renderTo:e,forExport:!0}),f.exporting.enabled=!1,f.chart.plotBackgroundImage=null,f.series=[],a(p.series,function(t){s=t.options,s.animation=!1,s.showCheckbox=!1,s&&s.marker&&/^url\(/.test(s.marker.symbol)&&(s.marker.symbol="circle"),s.data=[],a(t.data,function(t){h=t.config,d={x:t.x,y:t.y,name:t.name},"object"==typeof h&&t.config&&h.constructor!=Array&&l(d,h),s.data.push(d),(u=t.config&&t.config.marker)&&/^url\(/.test(u.symbol)&&delete u.symbol}),f.series.push(s)}),t=new Highcharts.Chart(f),i=t.container.innerHTML,f=null,t.destroy(),r(e),i=i.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/isTracker="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(t){return t.toLowerCase()}),i=i.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'"),2==i.match(/ xmlns="/g).length&&(i=i.replace(/xmlns="[^"]+"/,"")),i},exportChart:function(t,e){var i,s=this.getSVG(e);t=o(this.options.exporting,t),i=n("form",{method:"post",action:t.url},{display:"none"},c.body),a(["filename","type","width","svg"],function(e){n("input",{type:"hidden",name:e,value:{filename:t.filename||"chart",type:t.type,width:t.width,svg:s}[e]},null,i)}),i.submit(),r(i)},print:function(){var t=this,e=t.container,i=[],n=e.parentNode,r=c.body,s=r.childNodes;t.isPrinting||(t.isPrinting=!0,a(s,function(t,e){1==t.nodeType&&(i[e]=t.style.display,t.style.display="none")}),r.appendChild(e),d.print(),setTimeout(function(){n.appendChild(e),a(s,function(t,e){1==t.nodeType&&(t.style.display=i[e])}),t.isPrinting=!1},1e3))},contextMenu:function(e,r,o,c,d,p){var f,g,m=this,y=m.options.navigation,v=y.menuItemStyle,x=m.chartWidth,b=m.chartHeight,w="cache-"+e,k=m[w],S=h(d,p);k||(m[w]=k=n("div",{className:"highcharts-"+e},{position:"absolute",zIndex:1e3,padding:S+"px"},m.container),f=n("div",null,l({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},y.menuStyle),k),g=function(){s(k,{display:"none"})},i(k,"mouseleave",g),a(r,function(e){e&&(n("div",{onmouseover:function(){s(this,y.menuItemHoverStyle)},onmouseout:function(){s(this,v)},innerHTML:e.text||t.getOptions().lang[e.textKey]},l({cursor:"pointer"},v),f)[u?"ontouchstart":"onclick"]=function(){g(),e.onclick.apply(m,arguments)})}),m.exportMenuWidth=k.offsetWidth,m.exportMenuHeight=k.offsetHeight),e={display:"block"},o+m.exportMenuWidth>x?e.right=x-o-d-S+"px":e.left=o-S+"px",c+p+m.exportMenuHeight>b?e.bottom=b-c-S+"px":e.top=c+p-S+"px",s(k,e)},addButton:function(e){function i(){r.attr(m),n.attr(g)}var n,r,s,a=this,h=a.renderer,c=o(a.options.navigation.buttonOptions,e),d=c.onclick,u=c.menuItems,p=c.width,f=c.height;e=c.borderWidth;var g={stroke:c.borderColor},m={stroke:c.symbolStroke,fill:c.symbolFill};c.enabled!==!1&&(n=h.rect(0,0,p,f,c.borderRadius,e).align(c,!0).attr(l({fill:c.backgroundColor,"stroke-width":e,zIndex:19},g)).add(),s=h.rect(0,0,p,f,0).align(c).attr({fill:"rgba(255, 255, 255, 0.001)",title:t.getOptions().lang[c._titleKey],zIndex:21}).css({cursor:"pointer"}).on("mouseover",function(){r.attr({stroke:c.hoverSymbolStroke,fill:c.hoverSymbolFill}),n.attr({stroke:c.hoverBorderColor})}).on("mouseout",i).on("click",i).add(),u&&(d=function(){i();var t=s.getBBox();a.contextMenu("export-menu",u,t.x,t.y,p,f)}),s.on("click",function(){d.apply(a,arguments)}),r=h.symbol(c.symbol,c.symbolX,c.symbolY,(c.symbolSize||12)/2).align(c,!0).attr(l(m,{"stroke-width":c.symbolStrokeWidth||1,zIndex:20})).add())}}),t.Renderer.prototype.symbols.exportIcon=function(t,e,i){return["M",t-i,e+i,"L",t+i,e+i,t+i,e+.5*i,t-i,e+.5*i,"Z","M",t,e+.5*i,"L",t-.5*i,e-i/3,t-i/6,e-i/3,t-i/6,e-i,t+i/6,e-i,t+i/6,e-i/3,t+.5*i,e-i/3,"Z"]},t.Renderer.prototype.symbols.printIcon=function(t,e,i){return["M",t-i,e+.5*i,"L",t+i,e+.5*i,t+i,e-i/3,t-i,e-i/3,"Z","M",t-.5*i,e-i/3,"L",t-.5*i,e-i,t+.5*i,e-i,t+.5*i,e-i/3,"Z","M",t-.5*i,e+.5*i,"L",t-.75*i,e+i,t+.75*i,e+i,t+.5*i,e+.5*i,"Z"]},e.prototype.callbacks.push(function(t){var e,i=t.options.exporting,n=i.buttons;if(i.enabled!==!1)for(e in n)t.addButton(n[e])})}();var createWindows=function(t,e,i){return function(n){createWindowsWithData(n,t,e,i)}},updatePortletPositions=function(t,e){return function(){if(t){var i=$(this).sortable("serialize");colId=$(this).attr("id").charAt($(this).attr("id").length-1),portletArray=getPortletArray(i),jsonResult={col:colId,positions:portletArray},portletArray.length>0&&$.ajax({type:"PUT",url:"../channels/"+e+"/windows",data:{_method:"PUT",page:JSON.stringify(jsonResult)},dataType:"json"})}}},decoratePortlet=function(t){return function(){var e=$(this).find(".portlet-header");return e.append(""),thisObject=$(this),"true"==t?(thisObject.find(".wtype").prepend(""),thisObject.find(".wtype-chart_window").append(""),thisObject.find(".wtype").append(""),thisObject.find(".portlet-header").css("cursor","move")):$(".column").sortable({disabled:!0}),$(this).attr("id")}},uiEditClick=function(t){return function(){var e=$(this).parents(".portlet:first").attr("id").substring(8),i="";$("#chartConfig"+e).load("/channels/"+t+"/charts/"+e+"/edit",function(){i=$("#chartOptions"+e).html(),"undefined"!=i&&i.length>2&&$.each(i.split("&"),setupChartForm(e)),$("#button"+e).click(function(){updateChart(e,!0,450,250,t,!0),$("#chartConfig"+e).dialog("close")})}).dialog({title:"Chart Options",modal:!0,resizable:!1,width:500,dialogClass:"dev-info-dialog"})}},uiViewClick=function(t){return function(){var e=$(this).parents(".portlet:first").find(".portlet-content").offset().left,i=$(this).parents(".portlet:first").find(".portlet-content").offset().top,n=$(this).parents(".portlet:first").attr("id").substring(8);$("body").append(''),$.get("/channels/"+t+"/windows/"+n+"/iframe",function(t){var e=t.replace(/id=\"iframe[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?\"/,"");$("#iframeinner"+n).text(e)}),$("#iframepopup"+n).dialog({resizable:!1,width:"300px",position:[e+200,i-200],title:"Chart Iframe",dialogClass:"dev-info-dialog"})}},uiCloseClick=function(t){return function(){var e=$(this).parents(".portlet:first").attr("id").substring(8),i=$(this).parents(".portlet:first"); +$.update("/channels/"+t+"/windows/"+e+"/hide",function(){i.hide("drop",function(){i.remove()})})}};!function(t){function e(){var e=i(this);return isNaN(e.datetime)||t(this).text(n(e.datetime)),this}function i(e){if(e=t(e),!e.data("timeago")){e.data("timeago",{datetime:s.datetime(e)});var i=t.trim(e.text());i.length>0&&e.attr("title",i)}return e.data("timeago")}function n(t){return s.inWords(r(t))}function r(t){return(new Date).getTime()-t.getTime()}t.timeago=function(e){return e instanceof Date?n(e):"string"==typeof e?n(t.timeago.parse(e)):n(t.timeago.datetime(e))};var s=t.timeago;t.extend(t.timeago,{settings:{refreshMillis:6e4,allowFuture:!1,strings:{prefixAgo:null,prefixFromNow:null,suffixAgo:"ago",suffixFromNow:"from now",seconds:"less than a minute",minute:"about a minute",minutes:"%d minutes",hour:"about an hour",hours:"about %d hours",day:"a day",days:"%d days",month:"about a month",months:"%d months",year:"about a year",years:"%d years",numbers:[]}},inWords:function(e){function i(i,r){var s=t.isFunction(i)?i(r,e):i,o=n.numbers&&n.numbers[r]||r;return s.replace(/%d/i,o)}var n=this.settings.strings,r=n.prefixAgo,s=n.suffixAgo;this.settings.allowFuture&&(0>e&&(r=n.prefixFromNow,s=n.suffixFromNow),e=Math.abs(e));var o=e/1e3,a=o/60,l=a/60,h=l/24,c=h/365,d=45>o&&i(n.seconds,Math.round(o))||90>o&&i(n.minute,1)||45>a&&i(n.minutes,Math.round(a))||90>a&&i(n.hour,1)||24>l&&i(n.hours,Math.round(l))||48>l&&i(n.day,1)||30>h&&i(n.days,Math.floor(h))||60>h&&i(n.month,1)||365>h&&i(n.months,Math.floor(h/30))||2>c&&i(n.year,1)||i(n.years,Math.floor(c));return t.trim([r,d,s].join(" "))},parse:function(e){var i=t.trim(e);return i=i.replace(/\.\d\d\d+/,""),i=i.replace(/-/,"/").replace(/-/,"/"),i=i.replace(/T/," ").replace(/Z/," UTC"),i=i.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"),new Date(i)},datetime:function(e){var i="time"===t(e).get(0).tagName.toLowerCase(),n=i?t(e).attr("datetime"):t(e).attr("title");return s.parse(n)}}),t.fn.timeago=function(){var t=this;t.each(e);var i=s.settings;return i.refreshMillis>0&&setInterval(function(){t.each(e)},i.refreshMillis),t},document.createElement("abbr"),document.createElement("time")}(jQuery),function(t){function e(t,e){return e.measureText(t).width}function i(t,e){return e.text(t),e.width()}var n,r,s,o=!1;t.fn.shorten=function(){var o={},a=arguments,l=a.callee;if(a.length)if(a[0].constructor==Object)o=a[0];else{if("options"==a[0])return t(this).eq(0).data("shorten-options");o={width:parseInt(a[0]),tail:a[1]}}this.css("visibility","hidden");var h=t.extend({},l.defaults,o);return this.each(function(){var a,c=t(this),d=c.text(),u=d.length,p=t("").html(h.tail).text(),f={shortened:!1,textOverflow:!1};if(a="none"!=c.css("float")?h.width||c.width():h.width||c.parent().width(),0>a)return!0;if(c.data("shorten-options",h),this.style.display="inline-block",this.style.whiteSpace="nowrap",n){var g=t(this),m=document.createElement("canvas");ctx=m.getContext("2d"),g.html(m),ctx.font=g.css("font-style")+" "+g.css("font-variant")+" "+g.css("font-weight")+" "+Math.ceil(parseFloat(g.css("font-size")))+"px "+g.css("font-family"),r=ctx,s=e}else g=t('
'),$td=t("td",g),t(this).html(g),r=$td,s=i;if(g=s.call(this,d,r),a>g)return c.text(d),this.style.visibility="visible",c.data("shorten-info",f),!0;if(h.tooltip&&this.setAttribute("title",d),l._native&&!o.width&&(m=t(""+h.tail+"").text(),1==m.length&&8230==m.charCodeAt(0)))return c.text(d),this.style.overflow="hidden",this.style[l._native]="ellipsis",this.style.visibility="visible",f.shortened=!0,f.textOverflow="ellipsis",c.data("shorten-info",f),!0;p=s.call(this,p,r),a-=p,p=1.15*a,g-p>0&&(p=d.substring(0,Math.ceil(u*(p/g))),s.call(this,p,r)>a&&(d=p,u=d.length));do u--,d=d.substring(0,u);while(s.call(this,d,r)>=a);return c.html(t.trim(t("").text(d).html())+h.tail),this.style.visibility="visible",f.shortened=!0,c.data("shorten-info",f),!0})};var a=document.documentElement.style;"textOverflow"in a?o="textOverflow":"OTextOverflow"in a&&(o="OTextOverflow"),"undefined"!=typeof Modernizr&&Modernizr.canvastext?n=Modernizr.canvastext:(a=document.createElement("canvas"),n=!(!a.getContext||!a.getContext("2d")||"function"!=typeof a.getContext("2d").fillText)),t.fn.shorten._is_canvasTextSupported=n,t.fn.shorten._native=o,t.fn.shorten.defaults={tail:"…",tooltip:!0}}(jQuery),function(t){window.NestedFormEvents=function(){this.addFields=t.proxy(this.addFields,this),this.removeFields=t.proxy(this.removeFields,this)},NestedFormEvents.prototype={addFields:function(e){var i=e.currentTarget,n=t(i).data("association"),r=t("#"+t(i).data("blueprint-id")),s=r.data("blueprint"),o=(t(i).closest(".fields").closestChild("input, textarea, select").eq(0).attr("name")||"").replace(new RegExp("[[a-z_]+]$"),"");if(o)for(var a=o.match(/[a-z_]+_attributes(?=\]\[(new_)?\d+\])/g)||[],l=o.match(/[0-9]+/g)||[],h=0;h0;)for(var n=i.shift(),r=n.children(),s=0;s=a&&l>n||l>=r&&r>a||a>n&&r>l}),a=l+1;var c=0;for(var h in o)if(o[h].selected){var d=o[h].start+c;e&&i.tabString==t.value.substring(d,d+i.tabString.length)?(t.value=t.value.substring(0,d)+t.value.substring(d+i.tabString.length),c-=i.tabString.length):e||(t.value=t.value.substring(0,d)+i.tabString+t.value.substring(d),c+=i.tabString.length)}t.focus();var u=n+(c>0?i.tabString.length:0>c?-i.tabString.length:0),p=r+c;t.setSelectionRange(u,p)}}function n(e,i,n){var r=document.selection.createRange();if(e==r.parentElement())if(""==r.text)if(i){var s=r.getBookmark();r.moveStart("character",-n.tabString.length),n.tabString==r.text?r.text="":(r.moveToBookmark(s),r.moveEnd("character",n.tabString.length),n.tabString==r.text&&(r.text="")),r.collapse(!0),r.select()}else r.text=n.tabString,r.collapse(!1),r.select();else{var o=r.text,a=o.length,l=o.split("\r\n"),h=document.body.createTextRange();h.moveToElementText(e),h.setEndPoint("EndToStart",r);var c=h.text,d=c.split("\r\n"),u=c.length,p=document.body.createTextRange();p.moveToElementText(e),p.setEndPoint("StartToEnd",r);var f=p.text,g=document.body.createTextRange();g.moveToElementText(e),g.setEndPoint("StartToEnd",h);var m=g.text,y=t(e).html();t("#r3").text(u+" + "+a+" + "+f.length+" = "+y.length),u+m.length0?x.setEndPoint("StartToEnd",h):x.setEndPoint("StartToStart",h),x.setEndPoint("EndToEnd",r),x.select()}}t.fn.tabby=function(i){var n=t.extend({},t.fn.tabby.defaults,i),r=t.fn.tabby.pressed;return this.each(function(){$this=t(this);var i=t.meta?t.extend({},n,$this.data()):n;$this.bind("keydown",function(n){var s=t.fn.tabby.catch_kc(n);return 16==s&&(r.shft=!0),17==s&&(r.ctrl=!0,setTimeout("$.fn.tabby.pressed.ctrl = false;",1e3)),18==s&&(r.alt=!0,setTimeout("$.fn.tabby.pressed.alt = false;",1e3)),9!=s||r.ctrl||r.alt?void 0:(n.preventDefault,r.last=s,setTimeout("$.fn.tabby.pressed.last = null;",0),e(t(n.target).get(0),r.shft,i),!1)}).bind("keyup",function(e){16==t.fn.tabby.catch_kc(e)&&(r.shft=!1)}).bind("blur",function(e){9==r.last&&t(e.target).one("focus",function(){r.last=null}).get(0).focus()})})},t.fn.tabby.catch_kc=function(t){return t.keyCode?t.keyCode:t.charCode?t.charCode:t.which},t.fn.tabby.pressed={shft:!1,ctrl:!1,alt:!1,last:null},t.fn.tabby.defaults={tabString:String.fromCharCode(9)}}(jQuery),function(t,e,i){var n={required:"The %s field is required.",matches:"The %s field does not match the %s field.",valid_email:"The %s field must contain a valid email address.",min_length:"The %s field must be at least %s characters in length.",max_length:"The %s field must not exceed %s characters in length.",exact_length:"The %s field must be exactly %s characters in length.",greater_than:"The %s field must contain a number greater than %s.",less_than:"The %s field must contain a number less than %s.",alpha:"The %s field must only contain alphabetical characters.",alpha_numeric:"The %s field must only contain alpha-numeric characters.",alpha_dash:"The %s field must only contain alpha-numeric characters, underscores, and dashes.",numeric:"The %s field must contain only numbers.",integer:"The %s field must contain an integer."},r=function(){},s=/^(.+)\[(.+)\]$/,o=/^[0-9]+$/,a=/^\-?[0-9]+$/,l=/^\-?[0-9]*\.?[0-9]+$/,h=/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}$/i,c=/^[a-z]+$/i,d=/^[a-z0-9]+$/i,u=/^[a-z0-9_-]+$/i,p=function(t,i,n){for(this.callback=n||r,this.errors=[],this.fields={},this.form=e.forms[t]||{},this.messages={},this.handlers={},t=0,n=i.length;n>t;t++){var s=i[t];s.name&&s.rules&&(this.fields[s.name]={name:s.name,display:s.display||s.name,rules:s.rules,type:null,value:null,checked:null})}this.form.onsubmit=function(t){return function(e){try{return t._validateForm(e)}catch(i){}}}(this)};p.prototype.setMessage=function(t,e){return this.messages[t]=e,this},p.prototype.registerCallback=function(t,e){return t&&"string"==typeof t&&e&&"function"==typeof e&&(this.handlers[t]=e),this},p.prototype._validateForm=function(t){this.errors=[];for(var e in this.fields)if(this.fields.hasOwnProperty(e)){var n=this.fields[e]||{},r=this.form[n.name];r&&r!==i&&(n.type=r.type,n.value=r.value,n.checked=r.checked),this._validateField(n)}if("function"==typeof this.callback&&this.callback(this.errors,t),this.errors.length>0){if(!t||!t.preventDefault)return!1;t.preventDefault()}return!0},p.prototype._validateField=function(t){var e=t.rules.split("|");if(-1!==t.rules.indexOf("required")||t.value&&""!==t.value&&t.value!==i)for(var r=0,o=e.length;o>r;r++){var a=e[r],l=null,h=!1;if((parts=s.exec(a))&&(a=parts[1],l=parts[2]),"function"==typeof this._hooks[a]?this._hooks[a].apply(this,[t,l])||(h=!0):"callback_"===a.substring(0,9)&&(a=a.substring(9,a.length),"function"==typeof this.handlers[a]&&this.handlers[a].apply(this,[t.value])===!1&&(h=!0)),h){(e=this.messages[a]||n[a])?(t=e.replace("%s",t.display),l&&(t=t.replace("%s",this.fields[l]?this.fields[l].display:l)),this.errors.push(t)):this.errors.push("An error has occurred with the "+t.display+" field.");break}}},p.prototype._hooks={required:function(t){var e=t.value;return"checkbox"===t.type?t.checked===!0:null!==e&&""!==e},matches:function(t,e){return(el=this.form[e])?t.value===el.value:!1},valid_email:function(t){return h.test(t.value)},min_length:function(t,e){return o.test(e)?t.value.length>=e:!1},max_length:function(t,e){return o.test(e)?t.value.length<=e:!1},exact_length:function(t,e){return o.test(e)?t.value.length==e:!1},greater_than:function(t,e){return l.test(t.value)?parseFloat(t.value)>parseFloat(e):!1},less_than:function(t,e){return l.test(t.value)?parseFloat(t.value)="0"&&"7">=i?parseInt(t.substring(1),8):"u"===i||"x"===i?parseInt(t.substring(2),16):t.charCodeAt(1)}function i(t){return 32>t?(16>t?"\\x0":"\\x")+t.toString(16):(t=String.fromCharCode(t),("\\"===t||"-"===t||"["===t||"]"===t)&&(t="\\"+t),t)}function n(t){for(var n=t.substring(1,t.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),t=[],r=[],s="^"===n[0],o=s?1:0,a=n.length;a>o;++o){var l=n[o];if(/\\[bdsw]/i.test(l))t.push(l);else{var h,l=e(l);a>o+2&&"-"===n[o+1]?(h=e(n[o+2]),o+=2):h=l,r.push([l,h]),65>h||l>122||(65>h||l>90||r.push([32|Math.max(65,l),32|Math.min(h,90)]),97>h||l>122||r.push([-33&Math.max(97,l),-33&Math.min(h,122)]))}}for(r.sort(function(t,e){return t[0]-e[0]||e[1]-t[1]}),n=[],l=[0/0,0/0],o=0;oa[0]&&(a[1]+1>a[0]&&r.push("-"),r.push(i(a[1])));return r.push("]"),r.join("")}function r(t){for(var e=t.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),i=e.length,r=[],a=0,l=0;i>a;++a){var h=e[a];"("===h?++l:"\\"===h.charAt(0)&&(h=+h.substring(1))&&l>=h&&(r[h]=-1)}for(a=1;aa;++a)h=e[a],"("===h?(++l,void 0===r[l]&&(e[a]="(?:")):"\\"===h.charAt(0)&&(h=+h.substring(1))&&l>=h&&(e[a]="\\"+r[l]);for(l=a=0;i>a;++a)"^"===e[a]&&"^"!==e[a+1]&&(e[a]="");if(t.ignoreCase&&o)for(a=0;i>a;++a)h=e[a],t=h.charAt(0),h.length>=2&&"["===t?e[a]=n(h):"\\"!==t&&(e[a]=h.replace(/[A-Za-z]/g,function(t){return t=t.charCodeAt(0),"["+String.fromCharCode(-33&t,32|t)+"]"}));return e.join("")}for(var s=0,o=!1,a=!1,l=0,h=t.length;h>l;++l){var c=t[l];if(c.ignoreCase)a=!0;else if(/[a-z]/i.test(c.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){o=!0,a=!1;break}}for(var d={b:8,t:9,n:10,v:11,f:12,r:13},u=[],l=0,h=t.length;h>l;++l){if(c=t[l],c.global||c.multiline)throw Error(""+c);u.push("(?:"+r(c)+")")}return RegExp(u.join("|"),a?"gi":"g")}function e(t){function e(t){switch(t.nodeType){case 1:if(n.test(t.className))break;for(var i=t.firstChild;i;i=i.nextSibling)e(i);i=t.nodeName,("BR"===i||"LI"===i)&&(r[a]="\n",o[a<<1]=s++,o[a++<<1|1]=t);break;case 3:case 4:i=t.nodeValue,i.length&&(i=l?i.replace(/\r\n?/g,"\n"):i.replace(/[\t\n\r ]+/g," "),r[a]=i,o[a<<1]=s,s+=i.length,o[a++<<1|1]=t)}}var i,n=/(?:^|\s)nocode(?:\s|$)/,r=[],s=0,o=[],a=0;t.currentStyle?i=t.currentStyle.whiteSpace:window.getComputedStyle&&(i=document.defaultView.getComputedStyle(t,q).getPropertyValue("white-space"));var l=i&&"pre"===i.substring(0,3);return e(t),{a:r.join("").replace(/\n$/,""),c:o}}function i(t,e,i,n){e&&(t={a:e,d:t},i(t),n.push.apply(n,t.e))}function n(e,n){function r(t){for(var e=t.d,h=[e,"pln"],c=0,d=t.a.match(s)||[],u={},p=0,f=d.length;f>p;++p){var g,m=d[p],y=u[m],v=void 0;if("string"==typeof y)g=!1;else{var x=o[m.charAt(0)];if(x)v=m.match(x[1]),y=x[0];else{for(g=0;l>g;++g)if(x=n[g],v=m.match(x[1])){y=x[0];break}v||(y="pln")}!(g=y.length>=5&&"lang-"===y.substring(0,5))||v&&"string"==typeof v[1]||(g=!1,y="src"),g||(u[m]=y)}if(x=c,c+=m.length,g){g=v[1];var b=m.indexOf(g),w=b+g.length;v[2]&&(w=m.length-v[2].length,b=w-g.length),y=y.substring(5),i(e+x,m.substring(0,b),r,h),i(e+x+b,g,a(y,g),h),i(e+x+w,m.substring(w),r,h)}else h.push(e+x,y)}t.e=h}var s,o={};!function(){for(var i=e.concat(n),r=[],a={},l=0,h=i.length;h>l;++l){var c=i[l],d=c[3];if(d)for(var u=d.length;--u>=0;)o[d.charAt(u)]=c;c=c[1],d=""+c,a.hasOwnProperty(d)||(r.push(c),a[d]=q)}r.push(/[\S\s]/),s=t(r)}();var l=n.length;return r}function r(t){var e=[],i=[];t.tripleQuotedStrings?e.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):t.multiLineStrings?e.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,q,"'\"`"]):e.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]),t.verbatimStrings&&i.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var r=t.hashComments;return r&&(t.cStyleComments?(r>1?e.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):e.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),i.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):e.push(["com",/^#[^\n\r]*/,q,"#"])),t.cStyleComments&&(i.push(["com",/^\/\/[^\n\r]*/,q]),i.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q])),t.regexLiterals&&i.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]),(r=t.types)&&i.push(["typ",r]),t=(""+t.keywords).replace(/^ | $/g,""),t.length&&i.push(["kwd",RegExp("^(?:"+t.replace(/[\s,]+/g,"|")+")\\b"),q]),e.push(["pln",/^\s+/,q," \r\n  "]),i.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]),n(e,i)}function s(t,e){function i(t){switch(t.nodeType){case 1:if(s.test(t.className))break;if("BR"===t.nodeName)n(t),t.parentNode&&t.parentNode.removeChild(t);else for(t=t.firstChild;t;t=t.nextSibling)i(t);break;case 3:case 4:if(l){var e=t.nodeValue,r=e.match(o);if(r){var h=e.substring(0,r.index);t.nodeValue=h,(e=e.substring(r.index+r[0].length))&&t.parentNode.insertBefore(a.createTextNode(e),t.nextSibling),n(t),h||t.parentNode.removeChild(t)}}}}function n(t){function e(t,i){var n=i?t.cloneNode(!1):t,r=t.parentNode;if(r){var r=e(r,1),s=t.nextSibling;r.appendChild(n);for(var o=s;o;o=s)s=o.nextSibling,r.appendChild(o)}return n}for(;!t.nextSibling;)if(t=t.parentNode,!t)return;for(var i,t=e(t.nextSibling,0);(i=t.parentNode)&&1===i.nodeType;)t=i;h.push(t)}var r,s=/(?:^|\s)nocode(?:\s|$)/,o=/\r\n?|\n/,a=t.ownerDocument;t.currentStyle?r=t.currentStyle.whiteSpace:window.getComputedStyle&&(r=a.defaultView.getComputedStyle(t,q).getPropertyValue("white-space"));var l=r&&"pre"===r.substring(0,3);for(r=a.createElement("LI");t.firstChild;)r.appendChild(t.firstChild);for(var h=[r],c=0;cc;++c)r=h[c],r.className="L"+(c+u)%10,r.firstChild||r.appendChild(a.createTextNode(" ")),d.appendChild(r);t.appendChild(d)}function o(t,e){for(var i=e.length;--i>=0;){var n=e[i];x.hasOwnProperty(n)?window.console&&console.warn("cannot override language handler %s",n):x[n]=t}}function a(t,e){return t&&x.hasOwnProperty(t)||(t=/^\s*f;)d[f]!==d[f+2]?(d[p++]=d[f++],d[p++]=d[f++]):f+=2;for(u=p,f=p=0;u>f;){for(var g=d[f],m=d[f+1],y=f+2;u>=y+2&&d[y+1]===m;)y+=2;d[p++]=g,d[p++]=m,f=y}for(d.length=p;c>r;){var v,x=h[r+2]||l,b=d[t+2]||l,y=Math.min(x,b),w=h[r+1];if(1!==w.nodeType&&(v=o.substring(n,y))){s&&(v=v.replace(i,"\r")),w.nodeValue=v;var k=w.ownerDocument,S=k.createElement("SPAN");S.className=d[t+1];var T=w.parentNode;T.replaceChild(S,w),S.appendChild(w),x>n&&(h[r+1]=w=k.createTextNode(o.substring(y,x)),T.insertBefore(w,S.nextSibling))}n=y,n>=x&&(r+=2),n>=b&&(t+=2)}}catch(C){"console"in window&&console.log(C&&C.stack?C.stack:C)}}var h=["break,continue,do,else,for,if,return,while"],c=[[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],d=[c,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],u=[c,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],p=[u,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],c=[c,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],f=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],g=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],h=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],m=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,y=/\S/,v=r({keywords:[d,p,c,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+f,g,h],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),x={};o(v,["default-code"]),o(n([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]),o(n([["pln",/^\s+/,q," \r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]),o(n([],[["atv",/^[\S\s]+/]]),["uq.val"]),o(r({keywords:d,hashComments:!0,cStyleComments:!0,types:m}),["c","cc","cpp","cxx","cyc","m"]),o(r({keywords:"null,true,false"}),["json"]),o(r({keywords:p,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:m}),["cs"]),o(r({keywords:u,cStyleComments:!0}),["java"]),o(r({keywords:h,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]),o(r({keywords:f,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py"]),o(r({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]),o(r({keywords:g,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]),o(r({keywords:c,cStyleComments:!0,regexLiterals:!0}),["js"]),o(r({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]),o(n([],[["str",/^[\S\s]+/]]),["regex"]),window.prettyPrintOne=function(t,e,i){var n=document.createElement("PRE");return n.innerHTML=t,i&&s(n,i),l({g:e,i:i,h:n}),n.innerHTML},window.prettyPrint=function(t){function e(){for(var i=window.PR_SHOULD_USE_CONTINUATION?h.now()+250:1/0;d=0){var a,p,o=o.match(u);if(p=!o){p=r;for(var f=void 0,g=p.firstChild;g;g=g.nextSibling)var m=g.nodeType,f=1===m?f?p:g:3===m?y.test(g.nodeValue)?p:f:f;p=(a=f===p?void 0:f)&&"CODE"===a.tagName}for(p&&(o=a.className.match(u)),o&&(o=o[1]),p=!1,f=r.parentNode;f;f=f.parentNode)if(("pre"===f.tagName||"code"===f.tagName||"xmp"===f.tagName)&&f.className&&f.className.indexOf("prettyprint")>=0){p=!0;break}p||((p=(p=r.className.match(/\blinenums\b(?::(\d+))?/))?p[1]&&p[1].length?+p[1]:!0:!1)&&s(r,p),c={g:o,h:r,i:p},l(c))}}do;++o)n.push(i[r][o]);var i=q,h=Date;h.now||(h={now:function(){return+new Date}});var c,d=0,u=/\blang(?:uage)?-([\w.]+)(?!\S)/;e()},window.PR={createSimpleLexer:n,registerLangHandler:o,sourceDecorator:r,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}}(),!function(t){t(function(){window.prettyPrint&&prettyPrint()})}(window.jQuery),$(document).ready(function(){$(".response").click(function(){var t=$(this).data("response_type");$(".response").removeClass("active"),$(".response-"+t).addClass("active"),$(".format").hide(),$(".format-"+t).show()})}),$(document).ready(function(){$("#talkback_command_add").click(function(){$(this).hide(),$("#talkback_command_add_form").removeClass("hide")})}); \ No newline at end of file diff --git a/public/assets/application-1369f895a819b8f9cb3fdb98c04ee8e0.js.gz b/public/assets/application-1369f895a819b8f9cb3fdb98c04ee8e0.js.gz new file mode 100644 index 0000000..e4a5d14 Binary files /dev/null and b/public/assets/application-1369f895a819b8f9cb3fdb98c04ee8e0.js.gz differ diff --git a/public/assets/application-29a45c9a6c794a4499e57fc0bb19c87f.css b/public/assets/application-29a45c9a6c794a4499e57fc0bb19c87f.css new file mode 100644 index 0000000..5a4a71c --- /dev/null +++ b/public/assets/application-29a45c9a6c794a4499e57fc0bb19c87f.css @@ -0,0 +1,99 @@ +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #222 0, #282828 100%);background-image:linear-gradient(to bottom, #222 0, #282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:linear-gradient(to bottom, #428bca 0, #3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:linear-gradient(to bottom, #428bca 0, #3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}code{word-wrap:break-word;white-space:normal}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute !important;clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */.ui-widget{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1em}.ui-widget-content{border:1px solid #dddddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333333}.ui-widget-content a{color:#333333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#ffffff;font-weight:bold}.ui-widget-header a{color:#ffffff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #cccccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-widget :active{outline:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#ffffff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#ffffff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#ffffff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-off{background-position:-96px -144px}.ui-icon-radio-on{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.50;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.20;filter:Alpha(Opacity=20);-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px} /*! +* jQuery UI Resizable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Resizable#theming +*/.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} /*! +* jQuery UI Selectable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Selectable#theming +*/.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}/*! + * jQuery UI Accordion 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */.ui-accordion{width:100%}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1}.ui-accordion .ui-accordion-li-fix{display:inline}.ui-accordion .ui-accordion-header-active{border-bottom:0 !important}.ui-accordion .ui-accordion-header a{display:block;font-size:1em;padding:.5em .5em .5em .7em}.ui-accordion-icons .ui-accordion-header a{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1}.ui-accordion .ui-accordion-content-active{display:block}/*! + * jQuery UI Autocomplete 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */.ui-autocomplete{position:absolute;cursor:default}* html .ui-autocomplete{width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left}.ui-menu .ui-menu{margin-top:-3px}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1}.ui-menu .ui-menu-item a.ui-state-hover,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}/*! + * jQuery UI Button 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none !important;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}/*! + * jQuery UI Dialog 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}/*! + * jQuery UI Slider 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} /*! +* jQuery UI Tabs 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Tabs#theming +*/.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 .2em 1px 0;border-bottom:0 !important;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{margin-bottom:0;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-state-processing a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tabs .ui-tabs-hide{display:none !important}/*! + * jQuery UI Datepicker 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}/*! +* jQuery UI Progressbar 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Progressbar#theming +*/.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.form-horizontal .multiline-label{margin-top:-10px}.nested-fields{border:1px solid #d6d6d6;padding:10px 10px 0 10px;max-width:275px}.customcode,.customcode .str,.customcode .lit,.customcode .pln{color:#00ab9b}.response-div{margin-top:12px;font-size:0.8em}.response{background-color:#ddd;margin:0 1px;border:1px solid #555;padding:2px;font-weight:bold;color:#555;cursor:pointer}.response:hover{background-color:#eeb}.response.active{background-color:#beb;cursor:initial}.format-json,.format-xml{display:none}.format-block{min-height:200px}.format-block-lg{min-height:350px}.infobox{vertical-align:bottom}.spanlink{cursor:pointer}.boldlink{font-weight:bold}#logo{float:left;margin:0 0 0 0}#logo a{color:#d62020}#logo a span,.paygray{color:#666666}#logo a:hover,.apps a:hover,.apps:hover div{text-decoration:none}.commentarea{width:300px;height:80px}#logo.small{font-size:30px;color:#666666}#options{float:right;text-align:right}#login{padding:6px;border:1px solid #bbbbbb;border-collapse:separate;border-spacing:3px;background-color:#eeeeee;background:-webkit-gradient(linear, left top, right top, from(#ddd), to(#f5f5f5));background:-moz-linear-gradient(left, #ddd, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd', endColorstr='#f5f5f5', GradientType=1)}#menu{height:40px;margin:0 auto;border:1px solid #dddddd;background-color:#d6d6d6;background:-webkit-gradient(linear, left top, left bottom, from(#eee), to(#bbb));background:-moz-linear-gradient(top, #eee, #bbb);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#bbbbbb')}#menu div{float:left;height:40px}#menu div a{color:#777777;padding:10px 30px;display:block;font-weight:bold}#menu div:hover{background-color:#cccccc}#menu div:hover a{color:#000000;text-decoration:none}#menu .selected,#menu .selected:hover{background-color:#e5e5e5}#menu .selected a{color:#000000}#channel_info{padding-bottom:20px}.signed_in_channel_header{display:inline-block}.public_private_icon{display:inline-block}.signed_in_channel_header{width:300px;height:10px}#list_progress_bar{width:300px;height:10px}.public_channel_box{margin:5px;border-radius:7px;height:300px;border:solid 1px red;display:inline-block;width:30%;vertical-align:top}.public_channel_inner{margin-left:10px;margin-right:5px}.public_channel_name{height:11px;font-size:1.3em;font-weight:bold;color:#2565A5}.public_channel_user{height:15px;margin-left:7px;font-size:0.9em}.progressbar{height:10px}.public_channel_desc{height:140px;word-break:break-all}.public_channel_url{height:10px}.public_channel_tags{height:57px;margin-bottom:10px;overflow:hidden}.public_channel_thumbnail{position:absolute;border:2px solid red;display:none}h1.channel_info{margin:0;padding-top:10px}div.list_tags{padding-top:20px}.channelLinks{padding:0 0 0 0;margin-bottom:15px}.channelLinks li{padding:7px;border:1px solid #ccc;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;display:inline;margin:0 0 0 0;list-style:none}#comments{width:100%}#commentsmain{float:left;width:190px;background-color:#fffff9;border:1px dashed #d0d0d0;padding:5px;margin-right:16px;overflow:hidden;display:none}.commentlink{float:left;width:100%}#public_statuses{width:455px;height:380px;overflow:auto;font-size:1.5em}#public_statuses div{margin-left:15px}.statusIFrame{border:1px solid #ccc;background-color:#ffffff}.userlogin{display:none}.login_info{font-weight:bold;text-align:right;font-size:12px}.round{-moz-border-radius:7px;-webkit-border-radius:7px}.text_center{text-align:center}.big{font-size:18px}.large{font-size:20px}.xlarge{font-size:30px}.small{font-size:12px}.action{margin-right:20px;position:relative;top:35px;font-weight:bold;padding:10px}.action_reverse{margin-right:20px;position:relative;top:35px;font-weight:bold;background-color:#d62020;padding:8px;color:#000000}.action_reverse a{color:#FFFFFF}.section_header_reverse{font-weight:bold;color:#FFFFFF;background-color:#d62020;padding:8px}.nicetable{font-size:14px;border:1px solid #bbbbbb}.nicetable-borderless{font-size:14px;border:none}.nicetable-borderless p{margin-left:20px;margin-top:5px;margin-bottom:10px}.nicetable-borderless h3{margin-bottom:0}.nicetable-borderless h3.signed_in_channel_header{margin-bottom:10px}.nicetable .header{font-weight:bold;background-color:#e5e5e5}.nicetable .header td{padding-top:3px}.nicetable td{padding:2px 10px;border-bottom:1px solid #bbbbbb;word-wrap:word}.nicetable .stripe{background-color:#f9f9f9}.nicetable .disabled{background-color:#eee}.nicetable .disabled a{color:#888}.fulltable{width:95%}.fullform{width:100%;margin-bottom:1.5em}.deletecol{width:1em}.table_no_header{font-size:14px}.table_no_header td{padding:2px 10px}.table_no_header .left{font-weight:bold}.max_width_400{max-width:40;word-wrap:break-word}.helplink{float:right;margin-top:3px}.votediv,.votedivphoto,.votedivlink{color:#3478e3}.votedivlink{padding-right:20px}.votediv{float:right;display:none}.voteicon{padding:2px;background:#f8f8f8;border:1px solid #ddd;cursor:pointer}.voteicon:hover{text-decoration:none}.voteicon img{position:relative;top:3px}.nestedcomment{padding-left:30px}.commenttable{padding:0;margin:0;width:100%}.commenttable td{padding:4px 10px 4px 5px}.commentchannel{color:#f08600;font-weight:bold}.commentbody{color:#333333}.commentdiv{width:100%;padding:5px 0 5px 0;font-size:12px;border-top:1px solid #aaa}.gravatar{border:1px solid #999}.noavatar{width:50px;height:50px;border:1px solid #ddd;color:#ddd;text-align:center}.noavatartext{padding-top:5px}.prettydate{color:#aaa}.username a{color:#3478E3;font-weight:bold}.timeago{font-size:0.8em;color:#ccc}.pagination{font-size:14px}.centerme{display:table;margin:0 auto}.fixedwidth{width:960px;display:table;margin:0 auto}.code{margin:10px 0;background-color:#fafafa;white-space:pre-wrap;font:12px Monaco, Lucida Console, monospace;color:#000000;border:1px solid #bbbbbb;padding:10px}.apps{padding:20px 30px 30px 30px;font-size:20px;float:left;text-align:center;margin:0 auto;width:150px}input[type="text"].shortfield{width:30px}input[type="text"].midfield{width:120px}textarea.tweet{margin-top:0.5em;width:40em;height:3em}.errorExplanation{width:95%;background-color:#ffffe0;display:table;margin-bottom:20px;padding:10px;border:1px solid #aaaaaa}#error{color:red}.field_with_errors{display:inline}.warning_box{margin:15px 0 15px 0;padding:10px;background-color:#fc3;color:#000;border:1px solid #f90}#wrapper{min-height:100%;position:relative}#header{margin:0 auto}#head_wrap{width:940px;margin:0 auto;padding-left:10px;padding-right:10px}#menuwrap{padding:0 0;clear:both}#content{width:975px;padding:23px 0 58px 0;min-height:400px}.content{width:975px;padding:23px 0 58px 0;min-height:400px}#maincontent{float:left;width:980px;padding-bottom:20px;margin-left:10px;overflow:false}#maincontent.thin{width:400px}#maincontent.medium{width:500px}#maincontent .thinghttptable{table-layout:fixed;width:400px;word-wrap:break-word}#maincontent .thinghttptable .url{width:100px}#maincontent .thinghttptable .apikey{width:80px}#maincontent.medium .table_no_header{table-layout:fixed;width:440px;word-wrap:break-word}#maincontent.medium .table_no_header .left{width:180px}input#upload_csv{padding-top:5px;margin:20px 0}#sidebar{font-size:14px;width:50%;padding-right:10px;margin-top:10px;margin-left:460px;margin-right:0;border:1px solid #ccc;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px}#sidebar.wide{width:520px}#sidebar.medium{width:470px}#sidebar.narrow{width:470px;margin-left:520px}#sidebar ul{list-style:none;margin:15px 20px 30px 0}#sidebar ul li ul li{margin:0}#sidebar h2{color:#666;margin:0 0 6px 0;padding:0 0}#sidebar .helplink{float:right;margin-top:3px;margin-right:5px}#footer{clear:both;text-align:center;font-size:16px;font-family:Georgia, serif;padding-bottom:5px}#footer a{color:#0867A3}#footer a:hover{color:#0066ff;text-decoration:underline}#footer .copy{padding:5px;font-size:11px}#footer .copy a{color:#D62020;text-decoration:underline}#footer .copy a:hover{color:#890707;text-decoration:underline}.FL{float:left}.FR{float:right}.FN{float:none}.DT{display:table}.CL{clear:left}.CR{clear:right}.CB{clear:both}.UL{text-decoration:underline}.TAR{text-align:right}.TAC{text-align:center}.VAT{vertical-align:top}.PB10{padding-bottom:10px}.PR20{padding-right:20px}.PL20{padding-left:20px}.PL30{padding-left:30px}.MT10{margin-top:5px}.MR20{margin-right:20px}.MR60{margin-right:60px;margin-bottom:20px}.ML20{margin-left:20px}.ML60{margin-left:60px}.W50{width:50%}.W100{width:100%}.left20{position:relative;left:-20px}.up2{position:relative;top:-2px}.up20{position:relative;top:-20px}input.video_narrow{width:100px}#front{text-align:center}#features{clear:both}.feature{float:left;width:300px;margin-right:0}.feature h1{font-size:20px;color:#0867A3}#feature_signup a{border-bottom:3px solid #d62020;text-decoration:none;font-weight:bold}#feature_signup a:hover{text-decoration:none}#nav{list-style:none;padding:0 10px 0 92px;margin:0}#nav li{float:left;margin:0px 0px 0px 10px;padding:0px 15px 0px 0px;position:relative;font-size:14px;line-height:1.4;zoom:1}#nav li:last-child{padding:0}#nav .current-cat a,#nav .current_page_item a{color:#d62020;border-bottom:5px solid #2565A5}#nav .current-cat li a,#nav .current_page_item li a{color:#000}#nav .current-cat li a:hover,#nav .current_page_item li a:hover{color:#d62020;border-bottom:5px solid #2565A5}#nav li a{text-transform:uppercase;font-weight:bold;text-decoration:none;color:#000;border:none;text-decoration:none;float:left;border-bottom:5px solid #FFFFFF}#nav li a:hover{color:#d62020;border-bottom:5px solid #aaa}#nav li span{width:12px;height:20px;background:url("arrow-down.gif") no-repeat left 7px;margin:0;padding:0;position:absolute;right:0;top:0}#nav ul{display:none}#nav li span.child{width:12px;height:20px;background:url("arrow-right.gif") no-repeat left 10px;margin:0;padding:0;position:absolute;right:0;top:0}#nav li a.rss{background:url(rss_feed.png) right 0px no-repeat;padding:0px 30px 0px 0}#nav li a.rss:hover{background:url(rss_feed.png) right -24px no-repeat;padding:0px 30px 0px 0;border-bottom:0 solid #aaa}.ui-widget{font-size:.8em}.ui-widget-header{border:1px solid #0867A3;background:#0867a3 none top right no-repeat}.ui-progressbar{height:5px}.ui-progressbar-value{background-color:green}.ui-widget-content a{color:blue;text-decoration:underline;margin:0}.ui-widget-content p{margin:0 0 10px 10px}.column{width:470px;float:left;padding-bottom:50px;padding-left:5px}.portlet{margin:0 1em 1em 0}.portlet-header{margin:0.3em;padding:7px 7px 7px 7px}.portlet-header .ui-icon{float:right;margin-top:-2px;cursor:pointer;cursor:hand}.portlet-content{padding:0.4em}.ui-sortable-placeholder{border:1px dotted black;visibility:visible !important;height:50px !important}.ui-sortable-placeholder *{visibility:hidden}.buttonlets{float:left;overflow:hidden;max-width:95px}.tweetButton{width:80px}.facebookButton{width:85px}.googleplusButton{width:70px}.padded{margin-top:2px}.ui-button{height:19px;line-height:1em}.ui-button-text-only .ui-button-text{padding:0.2em 1em 0.2em 0.4em;font-size:12px}.ui-state-active{border:1px solid #2565a5;background:#ddd none 50% 50% repeat-x;color:#2565a5}.ui-state-default{border:1px solid #ccc;color:#2565a5}.ui-state-hover{background:#ccc none 50% 50% repeat-x}.topLink{font-size:16px}.developerlink{padding:7px;margin-left:10px;border-bottom-left-radius:15px;border-bottom-right-radius:15px;-webkit-border-bottom-left-radius:15px;-webkit-border-bottom-right-radius:15px;-moz-border-bottom-left-radius:15px;-moz-border-bottom-right-radius:15px;background-color:#aaa}.addpluginlink{color:white;padding:7px;margin-left:10px;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;background-color:#aaa;cursor:pointer}.addpluginlink:hover{background-color:#ccc}.pluginrectangle{display:none;background-color:#aaa;border-radius:5px;position:absolute;height:70%;width:100%;top:30px;right:0}.developerlink:hover{background-color:#ccc}.developerlink a{color:white;text-decoration:none}.channelInfo{max-width:500px}.channelDescription{width:450px;height:60px}.socialButtons{float:right;display:inline}.dev-info-dialog{border:2px solid #bbb}.dev-info-dialog .ui-dialog-titlebar{background-color:#aaa;color:white}.dev-info-dialog a{text-decoration:underline}.ui-tabs{height:100%}.dev-info-dialog ul{list-style-type:none;background-color:whitesmoke}#devInfo{font-size:1.2em}.dev-info-dialog ul li{display:inline;list-style-type:none}.dev_info_table1{margin-bottom:10px}.dev_info_table2{margin-left:10px}.dev_info_table2 td{max-width:300px}.watchButtonLabel{white-space:nowrap;padding-right:10px}.watchButtonImage{float:left;background-position:left;background-image:url("eye.png");background-repeat:no-repeat;width:19px;height:16px}.watchButtonPadding{padding-right:5px}.chartOptions{display:none}.fade{display:none;font-size:1.2em}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-hover a,.ui-state-hover a:hover{color:#d82020;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#d82020;text-decoration:none}.ui-widget :active{outline:none}.ui-tabs .ui-tabs-panel{padding-top:0}.addportlet{padding:5px;width:50px;margin:5px;border-radius:5px;border:2px solid red;cursor:pointer;display:inline-block}.channel_stats_location{clear:right;float:right;width:475px;padding-top:23px}.channel_stats_text{font-weight:bold;font-size:1.2em}.channel_time_text{color:black;font-size:1em}.recent_status{font-family:sans-serif;margin:4px}.timeago{font-size:0.8em;color:#ccc;margin-left:10px}.com{color:#93a1a1}.lit{color:#195f91}.pun,.opn,.clo{color:#93a1a1}.fun{color:#dc322f}.str,.atv{color:#D14}.kwd,.prettyprint .tag{color:#1e347b}.typ,.atn,.dec,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:20px;text-shadow:0 1px 0 #fff}.affix-top,.affix{position:static}#bootstrap-sidebar{background-color:#eee;border:1px solid #bbb;border-radius:5px;padding:2px 0}#bootstrap-sidebar li a:hover{background-color:#fafafa}#bootstrap-sidebar li.active{border:0 #666 solid;border-right-width:4px}@media (min-width: 979px){#bootstrap-sidebar.affix-top,#bootstrap-sidebar.affix{position:fixed;top:30px;width:228px}} diff --git a/public/assets/application-29a45c9a6c794a4499e57fc0bb19c87f.css.gz b/public/assets/application-29a45c9a6c794a4499e57fc0bb19c87f.css.gz new file mode 100644 index 0000000..4c2333b Binary files /dev/null and b/public/assets/application-29a45c9a6c794a4499e57fc0bb19c87f.css.gz differ diff --git a/public/assets/application-6b141b11b3826cf03d9c3fa5cc7fd6dd.css b/public/assets/application-6b141b11b3826cf03d9c3fa5cc7fd6dd.css new file mode 100644 index 0000000..70fefdf --- /dev/null +++ b/public/assets/application-6b141b11b3826cf03d9c3fa5cc7fd6dd.css @@ -0,0 +1,103 @@ +/*! + * Bootstrap v3.1.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width: 768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media (min-width: 992px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width: 768px){.container{width:750px}}@media (min-width: 992px){.container{width:970px}}@media (min-width: 1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media (min-width: 768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width: 992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width: 1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width: 767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="date"]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width: 768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width: 768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url("../fonts/glyphicons-halflings-regular.eot");src:url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/glyphicons-halflings-regular.woff") format("woff"),url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 992px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:none}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width: 992px){.navbar{border-radius:4px}}@media (min-width: 992px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width: 992px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width: 992px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 992px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 992px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width: 992px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:none}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width: 992px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width: 991px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width: 992px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width: 992px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width: 768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width: 991px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width: 992px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width: 992px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width: 991px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width: 991px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.428571429;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width: 768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group .list-group-item:first-child{border-top:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tfoot>tr:first-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tfoot>tr:first-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>td{border-top:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.428571429px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width: 768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.5) 0), color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.0001) 0), color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:none;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width: 768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none !important}@media (max-width: 767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none !important}@media (min-width: 768px) and (max-width: 991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none !important}@media (min-width: 992px) and (max-width: 1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none !important}@media (min-width: 1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width: 767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none !important}}@media (min-width: 1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none !important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none !important}}.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #222 0, #282828 100%);background-image:linear-gradient(to bottom, #222 0, #282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:linear-gradient(to bottom, #428bca 0, #3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:linear-gradient(to bottom, #428bca 0, #3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}code{word-wrap:break-word;white-space:normal}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute !important;clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */.ui-widget{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1em}.ui-widget-content{border:1px solid #dddddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333333}.ui-widget-content a{color:#333333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#ffffff;font-weight:bold}.ui-widget-header a{color:#ffffff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #cccccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-widget :active{outline:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#ffffff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#ffffff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#ffffff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-off{background-position:-96px -144px}.ui-icon-radio-on{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.50;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.20;filter:Alpha(Opacity=20);-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px} /*! +* jQuery UI Resizable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Resizable#theming +*/.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} /*! +* jQuery UI Selectable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Selectable#theming +*/.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}/*! + * jQuery UI Accordion 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */.ui-accordion{width:100%}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1}.ui-accordion .ui-accordion-li-fix{display:inline}.ui-accordion .ui-accordion-header-active{border-bottom:0 !important}.ui-accordion .ui-accordion-header a{display:block;font-size:1em;padding:.5em .5em .5em .7em}.ui-accordion-icons .ui-accordion-header a{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1}.ui-accordion .ui-accordion-content-active{display:block}/*! + * jQuery UI Autocomplete 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */.ui-autocomplete{position:absolute;cursor:default}* html .ui-autocomplete{width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left}.ui-menu .ui-menu{margin-top:-3px}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1}.ui-menu .ui-menu-item a.ui-state-hover,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}/*! + * jQuery UI Button 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none !important;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}/*! + * jQuery UI Dialog 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}/*! + * jQuery UI Slider 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} /*! +* jQuery UI Tabs 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Tabs#theming +*/.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 .2em 1px 0;border-bottom:0 !important;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{margin-bottom:0;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-state-processing a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tabs .ui-tabs-hide{display:none !important}/*! + * jQuery UI Datepicker 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}/*! +* jQuery UI Progressbar 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Progressbar#theming +*/.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.navbar-collapse{max-height:350px}.breadcrumb{margin-top:10px;margin-bottom:20px}.table td{word-break:break-word}body{padding-top:70px}.break-word{word-break:break-word}.col-pad{padding:0 15px}.form-horizontal .multiline-label{margin-top:-10px}.nested-fields{border:1px solid #d6d6d6;padding:10px 10px 0 10px;max-width:275px}.customcode,.customcode .str,.customcode .lit,.customcode .pln{color:#00ab9b}.response-div{margin-top:12px;font-size:0.8em}.response{background-color:#ddd;margin:0 1px;border:1px solid #555;padding:2px;font-weight:bold;color:#555;cursor:pointer}.response:hover{background-color:#eeb}.response.active{background-color:#beb;cursor:initial}.format-json,.format-xml{display:none}.format-block{min-height:200px}.format-block-lg{min-height:350px}html,body{height:100%}#wrap{min-height:100%;height:auto;margin:0 auto -30px;padding:0 0 60px}#footer{padding-top:5px;border-top:1px solid #ddd;height:30px;background-color:#f5f5f5}.infobox{vertical-align:bottom}.spanlink{cursor:pointer}.boldlink{font-weight:bold}#logo{float:left;margin:0 0 0 0}#logo a{color:#d62020}#logo a span,.paygray{color:#666666}#logo a:hover,.apps a:hover,.apps:hover div{text-decoration:none}.commentarea{width:300px;height:80px}#logo.small{font-size:30px;color:#666666}#options{float:right;text-align:right}#login{padding:6px;border:1px solid #bbbbbb;border-collapse:separate;border-spacing:3px;background-color:#eeeeee;background:-webkit-gradient(linear, left top, right top, from(#ddd), to(#f5f5f5));background:-moz-linear-gradient(left, #ddd, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd', endColorstr='#f5f5f5', GradientType=1)}#menu{height:40px;margin:0 auto;border:1px solid #dddddd;background-color:#d6d6d6;background:-webkit-gradient(linear, left top, left bottom, from(#eee), to(#bbb));background:-moz-linear-gradient(top, #eee, #bbb);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#bbbbbb')}#menu div{float:left;height:40px}#menu div a{color:#777777;padding:10px 30px;display:block;font-weight:bold}#menu div:hover{background-color:#cccccc}#menu div:hover a{color:#000000;text-decoration:none}#menu .selected,#menu .selected:hover{background-color:#e5e5e5}#menu .selected a{color:#000000}#channel_info{padding-bottom:20px}.signed_in_channel_header{display:inline-block}.public_private_icon{display:inline-block}.signed_in_channel_header{width:300px;height:10px}#list_progress_bar{width:300px;height:10px}.public_channel_box{margin:5px;border-radius:7px;height:300px;border:solid 1px red;display:inline-block;width:30%;vertical-align:top}.public_channel_inner{margin-left:10px;margin-right:5px}.public_channel_name{height:11px;font-size:1.3em;font-weight:bold;color:#2565A5}.public_channel_user{height:15px;margin-left:7px;font-size:0.9em}.progressbar{height:10px}.public_channel_desc{height:140px;word-break:break-all}.public_channel_url{height:10px}.public_channel_tags{height:57px;margin-bottom:10px;overflow:hidden}.public_channel_thumbnail{position:absolute;border:2px solid red;display:none}h1.channel_info{margin:0;padding-top:10px}div.list_tags{padding-top:20px}.channelLinks{padding:0 0 0 0;margin-bottom:15px}.channelLinks li{padding:7px;border:1px solid #ccc;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;display:inline;margin:0 0 0 0;list-style:none}#comments{width:100%}#commentsmain{float:left;width:190px;background-color:#fffff9;border:1px dashed #d0d0d0;padding:5px;margin-right:16px;overflow:hidden;display:none}.commentlink{float:left;width:100%}#public_statuses{width:455px;height:380px;overflow:auto;font-size:1.5em}#public_statuses div{margin-left:15px}.statusIFrame{border:1px solid #ccc;background-color:#ffffff}.userlogin{display:none}.login_info{font-weight:bold;text-align:right;font-size:12px}.round{-moz-border-radius:7px;-webkit-border-radius:7px}.text_center{text-align:center}.big{font-size:18px}.large{font-size:20px}.xlarge{font-size:30px}.small{font-size:12px}.action{margin-right:20px;position:relative;top:35px;font-weight:bold;padding:10px}.action_reverse{margin-right:20px;position:relative;top:35px;font-weight:bold;background-color:#d62020;padding:8px;color:#000000}.action_reverse a{color:#FFFFFF}.section_header_reverse{margin:15px 0 5px 0;display:inline-block;font-weight:bold;color:#FFFFFF;background-color:#d62020;padding:8px}.nicetable{font-size:14px;border:1px solid #bbbbbb}.nicetable-borderless{font-size:14px;border:none}.nicetable-borderless p{margin-left:20px;margin-top:5px;margin-bottom:10px}.nicetable-borderless h3{margin-bottom:0}.nicetable-borderless h3.signed_in_channel_header{margin-bottom:10px}.nicetable .header{font-weight:bold;background-color:#e5e5e5}.nicetable .header td{padding-top:3px}.nicetable td{padding:2px 10px;border-bottom:1px solid #bbbbbb;word-wrap:word}.nicetable .stripe{background-color:#f9f9f9}.nicetable .disabled{background-color:#eee}.nicetable .disabled a{color:#888}.fulltable{width:95%}.fullform{width:100%;margin-bottom:1.5em}.deletecol{width:1em}.table_no_header{font-size:14px}.table_no_header td{padding:2px 10px}.table_no_header .left{font-weight:bold}.max_width_400{max-width:40;word-wrap:break-word}.helplink{float:right;margin-top:3px}.votediv,.votedivphoto,.votedivlink{color:#3478e3}.votedivlink{padding-right:20px}.votediv{float:right;display:none}.voteicon{padding:2px;background:#f8f8f8;border:1px solid #ddd;cursor:pointer}.voteicon:hover{text-decoration:none}.voteicon img{position:relative;top:3px}.nestedcomment{padding-left:30px}.commenttable{padding:0;margin:0;width:100%}.commenttable td{padding:4px 10px 4px 5px}.commentchannel{color:#f08600;font-weight:bold}.commentbody{color:#333333}.commentdiv{width:100%;padding:5px 0 5px 0;font-size:12px;border-top:1px solid #aaa}.gravatar{border:1px solid #999}.noavatar{width:50px;height:50px;border:1px solid #ddd;color:#ddd;text-align:center}.noavatartext{padding-top:5px}.prettydate{color:#aaa}.username a{color:#3478E3;font-weight:bold}.timeago{font-size:0.8em;color:#ccc}.pagination{font-size:14px}.centerme{display:table;margin:0 auto}.fixedwidth{width:960px;display:table;margin:0 auto}.code{margin:10px 0;background-color:#fafafa;white-space:pre-wrap;font:12px Monaco, Lucida Console, monospace;color:#000000;border:1px solid #bbbbbb;padding:10px}.apps{padding:0 30px 40px 0;font-size:20px;float:left;text-align:center;margin:0 auto;width:150px}input[type="text"].shortfield{width:30px}input[type="text"].midfield{width:120px}textarea.tweet{margin-top:0.5em;width:40em;height:3em}.errorExplanation{width:95%;background-color:#ffffe0;display:table;margin-bottom:20px;padding:10px;border:1px solid #aaaaaa}#error{color:red}.field_with_errors{display:inline}.warning_box{margin:15px 0 15px 0;padding:10px;background-color:#fc3;color:#000;border:1px solid #f90}#maincontent{float:left;width:980px;padding-bottom:20px;margin-left:10px;overflow:false}#maincontent.thin{width:400px}#maincontent.medium{width:500px}#maincontent .thinghttptable{table-layout:fixed;width:400px;word-wrap:break-word}#maincontent .thinghttptable .url{width:100px}#maincontent .thinghttptable .apikey{width:80px}input#upload_csv{padding-top:5px;margin:20px 0}#sidebar.wide{width:520px}#sidebar.medium{width:470px}#sidebar.narrow{width:470px;margin-left:520px}#sidebar .helplink{float:right;margin-top:5px;font-weight:normal;font-size:12px}.FL{float:left}.FR{float:right}.FN{float:none}.DT{display:table}.CL{clear:left}.CR{clear:right}.CB{clear:both}.UL{text-decoration:underline}.TAR{text-align:right}.TAC{text-align:center}.VAT{vertical-align:top}.PB10{padding-bottom:10px}.PR20{padding-right:20px}.PL20{padding-left:20px}.PL30{padding-left:30px}.MT10{margin-top:5px}.MR20{margin-right:20px}.MR60{margin-right:60px;margin-bottom:20px}.ML20{margin-left:20px}.ML60{margin-left:60px}.W50{width:50%}.W100{width:100%}.left20{position:relative;left:-20px}.up2{position:relative;top:-2px}.up20{position:relative;top:-20px}input.video_narrow{width:100px}#feature_signup a{border-bottom:3px solid #d62020;text-decoration:none;font-weight:bold}#feature_signup a:hover{text-decoration:none}#nav{list-style:none;padding:0 10px 0 92px;margin:0}#nav li{float:left;margin:0px 0px 0px 10px;padding:0px 15px 0px 0px;position:relative;font-size:14px;line-height:1.4;zoom:1}#nav li:last-child{padding:0}#nav .current-cat a,#nav .current_page_item a{color:#d62020;border-bottom:5px solid #2565A5}#nav .current-cat li a,#nav .current_page_item li a{color:#000}#nav .current-cat li a:hover,#nav .current_page_item li a:hover{color:#d62020;border-bottom:5px solid #2565A5}#nav li a{text-transform:uppercase;font-weight:bold;text-decoration:none;color:#000;border:none;text-decoration:none;float:left;border-bottom:5px solid #FFFFFF}#nav li a:hover{color:#d62020;border-bottom:5px solid #aaa}#nav li span{width:12px;height:20px;background:url("arrow-down.gif") no-repeat left 7px;margin:0;padding:0;position:absolute;right:0;top:0}#nav ul{display:none}#nav li span.child{width:12px;height:20px;background:url("arrow-right.gif") no-repeat left 10px;margin:0;padding:0;position:absolute;right:0;top:0}#nav li a.rss{background:url(rss_feed.png) right 0px no-repeat;padding:0px 30px 0px 0}#nav li a.rss:hover{background:url(rss_feed.png) right -24px no-repeat;padding:0px 30px 0px 0;border-bottom:0 solid #aaa}.ui-widget{font-size:.8em}.ui-widget-header{border:1px solid #0867A3;background:#0867a3 none top right no-repeat}.ui-progressbar{height:5px}.ui-progressbar-value{background-color:green}.ui-widget-content a{color:blue;text-decoration:underline;margin:0}.ui-widget-content p{margin:0 0 10px 10px}.column{width:470px;float:left;padding-bottom:50px;padding-left:5px}.portlet{margin:0 1em 1em 0}.portlet-header{margin:0.3em;padding:7px 7px 7px 7px}.portlet-header .ui-icon{float:right;margin-top:-2px;cursor:pointer;cursor:hand}.portlet-content{padding:0.4em}.ui-sortable-placeholder{border:1px dotted black;visibility:visible !important;height:50px !important}.ui-sortable-placeholder *{visibility:hidden}.buttonlets{float:left;overflow:hidden;max-width:95px}.tweetButton{width:80px}.facebookButton{width:85px}.googleplusButton{width:70px}.padded{margin-top:2px}.ui-button{height:19px;line-height:1em}.ui-button-text-only .ui-button-text{padding:0.2em 1em 0.2em 0.4em;font-size:12px}.ui-state-active{border:1px solid #2565a5;background:#ddd none 50% 50% repeat-x;color:#2565a5}.ui-state-default{border:1px solid #ccc;color:#2565a5}.ui-state-hover{background:#ccc none 50% 50% repeat-x}.topLink{font-size:16px}.developerlink{padding:7px;margin-left:10px;border-bottom-left-radius:15px;border-bottom-right-radius:15px;-webkit-border-bottom-left-radius:15px;-webkit-border-bottom-right-radius:15px;-moz-border-bottom-left-radius:15px;-moz-border-bottom-right-radius:15px;background-color:#aaa}.addpluginlink{color:white;padding:7px;margin-left:10px;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;background-color:#aaa;cursor:pointer}.addpluginlink:hover{background-color:#ccc}.pluginrectangle{display:none;background-color:#aaa;border-radius:5px;position:absolute;height:70%;width:100%;top:30px;right:0}.developerlink:hover{background-color:#ccc}.developerlink a{color:white;text-decoration:none}.channelInfo{max-width:500px}.channelDescription{width:450px;height:60px}.socialButtons{float:right;display:inline}.dev-info-dialog{border:2px solid #bbb}.dev-info-dialog .ui-dialog-titlebar{background-color:#aaa;color:white}.dev-info-dialog a{text-decoration:underline}.ui-tabs{height:100%}.dev-info-dialog ul{list-style-type:none;background-color:whitesmoke}#devInfo{font-size:1.2em}.dev-info-dialog ul li{display:inline;list-style-type:none}.dev_info_table1{margin-bottom:10px}.dev_info_table2{margin-left:10px}.dev_info_table2 td{max-width:300px}.watchButtonLabel{white-space:nowrap;padding-right:10px}.watchButtonImage{float:left;background-position:left;background-image:url("eye.png");background-repeat:no-repeat;width:19px;height:16px}.watchButtonPadding{padding-right:5px}.chartOptions{display:none}.fade{display:none;font-size:1.2em}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-hover a,.ui-state-hover a:hover{color:#d82020;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#d82020;text-decoration:none}.ui-widget :active{outline:none}.ui-tabs .ui-tabs-panel{padding-top:0}.addportlet{padding:5px;width:50px;margin:5px;border-radius:5px;border:2px solid red;cursor:pointer;display:inline-block}.channel_stats_location{clear:right;float:right;width:475px;padding-top:23px}.channel_stats_text{font-weight:bold;font-size:1.2em}.channel_time_text{color:black;font-size:1em}.recent_status{font-family:sans-serif;margin:4px}.timeago{font-size:0.8em;color:#ccc;margin-left:10px}.com{color:#93a1a1}.lit{color:#195f91}.pun,.opn,.clo{color:#93a1a1}.fun{color:#dc322f}.str,.atv{color:#D14}.kwd,.prettyprint .tag{color:#1e347b}.typ,.atn,.dec,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:20px;text-shadow:0 1px 0 #fff}.affix-top,.affix{position:static}#bootstrap-sidebar{background-color:#eee;border:1px solid #bbb;border-radius:5px;padding:2px 0}#bootstrap-sidebar li a:hover{background-color:#fafafa}#bootstrap-sidebar li.active{border:0 #666 solid;border-right-width:4px}@media (min-width: 979px){#bootstrap-sidebar.affix-top,#bootstrap-sidebar.affix{position:fixed;top:30px;width:228px}} diff --git a/public/assets/application-6b141b11b3826cf03d9c3fa5cc7fd6dd.css.gz b/public/assets/application-6b141b11b3826cf03d9c3fa5cc7fd6dd.css.gz new file mode 100644 index 0000000..dc6ffed Binary files /dev/null and b/public/assets/application-6b141b11b3826cf03d9c3fa5cc7fd6dd.css.gz differ diff --git a/public/assets/application-7190531a22e0dae7db2fbb715e0d2fe5.css b/public/assets/application-7190531a22e0dae7db2fbb715e0d2fe5.css new file mode 100644 index 0000000..b01de20 --- /dev/null +++ b/public/assets/application-7190531a22e0dae7db2fbb715e0d2fe5.css @@ -0,0 +1,99 @@ +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #222 0, #282828 100%);background-image:linear-gradient(to bottom, #222 0, #282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:linear-gradient(to bottom, #428bca 0, #3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:linear-gradient(to bottom, #428bca 0, #3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}code{word-wrap:break-word;white-space:normal}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute !important;clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */.ui-widget{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1em}.ui-widget-content{border:1px solid #dddddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333333}.ui-widget-content a{color:#333333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#ffffff;font-weight:bold}.ui-widget-header a{color:#ffffff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #cccccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-widget :active{outline:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#ffffff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#ffffff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#ffffff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-off{background-position:-96px -144px}.ui-icon-radio-on{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.50;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.20;filter:Alpha(Opacity=20);-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px} /*! +* jQuery UI Resizable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Resizable#theming +*/.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} /*! +* jQuery UI Selectable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Selectable#theming +*/.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}/*! + * jQuery UI Accordion 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */.ui-accordion{width:100%}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1}.ui-accordion .ui-accordion-li-fix{display:inline}.ui-accordion .ui-accordion-header-active{border-bottom:0 !important}.ui-accordion .ui-accordion-header a{display:block;font-size:1em;padding:.5em .5em .5em .7em}.ui-accordion-icons .ui-accordion-header a{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1}.ui-accordion .ui-accordion-content-active{display:block}/*! + * jQuery UI Autocomplete 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */.ui-autocomplete{position:absolute;cursor:default}* html .ui-autocomplete{width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left}.ui-menu .ui-menu{margin-top:-3px}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1}.ui-menu .ui-menu-item a.ui-state-hover,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}/*! + * jQuery UI Button 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none !important;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}/*! + * jQuery UI Dialog 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}/*! + * jQuery UI Slider 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} /*! +* jQuery UI Tabs 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Tabs#theming +*/.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 .2em 1px 0;border-bottom:0 !important;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{margin-bottom:0;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-state-processing a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tabs .ui-tabs-hide{display:none !important}/*! + * jQuery UI Datepicker 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}/*! +* jQuery UI Progressbar 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Progressbar#theming +*/.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.navbar-collapse{max-height:350px}.breadcrumb{margin-top:10px;margin-bottom:20px}.table td{word-break:break-word}.break-word{word-break:break-word}.form-horizontal .multiline-label{margin-top:-10px}.nested-fields{border:1px solid #d6d6d6;padding:10px 10px 0 10px;max-width:275px}.customcode,.customcode .str,.customcode .lit,.customcode .pln{color:#00ab9b}.response-div{margin-top:12px;font-size:0.8em}.response{background-color:#ddd;margin:0 1px;border:1px solid #555;padding:2px;font-weight:bold;color:#555;cursor:pointer}.response:hover{background-color:#eeb}.response.active{background-color:#beb;cursor:initial}.format-json,.format-xml{display:none}.format-block{min-height:200px}.format-block-lg{min-height:350px}html,body{height:100%}#wrap{min-height:100%;height:auto;margin:0 auto -30px;padding:0 0 60px}#footer{padding-top:5px;border-top:1px solid #ddd;height:30px;background-color:#f5f5f5}.infobox{vertical-align:bottom}.spanlink{cursor:pointer}.boldlink{font-weight:bold}#logo{float:left;margin:0 0 0 0}#logo a{color:#d62020}#logo a span,.paygray{color:#666666}#logo a:hover,.apps a:hover,.apps:hover div{text-decoration:none}.commentarea{width:300px;height:80px}#logo.small{font-size:30px;color:#666666}#options{float:right;text-align:right}#login{padding:6px;border:1px solid #bbbbbb;border-collapse:separate;border-spacing:3px;background-color:#eeeeee;background:-webkit-gradient(linear, left top, right top, from(#ddd), to(#f5f5f5));background:-moz-linear-gradient(left, #ddd, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd', endColorstr='#f5f5f5', GradientType=1)}#menu{height:40px;margin:0 auto;border:1px solid #dddddd;background-color:#d6d6d6;background:-webkit-gradient(linear, left top, left bottom, from(#eee), to(#bbb));background:-moz-linear-gradient(top, #eee, #bbb);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#bbbbbb')}#menu div{float:left;height:40px}#menu div a{color:#777777;padding:10px 30px;display:block;font-weight:bold}#menu div:hover{background-color:#cccccc}#menu div:hover a{color:#000000;text-decoration:none}#menu .selected,#menu .selected:hover{background-color:#e5e5e5}#menu .selected a{color:#000000}#channel_info{padding-bottom:20px}.signed_in_channel_header{display:inline-block}.public_private_icon{display:inline-block}.signed_in_channel_header{width:300px;height:10px}#list_progress_bar{width:300px;height:10px}.public_channel_box{margin:5px;border-radius:7px;height:300px;border:solid 1px red;display:inline-block;width:30%;vertical-align:top}.public_channel_inner{margin-left:10px;margin-right:5px}.public_channel_name{height:11px;font-size:1.3em;font-weight:bold;color:#2565A5}.public_channel_user{height:15px;margin-left:7px;font-size:0.9em}.progressbar{height:10px}.public_channel_desc{height:140px;word-break:break-all}.public_channel_url{height:10px}.public_channel_tags{height:57px;margin-bottom:10px;overflow:hidden}.public_channel_thumbnail{position:absolute;border:2px solid red;display:none}h1.channel_info{margin:0;padding-top:10px}div.list_tags{padding-top:20px}.channelLinks{padding:0 0 0 0;margin-bottom:15px}.channelLinks li{padding:7px;border:1px solid #ccc;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;display:inline;margin:0 0 0 0;list-style:none}#comments{width:100%}#commentsmain{float:left;width:190px;background-color:#fffff9;border:1px dashed #d0d0d0;padding:5px;margin-right:16px;overflow:hidden;display:none}.commentlink{float:left;width:100%}#public_statuses{width:455px;height:380px;overflow:auto;font-size:1.5em}#public_statuses div{margin-left:15px}.statusIFrame{border:1px solid #ccc;background-color:#ffffff}.userlogin{display:none}.login_info{font-weight:bold;text-align:right;font-size:12px}.round{-moz-border-radius:7px;-webkit-border-radius:7px}.text_center{text-align:center}.big{font-size:18px}.large{font-size:20px}.xlarge{font-size:30px}.small{font-size:12px}.action{margin-right:20px;position:relative;top:35px;font-weight:bold;padding:10px}.action_reverse{margin-right:20px;position:relative;top:35px;font-weight:bold;background-color:#d62020;padding:8px;color:#000000}.action_reverse a{color:#FFFFFF}.section_header_reverse{margin:15px 0 5px 0;display:inline-block;font-weight:bold;color:#FFFFFF;background-color:#d62020;padding:8px}.nicetable{font-size:14px;border:1px solid #bbbbbb}.nicetable-borderless{font-size:14px;border:none}.nicetable-borderless p{margin-left:20px;margin-top:5px;margin-bottom:10px}.nicetable-borderless h3{margin-bottom:0}.nicetable-borderless h3.signed_in_channel_header{margin-bottom:10px}.nicetable .header{font-weight:bold;background-color:#e5e5e5}.nicetable .header td{padding-top:3px}.nicetable td{padding:2px 10px;border-bottom:1px solid #bbbbbb;word-wrap:word}.nicetable .stripe{background-color:#f9f9f9}.nicetable .disabled{background-color:#eee}.nicetable .disabled a{color:#888}.fulltable{width:95%}.fullform{width:100%;margin-bottom:1.5em}.deletecol{width:1em}.table_no_header{font-size:14px}.table_no_header td{padding:2px 10px}.table_no_header .left{font-weight:bold}.max_width_400{max-width:40;word-wrap:break-word}.helplink{float:right;margin-top:3px}.votediv,.votedivphoto,.votedivlink{color:#3478e3}.votedivlink{padding-right:20px}.votediv{float:right;display:none}.voteicon{padding:2px;background:#f8f8f8;border:1px solid #ddd;cursor:pointer}.voteicon:hover{text-decoration:none}.voteicon img{position:relative;top:3px}.nestedcomment{padding-left:30px}.commenttable{padding:0;margin:0;width:100%}.commenttable td{padding:4px 10px 4px 5px}.commentchannel{color:#f08600;font-weight:bold}.commentbody{color:#333333}.commentdiv{width:100%;padding:5px 0 5px 0;font-size:12px;border-top:1px solid #aaa}.gravatar{border:1px solid #999}.noavatar{width:50px;height:50px;border:1px solid #ddd;color:#ddd;text-align:center}.noavatartext{padding-top:5px}.prettydate{color:#aaa}.username a{color:#3478E3;font-weight:bold}.timeago{font-size:0.8em;color:#ccc}.pagination{font-size:14px}.centerme{display:table;margin:0 auto}.fixedwidth{width:960px;display:table;margin:0 auto}.code{margin:10px 0;background-color:#fafafa;white-space:pre-wrap;font:12px Monaco, Lucida Console, monospace;color:#000000;border:1px solid #bbbbbb;padding:10px}.apps{padding:0 30px 40px 0;font-size:20px;float:left;text-align:center;margin:0 auto;width:150px}input[type="text"].shortfield{width:30px}input[type="text"].midfield{width:120px}textarea.tweet{margin-top:0.5em;width:40em;height:3em}.errorExplanation{width:95%;background-color:#ffffe0;display:table;margin-bottom:20px;padding:10px;border:1px solid #aaaaaa}#error{color:red}.field_with_errors{display:inline}.warning_box{margin:15px 0 15px 0;padding:10px;background-color:#fc3;color:#000;border:1px solid #f90}#maincontent{float:left;width:980px;padding-bottom:20px;margin-left:10px;overflow:false}#maincontent.thin{width:400px}#maincontent.medium{width:500px}#maincontent .thinghttptable{table-layout:fixed;width:400px;word-wrap:break-word}#maincontent .thinghttptable .url{width:100px}#maincontent .thinghttptable .apikey{width:80px}input#upload_csv{padding-top:5px;margin:20px 0}#sidebar.wide{width:520px}#sidebar.medium{width:470px}#sidebar.narrow{width:470px;margin-left:520px}#sidebar .helplink{float:right;margin-top:5px;font-weight:normal;font-size:12px}.FL{float:left}.FR{float:right}.FN{float:none}.DT{display:table}.CL{clear:left}.CR{clear:right}.CB{clear:both}.UL{text-decoration:underline}.TAR{text-align:right}.TAC{text-align:center}.VAT{vertical-align:top}.PB10{padding-bottom:10px}.PR20{padding-right:20px}.PL20{padding-left:20px}.PL30{padding-left:30px}.MT10{margin-top:5px}.MR20{margin-right:20px}.MR60{margin-right:60px;margin-bottom:20px}.ML20{margin-left:20px}.ML60{margin-left:60px}.W50{width:50%}.W100{width:100%}.left20{position:relative;left:-20px}.up2{position:relative;top:-2px}.up20{position:relative;top:-20px}input.video_narrow{width:100px}#feature_signup a{border-bottom:3px solid #d62020;text-decoration:none;font-weight:bold}#feature_signup a:hover{text-decoration:none}#nav{list-style:none;padding:0 10px 0 92px;margin:0}#nav li{float:left;margin:0px 0px 0px 10px;padding:0px 15px 0px 0px;position:relative;font-size:14px;line-height:1.4;zoom:1}#nav li:last-child{padding:0}#nav .current-cat a,#nav .current_page_item a{color:#d62020;border-bottom:5px solid #2565A5}#nav .current-cat li a,#nav .current_page_item li a{color:#000}#nav .current-cat li a:hover,#nav .current_page_item li a:hover{color:#d62020;border-bottom:5px solid #2565A5}#nav li a{text-transform:uppercase;font-weight:bold;text-decoration:none;color:#000;border:none;text-decoration:none;float:left;border-bottom:5px solid #FFFFFF}#nav li a:hover{color:#d62020;border-bottom:5px solid #aaa}#nav li span{width:12px;height:20px;background:url("arrow-down.gif") no-repeat left 7px;margin:0;padding:0;position:absolute;right:0;top:0}#nav ul{display:none}#nav li span.child{width:12px;height:20px;background:url("arrow-right.gif") no-repeat left 10px;margin:0;padding:0;position:absolute;right:0;top:0}#nav li a.rss{background:url(rss_feed.png) right 0px no-repeat;padding:0px 30px 0px 0}#nav li a.rss:hover{background:url(rss_feed.png) right -24px no-repeat;padding:0px 30px 0px 0;border-bottom:0 solid #aaa}.ui-widget{font-size:.8em}.ui-widget-header{border:1px solid #0867A3;background:#0867a3 none top right no-repeat}.ui-progressbar{height:5px}.ui-progressbar-value{background-color:green}.ui-widget-content a{color:blue;text-decoration:underline;margin:0}.ui-widget-content p{margin:0 0 10px 10px}.column{width:470px;float:left;padding-bottom:50px;padding-left:5px}.portlet{margin:0 1em 1em 0}.portlet-header{margin:0.3em;padding:7px 7px 7px 7px}.portlet-header .ui-icon{float:right;margin-top:-2px;cursor:pointer;cursor:hand}.portlet-content{padding:0.4em}.ui-sortable-placeholder{border:1px dotted black;visibility:visible !important;height:50px !important}.ui-sortable-placeholder *{visibility:hidden}.buttonlets{float:left;overflow:hidden;max-width:95px}.tweetButton{width:80px}.facebookButton{width:85px}.googleplusButton{width:70px}.padded{margin-top:2px}.ui-button{height:19px;line-height:1em}.ui-button-text-only .ui-button-text{padding:0.2em 1em 0.2em 0.4em;font-size:12px}.ui-state-active{border:1px solid #2565a5;background:#ddd none 50% 50% repeat-x;color:#2565a5}.ui-state-default{border:1px solid #ccc;color:#2565a5}.ui-state-hover{background:#ccc none 50% 50% repeat-x}.topLink{font-size:16px}.developerlink{padding:7px;margin-left:10px;border-bottom-left-radius:15px;border-bottom-right-radius:15px;-webkit-border-bottom-left-radius:15px;-webkit-border-bottom-right-radius:15px;-moz-border-bottom-left-radius:15px;-moz-border-bottom-right-radius:15px;background-color:#aaa}.addpluginlink{color:white;padding:7px;margin-left:10px;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;background-color:#aaa;cursor:pointer}.addpluginlink:hover{background-color:#ccc}.pluginrectangle{display:none;background-color:#aaa;border-radius:5px;position:absolute;height:70%;width:100%;top:30px;right:0}.developerlink:hover{background-color:#ccc}.developerlink a{color:white;text-decoration:none}.channelInfo{max-width:500px}.channelDescription{width:450px;height:60px}.socialButtons{float:right;display:inline}.dev-info-dialog{border:2px solid #bbb}.dev-info-dialog .ui-dialog-titlebar{background-color:#aaa;color:white}.dev-info-dialog a{text-decoration:underline}.ui-tabs{height:100%}.dev-info-dialog ul{list-style-type:none;background-color:whitesmoke}#devInfo{font-size:1.2em}.dev-info-dialog ul li{display:inline;list-style-type:none}.dev_info_table1{margin-bottom:10px}.dev_info_table2{margin-left:10px}.dev_info_table2 td{max-width:300px}.watchButtonLabel{white-space:nowrap;padding-right:10px}.watchButtonImage{float:left;background-position:left;background-image:url("eye.png");background-repeat:no-repeat;width:19px;height:16px}.watchButtonPadding{padding-right:5px}.chartOptions{display:none}.fade{display:none;font-size:1.2em}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-hover a,.ui-state-hover a:hover{color:#d82020;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#d82020;text-decoration:none}.ui-widget :active{outline:none}.ui-tabs .ui-tabs-panel{padding-top:0}.addportlet{padding:5px;width:50px;margin:5px;border-radius:5px;border:2px solid red;cursor:pointer;display:inline-block}.channel_stats_location{clear:right;float:right;width:475px;padding-top:23px}.channel_stats_text{font-weight:bold;font-size:1.2em}.channel_time_text{color:black;font-size:1em}.recent_status{font-family:sans-serif;margin:4px}.timeago{font-size:0.8em;color:#ccc;margin-left:10px}.com{color:#93a1a1}.lit{color:#195f91}.pun,.opn,.clo{color:#93a1a1}.fun{color:#dc322f}.str,.atv{color:#D14}.kwd,.prettyprint .tag{color:#1e347b}.typ,.atn,.dec,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:20px;text-shadow:0 1px 0 #fff}.affix-top,.affix{position:static}#bootstrap-sidebar{background-color:#eee;border:1px solid #bbb;border-radius:5px;padding:2px 0}#bootstrap-sidebar li a:hover{background-color:#fafafa}#bootstrap-sidebar li.active{border:0 #666 solid;border-right-width:4px}@media (min-width: 979px){#bootstrap-sidebar.affix-top,#bootstrap-sidebar.affix{position:fixed;top:30px;width:228px}} diff --git a/public/assets/application-7190531a22e0dae7db2fbb715e0d2fe5.css.gz b/public/assets/application-7190531a22e0dae7db2fbb715e0d2fe5.css.gz new file mode 100644 index 0000000..13af34a Binary files /dev/null and b/public/assets/application-7190531a22e0dae7db2fbb715e0d2fe5.css.gz differ diff --git a/public/assets/application-9a8391e7623b717b5e3815c9802c8c19.js b/public/assets/application-9a8391e7623b717b5e3815c9802c8c19.js new file mode 100644 index 0000000..eb0ba87 --- /dev/null +++ b/public/assets/application-9a8391e7623b717b5e3815c9802c8c19.js @@ -0,0 +1,6 @@ +function openDialogCenter(t){t.dialog("open");var e=getDimensions(t.parent());t.dialog({position:[e[0],e[1]]})}function getDimensions(t){var e=new Array(2);return e[0]=$(window).width()/2-t.width()/2,e[1]=$(window).height()/2-t.height()/2,e}function updateChart(t,e,i,n,r,s){var i=i,n=n,o=$("#iframe"+t).attr("default_src");o||(o=$("#iframe"+t).attr("src")),src=o.split("?")[0],"line"!=$("#type_"+t).val()&&0==$("#timescale_"+t).val().length&&0==$("#average_"+t).val().length&&0==$("#median_"+t).val().length&&0==$("#sum_"+t).val().length&&$("#timescale_"+t).val(30);var a=[];$(".chart_options"+t).each(function(){var t=$(this).val(),e=$(this).attr("id"),i=e.split("_")[0];t.length>0&&a.push([i,t])});for(var l="";a.length>0;){var h=a.pop();"width"==h[0]&&(i=parseInt(h[1])),"height"==h[0]&&(n=parseInt(h[1])),("type"!=h[0]||"line"!=h[1])&&(l+="&"+h[0]+"="+encodeURIComponent(h[1]))}l.length>0&&(src+="?"+l.substring(1)),e&&t>0&&s?$.update("/channels/"+r+"/charts/"+t,{newOptions:{options:l}}):e&&t>0&&$.update("/channels/"+r+"/charts/"+t,{options:l}),$("#embed"+t).val(''),$("#iframe"+t).attr("src",src),$("#iframe"+t).attr("width",i),$("#iframe"+t).attr("height",n)}function updateSelectValues(){selectedValue=$(this).val(),$(".mutuallyexclusive"+index).each(function(){$(this).val("")}),$(this).val(selectedValue)}function setupChartForm(t){return function(e,i){i.length>0&&$("#"+i.split("=")[0]+"_"+t).val(decodeURIComponent(i.split("=")[1]))}}function setupColumns(t,e){$(sortColumnSetup(t,e)),$(".column").disableSelection()}function createWindowsWithData(t,e,i,n){for(var r in t){for(var s in t[r])var o=s;if(t[r].chart_window&&(a=t[r].chart_window),t[r].plugin_window&&(a=t[r].plugin_window),t[r].portlet_window&&(a=t[r].portlet_window),"undefined"==a)var a=t[r].portlet_window?t[r].portlet_window:t[r].chart_window;colId=a.col,title=a.title;var l=a.html;if(t[r].chart_window){var h=a.id;$("body").append("
")}var c=addWindow(n,colId,a.id,o,title,l);c.each(decoratePortlet(e)),c.find(".ui-toggle").click(uiToggleClick),c.find(".ui-view").click(uiViewClick(i)),c.find(".ui-edit").click(uiEditClick(i)),c.find(".ui-close").click(uiCloseClick(i))}}function addWindow(t,e,i,n,r,s){if($("#"+t+"_dialog"+e).append('
'+r+'
'+s+"
"),$("#portlet_"+i).length>1)throw"Portlet count doesn't match what's expected";return $("#portlet_"+i)}function sortColumnSetup(t,e){$(".column").sortable({opacity:.6,helper:function(){return $("
Drop to re-position
")},connectWith:".column",update:updatePortletPositions(t,e)})}function getPortletArray(t){var e=new Array,n=t.split("&");for(i in n)val=n[i].split("=")[1],e.push(val);return e}function uiToggleClick(){$(this).toggleClass("ui-icon-minusthick").toggleClass("ui-icon-plusthick"),$(this).parents(".portlet:first").find(".portlet-content").toggle()}!function(t,e){t.rails!==e&&t.error("jquery-ujs has already been loaded!");var i,n=t(document);t.rails=i={linkClickSelector:"a[data-confirm], a[data-method], a[data-remote], a[data-disable-with]",buttonClickSelector:"button[data-remote]",inputChangeSelector:"select[data-remote], input[data-remote], textarea[data-remote]",formSubmitSelector:"form",formInputClickSelector:"form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])",disableSelector:"input[data-disable-with], button[data-disable-with], textarea[data-disable-with]",enableSelector:"input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled",requiredInputSelector:"input[name][required]:not([disabled]),textarea[name][required]:not([disabled])",fileInputSelector:"input[type=file]",linkDisableSelector:"a[data-disable-with]",CSRFProtection:function(e){var i=t('meta[name="csrf-token"]').attr("content");i&&e.setRequestHeader("X-CSRF-Token",i)},fire:function(e,i,n){var r=t.Event(i);return e.trigger(r,n),r.result!==!1},confirm:function(t){return confirm(t)},ajax:function(e){return t.ajax(e)},href:function(t){return t.attr("href")},handleRemote:function(n){var r,s,o,a,l,h,c,d;if(i.fire(n,"ajax:before")){if(a=n.data("cross-domain"),l=a===e?null:a,h=n.data("with-credentials")||null,c=n.data("type")||t.ajaxSettings&&t.ajaxSettings.dataType,n.is("form")){r=n.attr("method"),s=n.attr("action"),o=n.serializeArray();var u=n.data("ujs:submit-button");u&&(o.push(u),n.data("ujs:submit-button",null))}else n.is(i.inputChangeSelector)?(r=n.data("method"),s=n.data("url"),o=n.serialize(),n.data("params")&&(o=o+"&"+n.data("params"))):n.is(i.buttonClickSelector)?(r=n.data("method")||"get",s=n.data("url"),o=n.serialize(),n.data("params")&&(o=o+"&"+n.data("params"))):(r=n.data("method"),s=i.href(n),o=n.data("params")||null);d={type:r||"GET",data:o,dataType:c,beforeSend:function(t,r){return r.dataType===e&&t.setRequestHeader("accept","*/*;q=0.5, "+r.accepts.script),i.fire(n,"ajax:beforeSend",[t,r])},success:function(t,e,i){n.trigger("ajax:success",[t,e,i])},complete:function(t,e){n.trigger("ajax:complete",[t,e])},error:function(t,e,i){n.trigger("ajax:error",[t,e,i])},crossDomain:l},h&&(d.xhrFields={withCredentials:h}),s&&(d.url=s);var p=i.ajax(d);return n.trigger("ajax:send",p),p}return!1},handleMethod:function(n){var r=i.href(n),s=n.data("method"),o=n.attr("target"),a=t("meta[name=csrf-token]").attr("content"),l=t("meta[name=csrf-param]").attr("content"),h=t('
'),c='';l!==e&&a!==e&&(c+=''),o&&h.attr("target",o),h.hide().append(c).appendTo("body"),h.submit()},disableFormElements:function(e){e.find(i.disableSelector).each(function(){var e=t(this),i=e.is("button")?"html":"val";e.data("ujs:enable-with",e[i]()),e[i](e.data("disable-with")),e.prop("disabled",!0)})},enableFormElements:function(e){e.find(i.enableSelector).each(function(){var e=t(this),i=e.is("button")?"html":"val";e.data("ujs:enable-with")&&e[i](e.data("ujs:enable-with")),e.prop("disabled",!1)})},allowAction:function(t){var e,n=t.data("confirm"),r=!1;return n?(i.fire(t,"confirm")&&(r=i.confirm(n),e=i.fire(t,"confirm:complete",[r])),r&&e):!0},blankInputs:function(e,i,n){var r,s,o=t(),a=i||"input,textarea",l=e.find(a);return l.each(function(){if(r=t(this),s=r.is("input[type=checkbox],input[type=radio]")?r.is(":checked"):r.val(),!s==!n){if(r.is("input[type=radio]")&&l.filter('input[type=radio]:checked[name="'+r.attr("name")+'"]').length)return!0;o=o.add(r)}}),o.length?o:!1},nonBlankInputs:function(t,e){return i.blankInputs(t,e,!0)},stopEverything:function(e){return t(e.target).trigger("ujs:everythingStopped"),e.stopImmediatePropagation(),!1},disableElement:function(t){t.data("ujs:enable-with",t.html()),t.html(t.data("disable-with")),t.bind("click.railsDisable",function(t){return i.stopEverything(t)})},enableElement:function(t){t.data("ujs:enable-with")!==e&&(t.html(t.data("ujs:enable-with")),t.removeData("ujs:enable-with")),t.unbind("click.railsDisable")}},i.fire(n,"rails:attachBindings")&&(t.ajaxPrefilter(function(t,e,n){t.crossDomain||i.CSRFProtection(n)}),n.delegate(i.linkDisableSelector,"ajax:complete",function(){i.enableElement(t(this))}),n.delegate(i.linkClickSelector,"click.rails",function(n){var r=t(this),s=r.data("method"),o=r.data("params");if(!i.allowAction(r))return i.stopEverything(n);if(r.is(i.linkDisableSelector)&&i.disableElement(r),r.data("remote")!==e){if(!(!n.metaKey&&!n.ctrlKey||s&&"GET"!==s||o))return!0;var a=i.handleRemote(r);return a===!1?i.enableElement(r):a.error(function(){i.enableElement(r)}),!1}return r.data("method")?(i.handleMethod(r),!1):void 0}),n.delegate(i.buttonClickSelector,"click.rails",function(e){var n=t(this);return i.allowAction(n)?(i.handleRemote(n),!1):i.stopEverything(e)}),n.delegate(i.inputChangeSelector,"change.rails",function(e){var n=t(this);return i.allowAction(n)?(i.handleRemote(n),!1):i.stopEverything(e)}),n.delegate(i.formSubmitSelector,"submit.rails",function(n){var r=t(this),s=r.data("remote")!==e,o=i.blankInputs(r,i.requiredInputSelector),a=i.nonBlankInputs(r,i.fileInputSelector);if(!i.allowAction(r))return i.stopEverything(n);if(o&&r.attr("novalidate")==e&&i.fire(r,"ajax:aborted:required",[o]))return i.stopEverything(n);if(s){if(a){setTimeout(function(){i.disableFormElements(r)},13);var l=i.fire(r,"ajax:aborted:file",[a]);return l||setTimeout(function(){i.enableFormElements(r)},13),l}return i.handleRemote(r),!1}setTimeout(function(){i.disableFormElements(r)},13)}),n.delegate(i.formInputClickSelector,"click.rails",function(e){var n=t(this);if(!i.allowAction(n))return i.stopEverything(e);var r=n.attr("name"),s=r?{name:r,value:n.val()}:null;n.closest("form").data("ujs:submit-button",s)}),n.delegate(i.formSubmitSelector,"ajax:beforeSend.rails",function(e){this==e.target&&i.disableFormElements(t(this))}),n.delegate(i.formSubmitSelector,"ajax:complete.rails",function(e){this==e.target&&i.enableFormElements(t(this))}),t(function(){var e=t("meta[name=csrf-token]").attr("content"),i=t("meta[name=csrf-param]").attr("content");t('form input[name="'+i+'"]').val(e)}))}(jQuery),function(t){t.cookie=function(e,i,n){if(arguments.length>1&&(!/Object/.test(Object.prototype.toString.call(i))||null===i||void 0===i)){if(n=t.extend({},n),(null===i||void 0===i)&&(n.expires=-1),"number"==typeof n.expires){var r=n.expires,s=n.expires=new Date;s.setDate(s.getDate()+r)}return i=String(i),document.cookie=[encodeURIComponent(e),"=",n.raw?i:encodeURIComponent(i),n.expires?"; expires="+n.expires.toUTCString():"",n.path?"; path="+n.path:"",n.domain?"; domain="+n.domain:"",n.secure?"; secure":""].join("")}n=i||{};for(var o,a=n.raw?function(t){return t}:decodeURIComponent,l=document.cookie.split("; "),h=0;o=l[h]&&l[h].split("=");h++)if(a(o[0])===e)return a(o[1]||"");return null}}(jQuery),function(){function t(t,e){var i;t||(t={});for(i in e)t[i]=e[i];return t}function e(){var t,e,i=arguments,n={},r=function(t,e){var i,n;"object"!=typeof t&&(t={});for(n in e)e.hasOwnProperty(n)&&(i=e[n],t[n]=i&&"object"==typeof i&&"[object Array]"!==Object.prototype.toString.call(i)&&"number"!=typeof i.nodeType?r(t[n]||{},i):e[n]);return t};for(i[0]===!0&&(n=i[1],i=Array.prototype.slice.call(i,2)),e=i.length,t=0;e>t;t++)n=r(n,i[t]);return n}function i(t,e){return parseInt(t,e||10)}function n(t){return"string"==typeof t}function r(t){return"object"==typeof t}function s(t){return"[object Array]"===Object.prototype.toString.call(t)}function o(t){return"number"==typeof t}function a(t){return le.log(t)/le.LN10}function l(t){return le.pow(10,t)}function h(t,e){for(var i=t.length;i--;)if(t[i]===e){t.splice(i,1);break}}function c(t){return t!==_&&null!==t}function d(t,e,i){var s,o;if(n(e))c(i)?t.setAttribute(e,i):t&&t.getAttribute&&(o=t.getAttribute(e));else if(c(e)&&r(e))for(s in e)t.setAttribute(s,e[s]);return o}function u(t){return s(t)?t:[t]}function p(){var t,e,i=arguments,n=i.length;for(t=0;n>t;t++)if(e=i[t],"undefined"!=typeof e&&null!==e)return e}function f(e,i){we&&i&&i.opacity!==_&&(i.filter="alpha(opacity="+100*i.opacity+")"),t(e.style,i)}function g(e,i,n,r,s){return e=oe.createElement(e),i&&t(e,i),s&&f(e,{padding:0,border:Be,margin:0}),n&&f(e,n),r&&r.appendChild(e),e}function m(e,i){var n=function(){};return n.prototype=new e,t(n.prototype,i),n}function y(t,e,n,r){var s=X.lang,t=+t||0,o=-1===e?(t.toString().split(".")[1]||"").length:isNaN(e=fe(e))?2:e,e=void 0===n?s.decimalPoint:n,r=void 0===r?s.thousandsSep:r,s=0>t?"-":"",n=String(i(t=fe(t).toFixed(o))),a=n.length>3?n.length%3:0;return s+(a?n.substr(0,a)+r:"")+n.substr(a).replace(/(\d{3})(?=\d)/g,"$1"+r)+(o?e+fe(t-n).toFixed(o).slice(2):"")}function v(t,e){return Array((e||2)+1-String(t).length).join(0)+t}function x(t,e,i){var n=t[e];t[e]=function(){var t=Array.prototype.slice.call(arguments);return t.unshift(n),i.apply(this,t)}}function b(t,e){for(var i,n,r,s,o,a="{",l=!1,h=[];-1!==(a=t.indexOf(a));){if(i=t.slice(0,a),l){for(n=i.split(":"),r=n.shift().split("."),o=r.length,i=e,s=0;o>s;s++)i=i[r[s]];n.length&&(n=n.join(":"),r=/\.([0-9])/,s=X.lang,o=void 0,/f$/.test(n)?(o=(o=n.match(r))?o[1]:-1,i=y(i,o,s.decimalPoint,n.indexOf(",")>-1?s.thousandsSep:"")):i=G(n,i))}h.push(i),t=t.slice(a+1),a=(l=!l)?"}":"{"}return h.push(t),h.join("")}function w(t){return le.pow(10,ce(le.log(t)/le.LN10))}function k(t,e,i,n){var r,i=p(i,1);for(r=t/i,e||(e=[1,2,2.5,5,10],n&&n.allowDecimals===!1&&(1===i?e=[1,2,5,10]:.1>=i&&(e=[1/i]))),n=0;nn;n++)t[n].ss_i=n;for(t.sort(function(t,n){return i=e(t,n),0===i?t.ss_i-n.ss_i:i}),n=0;r>n;n++)delete t[n].ss_i}function C(t){for(var e=t.length,i=t[0];e--;)t[e]i&&(i=t[e]);return i}function A(t,e){for(var i in t)t[i]&&t[i]!==e&&t[i].destroy&&t[i].destroy(),delete t[i]}function L(t){W||(W=g(ze)),t&&W.appendChild(t),W.innerHTML=""}function M(t,e){var i="Highcharts error #"+t+": www.highcharts.com/errors/"+t;if(e)throw i;ae.console&&console.log(i)}function I(t){return parseFloat(t.toPrecision(14))}function D(t,e){$=p(t,e.animation)}function E(){var t=X.global.useUTC,e=t?"getUTC":"get",i=t?"setUTC":"set";q=6e4*(t&&X.global.timezoneOffset||0),V=t?Date.UTC:function(t,e,i,n,r,s){return new Date(t,e,p(i,1),p(n,0),p(r,0),p(s,0)).getTime()},U=e+"Minutes",Z=e+"Hours",K=e+"Day",Q=e+"Date",J=e+"Month",te=e+"FullYear",ee=i+"Minutes",ie=i+"Hours",ne=i+"Date",re=i+"Month",se=i+"FullYear"}function O(){}function R(t,e,i,n){this.axis=t,this.pos=e,this.type=i||"",this.isNew=!0,!i&&!n&&this.addLabel()}function z(){this.init.apply(this,arguments)}function B(t,e,i,n,r,s){var o=t.chart.inverted;this.axis=t,this.isNegative=i,this.options=e,this.x=n,this.total=null,this.points={},this.stack=r,this.percent="percent"===s,this.alignOptions={align:e.align||(o?i?"left":"right":"center"),verticalAlign:e.verticalAlign||(o?"middle":i?"bottom":"top"),y:p(e.y,o?4:i?14:-6),x:p(e.x,o?i?-6:6:0)},this.textAlign=e.textAlign||(o?i?"right":"left":"center")}function F(){this.init.apply(this,arguments)}function N(){this.init.apply(this,arguments)}var _,H,W,X,G,$,Y,j,V,q,U,Z,K,Q,J,te,ee,ie,ne,re,se,oe=document,ae=window,le=Math,he=le.round,ce=le.floor,de=le.ceil,ue=le.max,pe=le.min,fe=le.abs,ge=le.cos,me=le.sin,ye=le.PI,ve=2*ye/360,xe=navigator.userAgent,be=ae.opera,we=/msie/i.test(xe)&&!be,ke=8===oe.documentMode,Se=/AppleWebKit/.test(xe),Te=/Firefox/.test(xe),Ce=/(Mobile|Android|Windows Phone)/.test(xe),Pe="http://www.w3.org/2000/svg",Ae=!!oe.createElementNS&&!!oe.createElementNS(Pe,"svg").createSVGRect,Le=Te&&parseInt(xe.split("Firefox/")[1],10)<4,Me=!Ae&&!we&&!!oe.createElement("canvas").getContext,Ie=oe.documentElement.ontouchstart!==_,De={},Ee=0,Oe=function(){},Re=[],ze="div",Be="none",Fe=/^[0-9]+$/,Ne="rgba(192,192,192,"+(Ae?1e-4:.002)+")",_e="stroke-width",He={};ae.Highcharts=ae.Highcharts?M(16,!0):{},G=function(e,i,n){if(!c(i)||isNaN(i))return"Invalid date";var r,e=p(e,"%Y-%m-%d %H:%M:%S"),s=new Date(i-q),o=s[Z](),a=s[K](),l=s[Q](),h=s[J](),d=s[te](),u=X.lang,f=u.weekdays,s=t({a:f[a].substr(0,3),A:f[a],d:v(l),e:l,b:u.shortMonths[h],B:u.months[h],m:v(h+1),y:d.toString().substr(2,2),Y:d,H:v(o),I:v(o%12||12),l:o%12||12,M:v(s[U]()),p:12>o?"AM":"PM",P:12>o?"am":"pm",S:v(s.getSeconds()),L:v(he(i%1e3),3)},Highcharts.dateFormats);for(r in s)for(;-1!==e.indexOf("%"+r);)e=e.replace("%"+r,"function"==typeof s[r]?s[r](i):s[r]);return n?e.substr(0,1).toUpperCase()+e.substr(1):e},S.prototype={wrapColor:function(t){this.color>=t&&(this.color=0)},wrapSymbol:function(t){this.symbol>=t&&(this.symbol=0)}},j=function(){for(var t=0,e=arguments,i=e.length,n={};i>t;t++)n[e[t++]]=e[t];return n}("millisecond",1,"second",1e3,"minute",6e4,"hour",36e5,"day",864e5,"week",6048e5,"month",26784e5,"year",31556952e3),Y={init:function(t,e,i){var n,r,s,e=e||"",o=t.shift,a=e.indexOf("C")>-1,l=a?7:3,e=e.split(" "),i=[].concat(i),h=function(t){for(n=t.length;n--;)"M"===t[n]&&t.splice(n+1,0,t[n+1],t[n+2],t[n+1],t[n+2])};if(a&&(h(e),h(i)),t.isArea&&(r=e.splice(e.length-6,6),s=i.splice(i.length-6,6)),o<=i.length/l&&e.length===i.length)for(;o--;)i=[].concat(i).splice(0,l).concat(i);if(t.shift=0,e.length)for(t=i.length;e.lengthi)for(;s--;)n=parseFloat(t[s]),r[s]=isNaN(n)?t[s]:i*parseFloat(e[s]-n)+n;else r=e;return r}},function(e){ae.HighchartsAdapter=ae.HighchartsAdapter||e&&{init:function(t){var i,r=e.fx,s=r.step,o=e.Tween,a=o&&o.propHooks;i=e.cssHooks.opacity,e.extend(e.easing,{easeOutQuad:function(t,e,i,n,r){return-n*(e/=r)*(e-2)+i}}),e.each(["cur","_default","width","height","opacity"],function(t,e){var i,n=s;"cur"===e?n=r.prototype:"_default"===e&&o&&(n=a[e],e="set"),(i=n[e])&&(n[e]=function(n){var r,n=t?n:this;return"align"!==n.prop?(r=n.elem,r.attr?r.attr(n.prop,"cur"===e?_:n.now):i.apply(this,arguments)):void 0})}),x(i,"get",function(t,e,i){return e.attr?e.opacity||0:t.call(this,e,i)}),i=function(e){var i,n=e.elem;e.started||(i=t.init(n,n.d,n.toD),e.start=i[0],e.end=i[1],e.started=!0),n.attr("d",t.step(e.start,e.end,e.pos,n.toD))},o?a.d={set:i}:s.d=i,this.each=Array.prototype.forEach?function(t,e){return Array.prototype.forEach.call(t,e)}:function(t,e){for(var i=0,n=t.length;n>i;i++)if(e.call(t[i],t[i],i,t)===!1)return i},e.fn.highcharts=function(){var t,e,i="Chart",r=arguments;return n(r[0])&&(i=r[0],r=Array.prototype.slice.call(r,1)),t=r[0],t!==_&&(t.chart=t.chart||{},t.chart.renderTo=this[0],new Highcharts[i](t,r[1]),e=this),t===_&&(e=Re[d(this[0],"data-highcharts-chart")]),e}},getScript:e.getScript,inArray:e.inArray,adapterRun:function(t,i){return e(t)[i]()},grep:e.grep,map:function(t,e){for(var i=[],n=0,r=t.length;r>n;n++)i[n]=e.call(t[n],t[n],n,t);return i},offset:function(t){return e(t).offset()},addEvent:function(t,i,n){e(t).bind(i,n)},removeEvent:function(t,i,n){var r=oe.removeEventListener?"removeEventListener":"detachEvent";oe[r]&&t&&!t[r]&&(t[r]=function(){}),e(t).unbind(i,n)},fireEvent:function(i,n,r,s){var o,a=e.Event(n),l="detached"+n;!we&&r&&(delete r.layerX,delete r.layerY),t(a,r),i[n]&&(i[l]=i[n],i[n]=null),e.each(["preventDefault","stopPropagation"],function(t,e){var i=a[e];a[e]=function(){try{i.call(a)}catch(t){"preventDefault"===e&&(o=!0)}}}),e(i).trigger(a),i[l]&&(i[n]=i[l],i[l]=null),s&&!a.isDefaultPrevented()&&!o&&s(a)},washMouseEvent:function(t){var e=t.originalEvent||t;return e.pageX===_&&(e.pageX=t.pageX,e.pageY=t.pageY),e},animate:function(t,i,n){var r=e(t);t.style||(t.style={}),i.d&&(t.toD=i.d,i.d=1),r.stop(),i.opacity!==_&&t.attr&&(i.opacity+="px"),r.animate(i,n)},stop:function(t){e(t).stop()}}}(ae.jQuery);var We=ae.HighchartsAdapter,Xe=We||{};We&&We.init.call(We,Y);var Ge=Xe.adapterRun,$e=Xe.getScript,Ye=Xe.inArray,je=Xe.each,Ve=Xe.grep,qe=Xe.offset,Ue=Xe.map,Ze=Xe.addEvent,Ke=Xe.removeEvent,Qe=Xe.fireEvent,Je=Xe.washMouseEvent,ti=Xe.animate,ei=Xe.stop,Xe={enabled:!0,x:0,y:15,style:{color:"#666",cursor:"default",fontSize:"11px",lineHeight:"14px"}};X={colors:"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/3.0.8/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/3.0.8/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#274b6d",fontSize:"16px"}},subtitle:{text:"",align:"center",style:{color:"#4d759e"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1e3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:e(Xe,{align:"center",enabled:!1,formatter:function(){return null===this.y?"":y(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1e3}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#274b6d",fontSize:"12px"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:Ae,backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'{point.key}
',pointFormat:'{series.name}: {point.y}
',shadow:!0,snap:Ce?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"ThingSpeak.com",href:"https://thingspeak.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#D62020",fontSize:"9px"}}};var ii=X.plotOptions,We=ii.line;E();var ni=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,ri=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,si=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,oi=function(t){var n,r,s=[];return function(t){t&&t.stops?r=Ue(t.stops,function(t){return oi(t[1])}):(n=ni.exec(t))?s=[i(n[1]),i(n[2]),i(n[3]),parseFloat(n[4],10)]:(n=ri.exec(t))?s=[i(n[1],16),i(n[2],16),i(n[3],16),1]:(n=si.exec(t))&&(s=[i(n[1]),i(n[2]),i(n[3]),1])}(t),{get:function(i){var n;return r?(n=e(t),n.stops=[].concat(n.stops),je(r,function(t,e){n.stops[e]=[n.stops[e][0],t.get(i)]})):n=s&&!isNaN(s[0])?"rgb"===i?"rgb("+s[0]+","+s[1]+","+s[2]+")":"a"===i?s[3]:"rgba("+s.join(",")+")":t,n},brighten:function(t){if(r)je(r,function(e){e.brighten(t)});else if(o(t)&&0!==t){var e;for(e=0;3>e;e++)s[e]+=i(255*t),s[e]<0&&(s[e]=0),s[e]>255&&(s[e]=255)}return this},rgba:s,setOpacity:function(t){return s[3]=t,this}}};O.prototype={init:function(t,e){this.element="span"===e?g(e):oe.createElementNS(Pe,e),this.renderer=t,this.attrSetters={}},opacity:1,animate:function(t,i,n){i=p(i,$,!0),ei(this),i?(i=e(i),n&&(i.complete=n),ti(this,t,i)):(this.attr(t),n&&n())},attr:function(t,e){var r,s,o,a,l,h,u,f=this.element,g=f.nodeName.toLowerCase(),m=this.renderer,y=this.attrSetters,v=this.shadows,x=this;if(n(t)&&c(e)&&(r=t,t={},t[r]=e),n(t))r=t,"circle"===g?r={x:"cx",y:"cy"}[r]||r:"strokeWidth"===r&&(r="stroke-width"),x=d(f,r)||this[r]||0,"d"!==r&&"visibility"!==r&&"fill"!==r&&(x=parseFloat(x));else{for(r in t)if(l=!1,s=t[r],o=y[r]&&y[r].call(this,s,r),o!==!1){if(o!==_&&(s=o),"d"===r)s&&s.join&&(s=s.join(" ")),/(NaN| {2}|^$)/.test(s)&&(s="M 0 0");else if("x"===r&&"text"===g)for(o=0;os&&(s=0),this[r]=s,"text"===r?(s!==this.textStr&&delete this.bBox,this.textStr=s,this.added&&m.buildText(this)):l||d(f,r,s)}u&&this.updateTransform()}return x},addClass:function(t){var e=this.element,i=d(e,"class")||"";return-1===i.indexOf(t)&&d(e,"class",i+" "+t),this},symbolAttr:function(t){var e=this;je("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(i){e[i]=p(t[i],e[i])}),e.attr({d:e.renderer.symbols[e.symbolName](e.x,e.y,e.width,e.height,e)})},clip:function(t){return this.attr("clip-path",t?"url("+this.renderer.url+"#"+t.id+")":Be)},crisp:function(t,e,i,n,r){var s,o,a={},l={},t=t||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;o=he(t)%2/2,l.x=ce(e||this.x||0)+o,l.y=ce(i||this.y||0)+o,l.width=ce((n||this.width||0)-2*o),l.height=ce((r||this.height||0)-2*o),l.strokeWidth=t;for(s in l)this[s]!==l[s]&&(this[s]=a[s]=l[s]);return a},css:function(e){var n,r=this.element,s=this.textWidth=e&&e.width&&"text"===r.nodeName.toLowerCase()&&i(e.width),o="",a=function(t,e){return"-"+e.toLowerCase()};if(e&&e.color&&(e.fill=e.color),this.styles=e=t(this.styles,e),s&&delete e.width,we&&!Ae)f(this.element,e);else{for(n in e)o+=n.replace(/([A-Z])/g,a)+":"+e[n]+";";d(r,"style",o)}return s&&this.added&&this.renderer.buildText(this),this},on:function(t,e){var i=this,n=i.element;return Ie&&"click"===t?(n.ontouchstart=function(t){i.touchEventFired=Date.now(),t.preventDefault(),e.call(n,t)},n.onclick=function(t){(-1===xe.indexOf("Android")||Date.now()-(i.touchEventFired||0)>1100)&&e.call(n,t)}):n["on"+t]=e,this},setRadialReference:function(t){return this.element.radialReference=t,this},translate:function(t,e){return this.attr({translateX:t,translateY:e})},invert:function(){return this.inverted=!0,this.updateTransform(),this},updateTransform:function(){var t=this.translateX||0,e=this.translateY||0,i=this.scaleX,n=this.scaleY,r=this.inverted,s=this.rotation;r&&(t+=this.attr("width"),e+=this.attr("height")),t=["translate("+t+","+e+")"],r?t.push("rotate(90) scale(-1,1)"):s&&t.push("rotate("+s+" "+(this.x||0)+" "+(this.y||0)+")"),(c(i)||c(n))&&t.push("scale("+p(i,1)+" "+p(n,1)+")"),t.length&&d(this.element,"transform",t.join(" "))},toFront:function(){var t=this.element;return t.parentNode.appendChild(t),this},align:function(t,e,i){var r,s,o,a,l={};return s=this.renderer,o=s.alignedObjects,t?(this.alignOptions=t,this.alignByTranslate=e,(!i||n(i))&&(this.alignTo=r=i||"renderer",h(o,this),o.push(this),i=null)):(t=this.alignOptions,e=this.alignByTranslate,r=this.alignTo),i=p(i,s[r],s),r=t.align,s=t.verticalAlign,o=(i.x||0)+(t.x||0),a=(i.y||0)+(t.y||0),("right"===r||"center"===r)&&(o+=(i.width-(t.width||0))/{right:1,center:2}[r]),l[e?"translateX":"x"]=he(o),("bottom"===s||"middle"===s)&&(a+=(i.height-(t.height||0))/({bottom:1,middle:2}[s]||1)),l[e?"translateY":"y"]=he(a),this[this.placed?"animate":"attr"](l),this.placed=!0,this.alignAttr=l,this},getBBox:function(){var e,i,n=this.bBox,r=this.renderer,s=this.rotation;e=this.element;var o=this.styles,a=s*ve;i=this.textStr;var l;if((""===i||Fe.test(i))&&(l=i.length+"|"+o.fontSize+"|"+o.fontFamily,n=r.cache[l]),!n){if(e.namespaceURI===Pe||r.forExport){try{n=e.getBBox?t({},e.getBBox()):{width:e.offsetWidth,height:e.offsetHeight}}catch(h){}(!n||n.width<0)&&(n={width:0,height:0})}else n=this.htmlGetBBox();r.isSVG&&(e=n.width,i=n.height,we&&o&&"11px"===o.fontSize&&"22.7"===i.toPrecision(3)&&(n.height=i=14),s&&(n.width=fe(i*me(a))+fe(e*ge(a)),n.height=fe(i*ge(a))+fe(e*me(a)))),this.bBox=n,l&&(r.cache[l]=n)}return n},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(t){var e=this;e.animate({opacity:0},{duration:t||150,complete:function(){e.hide()}})},add:function(t){var e,n=this.renderer,r=t||n,s=r.element||n.box,o=s.childNodes,a=this.element,l=d(a,"zIndex");if(t&&(this.parentGroup=t),this.parentInverted=t&&t.inverted,void 0!==this.textStr&&n.buildText(this),l&&(r.handleZ=!0,l=i(l)),r.handleZ)for(r=0;rl||!c(l)&&c(n))){s.insertBefore(a,t),e=!0;break}return e||s.appendChild(a),this.added=!0,Qe(this,"add"),this},safeRemoveChild:function(t){var e=t.parentNode;e&&e.removeChild(t)},destroy:function(){var t,e,i=this,n=i.element||{},r=i.shadows,s=i.renderer.isSVG&&"SPAN"===n.nodeName&&i.parentGroup;if(n.onclick=n.onmouseout=n.onmouseover=n.onmousemove=n.point=null,ei(i),i.clipPath&&(i.clipPath=i.clipPath.destroy()),i.stops){for(e=0;e=n;n++)r=c.cloneNode(0),s=2*o+1-2*n,d(r,{isShadow:"true",stroke:t.color||"black","stroke-opacity":a*n,"stroke-width":s,transform:"translate"+l,fill:Be}),i&&(d(r,"height",ue(d(r,"height")-s,0)),r.cutHeight=s),e?e.element.appendChild(r):c.parentNode.insertBefore(r,c),h.push(r);this.shadows=h}return this}};var ai=function(){this.init.apply(this,arguments)};ai.prototype={Element:O,init:function(t,e,i,n){var r,s,o=location;r=this.createElement("svg").attr({version:"1.1"}),s=r.element,t.appendChild(s),-1===t.innerHTML.indexOf("xmlns")&&d(s,"xmlns",Pe),this.isSVG=!0,this.box=s,this.boxWrapper=r,this.alignedObjects=[],this.url=(Te||Se)&&oe.getElementsByTagName("base").length?o.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"",this.createElement("desc").add().element.appendChild(oe.createTextNode("Created with Highcharts 3.0.8")),this.defs=this.createElement("defs").add(),this.forExport=n,this.gradients={},this.cache={},this.setSize(e,i,!1);var a;Te&&t.getBoundingClientRect&&(this.subPixelFix=e=function(){f(t,{left:0,top:0}),a=t.getBoundingClientRect(),f(t,{left:de(a.left)-a.left+"px",top:de(a.top)-a.top+"px"})},e(),Ze(ae,"resize",e))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var t=this.defs;return this.box=null,this.boxWrapper=this.boxWrapper.destroy(),A(this.gradients||{}),this.gradients=null,t&&(this.defs=t.destroy()),this.subPixelFix&&Ke(ae,"resize",this.subPixelFix),this.alignedObjects=null},createElement:function(t){var e=new this.Element;return e.init(this,t),e},draw:function(){},buildText:function(t){for(var e=t.element,n=this,r=n.forExport,s=p(t.textStr,"").toString().replace(/<(b|strong)>/g,'').replace(/<(i|em)>/g,'').replace(/
/g,"").split(//g),o=e.childNodes,a=/style="([^"]+)"/,l=/href="(http[^"]+)"/,h=d(e,"x"),c=t.styles,u=t.textWidth,g=c&&c.lineHeight,m=o.length;m--;)e.removeChild(o[m]); +u&&!t.added&&this.box.appendChild(e),""===s[s.length-1]&&s.pop(),je(s,function(s,o){var p,m=0,s=s.replace(//g,"|||");p=s.split("|||"),je(p,function(s){if(""!==s||1===p.length){var y,v={},x=oe.createElementNS(Pe,"tspan");if(a.test(s)&&(y=s.match(a)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),d(x,"style",y)),l.test(s)&&!r&&(d(x,"onclick",'location.href="'+s.match(l)[1]+'"'),f(x,{cursor:"pointer"})),s=(s.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">")," "!==s&&(x.appendChild(oe.createTextNode(s)),m?v.dx=0:v.x=h,d(x,v),!m&&o&&(!Ae&&r&&f(x,{display:"block"}),d(x,"dy",g||n.fontMetrics(/px$/.test(x.style.fontSize)?x.style.fontSize:c.fontSize).h,Se&&x.offsetHeight)),e.appendChild(x),m++,u))for(var b,w,s=s.replace(/([^\^])-/g,"$1- ").split(" "),v=s.length>1&&"nowrap"!==c.whiteSpace,k=t._clipHeight,S=[],T=i(g||16),C=1;v&&(s.length||S.length);)delete t.bBox,b=t.getBBox(),w=b.width,!Ae&&n.forExport&&(w=n.measureSpanWidth(x.firstChild.data,t.styles)),b=w>u,b&&1!==s.length?(x.removeChild(x.firstChild),S.unshift(s.pop())):(s=S,S=[],s.length&&(C++,k&&C*T>k?(s=["..."],t.attr("title",t.textStr)):(x=oe.createElementNS(Pe,"tspan"),d(x,{dy:T,x:h}),y&&d(x,"style",y),e.appendChild(x),w>u&&(u=w)))),s.length&&x.appendChild(oe.createTextNode(s.join(" ").replace(/- /g,"-")))}})})},button:function(i,n,r,s,o,a,l,h,c){var d,u,p,f,g,m,y=this.label(i,n,r,c,null,null,null,null,"button"),v=0,i={x1:0,y1:0,x2:0,y2:1},o=e({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:i,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},o);return p=o.style,delete o.style,a=e(o,{stroke:"#68A",fill:{linearGradient:i,stops:[[0,"#FFF"],[1,"#ACF"]]}},a),f=a.style,delete a.style,l=e(o,{stroke:"#68A",fill:{linearGradient:i,stops:[[0,"#9BD"],[1,"#CDF"]]}},l),g=l.style,delete l.style,h=e(o,{style:{color:"#CCC"}},h),m=h.style,delete h.style,Ze(y.element,we?"mouseover":"mouseenter",function(){3!==v&&y.attr(a).css(f)}),Ze(y.element,we?"mouseout":"mouseleave",function(){3!==v&&(d=[o,a,l][v],u=[p,f,g][v],y.attr(d).css(u))}),y.setState=function(t){(y.state=v=t)?2===t?y.attr(l).css(g):3===t&&y.attr(h).css(m):y.attr(o).css(p)},y.on("click",function(){3!==v&&s.call(y)}).attr(o).css(t({cursor:"default"},p))},crispLine:function(t,e){return t[1]===t[4]&&(t[1]=t[4]=he(t[1])-e%2/2),t[2]===t[5]&&(t[2]=t[5]=he(t[2])+e%2/2),t},path:function(e){var i={fill:Be};return s(e)?i.d=e:r(e)&&t(i,e),this.createElement("path").attr(i)},circle:function(t,e,i){return t=r(t)?t:{x:t,y:e,r:i},this.createElement("circle").attr(t)},arc:function(t,e,i,n,s,o){return r(t)&&(e=t.y,i=t.r,n=t.innerR,s=t.start,o=t.end,t=t.x),t=this.symbol("arc",t||0,e||0,i||0,i||0,{innerR:n||0,start:s||0,end:o||0}),t.r=i,t},rect:function(t,e,i,n,s,o){return s=r(t)?t.r:s,s=this.createElement("rect").attr({rx:s,ry:s,fill:Be}),s.attr(r(t)?t:s.crisp(o,t,e,ue(i,0),ue(n,0)))},setSize:function(t,e,i){var n=this.alignedObjects,r=n.length;for(this.width=t,this.height=e,this.boxWrapper[p(i,!0)?"animate":"attr"]({width:t,height:e});r--;)n[r].align()},g:function(t){var e=this.createElement("g");return c(t)?e.attr({"class":"highcharts-"+t}):e},image:function(e,i,n,r,s){var o={preserveAspectRatio:Be};return arguments.length>1&&t(o,{x:i,y:n,width:r,height:s}),o=this.createElement("image").attr(o),o.element.setAttributeNS?o.element.setAttributeNS("http://www.w3.org/1999/xlink","href",e):o.element.setAttribute("hc-svg-href",e),o},symbol:function(e,i,n,r,s,o){var a,l,h,c=this.symbols[e],c=c&&c(he(i),he(n),r,s,o),d=/^url\((.*?)\)$/;return c?(a=this.path(c),t(a,{symbolName:e,x:i,y:n,width:r,height:s}),o&&t(a,o)):d.test(e)&&(h=function(t,e){t.element&&(t.attr({width:e[0],height:e[1]}),t.alignByTranslate||t.translate(he((r-e[0])/2),he((s-e[1])/2)))},l=e.match(d)[1],e=De[l],a=this.image(l).attr({x:i,y:n}),a.isImg=!0,e?h(a,e):(a.attr({width:0,height:0}),g("img",{onload:function(){h(a,De[l]=[this.width,this.height])},src:l}))),a},symbols:{circle:function(t,e,i,n){var r=.166*i;return["M",t+i/2,e,"C",t+i+r,e,t+i+r,e+n,t+i/2,e+n,"C",t-r,e+n,t-r,e,t+i/2,e,"Z"]},square:function(t,e,i,n){return["M",t,e,"L",t+i,e,t+i,e+n,t,e+n,"Z"]},triangle:function(t,e,i,n){return["M",t+i/2,e,"L",t+i,e+n,t,e+n,"Z"]},"triangle-down":function(t,e,i,n){return["M",t,e,"L",t+i,e,t+i/2,e+n,"Z"]},diamond:function(t,e,i,n){return["M",t+i/2,e,"L",t+i,e+n/2,t+i/2,e+n,t,e+n/2,"Z"]},arc:function(t,e,i,n,r){var s=r.start,i=r.r||i||n,o=r.end-.001,n=r.innerR,a=r.open,l=ge(s),h=me(s),c=ge(o),o=me(o),r=r.end-st?t+4:he(1.2*t),e=he(.8*t);return{h:t,b:e}},label:function(i,n,r,s,o,a,l,h,d){function u(){var t,i;t=P.element.style,y=(void 0===v||void 0===x||C.styles.textAlign)&&P.getBBox(),C.width=(v||y.width||0)+2*L+M,C.height=(x||y.height||0)+2*L,k=L+T.fontMetrics(t&&t.fontSize).b,S&&(m||(t=he(-A*L),i=h?-k:0,C.box=m=s?T.symbol(s,t,i,C.width,C.height,D):T.rect(t,i,C.width,C.height,0,D[_e]),m.add(C)),m.isImg||m.attr(e({width:C.width,height:C.height},D)),D=null)}function p(){var t,e=C.styles,e=e&&e.textAlign,i=M+L*(1-A);t=h?0:k,!c(v)||"center"!==e&&"right"!==e||(i+={center:.5,right:1}[e]*(v-y.width)),(i!==P.x||t!==P.y)&&P.attr({x:i,y:t}),P.x=i,P.y=t}function f(t,e){m?m.attr(t,e):D[t]=e}function g(){P.add(C),C.attr({text:i,x:n,y:r}),m&&c(o)&&C.attr({anchorX:o,anchorY:a})}var m,y,v,x,b,w,k,S,T=this,C=T.g(d),P=T.text("",0,0,l).attr({zIndex:1}),A=0,L=3,M=0,I=0,D={},l=C.attrSetters;Ze(C,"add",g),l.width=function(t){return v=t,!1},l.height=function(t){return x=t,!1},l.padding=function(t){return c(t)&&t!==L&&(L=t,p()),!1},l.paddingLeft=function(t){return c(t)&&t!==M&&(M=t,p()),!1},l.align=function(t){return A={left:0,center:.5,right:1}[t],!1},l.text=function(t,e){return P.attr(e,t),u(),p(),!1},l[_e]=function(t,e){return S=!0,I=t%2/2,f(e,t),!1},l.stroke=l.fill=l.r=function(t,e){return"fill"===e&&(S=!0),f(e,t),!1},l.anchorX=function(t,e){return o=t,f(e,t+I-b),!1},l.anchorY=function(t,e){return a=t,f(e,t-w),!1},l.x=function(t){return C.x=t,t-=A*((v||y.width)+L),b=he(t),C.attr("translateX",b),!1},l.y=function(t){return w=C.y=he(t),C.attr("translateY",w),!1};var E=C.css;return t(C,{css:function(t){if(t){var i={},t=e(t);je("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow".split(","),function(e){t[e]!==_&&(i[e]=t[e],delete t[e])}),P.css(i)}return E.call(C,t)},getBBox:function(){return{width:y.width+2*L,height:y.height+2*L,x:y.x-L,y:y.y-L}},shadow:function(t){return m&&m.shadow(t),C},destroy:function(){Ke(C,"add",g),Ke(C.element,"mouseenter"),Ke(C.element,"mouseleave"),P&&(P=P.destroy()),m&&(m=m.destroy()),O.prototype.destroy.call(C),C=T=u=p=f=g=null}})}},H=ai,t(O.prototype,{htmlCss:function(e){var i=this.element;return(i=e&&"SPAN"===i.tagName&&e.width)&&(delete e.width,this.textWidth=i,this.updateTransform()),this.styles=t(this.styles,e),f(this.element,e),this},htmlGetBBox:function(){var t=this.element,e=this.bBox;return e||("text"===t.nodeName&&(t.style.position="absolute"),e=this.bBox={x:t.offsetLeft,y:t.offsetTop,width:t.offsetWidth,height:t.offsetHeight}),e},htmlUpdateTransform:function(){if(this.added){var t=this.renderer,e=this.element,n=this.translateX||0,r=this.translateY||0,s=this.x||0,o=this.y||0,a=this.textAlign||"left",l={left:0,center:.5,right:1}[a],h=this.shadows;if(f(e,{marginLeft:n,marginTop:r}),h&&je(h,function(t){f(t,{marginLeft:n+1,marginTop:r+1})}),this.inverted&&je(e.childNodes,function(i){t.invertChild(i,e)}),"SPAN"===e.tagName){var d,u=this.rotation,g=i(this.textWidth),m=[u,a,e.innerHTML,this.textWidth].join(",");m!==this.cTT&&(d=t.fontMetrics(e.style.fontSize).b,c(u)&&this.setSpanRotation(u,l,d),h=p(this.elemWidth,e.offsetWidth),h>g&&/[ \-]/.test(e.textContent||e.innerText)&&(f(e,{width:g+"px",display:"block",whiteSpace:"normal"}),h=g),this.getSpanCorrection(h,d,l,u,a)),f(e,{left:s+(this.xCorr||0)+"px",top:o+(this.yCorr||0)+"px"}),Se&&(d=e.offsetHeight),this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(t,e,i){var n={},r=we?"-ms-transform":Se?"-webkit-transform":Te?"MozTransform":be?"-o-transform":"";n[r]=n.transform="rotate("+t+"deg)",n[r+(Te?"Origin":"-origin")]=100*e+"% "+i+"px",f(this.element,n)},getSpanCorrection:function(t,e,i){this.xCorr=-t*i,this.yCorr=-e}}),t(ai.prototype,{html:function(e,i,n){var r=X.chart.style,s=this.createElement("span"),o=s.attrSetters,a=s.element,l=s.renderer;return o.text=function(t){return t!==a.innerHTML&&delete this.bBox,a.innerHTML=t,!1},o.x=o.y=o.align=o.rotation=function(t,e){return"align"===e&&(e="textAlign"),s[e]=t,s.htmlUpdateTransform(),!1},s.attr({text:e,x:he(i),y:he(n)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:r.fontFamily,fontSize:r.fontSize}),s.css=s.htmlCss,l.isSVG&&(s.add=function(e){var i,n=l.box.parentNode,r=[];if(this.parentGroup=e){if(i=e.div,!i){for(;e;)r.push(e),e=e.parentGroup;je(r.reverse(),function(e){var r;i=e.div=e.div||g(ze,{className:d(e.element,"class")},{position:"absolute",left:(e.translateX||0)+"px",top:(e.translateY||0)+"px"},i||n),r=i.style,t(e.attrSetters,{translateX:function(t){r.left=t+"px"},translateY:function(t){r.top=t+"px"},visibility:function(t,e){r[e]=t}})})}}else i=n;return i.appendChild(a),s.added=!0,s.alignOnAdd&&s.htmlUpdateTransform(),s}),s}});var li;if(!Ae&&!Me){Highcharts.VMLElement=li={init:function(t,e){var i=["<",e,' filled="f" stroked="f"'],n=["position: ","absolute",";"],r=e===ze;("shape"===e||r)&&n.push("left:0;top:0;width:1px;height:1px;"),n.push("visibility: ",r?"hidden":"visible"),i.push(' style="',n.join(""),'"/>'),e&&(i=r||"span"===e||"img"===e?i.join(""):t.prepVML(i),this.element=g(i)),this.renderer=t,this.attrSetters={}},add:function(t){var e=this.renderer,i=this.element,n=e.box,n=t?t.element||t:n;return t&&t.inverted&&e.invertChild(i,n),n.appendChild(i),this.added=!0,this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform(),Qe(this,"add"),this},updateTransform:O.prototype.htmlUpdateTransform,setSpanRotation:function(){var t=this.rotation,e=ge(t*ve),i=me(t*ve);f(this.element,{filter:t?["progid:DXImageTransform.Microsoft.Matrix(M11=",e,", M12=",-i,", M21=",i,", M22=",e,", sizingMethod='auto expand')"].join(""):Be})},getSpanCorrection:function(t,e,i,n,r){var s,o=n?ge(n*ve):1,a=n?me(n*ve):0,l=p(this.elemHeight,this.element.offsetHeight);this.xCorr=0>o&&-t,this.yCorr=0>a&&-l,s=0>o*a,this.xCorr+=a*e*(s?1-i:i),this.yCorr-=o*e*(n?s?i:1-i:1),r&&"left"!==r&&(this.xCorr-=t*i*(0>o?-1:1),n&&(this.yCorr-=l*i*(0>a?-1:1)),f(this.element,{textAlign:r}))},pathToVML:function(t){for(var e=t.length,i=[];e--;)o(t[e])?i[e]=he(10*t[e])-5:"Z"===t[e]?i[e]="x":(i[e]=t[e],!t.isArc||"wa"!==t[e]&&"at"!==t[e]||(i[e+5]===i[e+7]&&(i[e+7]+=t[e+7]>t[e+5]?1:-1),i[e+6]===i[e+8]&&(i[e+8]+=t[e+8]>t[e+6]?1:-1)));return i.join(" ")||"x"},attr:function(t,e){var i,r,s,a,l,h=this.element||{},u=h.style,p=h.nodeName,f=this.renderer,m=this.symbolName,y=this.shadows,v=this.attrSetters,x=this;if(n(t)&&c(e)&&(i=t,t={},t[i]=e),n(t))i=t,x="strokeWidth"===i||"stroke-width"===i?this.strokeweight:this[i];else for(i in t)if(r=t[i],l=!1,s=v[i]&&v[i].call(this,r,i),s!==!1&&null!==r){if(s!==_&&(r=s),m&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(i))a||(this.symbolAttr(t),a=!0),l=!0;else if("d"===i){if(r=r||[],this.d=r.join(" "),h.path=r=this.pathToVML(r),y)for(s=y.length;s--;)y[s].path=y[s].cutOff?this.cutOffPath(r,y[s].cutOff):r;l=!0}else if("visibility"===i){if(y)for(s=y.length;s--;)y[s].style[i]=r;"DIV"===p&&(r="hidden"===r?"-999em":0,ke||(u[i]=r?"visible":"hidden"),i="top"),u[i]=r,l=!0}else"zIndex"===i?(r&&(u[i]=r),l=!0):-1!==Ye(i,["x","y","width","height"])?(this[i]=r,"x"===i||"y"===i?i={x:"left",y:"top"}[i]:r=ue(0,r),this.updateClipping?(this[i]=r,this.updateClipping()):u[i]=r,l=!0):"class"===i&&"DIV"===p?h.className=r:"stroke"===i?(r=f.color(r,h,i),i="strokecolor"):"stroke-width"===i||"strokeWidth"===i?(h.stroked=r?!0:!1,i="strokeweight",this[i]=r,o(r)&&(r+="px")):"dashstyle"===i?((h.getElementsByTagName("stroke")[0]||g(f.prepVML([""]),null,null,h))[i]=r||"solid",this.dashstyle=r,l=!0):"fill"===i?"SPAN"===p?u.color=r:"IMG"!==p&&(h.filled=r!==Be?!0:!1,r=f.color(r,h,i,this),i="fillcolor"):"opacity"===i?l=!0:"shape"===p&&"rotation"===i?(this[i]=h.style[i]=r,h.style.left=-he(me(r*ve)+1)+"px",h.style.top=he(ge(r*ve))+"px"):("translateX"===i||"translateY"===i||"rotation"===i)&&(this[i]=r,this.updateTransform(),l=!0);l||(ke?h[i]=r:d(h,i,r))}return x},clip:function(t){var e,i=this;return t?(e=t.members,h(e,i),e.push(i),i.destroyClip=function(){h(e,i)},t=t.getCSS(i)):(i.destroyClip&&i.destroyClip(),t={clip:ke?"inherit":"rect(auto)"}),i.css(t)},css:O.prototype.htmlCss,safeRemoveChild:function(t){t.parentNode&&L(t)},destroy:function(){return this.destroyClip&&this.destroyClip(),O.prototype.destroy.apply(this)},on:function(t,e){return this.element["on"+t]=function(){var t=ae.event;t.target=t.srcElement,e(t)},this},cutOffPath:function(t,e){var n,t=t.split(/[ ,]/);return n=t.length,(9===n||11===n)&&(t[n-4]=t[n-2]=i(t[n-2])-10*e),t.join(" ")},shadow:function(t,e,n){var r,s,o,a,l,h,c,d=[],u=this.element,f=this.renderer,m=u.style,y=u.path;if(y&&"string"!=typeof y.value&&(y="x"),l=y,t){for(h=p(t.width,3),c=(t.opacity||.15)/h,r=1;3>=r;r++)a=2*h+1-2*r,n&&(l=this.cutOffPath(y.value,a+.5)),o=[''],s=g(f.prepVML(o),null,{left:i(m.left)+p(t.offsetX,1),top:i(m.top)+p(t.offsetY,1)}),n&&(s.cutOff=a+1),o=[''],g(f.prepVML(o),null,null,s),e?e.element.appendChild(s):u.parentNode.insertBefore(s,u),d.push(s);this.shadows=d}return this}},li=m(O,li);var hi={Element:li,isIE8:xe.indexOf("MSIE 8.0")>-1,init:function(t,e,i){var n,r;if(this.alignedObjects=[],n=this.createElement(ze),r=n.element,r.style.position="relative",t.appendChild(n.element),this.isVML=!0,this.box=r,this.boxWrapper=n,this.cache={},this.setSize(e,i,!1),!oe.namespaces.hcv){oe.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{oe.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(s){oe.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(e,i,n,s){var o=this.createElement(),a=r(e);return t(o,{members:[],left:(a?e.x:e)+1,top:(a?e.y:i)+1,width:(a?e.width:n)-1,height:(a?e.height:s)-1,getCSS:function(e){var i=e.element,n=i.nodeName,e=e.inverted,r=this.top-("shape"===n?i.offsetTop:0),s=this.left,i=s+this.width,o=r+this.height,r={clip:"rect("+he(e?s:r)+"px,"+he(e?o:i)+"px,"+he(e?i:o)+"px,"+he(e?r:s)+"px)"};return!e&&ke&&"DIV"===n&&t(r,{width:i+"px",height:o+"px"}),r},updateClipping:function(){je(o.members,function(t){t.css(o.getCSS(t))})}})},color:function(t,e,i,n){var r,s,o,a=this,l=/^rgba/,h=Be;if(t&&t.linearGradient?o="gradient":t&&t.radialGradient&&(o="pattern"),o){var c,d,u,p,f,m,y,v,x=t.linearGradient||t.radialGradient,b="",t=t.stops,w=[],k=function(){s=[''],g(a.prepVML(s),null,null,e)};if(u=t[0],v=t[t.length-1],u[0]>0&&t.unshift([0,u[1]]),v[0]<1&&t.push([1,v[1]]),je(t,function(t,e){l.test(t[1])?(r=oi(t[1]),c=r.get("rgb"),d=r.get("a")):(c=t[1],d=1),w.push(100*t[0]+"% "+c),e?(f=d,m=c):(p=d,y=c)}),"fill"===i)if("gradient"===o)i=x.x1||x[0]||0,t=x.y1||x[1]||0,u=x.x2||x[2]||0,x=x.y2||x[3]||0,b='angle="'+(90-180*le.atan((x-t)/(u-i))/ye)+'"',k();else{var S,h=x.r,T=2*h,C=2*h,P=x.cx,A=x.cy,L=e.radialReference,h=function(){L&&(S=n.getBBox(),P+=(L[0]-S.x)/S.width-.5,A+=(L[1]-S.y)/S.height-.5,T*=L[2]/S.width,C*=L[2]/S.height),b='src="'+X.global.VMLRadialGradientURL+'" size="'+T+","+C+'" origin="0.5,0.5" position="'+P+","+A+'" color2="'+y+'" ',k()};n.added?h():Ze(n,"add",h),h=m}else h=c}else l.test(t)&&"IMG"!==e.tagName?(r=oi(t),s=["<",i,' opacity="',r.get("a"),'"/>'],g(this.prepVML(s),null,null,e),h=r.get("rgb")):(h=e.getElementsByTagName(i),h.length&&(h[0].opacity=1,h[0].type="solid"),h=t);return h},prepVML:function(t){var e=this.isIE8,t=t.join("");return e?(t=t.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),t=-1===t.indexOf('style="')?t.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):t.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):t=t.replace("<","1&&s.attr({x:e,y:i,width:n,height:r}),s},rect:function(t,e,i,n,s,o){var a=this.symbol("rect");return a.r=r(t)?t.r:s,a.attr(r(t)?t:a.crisp(o,t,e,ue(i,0),ue(n,0)))},invertChild:function(t,e){var n=e.style;f(t,{flip:"x",left:i(n.width)-1,top:i(n.height)-1,rotation:-90})},symbols:{arc:function(t,e,i,n,r){var s=r.start,o=r.end,a=r.r||i||n,i=r.innerR,n=ge(s),l=me(s),h=ge(o),c=me(o);return o-s===0?["x"]:(s=["wa",t-a,e-a,t+a,e+a,t+a*n,e+a*l,t+a*h,e+a*c],r.open&&!i&&s.push("e","M",t,e),s.push("at",t-i,e-i,t+i,e+i,t+i*h,e+i*c,t+i*n,e+i*l,"x","e"),s.isArc=!0,s)},circle:function(t,e,i,n,r){return r&&(i=n=2*r.r),r&&r.isCircle&&(t-=i/2,e-=n/2),["wa",t,e,t+i,e+n,t+i,e+n/2,t+i,e+n/2,"e"]},rect:function(t,e,i,n,r){var s,o=t+i,a=e+n;return c(r)&&r.r?(s=pe(r.r,i,n),o=["M",t+s,e,"L",o-s,e,"wa",o-2*s,e,o,e+2*s,o-s,e,o,e+s,"L",o,a-s,"wa",o-2*s,a-2*s,o,a,o,a-s,o-s,a,"L",t+s,a,"wa",t,a-2*s,t+2*s,a,t+s,a,t,a-s,"L",t,e+s,"wa",t,e,t+2*s,e+2*s,t,e+s,t+s,e,"x","e"]):o=ai.prototype.symbols.square.apply(0,arguments),o}}};Highcharts.VMLRenderer=li=function(){this.init.apply(this,arguments)},li.prototype=e(ai.prototype,hi),H=li}ai.prototype.measureSpanWidth=function(t,e){var i,n=oe.createElement("span");return i=oe.createTextNode(t),n.appendChild(i),f(n,e),this.box.appendChild(n),i=n.offsetWidth,L(n),i};var ci;Me&&(Highcharts.CanVGRenderer=li=function(){Pe="http://www.w3.org/1999/xhtml"},li.prototype.symbols={},ci=function(){function t(){var t,i=e.length;for(t=0;i>t;t++)e[t]();e=[]}var e=[];return{push:function(i,n){0===e.length&&$e(n,t),e.push(i)}}}(),H=li),R.prototype={addLabel:function(){var e,i=this.axis,n=i.options,r=i.chart,s=i.horiz,a=i.categories,h=i.names,d=this.pos,u=n.labels,f=i.tickPositions,s=s&&a&&!u.step&&!u.staggerLines&&!u.rotation&&r.plotWidth/f.length||!s&&(r.margin[3]||.33*r.chartWidth),g=d===f[0],m=d===f[f.length-1],h=a?p(a[d],h[d],d):d,a=this.label,y=f.info;i.isDatetimeAxis&&y&&(e=n.dateTimeLabelFormats[y.higherRanks[d]||y.unitName]),this.isFirst=g,this.isLast=m,n=i.labelFormatter.call({axis:i,chart:r,isFirst:g,isLast:m,dateTimeLabelFormat:e,value:i.isLog?I(l(h)):h}),d=s&&{width:ue(1,he(s-2*(u.padding||10)))+"px"},d=t(d,u.style),c(a)?a&&a.attr({text:n}).css(d):(e={align:i.labelAlign},o(u.rotation)&&(e.rotation=u.rotation),s&&u.ellipsis&&(e._clipHeight=i.len/f.length),this.label=c(n)&&u.enabled?r.renderer.text(n,0,0,u.useHTML).attr(e).css(d).add(i.labelGroup):null)},getLabelSize:function(){var t=this.label,e=this.axis;return t?t.getBBox()[e.horiz?"height":"width"]:0},getLabelSides:function(){var t=this.label.getBBox(),e=this.axis,i=e.horiz,n=e.options.labels,t=i?t.width:t.height,e=i?t*{left:0,center:.5,right:1}[e.labelAlign]-n.x:t;return[-e,t-e]},handleOverflow:function(t,e){var i,n=!0,r=this.axis,s=this.isFirst,o=this.isLast,a=r.horiz?e.x:e.y,l=r.reversed,h=r.tickPositions,c=this.getLabelSides(),d=c[0],c=c[1],u=r.pos,p=u+r.len,f=this.label.line||0,g=r.labelEdge,m=r.justifyLabels&&(s||o);return g[f]===_||a+d>g[f]?g[f]=a+c:m||(n=!1),m&&(i=(r=r.ticks[h[t+(s?1:-1)]])&&r.label.xy&&r.label.xy.x+r.getLabelSides()[s?0:1],h=i,s&&!l||o&&l?u>a+d&&(a=u-d,r&&a+c>h&&(n=!1)):a+c>p&&(a=p-c,r&&h>a+d&&(n=!1)),e.x=a),n},getPosition:function(t,e,i,n){var r=this.axis,s=r.chart,o=n&&s.oldChartHeight||s.chartHeight;return{x:t?r.translate(e+i,null,null,n)+r.transB:r.left+r.offset+(r.opposite?(n&&s.oldChartWidth||s.chartWidth)-r.right-r.left:0),y:t?o-r.bottom+r.offset-(r.opposite?r.height:0):o-r.translate(e+i,null,null,n)-r.transB}},getLabelPosition:function(t,e,i,n,r,s,o,a){var l=this.axis,h=l.transA,d=l.reversed,u=l.staggerLines,p=l.chart.renderer.fontMetrics(r.style.fontSize).b,f=r.rotation,t=t+r.x-(s&&n?s*h*(d?-1:1):0),e=e+r.y-(s&&!n?s*h*(d?1:-1):0);return f&&2===l.side&&(e-=p-p*ge(f*ve)),!c(r.y)&&!f&&(e+=p-i.getBBox().height/2),u&&(i.line=o/(a||1)%u,e+=i.line*(l.labelOffset/u)),{x:t,y:e}},getMarkPath:function(t,e,i,n,r,s){return s.crispLine(["M",t,e,"L",t+(r?0:-i),e+(r?i:0)],n)},render:function(t,e,i){var n=this.axis,r=n.options,s=n.chart.renderer,o=n.horiz,a=this.type,l=this.label,h=this.pos,c=r.labels,d=this.gridLine,u=a?a+"Grid":"grid",f=a?a+"Tick":"tick",g=r[u+"LineWidth"],m=r[u+"LineColor"],y=r[u+"LineDashStyle"],v=r[f+"Length"],u=r[f+"Width"]||0,x=r[f+"Color"],b=r[f+"Position"],f=this.mark,w=c.step,k=!0,S=n.tickmarkOffset,T=this.getPosition(o,h,S,e),C=T.x,T=T.y,P=o&&C===n.pos+n.len||!o&&T===n.pos?-1:1;this.isActive=!0,g&&(h=n.getPlotLinePath(h+S,g*P,e,!0),d===_&&(d={stroke:m,"stroke-width":g},y&&(d.dashstyle=y),a||(d.zIndex=1),e&&(d.opacity=0),this.gridLine=d=g?s.path(h).attr(d).add(n.gridGroup):null),!e&&d&&h&&d[this.isNew?"attr":"animate"]({d:h,opacity:i})),u&&v&&("inside"===b&&(v=-v),n.opposite&&(v=-v),a=this.getMarkPath(C,T,v,u*P,o,s),f?f.animate({d:a,opacity:i}):this.mark=s.path(a).attr({stroke:x,"stroke-width":u,opacity:i}).add(n.axisGroup)),l&&!isNaN(C)&&(l.xy=T=this.getLabelPosition(C,T,l,o,c,S,t,w),this.isFirst&&!this.isLast&&!p(r.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(r.showLastLabel,1)?k=!1:!n.isRadial&&!c.step&&!c.rotation&&!e&&0!==i&&(k=this.handleOverflow(t,T)),w&&t%w&&(k=!1),k&&!isNaN(T.y)?(T.opacity=i,l[this.isNew?"attr":"animate"](T),this.isNew=!1):l.attr("y",-9999))},destroy:function(){A(this,this.axis)}};var di=function(t,e){this.axis=t,e&&(this.options=e,this.id=e.id)};di.prototype={render:function(){var t,i=this,n=i.axis,r=n.horiz,s=(n.pointRange||0)/2,o=i.options,l=o.label,h=i.label,d=o.width,u=o.to,f=o.from,g=c(f)&&c(u),m=o.value,y=o.dashStyle,v=i.svgElem,x=[],b=o.color,w=o.zIndex,k=o.events,S=n.chart.renderer;if(n.isLog&&(f=a(f),u=a(u),m=a(m)),d)x=n.getPlotLinePath(m,d),s={stroke:b,"stroke-width":d},y&&(s.dashstyle=y);else{if(!g)return;f=ue(f,n.min-s),u=pe(u,n.max+s),x=n.getPlotBandPath(f,u,o),s={fill:b},o.borderWidth&&(s.stroke=o.borderColor,s["stroke-width"]=o.borderWidth)}if(c(w)&&(s.zIndex=w),v)x?v.animate({d:x},null,v.onGetPath):(v.hide(),v.onGetPath=function(){v.show()},h&&(i.label=h=h.destroy()));else if(x&&x.length&&(i.svgElem=v=S.path(x).attr(s).add(),k))for(t in o=function(t){v.on(t,function(e){k[t].apply(i,[e])})},k)o(t);return l&&c(l.text)&&x&&x.length&&n.width>0&&n.height>0?(l=e({align:r&&g&&"center",x:r?!g&&4:10,verticalAlign:!r&&g&&"middle",y:r?g?16:10:g?6:-4,rotation:r&&!g&&90},l),h||(i.label=h=S.text(l.text,0,0,l.useHTML).attr({align:l.textAlign||l.align,rotation:l.rotation,zIndex:w}).css(l.style).add()),n=[x[1],x[4],p(x[6],x[1])],x=[x[2],x[5],p(x[7],x[2])],r=C(n),g=C(x),h.align(l,!1,{x:r,y:g,width:P(n)-r,height:P(x)-g}),h.show()):h&&h.hide(),i},destroy:function(){h(this.axis.plotLinesAndBands,this),delete this.axis,A(this)}},z.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:Xe,lineColor:"#C0D0E0",lineWidth:1,minPadding:.01,maxPadding:.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:.05,minPadding:.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return y(this.total,-1)},style:Xe.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},title:{rotation:0}},init:function(t,e){var i=e.isX;this.horiz=t.inverted?!i:i,this.coll=(this.isXAxis=i)?"xAxis":"yAxis",this.opposite=e.opposite,this.side=e.side||(this.horiz?this.opposite?0:2:this.opposite?1:3),this.setOptions(e);var n=this.options,r=n.type;this.labelFormatter=n.labels.formatter||this.defaultLabelFormatter,this.userOptions=e,this.minPixelPadding=0,this.chart=t,this.reversed=n.reversed,this.zoomEnabled=n.zoomEnabled!==!1,this.categories=n.categories||"category"===r,this.names=[],this.isLog="logarithmic"===r,this.isDatetimeAxis="datetime"===r,this.isLinked=c(n.linkedTo),this.tickmarkOffset=this.categories&&"between"===n.tickmarkPlacement?.5:0,this.ticks={},this.labelEdge=[],this.minorTicks={},this.plotLinesAndBands=[],this.alternateBands={},this.len=0,this.minRange=this.userMinRange=n.minRange||n.maxZoom,this.range=n.range,this.offset=n.offset||0,this.stacks={},this.oldStacks={},this.stackExtremes={},this.min=this.max=null,this.crosshair=p(n.crosshair,u(t.options.tooltip.crosshairs)[i?0:1],!1);var s,n=this.options.events;-1===Ye(this,t.axes)&&(t.axes.push(this),t[this.coll].push(this)),this.series=this.series||[],t.inverted&&i&&this.reversed===_&&(this.reversed=!0),this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(s in n)Ze(this,s,n[s]);this.isLog&&(this.val2lin=a,this.lin2val=l)},setOptions:function(t){this.options=e(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],e(X[this.coll],t))},defaultLabelFormatter:function(){var t,e=this.axis,i=this.value,n=e.categories,r=this.dateTimeLabelFormat,s=X.lang.numericSymbols,o=s&&s.length,a=e.options.labels.format,e=e.isLog?i:e.tickInterval;if(a)t=b(a,this);else if(n)t=i;else if(r)t=G(r,i);else if(o&&e>=1e3)for(;o--&&t===_;)n=Math.pow(1e3,o+1),e>=n&&null!==s[o]&&(t=y(i/n,-1)+s[o]);return t===_&&(t=i>=1e4?y(i,0):y(i,-1,_,"")),t},getSeriesExtremes:function(){var t=this,e=t.chart;t.hasVisibleSeries=!1,t.dataMin=t.dataMax=null,t.stackExtremes={},t.buildStacks(),je(t.series,function(i){if(i.visible||!e.options.chart.ignoreHiddenSeries){var n;n=i.options.threshold;var r;t.hasVisibleSeries=!0,t.isLog&&0>=n&&(n=null),t.isXAxis?(n=i.xData,n.length&&(t.dataMin=pe(p(t.dataMin,n[0]),C(n)),t.dataMax=ue(p(t.dataMax,n[0]),P(n)))):(i.getExtremes(),r=i.dataMax,i=i.dataMin,c(i)&&c(r)&&(t.dataMin=pe(p(t.dataMin,i),i),t.dataMax=ue(p(t.dataMax,r),r)),c(n)&&(t.dataMin>=n?(t.dataMin=n,t.ignoreMinPadding=!0):t.dataMaxt||t>h+this.width)&&(a=!0)):(t=h,i=u-this.right,(c>s||s>c+this.height)&&(a=!0)),a&&!n?null:l.renderer.crispLine(["M",t,s,"L",i,o],e||1)},getLinearTickPositions:function(t,e,i){for(var n,e=I(ce(e/t)*t),i=I(de(i/t)*t),r=[];i>=e&&(r.push(e),e=I(e+t),e!==n);)n=e;return r},getMinorTickPositions:function(){var t,e=this.options,i=this.tickPositions,n=this.minorTickInterval,r=[];if(this.isLog)for(t=i.length,e=1;t>e;e++)r=r.concat(this.getLogTickPositions(n,i[e-1],i[e],!0));else if(this.isDatetimeAxis&&"auto"===e.minorTickInterval)r=r.concat(this.getTimeTicks(this.normalizeTimeTickInterval(n),this.min,this.max,e.startOfWeek)),r[0]=this.minRange;if(this.isXAxis&&this.minRange===_&&!this.isLog&&(c(o.min)||c(o.max)?this.minRange=null:(je(this.series,function(t){for(r=t.xData,i=s=t.xIncrement?1:r.length-1;i>0;i--)n=r[i]-r[i-1],(e===_||e>n)&&(e=n)}),this.minRange=pe(5*e,this.dataMax-this.dataMin))),l-al-a&&(t[0]=l-d,t[1]=p(o.min,l-d),a=P(t))}this.min=a,this.max=l},setAxisTranslation:function(t){var e,i=this.max-this.min,r=0,s=0,o=0,a=this.linkedParent,l=!!this.categories,h=this.transA;(this.isXAxis||l)&&(a?(s=a.minPointOffset,o=a.pointRangePadding):je(this.series,function(t){var a=ue(t.pointRange,+l),h=t.options.pointPlacement,d=t.closestPointRange;a>i&&(a=0),r=ue(r,a),s=ue(s,n(h)?0:a/2),o=ue(o,"on"===h?0:a),!t.noSharedTooltip&&c(d)&&(e=c(e)?pe(e,d):d)}),a=this.ordinalSlope&&e?this.ordinalSlope/e:1,this.minPointOffset=s*=a,this.pointRangePadding=o*=a,this.pointRange=pe(r,i),this.closestPointRange=e),t&&(this.oldTransA=h),this.translationSlope=this.transA=h=this.len/(i+o||1),this.transB=this.horiz?this.left:this.bottom,this.minPixelPadding=h*s},setTickPositions:function(t){var e,i=this,n=i.chart,r=i.options,s=i.isLog,o=i.isDatetimeAxis,l=i.isXAxis,h=i.isLinked,d=i.options.tickPositioner,u=r.maxPadding,f=r.minPadding,g=r.tickInterval,m=r.minTickInterval,y=r.tickPixelInterval,v=i.categories;h?(i.linkedParent=n[i.coll][r.linkedTo],n=i.linkedParent.getExtremes(),i.min=p(n.min,n.dataMin),i.max=p(n.max,n.dataMax),r.type!==i.linkedParent.options.type&&M(11,1)):(i.min=p(i.userMin,r.min,i.dataMin),i.max=p(i.userMax,r.max,i.dataMax)),s&&(!t&&pe(i.min,p(i.dataMin,i.min))<=0&&M(10,1),i.min=I(a(i.min)),i.max=I(a(i.max))),i.range&&c(i.max)&&(i.userMin=i.min=ue(i.min,i.max-i.range),i.userMax=i.max,i.range=null),i.beforePadding&&i.beforePadding(),i.adjustForMinRange(),!v&&!i.usePercentage&&!h&&c(i.min)&&c(i.max)&&(n=i.max-i.min)&&(c(r.min)||c(i.userMin)||!f||!(i.dataMin<0)&&i.ignoreMinPadding||(i.min-=n*f),c(r.max)||c(i.userMax)||!u||!(i.dataMax>0)&&i.ignoreMaxPadding||(i.max+=n*u)),i.min===i.max||void 0===i.min||void 0===i.max?i.tickInterval=1:h&&!g&&y===i.linkedParent.options.tickPixelInterval?i.tickInterval=i.linkedParent.tickInterval:(i.tickInterval=p(g,v?1:(i.max-i.min)*y/ue(i.len,y)),!c(g)&&i.lenue(2*i.len,200)&&M(19,!0),t=o?i.getTimeTicks(i.normalizeTimeTickInterval(i.tickInterval,r.units),i.min,i.max,r.startOfWeek,i.ordinalPositions,i.closestPointRange,!0):s?i.getLogTickPositions(i.tickInterval,i.min,i.max):i.getLinearTickPositions(i.tickInterval,i.min,i.max),e&&t.splice(1,t.length-2),i.tickPositions=t),h||(s=t[0],o=t[t.length-1],h=i.minPointOffset||0,r.startOnTick?i.min=s:i.min-h>s&&t.shift(),r.endOnTick?i.max=o:i.max+h(e[n]||0)&&this.options.alignTicks!==!1&&(e[n]=i.length),t.maxTicks=e},adjustTickAmount:function(){var t=this._maxTicksKey,e=this.tickPositions,i=this.chart.maxTicks;if(i&&i[t]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1&&this.min!==_){var n=this.tickAmount,r=e.length;if(this.tickAmount=t=i[t],t>r){for(;e.length=this.dataMax&&(e=_)),this.displayBtn=t!==_||e!==_,this.setExtremes(t,e,!1,_,{trigger:"zoom"}),!0},setAxisSize:function(){var t,e,i=this.chart,n=this.options,r=n.offsetLeft||0,s=n.offsetRight||0,o=this.horiz;this.left=e=p(n.left,i.plotLeft+r),this.top=t=p(n.top,i.plotTop),this.width=r=p(n.width,i.plotWidth-r+s),this.height=n=p(n.height,i.plotHeight),this.bottom=i.chartHeight-n-t,this.right=i.chartWidth-r-e,this.len=ue(o?r:n,0),this.pos=o?e:t},getExtremes:function(){var t=this.isLog;return{min:t?I(l(this.min)):this.min,max:t?I(l(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(t){var e=this.isLog,i=e?l(this.min):this.min,e=e?l(this.max):this.max;return i>t||null===t?t=i:t>e&&(t=e),this.translate(t,0,1,0,1)},autoLabelAlign:function(t){return t=(p(t,0)-90*this.side+720)%360,t>15&&165>t?"right":t>195&&345>t?"left":"center"},getOffset:function(){var t,e,i,n,r,s,o,a=this,l=a.chart,h=l.renderer,d=a.options,u=a.tickPositions,f=a.ticks,g=a.horiz,m=a.side,y=l.inverted?[1,0,3,2][m]:m,v=0,x=0,b=d.title,w=d.labels,k=0,S=l.axisOffset,T=l.clipOffset,C=[-1,1,1,-1][m],P=1,A=p(w.maxStaggerLines,5);if(a.hasData=t=a.hasVisibleSeries||c(a.min)&&c(a.max)&&!!u,a.showAxis=l=t||p(d.showEmpty,!0),a.staggerLines=a.horiz&&w.staggerLines,a.axisGroup||(a.gridGroup=h.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=h.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=h.g("axis-labels").attr({zIndex:w.zIndex||7}).add()),t||a.isLinked){if(a.labelAlign=p(w.align||a.autoLabelAlign(w.rotation)),je(u,function(t){f[t]?f[t].addLabel():f[t]=new R(a,t)}),a.horiz&&!a.staggerLines&&A&&!w.rotation){for(i=a.reversed?[].concat(u).reverse():u;A>P;){for(t=[],n=!1,w=0;w1&&(a.staggerLines=P)}je(u,function(t){(0===m||2===m||{1:"left",3:"right"}[m]===a.labelAlign)&&(k=ue(f[t].getLabelSize(),k))}),a.staggerLines&&(k*=a.staggerLines,a.labelOffset=k)}else for(i in f)f[i].destroy(),delete f[i];b&&b.text&&b.enabled!==!1&&(a.axisTitle||(a.axisTitle=h.text(b.text,0,0,b.useHTML).attr({zIndex:7,rotation:b.rotation||0,align:b.textAlign||{low:"left",middle:"center",high:"right"}[b.align]}).css(b.style).add(a.axisGroup),a.axisTitle.isNew=!0),l&&(v=a.axisTitle.getBBox()[g?"height":"width"],x=p(b.margin,g?5:10),e=b.offset),a.axisTitle[l?"show":"hide"]()),a.offset=C*p(d.offset,S[m]),a.axisTitleMargin=p(e,k+x+(2!==m&&k&&C*d.labels[g?"y":"x"])),S[m]=ue(S[m],a.axisTitleMargin+v+C*a.offset),T[y]=ue(T[y],2*ce(d.lineWidth/2))},getLinePath:function(t){var e=this.chart,i=this.opposite,n=this.offset,r=this.horiz,s=this.left+(i?this.width:0)+n,n=e.chartHeight-this.bottom-(i?this.height:0)+n;return i&&(t*=-1),e.renderer.crispLine(["M",r?this.left:s,r?n:this.top,"L",r?e.chartWidth-this.right:s,r?n:e.chartHeight-this.bottom],t)},getTitlePosition:function(){var t=this.horiz,e=this.left,n=this.top,r=this.len,s=this.options.title,o=t?e:n,a=this.opposite,l=this.offset,h=i(s.style.fontSize||12),r={low:o+(t?0:r),middle:o+r/2,high:o+(t?r:0)}[s.align],e=(t?n+this.height:e)+(t?1:-1)*(a?-1:1)*this.axisTitleMargin+(2===this.side?h:0);return{x:t?r:e+(a?this.width:0)+l+(s.x||0),y:t?e-(a?this.height:0)+l:r+(s.y||0)}},render:function(){var t,e,i,n=this,r=n.horiz,s=n.reversed,o=n.chart,a=o.renderer,h=n.options,d=n.isLog,u=n.isLinked,p=n.tickPositions,f=n.axisTitle,g=n.stacks,m=n.ticks,y=n.minorTicks,v=n.alternateBands,x=h.stackLabels,b=h.alternateGridColor,w=n.tickmarkOffset,k=h.lineWidth,S=o.hasRendered&&c(n.oldMin)&&!isNaN(n.oldMin),T=n.hasData,C=n.showAxis,P=n.justifyLabels=!n.staggerLines&&r&&"justify"===h.labels.overflow;if(n.labelEdge.length=0,je([m,y,v],function(t){for(var e in t)t[e].isActive=!1}),(T||u)&&(n.minorTickInterval&&!n.categories&&je(n.getMinorTickPositions(),function(t){y[t]||(y[t]=new R(n,t,"minor")),S&&y[t].isNew&&y[t].render(null,!0),y[t].render(null,!1,1)}),p.length&&(t=p.slice(),(r&&s||!r&&!s)&&t.reverse(),P&&(t=t.slice(1).concat([t[0]])),je(t,function(e,i){P&&(i=i===t.length-1?0:i+1),(!u||e>=n.min&&e<=n.max)&&(m[e]||(m[e]=new R(n,e)),S&&m[e].isNew&&m[e].render(i,!0,.1),m[e].render(i,!1,1))}),w&&0===n.min&&(m[-1]||(m[-1]=new R(n,-1,null,!0)),m[-1].render(-1))),b&&je(p,function(t,r){r%2===0&&t=.5)t=he(t),o=this.getLinearTickPositions(t,e,i);else if(t>=.08)for(var h,c,d,u,f,s=ce(e),r=t>.3?[1,2,4]:t>.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];i+1>s&&!f;s++)for(c=r.length,h=0;c>h&&!f;h++)d=a(l(s)*r[h]),d>e&&(!n||i>=u)&&o.push(u),u>i&&(f=!0),u=d;else e=l(e),i=l(i),t=r[n?"minorTickInterval":"tickInterval"],t=p("auto"===t?null:t,this._minorAutoInterval,(i-e)*(r.tickPixelInterval/(n?5:1))/((n?s/this.tickPositions.length:s)||1)),t=k(t,null,w(t)),o=Ue(this.getLinearTickPositions(t,e,i),a),n||(this._minorAutoInterval=t/5);return n||(this.tickInterval=t),o},z.prototype.getTimeTicks=function(e,i,n,r){var s,o=[],a={},l=X.global.useUTC,h=new Date(i-q),d=e.unitRange,u=e.count;if(c(i)){d>=j.second&&(h.setMilliseconds(0),h.setSeconds(d>=j.minute?0:u*ce(h.getSeconds()/u))),d>=j.minute&&h[ee](d>=j.hour?0:u*ce(h[U]()/u)),d>=j.hour&&h[ie](d>=j.day?0:u*ce(h[Z]()/u)),d>=j.day&&h[ne](d>=j.month?1:u*ce(h[Q]()/u)),d>=j.month&&(h[re](d>=j.year?0:u*ce(h[J]()/u)),s=h[te]()),d>=j.year&&(s-=s%u,h[se](s)),d===j.week&&h[ne](h[Q]()-h[K]()+p(r,1)),i=1,q&&(h=new Date(h.getTime()+q)),s=h[te]();for(var r=h.getTime(),f=h[J](),g=h[Q](),m=l?q:(864e5+6e4*h.getTimezoneOffset())%864e5;n>r;)o.push(r),d===j.year?r=V(s+i*u,0):d===j.month?r=V(s,f+i*u):l||d!==j.day&&d!==j.week?r+=d*u:r=V(s,f,g+i*u*(d===j.day?1:7)),i++;o.push(r),je(Ve(o,function(t){return d<=j.hour&&t%j.day===m}),function(t){a[t]="day"})}return o.info=t(e,{higherRanks:a,totalRange:d*u}),o},z.prototype.normalizeTimeTickInterval=function(t,e){var i,n=e||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],r=n[n.length-1],s=j[r[0]],o=r[1];for(i=0;it&&(o=[1,2,5]),n=k(t/s,o,"year"===r[0]?ue(w(t/s),1):1),{unitRange:s,count:n,unitName:r[0]}},B.prototype={destroy:function(){A(this,this.axis)},render:function(t){var e=this.options,i=e.format,i=i?b(i,this):e.formatter.call(this);this.label?this.label.attr({text:i,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(i,0,0,e.useHTML).css(e.style).attr({align:this.textAlign,rotation:e.rotation,visibility:"hidden"}).add(t)},setOffset:function(t,e){var i=this.axis,n=i.chart,r=n.inverted,s=this.isNegative,o=i.translate(this.percent?100:this.total,0,0,0,1),i=i.translate(0),i=fe(o-i),a=n.xAxis[0].translate(this.x)+t,l=n.plotHeight,s={x:r?s?o:o-i:a,y:r?l-a-e:s?l-o-i:l-o,width:r?i:e,height:r?e:i};(r=this.label)&&(r.align(this.alignOptions,null,s),s=r.alignAttr,r.attr({visibility:this.options.crop===!1||n.isInsidePlot(s.x,s.y)?Ae?"inherit":"visible":"hidden"}))}},F.prototype={init:function(t,e){var n=e.borderWidth,r=e.style,s=i(r.padding);this.chart=t,this.options=e,this.crosshairs=[],this.now={x:0,y:0},this.isHidden=!0,this.label=t.renderer.label("",0,0,e.shape,null,null,e.useHTML,null,"tooltip").attr({padding:s,fill:e.backgroundColor,"stroke-width":n,r:e.borderRadius,zIndex:8}).css(r).css({padding:0}).add().attr({y:-999}),Me||this.label.shadow(e.shadow),this.shared=e.shared},destroy:function(){this.label&&(this.label=this.label.destroy()),clearTimeout(this.hideTimer),clearTimeout(this.tooltipTimeout)},move:function(e,i,n,r){var s=this,o=s.now,a=s.options.animation!==!1&&!s.isHidden;t(o,{x:a?(2*o.x+e)/3:e,y:a?(o.y+i)/2:i,anchorX:a?(2*o.anchorX+n)/3:n,anchorY:a?(o.anchorY+r)/2:r}),s.label.attr(o),a&&(fe(e-o.x)>1||fe(i-o.y)>1)&&(clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){s&&s.move(e,i,n,r)},32))},hide:function(){var t,e=this;clearTimeout(this.hideTimer),this.isHidden||(t=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){e.label.fadeOut(),e.isHidden=!0},p(this.options.hideDelay,500)),t&&je(t,function(t){t.setState()}),this.chart.hoverPoints=null)},getAnchor:function(t,e){var i,n,r=this.chart,s=r.inverted,o=r.plotTop,a=0,l=0,t=u(t);return i=t[0].tooltipPos,this.followPointer&&e&&(e.chartX===_&&(e=r.pointer.normalize(e)),i=[e.chartX-r.plotLeft,e.chartY-o]),i||(je(t,function(t){n=t.series.yAxis,a+=t.plotX,l+=(t.plotLow?(t.plotLow+t.plotHigh)/2:t.plotY)+(!s&&n?n.top-o:0)}),a/=t.length,l/=t.length,i=[s?r.plotWidth-l:a,this.shared&&!s&&t.length>1&&e?e.chartY-o:s?r.plotHeight-a:l]),Ue(i,he)},getPosition:function(t,e,i){var n,r=this.chart,s=r.plotLeft,o=r.plotTop,a=r.plotWidth,l=r.plotHeight,h=p(this.options.distance,12),c=i.plotX,i=i.plotY,r=c+s+(r.inverted?h:-t-h),d=i-e+o+15;return 7>r&&(r=s+ue(c,0)+h),r+t>s+a&&(r-=r+t-(s+a),d=i-e+o-h,n=!0),o+5>d&&(d=o+5,n&&i>=d&&d+e>=i&&(d=i+o+h)),d+e>o+l&&(d=ue(o,o+l-e-h)),{x:r,y:d}},defaultFormatter:function(t){var e,i=this.points||u(this),n=i[0].series;return e=[n.tooltipHeaderFormatter(i[0])],je(i,function(t){n=t.series,e.push(n.tooltipFormatter&&n.tooltipFormatter(t)||t.point.tooltipFormatter(n.tooltipOptions.pointFormat))}),e.push(t.options.footerFormat||""),e.join("")},refresh:function(t,e){var i,n,r,s=this.chart,o=this.label,a=this.options,l={},h=[];r=a.formatter||this.defaultFormatter;var c,l=s.hoverPoints,d=this.shared;clearTimeout(this.hideTimer),this.followPointer=u(t)[0].series.tooltipOptions.followPointer,n=this.getAnchor(t,e),i=n[0],n=n[1],!d||t.series&&t.series.noSharedTooltip?l=t.getLabelConfig():(s.hoverPoints=t,l&&je(l,function(t){t.setState()}),je(t,function(t){t.setState("hover"),h.push(t.getLabelConfig())}),l={x:t[0].category,y:t[0].y},l.points=h,t=t[0]),r=r.call(l,this),l=t.series,r===!1?this.hide():(this.isHidden&&(ei(o),o.attr("opacity",1).show()),o.attr({text:r}),c=a.borderColor||t.color||l.color||"#606060",o.attr({stroke:c}),this.updatePosition({plotX:i,plotY:n}),this.isHidden=!1),Qe(s,"tooltipRefresh",{text:r,x:i+s.plotLeft,y:n+s.plotTop,borderColor:c})},updatePosition:function(t){var e=this.chart,i=this.label,i=(this.options.positioner||this.getPosition).call(this,i.width,i.height,t);this.move(he(i.x),he(i.y),t.plotX+e.plotLeft,t.plotY+e.plotTop)}};var ui=Highcharts.Pointer=function(t,e){this.init(t,e)};if(ui.prototype={init:function(t,e){var i,n=e.chart,r=n.events,s=Me?"":n.zoomType,n=t.inverted;this.options=e,this.chart=t,this.zoomX=i=/x/.test(s),this.zoomY=s=/y/.test(s),this.zoomHor=i&&!n||s&&n,this.zoomVert=s&&!n||i&&n,this.runChartClick=r&&!!r.click,this.pinchDown=[],this.lastValidTouch={},e.tooltip.enabled&&(t.tooltip=new F(t,e.tooltip)),this.setDOMEvents()},normalize:function(e,i){var n,r,e=e||ae.event;return e.target||(e.target=e.srcElement),e=Je(e),r=e.touches?e.touches.item(0):e,i||(this.chartPosition=i=qe(this.chart.container)),r.pageX===_?(n=ue(e.x,e.clientX-i.left),r=e.y):(n=r.pageX-i.left,r=r.pageY-i.top),t(e,{chartX:he(n),chartY:he(r)})},getCoordinates:function(t){var e={xAxis:[],yAxis:[]};return je(this.chart.axes,function(i){e[i.isXAxis?"xAxis":"yAxis"].push({axis:i,value:i.toValue(t[i.horiz?"chartX":"chartY"])})}),e},getIndex:function(t){var e=this.chart;return e.inverted?e.plotHeight+e.plotTop-t.chartY:t.chartX-e.plotLeft},runPointActions:function(t){var e,i,n,r,s=this,o=s.chart,a=o.series,l=o.tooltip,h=o.hoverPoint,c=o.hoverSeries,d=o.chartWidth,u=s.getIndex(t);if(l&&s.options.tooltip.shared&&(!c||!c.noSharedTooltip)){for(i=[],n=a.length,r=0;n>r;r++)a[r].visible&&a[r].options.enableMouseTracking!==!1&&!a[r].noSharedTooltip&&a[r].tooltipPoints.length&&(e=a[r].tooltipPoints[u])&&e.series&&(e._dist=fe(u-e.clientX),d=pe(d,e._dist),i.push(e));for(n=i.length;n--;)i[n]._dist>d&&i.splice(n,1);i.length&&i[0].clientX!==s.hoverX&&(l.refresh(i,t),s.hoverX=i[0].clientX)}c&&c.tracker?(e=c.tooltipPoints[u])&&e!==h&&e.onMouseOver(t):l&&l.followPointer&&!l.isHidden&&(a=l.getAnchor([{}],t),l.updatePosition({plotX:a[0],plotY:a[1]})),l&&!s._onDocumentMouseMove&&(s._onDocumentMouseMove=function(t){s.onDocumentMouseMove(t)},Ze(oe,"mousemove",s._onDocumentMouseMove)),je(o.axes,function(i){i.drawCrosshair(t,p(h,e))})},reset:function(t){var e=this.chart,i=e.hoverSeries,n=e.hoverPoint,r=e.tooltip,s=r&&r.shared?e.hoverPoints:n;(t=t&&r&&s)&&u(s)[0].plotX===_&&(t=!1),t?(r.refresh(s),n&&n.setState(n.state,!0)):(n&&n.onMouseOut(),i&&i.onMouseOut(),r&&r.hide(),this._onDocumentMouseMove&&(Ke(oe,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null),je(e.axes,function(t){t.hideCrosshair()}),this.hoverX=null)},scaleGroups:function(t,e){var i,n=this.chart;je(n.series,function(r){i=t||r.getPlotBox(),r.xAxis&&r.xAxis.zoomEnabled&&(r.group.attr(i),r.markerGroup&&(r.markerGroup.attr(i),r.markerGroup.clip(e?n.clipRect:null)),r.dataLabelsGroup&&r.dataLabelsGroup.attr(i))}),n.clipRect.attr(e||n.clipBox)},pinchTranslate:function(t,e,i,n,r,s,o,a){t&&this.pinchTranslateDirection(!0,i,n,r,s,o,a),e&&this.pinchTranslateDirection(!1,i,n,r,s,o,a)},pinchTranslateDirection:function(t,e,i,n,r,s,o,a){var l,h,c,d=this.chart,u=t?"x":"y",p=t?"X":"Y",f="chart"+p,g=t?"width":"height",m=d["plot"+(t?"Left":"Top")],y=a||1,v=d.inverted,x=d.bounds[t?"h":"v"],b=1===e.length,w=e[0][f],k=i[0][f],S=!b&&e[1][f],T=!b&&i[1][f],i=function(){!b&&fe(w-S)>20&&(y=a||fe(k-T)/fe(w-S)),h=(m-k)/y+w,l=d["plot"+(t?"Width":"Height")]/y};i(),e=h,ex.max&&(e=x.max-l,c=!0),c?(k-=.8*(k-o[u][0]),b||(T-=.8*(T-o[u][1])),i()):o[u]=[k,T],v||(s[u]=h-m,s[g]=l),s=v?1/y:y,r[g]=l,r[u]=e,n[v?t?"scaleY":"scaleX":"scale"+p]=y,n["translate"+p]=s*m+(k-s*w)},pinch:function(e){var i=this,n=i.chart,r=i.pinchDown,s=n.tooltip&&n.tooltip.options.followTouchMove,o=e.touches,a=o.length,l=i.lastValidTouch,h=i.zoomHor||i.pinchHor,c=i.zoomVert||i.pinchVert,d=h||c,u=i.selectionMarker,p={},f=1===a&&(i.inClass(e.target,"highcharts-tracker")&&n.runTrackerClick||n.runChartClick),g={};(d||s)&&!f&&e.preventDefault(),Ue(o,function(t){return i.normalize(t)}),"touchstart"===e.type?(je(o,function(t,e){r[e]={chartX:t.chartX,chartY:t.chartY}}),l.x=[r[0].chartX,r[1]&&r[1].chartX],l.y=[r[0].chartY,r[1]&&r[1].chartY],je(n.axes,function(t){if(t.zoomEnabled){var e=n.bounds[t.horiz?"h":"v"],i=t.minPixelPadding,r=t.toPixels(t.dataMin),s=t.toPixels(t.dataMax),o=pe(r,s),r=ue(r,s);e.min=pe(t.pos,o-i),e.max=ue(t.pos+t.len,r+i)}})):r.length&&(u||(i.selectionMarker=u=t({destroy:Oe},n.plotBox)),i.pinchTranslate(h,c,r,o,p,u,g,l),i.hasPinched=d,i.scaleGroups(p,g),!d&&s&&1===a&&this.runPointActions(i.normalize(e)))},dragStart:function(t){var e=this.chart;e.mouseIsDown=t.type,e.cancelClick=!1,e.mouseDownX=this.mouseDownX=t.chartX,e.mouseDownY=this.mouseDownY=t.chartY},drag:function(t){var e,i=this.chart,n=i.options.chart,r=t.chartX,s=t.chartY,o=this.zoomHor,a=this.zoomVert,l=i.plotLeft,h=i.plotTop,c=i.plotWidth,d=i.plotHeight,u=this.mouseDownX,p=this.mouseDownY;l>r?r=l:r>l+c&&(r=l+c),h>s?s=h:s>h+d&&(s=h+d),this.hasDragged=Math.sqrt(Math.pow(u-r,2)+Math.pow(p-s,2)),this.hasDragged>10&&(e=i.isInsidePlot(u-l,p-h),i.hasCartesianSeries&&(this.zoomX||this.zoomY)&&e&&!this.selectionMarker&&(this.selectionMarker=i.renderer.rect(l,h,o?1:c,a?1:d,0).attr({fill:n.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add()),this.selectionMarker&&o&&(r-=u,this.selectionMarker.attr({width:fe(r),x:(r>0?0:r)+u})),this.selectionMarker&&a&&(r=s-p,this.selectionMarker.attr({height:fe(r),y:(r>0?0:r)+p})),e&&!this.selectionMarker&&n.panning&&i.pan(t,n.panning))},drop:function(e){var i=this.chart,n=this.hasPinched;if(this.selectionMarker){var r,s={xAxis:[],yAxis:[],originalEvent:e.originalEvent||e},o=this.selectionMarker,a=o.x,l=o.y;(this.hasDragged||n)&&(je(i.axes,function(t){if(t.zoomEnabled){var e=t.horiz,i=t.toValue(e?a:l),e=t.toValue(e?a+o.width:l+o.height);!isNaN(i)&&!isNaN(e)&&(s[t.coll].push({axis:t,min:pe(i,e),max:ue(i,e)}),r=!0)}}),r&&Qe(i,"selection",s,function(e){i.zoom(t(e,n?{animation:!1}:null))})),this.selectionMarker=this.selectionMarker.destroy(),n&&this.scaleGroups()}i&&(f(i.container,{cursor:i._cursor}),i.cancelClick=this.hasDragged>10,i.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])},onContainerMouseDown:function(t){t=this.normalize(t),t.preventDefault&&t.preventDefault(),this.dragStart(t)},onDocumentMouseUp:function(t){this.drop(t)},onDocumentMouseMove:function(t){var e=this.chart,i=this.chartPosition,n=e.hoverSeries,t=this.normalize(t,i);i&&n&&!this.inClass(t.target,"highcharts-tracker")&&!e.isInsidePlot(t.chartX-e.plotLeft,t.chartY-e.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset(),this.chartPosition=null},onContainerMouseMove:function(t){var e=this.chart,t=this.normalize(t);"mousedown"===e.mouseIsDown&&this.drag(t),(this.inClass(t.target,"highcharts-tracker")||e.isInsidePlot(t.chartX-e.plotLeft,t.chartY-e.plotTop))&&!e.openMenu&&this.runPointActions(t)},inClass:function(t,e){for(var i;t;){if(i=d(t,"class")){if(-1!==i.indexOf(e))return!0;if(-1!==i.indexOf("highcharts-container"))return!1}t=t.parentNode}},onTrackerMouseOut:function(t){var e=this.chart.hoverSeries,t=t.relatedTarget||t.toElement,i=t.point&&t.point.series;!e||e.options.stickyTracking||this.inClass(t,"highcharts-tooltip")||i===e||e.onMouseOut()},onContainerClick:function(e){var i,n,r,s=this.chart,o=s.hoverPoint,a=s.plotLeft,l=s.plotTop,h=s.inverted,e=this.normalize(e);e.cancelBubble=!0,s.cancelClick||(o&&this.inClass(e.target,"highcharts-tracker")?(i=this.chartPosition,n=o.plotX,r=o.plotY,t(o,{pageX:i.left+a+(h?s.plotWidth-r:n),pageY:i.top+l+(h?s.plotHeight-n:r)}),Qe(o.series,"click",t(e,{point:o})),s.hoverPoint&&o.firePointEvent("click",e)):(t(e,this.getCoordinates(e)),s.isInsidePlot(e.chartX-a,e.chartY-l)&&Qe(s,"click",e)))},onContainerTouchStart:function(t){var e=this.chart;1===t.touches.length?(t=this.normalize(t),e.isInsidePlot(t.chartX-e.plotLeft,t.chartY-e.plotTop)?(this.runPointActions(t),this.pinch(t)):this.reset()):2===t.touches.length&&this.pinch(t)},onContainerTouchMove:function(t){(1===t.touches.length||2===t.touches.length)&&this.pinch(t)},onDocumentTouchEnd:function(t){this.drop(t)},setDOMEvents:function(){var t,e=this,i=e.chart.container;this._events=t=[[i,"onmousedown","onContainerMouseDown"],[i,"onmousemove","onContainerMouseMove"],[i,"onclick","onContainerClick"],[i,"mouseleave","onContainerMouseLeave"],[oe,"mouseup","onDocumentMouseUp"]],Ie&&t.push([i,"ontouchstart","onContainerTouchStart"],[i,"ontouchmove","onContainerTouchMove"],[oe,"touchend","onDocumentTouchEnd"]),je(t,function(t){e["_"+t[2]]=function(i){e[t[2]](i)},0===t[1].indexOf("on")?t[0][t[1]]=e["_"+t[2]]:Ze(t[0],t[1],e["_"+t[2]])})},destroy:function(){var t=this;je(t._events,function(e){0===e[1].indexOf("on")?e[0][e[1]]=null:Ke(e[0],e[1],t["_"+e[2]])}),delete t._events,clearInterval(t.tooltipTimeout)}},Xe=Highcharts.TrackerMixin={drawTrackerPoint:function(){var t=this,e=t.chart,i=e.pointer,n=t.options.cursor,r=n&&{cursor:n},s=function(i){var n,r=i.target;for(e.hoverSeries!==t&&t.onMouseOver();r&&!n;)n=r.point,r=r.parentNode;n!==_&&n!==e.hoverPoint&&n.onMouseOver(i)};je(t.points,function(t){t.graphic&&(t.graphic.element.point=t),t.dataLabel&&(t.dataLabel.element.point=t)}),t._hasTracking||(je(t.trackerGroups,function(e){t[e]&&(t[e].addClass("highcharts-tracker").on("mouseover",s).on("mouseout",function(t){i.onTrackerMouseOut(t)}).css(r),Ie)&&t[e].on("touchstart",s)}),t._hasTracking=!0)},drawTrackerGraph:function(){var t,e=this,i=e.options,n=i.trackByArea,r=[].concat(n?e.areaPath:e.graphPath),s=r.length,o=e.chart,a=o.pointer,l=o.renderer,h=o.options.tooltip.snap,c=e.tracker,d=i.cursor,u=d&&{cursor:d},d=e.singlePoints,p=function(){o.hoverSeries!==e&&e.onMouseOver()};if(s&&!n)for(t=s+1;t--;)"M"===r[t]&&r.splice(t+1,0,r[t+1]-h,r[t+2],"L"),(t&&"M"===r[t]||t===s)&&r.splice(t,0,"L",r[t-2]+h,r[t-1]);for(t=0;te-6&&e+n-6>s?"":Be}))}))},renderTitle:function(){var t=this.padding,e=this.options.title,i=0;e.text&&(this.title||(this.title=this.chart.renderer.label(e.text,t-3,t-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(e.style).add(this.group)),t=this.title.getBBox(),i=t.height,this.offsetWidth=t.width,this.contentGroup.attr({translateY:i})),this.titleHeight=i},renderItem:function(t){var i,n=this,r=n.chart,s=r.renderer,o=n.options,a="horizontal"===o.layout,l=n.symbolWidth,h=o.symbolPadding,c=n.itemStyle,d=n.itemHiddenStyle,u=n.padding,f=a?p(o.itemDistance,8):0,m=!o.rtl,y=o.width,v=o.itemMarginBottom||0,x=n.itemMarginTop,w=n.initialItemX,k=t.legendItem,S=t.series&&t.series.drawLegendSymbol?t.series:t,T=S.options,T=T&&T.showCheckbox,C=o.useHTML;!k&&(t.legendGroup=s.g("legend-item").attr({zIndex:1}).add(n.scrollGroup),S.drawLegendSymbol(n,t),t.legendItem=k=s.text(o.labelFormat?b(o.labelFormat,t):o.labelFormatter.call(t),m?l+h:-h,n.baseline,C).css(e(t.visible?c:d)).attr({align:m?"left":"right",zIndex:2}).add(t.legendGroup),(C?k:t.legendGroup).on("mouseover",function(){t.setState("hover"),k.css(n.options.itemHoverStyle)}).on("mouseout",function(){k.css(t.visible?c:d),t.setState()}).on("click",function(e){var i=function(){t.setVisible()},e={browserEvent:e};t.firePointEvent?t.firePointEvent("legendItemClick",e,i):Qe(t,"legendItemClick",e,i)}),n.colorizeItem(t,t.visible),T)&&(t.checkbox=g("input",{type:"checkbox",checked:t.selected,defaultChecked:t.selected},o.itemCheckboxStyle,r.container),Ze(t.checkbox,"click",function(e){Qe(t,"checkboxClick",{checked:e.target.checked},function(){t.select()})})),s=k.getBBox(),i=t.legendItemWidth=o.itemWidth||t.legendItemWidth||l+h+s.width+f+(T?20:0),o=i,n.itemHeight=l=he(t.legendItemHeight||s.height),a&&n.itemX-w+o>(y||r.chartWidth-2*u-w)&&(n.itemX=w,n.itemY+=x+n.lastLineHeight+v,n.lastLineHeight=0),n.maxItemWidth=ue(n.maxItemWidth,o),n.lastItemY=x+n.itemY+v,n.lastLineHeight=ue(l,n.lastLineHeight),t._legendItemPos=[n.itemX,n.itemY],a?n.itemX+=o:(n.itemY+=x+l+v,n.lastLineHeight=l),n.offsetWidth=y||ue((a?n.itemX-w-f:o)+u,n.offsetWidth)},getAllItems:function(){var t=[];return je(this.chart.series,function(e){var i=e.options;p(i.showInLegend,c(i.linkedTo)?!1:_,!0)&&(t=t.concat(e.legendItems||("point"===i.legendType?e.data:e)))}),t},render:function(){var e,i,n,r,s=this,o=s.chart,a=o.renderer,l=s.group,h=s.box,c=s.options,d=s.padding,u=c.borderWidth,p=c.backgroundColor;s.itemX=s.initialItemX,s.itemY=s.initialItemY,s.offsetWidth=0,s.lastItemY=0,l||(s.group=l=a.g("legend").attr({zIndex:7}).add(),s.contentGroup=a.g().attr({zIndex:1}).add(l),s.scrollGroup=a.g().add(s.contentGroup)),s.renderTitle(),e=s.getAllItems(),T(e,function(t,e){return(t.options&&t.options.legendIndex||0)-(e.options&&e.options.legendIndex||0)}),c.reversed&&e.reverse(),s.allItems=e,s.display=i=!!e.length,je(e,function(t){s.renderItem(t)}),n=c.width||s.offsetWidth,r=s.lastItemY+s.lastLineHeight+s.titleHeight,r=s.handleOverflow(r),(u||p)&&(n+=d,r+=d,h?n>0&&r>0&&(h[h.isNew?"attr":"animate"](h.crisp(null,null,null,n,r)),h.isNew=!1):(s.box=h=a.rect(0,0,n,r,c.borderRadius,u||0).attr({stroke:c.borderColor,"stroke-width":u||0,fill:p||Be}).add(l).shadow(c.shadow),h.isNew=!0),h[i?"show":"hide"]()),s.legendWidth=n,s.legendHeight=r,je(e,function(t){s.positionItem(t)}),i&&l.align(t({width:n,height:r},c),!0,"spacingBox"),o.isResizing||this.positionCheckboxes()},handleOverflow:function(t){var e,i,n=this,r=this.chart,s=r.renderer,o=this.options,a=o.y,a=r.spacingBox.height+("top"===o.verticalAlign?-a:a)-this.padding,l=o.maxHeight,h=this.clipRect,c=o.navigation,d=p(c.animation,!0),u=c.arrowSize||12,f=this.nav,g=this.pages,m=this.allItems; +return"horizontal"===o.layout&&(a/=2),l&&(a=pe(a,l)),g.length=0,t>a&&!o.useHTML?(this.clipHeight=e=a-20-this.titleHeight-this.padding,this.currentPage=p(this.currentPage,1),this.fullHeight=t,je(m,function(t,n){var r=t._legendItemPos[1],s=he(t.legendItem.bBox.height),o=g.length;(!o||r-g[o-1]>e)&&g.push(i||r),n===m.length-1&&r+s-g[o-1]>e&&g.push(r),r!==i&&(i=r)}),h||(h=n.clipRect=s.clipRect(0,this.padding,9999,0),n.contentGroup.clip(h)),h.attr({height:e}),f||(this.nav=f=s.g().attr({zIndex:1}).add(this.group),this.up=s.symbol("triangle",0,0,u,u).on("click",function(){n.scroll(-1,d)}).add(f),this.pager=s.text("",15,10).css(c.style).add(f),this.down=s.symbol("triangle-down",0,0,u,u).on("click",function(){n.scroll(1,d)}).add(f)),n.scroll(0),t=a):f&&(h.attr({height:r.chartHeight}),f.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0),t},scroll:function(t,e){var i=this.pages,n=i.length,r=this.currentPage+t,s=this.clipHeight,o=this.options.navigation,a=o.activeColor,o=o.inactiveColor,l=this.pager,h=this.padding;r>n&&(r=n),r>0&&(e!==_&&D(e,this.chart),this.nav.attr({translateX:h,translateY:s+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:1===r?o:a}).css({cursor:1===r?"default":"pointer"}),l.attr({text:r+"/"+n}),this.down.attr({x:18+this.pager.getBBox().width,fill:r===n?o:a}).css({cursor:r===n?"default":"pointer"}),i=-i[r-1]+this.initialItemY,this.scrollGroup.animate({translateY:i}),this.currentPage=r,this.positionCheckboxes(i))}},li=Highcharts.LegendSymbolMixin={drawRectangle:function(t,e){var i=t.options.symbolHeight||12;e.legendSymbol=this.chart.renderer.rect(0,t.baseline-5-i/2,t.symbolWidth,i,p(t.options.symbolRadius,2)).attr({zIndex:3}).add(e.legendGroup)},drawLineMarker:function(t){var e,i=this.options,n=i.marker;e=t.symbolWidth;var r,s=this.chart.renderer,o=this.legendGroup,t=t.baseline-he(.3*s.fontMetrics(t.options.itemStyle.fontSize).b);i.lineWidth&&(r={"stroke-width":i.lineWidth},i.dashStyle&&(r.dashstyle=i.dashStyle),this.legendLine=s.path(["M",0,t,"L",e,t]).attr(r).add(o)),n&&n.enabled&&(i=n.radius,this.legendSymbol=e=s.symbol(this.symbol,e/2-i,t-i,2*i,2*i).add(o),e.isMarker=!0)}},/Trident\/7\.0/.test(xe)&&x(fi.prototype,"positionItem",function(t,e){var i=this,n=function(){e._legendItemPos&&t.call(i,e)};i.chart.renderer.forExport?n():setTimeout(n)}),N.prototype={init:function(t,i){var n,r=t.series;t.series=null,n=e(X,t),n.series=t.series=r,this.userOptions=t,r=n.chart,this.margin=this.splashArray("margin",r),this.spacing=this.splashArray("spacing",r);var s=r.events;this.bounds={h:{},v:{}},this.callback=i,this.isResizing=0,this.options=n,this.axes=[],this.series=[],this.hasCartesianSeries=r.showAxes;var o,a=this;if(a.index=Re.length,Re.push(a),r.reflow!==!1&&Ze(a,"load",function(){a.initReflow()}),s)for(o in s)Ze(a,o,s[o]);a.xAxis=[],a.yAxis=[],a.animation=Me?!1:p(r.animation,!0),a.pointCount=0,a.counters=new S,a.firstRender()},initSeries:function(t){var e=this.options.chart;return(e=He[t.type||e.type||e.defaultSeriesType])||M(17,!0),e=new e,e.init(this,t),e},isInsidePlot:function(t,e,i){var n=i?e:t,t=i?t:e;return n>=0&&n<=this.plotWidth&&t>=0&&t<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&je(this.axes,function(t){t.adjustTickAmount()}),this.maxTicks=null},redraw:function(e){var i,n,r=this.axes,s=this.series,o=this.pointer,a=this.legend,l=this.isDirtyLegend,h=this.isDirtyBox,c=s.length,d=c,u=this.renderer,p=u.isHidden(),f=[];for(D(e,this),p&&this.cloneRenderTo(),this.layOutTitles();d--;)if(e=s[d],e.options.stacking&&(i=!0,e.isDirty)){n=!0;break}if(n)for(d=c;d--;)e=s[d],e.options.stacking&&(e.isDirty=!0);je(s,function(t){t.isDirty&&"point"===t.options.legendType&&(l=!0)}),l&&a.options.enabled&&(a.render(),this.isDirtyLegend=!1),i&&this.getStacks(),this.hasCartesianSeries&&(this.isResizing||(this.maxTicks=null,je(r,function(t){t.setScale()})),this.adjustTickAmounts(),this.getMargins(),je(r,function(t){t.isDirty&&(h=!0)}),je(r,function(e){e.isDirtyExtremes&&(e.isDirtyExtremes=!1,f.push(function(){Qe(e,"afterSetExtremes",t(e.eventArgs,e.getExtremes())),delete e.eventArgs})),(h||i)&&e.redraw()})),h&&this.drawChartBox(),je(s,function(t){t.isDirty&&t.visible&&(!t.isCartesian||t.xAxis)&&t.redraw()}),o&&o.reset&&o.reset(!0),u.draw(),Qe(this,"redraw"),p&&this.cloneRenderTo(!0),je(f,function(t){t.call()})},get:function(t){var e,i,n=this.axes,r=this.series;for(e=0;epe(l.dataMin,l.min)&&o=18&&25>=e&&(e=15)),n&&(n.css({width:(r.width||o)+"px"}).align(t({y:e+s.margin},r),!1,"spacingBox"),!r.floating&&!r.verticalAlign&&(e=de(e+n.getBBox().height))),this.titleOffset=e},getChartSize:function(){var t=this.options.chart,e=this.renderToClone||this.renderTo;this.containerWidth=Ge(e,"width"),this.containerHeight=Ge(e,"height"),this.chartWidth=ue(0,t.width||this.containerWidth||600),this.chartHeight=ue(0,p(t.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(t){var e=this.renderToClone,i=this.container;t?e&&(this.renderTo.appendChild(i),L(e),delete this.renderToClone):(i&&i.parentNode===this.renderTo&&this.renderTo.removeChild(i),this.renderToClone=e=this.renderTo.cloneNode(0),f(e,{position:"absolute",top:"-9999px",display:"block"}),oe.body.appendChild(e),i&&e.appendChild(i))},getContainer:function(){var e,r,s,o,a=this.options.chart;this.renderTo=e=a.renderTo,o="highcharts-"+Ee++,n(e)&&(this.renderTo=e=oe.getElementById(e)),e||M(13,!0),r=i(d(e,"data-highcharts-chart")),!isNaN(r)&&Re[r]&&Re[r].destroy(),d(e,"data-highcharts-chart",this.index),e.innerHTML="",e.offsetWidth||this.cloneRenderTo(),this.getChartSize(),r=this.chartWidth,s=this.chartHeight,this.container=e=g(ze,{className:"highcharts-container"+(a.className?" "+a.className:""),id:o},t({position:"relative",overflow:"hidden",width:r+"px",height:s+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},a.style),this.renderToClone||e),this._cursor=e.style.cursor,this.renderer=a.forExport?new ai(e,r,s,!0):new H(e,r,s),Me&&this.renderer.create(this,e,r,s)},getMargins:function(){var t,e=this.spacing,i=this.legend,n=this.margin,r=this.options.legend,s=p(r.margin,10),o=r.x,a=r.y,l=r.align,h=r.verticalAlign,d=this.titleOffset;this.resetMargins(),t=this.axisOffset,d&&!c(n[0])&&(this.plotTop=ue(this.plotTop,d+this.options.title.margin+e[0])),i.display&&!r.floating&&("right"===l?c(n[1])||(this.marginRight=ue(this.marginRight,i.legendWidth-o+s+e[1])):"left"===l?c(n[3])||(this.plotLeft=ue(this.plotLeft,i.legendWidth+o+s+e[3])):"top"===h?c(n[0])||(this.plotTop=ue(this.plotTop,i.legendHeight+a+s+e[0])):"bottom"!==h||c(n[2])||(this.marginBottom=ue(this.marginBottom,i.legendHeight-a+s+e[2]))),this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin),this.extraTopMargin&&(this.plotTop+=this.extraTopMargin),this.hasCartesianSeries&&je(this.axes,function(t){t.getOffset()}),c(n[3])||(this.plotLeft+=t[3]),c(n[0])||(this.plotTop+=t[0]),c(n[2])||(this.marginBottom+=t[2]),c(n[1])||(this.marginRight+=t[1]),this.setChartSize()},reflow:function(t){var e=this,i=e.options.chart,n=e.renderTo,r=i.width||Ge(n,"width"),s=i.height||Ge(n,"height"),i=t?t.target:ae,n=function(){e.container&&(e.setSize(r,s,!1),e.hasUserSize=null)};e.hasUserSize||!r||!s||i!==ae&&i!==oe||((r!==e.containerWidth||s!==e.containerHeight)&&(clearTimeout(e.reflowTimeout),t?e.reflowTimeout=setTimeout(n,100):n()),e.containerWidth=r,e.containerHeight=s)},initReflow:function(){var t=this,e=function(e){t.reflow(e)};Ze(ae,"resize",e),Ze(t,"destroy",function(){Ke(ae,"resize",e)})},setSize:function(t,e,i){var n,r,s,o=this;o.isResizing+=1,s=function(){o&&Qe(o,"endResize",null,function(){o.isResizing-=1})},D(i,o),o.oldChartHeight=o.chartHeight,o.oldChartWidth=o.chartWidth,c(t)&&(o.chartWidth=n=ue(0,he(t)),o.hasUserSize=!!n),c(e)&&(o.chartHeight=r=ue(0,he(e))),($?ti:f)(o.container,{width:n+"px",height:r+"px"},$),o.setChartSize(!0),o.renderer.setSize(n,r,i),o.maxTicks=null,je(o.axes,function(t){t.isDirty=!0,t.setScale()}),je(o.series,function(t){t.isDirty=!0}),o.isDirtyLegend=!0,o.isDirtyBox=!0,o.getMargins(),o.redraw(i),o.oldChartHeight=null,Qe(o,"resize"),$===!1?s():setTimeout(s,$&&$.duration||500)},setChartSize:function(t){var e,i,n,r,s=this.inverted,o=this.renderer,a=this.chartWidth,l=this.chartHeight,h=this.options.chart,c=this.spacing,d=this.clipOffset;this.plotLeft=e=he(this.plotLeft),this.plotTop=i=he(this.plotTop),this.plotWidth=n=ue(0,he(a-e-this.marginRight)),this.plotHeight=r=ue(0,he(l-i-this.marginBottom)),this.plotSizeX=s?r:n,this.plotSizeY=s?n:r,this.plotBorderWidth=h.plotBorderWidth||0,this.spacingBox=o.spacingBox={x:c[3],y:c[0],width:a-c[3]-c[1],height:l-c[0]-c[2]},this.plotBox=o.plotBox={x:e,y:i,width:n,height:r},a=2*ce(this.plotBorderWidth/2),s=de(ue(a,d[3])/2),o=de(ue(a,d[0])/2),this.clipBox={x:s,y:o,width:ce(this.plotSizeX-ue(a,d[1])/2-s),height:ce(this.plotSizeY-ue(a,d[2])/2-o)},t||je(this.axes,function(t){t.setAxisSize(),t.setAxisTranslation()})},resetMargins:function(){var t=this.spacing,e=this.margin;this.plotTop=p(e[0],t[0]),this.marginRight=p(e[1],t[1]),this.marginBottom=p(e[2],t[2]),this.plotLeft=p(e[3],t[3]),this.axisOffset=[0,0,0,0],this.clipOffset=[0,0,0,0]},drawChartBox:function(){var t,e=this.options.chart,i=this.renderer,n=this.chartWidth,r=this.chartHeight,s=this.chartBackground,o=this.plotBackground,a=this.plotBorder,l=this.plotBGImage,h=e.borderWidth||0,c=e.backgroundColor,d=e.plotBackgroundColor,u=e.plotBackgroundImage,p=e.plotBorderWidth||0,f=this.plotLeft,g=this.plotTop,m=this.plotWidth,y=this.plotHeight,v=this.plotBox,x=this.clipRect,b=this.clipBox;t=h+(e.shadow?8:0),(h||c)&&(s?s.animate(s.crisp(null,null,null,n-t,r-t)):(s={fill:c||Be},h&&(s.stroke=e.borderColor,s["stroke-width"]=h),this.chartBackground=i.rect(t/2,t/2,n-t,r-t,e.borderRadius,h).attr(s).add().shadow(e.shadow))),d&&(o?o.animate(v):this.plotBackground=i.rect(f,g,m,y,0).attr({fill:d}).add().shadow(e.plotShadow)),u&&(l?l.animate(v):this.plotBGImage=i.image(u,f,g,m,y).add()),x?x.animate({width:b.width,height:b.height}):this.clipRect=i.clipRect(b),p&&(a?a.animate(a.crisp(null,f,g,m,y)):this.plotBorder=i.rect(f,g,m,y,0,-p).attr({stroke:e.plotBorderColor,"stroke-width":p,zIndex:1}).add()),this.isDirtyBox=!1},propFromSeries:function(){var t,e,i,n=this,r=n.options.chart,s=n.options.series;je(["inverted","angular","polar"],function(o){for(t=He[r.type||r.defaultSeriesType],i=n[o]||r[o]||t&&t.prototype[o],e=s&&s.length;!i&&e--;)(t=He[s[e].type])&&t.prototype[o]&&(i=!0);n[o]=i})},linkSeries:function(){var t=this,e=t.series;je(e,function(t){t.linkedSeries.length=0}),je(e,function(e){var i=e.options.linkedTo;n(i)&&(i=":previous"===i?t.series[e.index-1]:t.get(i))&&(i.linkedSeries.push(e),e.linkedParent=i)})},render:function(){var e,n=this,r=n.axes,s=n.renderer,o=n.options,a=o.labels,l=o.credits;n.setTitle(),n.legend=new fi(n,o.legend),n.getStacks(),je(r,function(t){t.setScale()}),n.getMargins(),n.maxTicks=null,je(r,function(t){t.setTickPositions(!0),t.setMaxTicks()}),n.adjustTickAmounts(),n.getMargins(),n.drawChartBox(),n.hasCartesianSeries&&je(r,function(t){t.render()}),n.seriesGroup||(n.seriesGroup=s.g("series-group").attr({zIndex:3}).add()),je(n.series,function(t){t.translate(),t.setTooltipPoints(),t.render()}),a.items&&je(a.items,function(e){var r=t(a.style,e.style),o=i(r.left)+n.plotLeft,l=i(r.top)+n.plotTop+12;delete r.left,delete r.top,s.text(e.html,o,l).attr({zIndex:2}).css(r).add()}),l.enabled&&!n.credits&&(e=l.href,n.credits=s.text(l.text,0,0).on("click",function(){e&&(location.href=e)}).attr({align:l.position.align,zIndex:8}).css(l.style).add().align(l.position)),n.hasRendered=!0},destroy:function(){var t,e=this,i=e.axes,n=e.series,r=e.container,s=r&&r.parentNode;for(Qe(e,"destroy"),Re[e.index]=_,e.renderTo.removeAttribute("data-highcharts-chart"),Ke(e),t=i.length;t--;)i[t]=i[t].destroy();for(t=n.length;t--;)n[t]=n[t].destroy();je("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(t){var i=e[t];i&&i.destroy&&(e[t]=i.destroy())}),r&&(r.innerHTML="",Ke(r),s&&L(r));for(t in e)delete e[t]},isReadyToRender:function(){var t=this;return!Ae&&ae==ae.top&&"complete"!==oe.readyState||Me&&!ae.canvg?(Me?ci.push(function(){t.firstRender()},t.options.global.canvasToolsURL):oe.attachEvent("onreadystatechange",function(){oe.detachEvent("onreadystatechange",t.firstRender),"complete"===oe.readyState&&t.firstRender()}),!1):!0},firstRender:function(){var t=this,e=t.options,i=t.callback;t.isReadyToRender()&&(t.getContainer(),Qe(t,"init"),t.resetMargins(),t.setChartSize(),t.propFromSeries(),t.getAxes(),je(e.series||[],function(e){t.initSeries(e)}),t.linkSeries(),Qe(t,"beforeRender"),t.pointer=new ui(t,e),t.render(),t.renderer.draw(),i&&i.apply(t,[t]),je(t.callbacks,function(e){e.apply(t,[t])}),t.cloneRenderTo(!0),Qe(t,"load"))},splashArray:function(t,e){var i=e[t],i=r(i)?i:[i,i,i,i];return[p(e[t+"Top"],i[0]),p(e[t+"Right"],i[1]),p(e[t+"Bottom"],i[2]),p(e[t+"Left"],i[3])]}},N.prototype.callbacks=[];var hi=Highcharts.CenteredSeriesMixin={getCenter:function(){var t,e,n=this.options,r=this.chart,s=2*(n.slicedOffset||0),o=r.plotWidth-2*s,a=r.plotHeight-2*s,r=n.center,n=[p(r[0],"50%"),p(r[1],"50%"),n.size||"100%",n.innerSize||0],l=pe(o,a);return Ue(n,function(n,r){return e=/%$/.test(n),t=2>r||2===r&&e,(e?[o,a,l,l][r]*i(n)/100:n)+(t?s:0)})}},gi=function(){};gi.prototype={init:function(t,e,i){return this.series=t,this.applyOptions(e,i),this.pointAttr={},t.options.colorByPoint&&(e=t.options.colors||t.chart.options.colors,this.color=this.color||e[t.colorCounter++],t.colorCounter===e.length)&&(t.colorCounter=0),t.chart.pointCount++,this},applyOptions:function(e,i){var n=this.series,r=n.pointValKey,e=gi.prototype.optionsToObject.call(this,e);return t(this,e),this.options=this.options?t(this.options,e):e,r&&(this.y=this[r]),this.x===_&&n&&(this.x=i===_?n.autoIncrement():i),this},optionsToObject:function(t){var e={},i=this.series,n=i.pointArrayMap||["y"],r=n.length,o=0,a=0;if("number"==typeof t||null===t)e[n[0]]=t;else if(s(t))for(t.length>r&&(i=typeof t[0],"string"===i?e.name=t[0]:"number"===i&&(e.x=t[0]),o++);r>a;)e[n[a++]]=t[o++];else"object"==typeof t&&(e=t,t.dataLabels&&(i._hasPointLabels=!0),t.marker&&(i._hasPointMarkers=!0));return e},destroy:function(){var t,e=this.series.chart,i=e.hoverPoints;e.pointCount--,i&&(this.setState(),h(i,this),!i.length)&&(e.hoverPoints=null),this===e.hoverPoint&&this.onMouseOut(),(this.graphic||this.dataLabel)&&(Ke(this),this.destroyElements()),this.legendItem&&e.legend.destroyItem(this);for(t in this)this[t]=null},destroyElements:function(){for(var t,e="graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),i=6;i--;)t=e[i],this[t]&&(this[t]=this[t].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(t,e){var i=this,n=i.series,r=n.chart,t=p(t,!i.selected);i.firePointEvent(t?"select":"unselect",{accumulate:e},function(){i.selected=i.options.selected=t,n.options.data[Ye(i,n.data)]=i.options,i.setState(t&&"select"),e||je(r.getSelectedPoints(),function(t){t.selected&&t!==i&&(t.selected=t.options.selected=!1,n.options.data[Ye(t,n.data)]=t.options,t.setState(""),t.firePointEvent("unselect"))})})},onMouseOver:function(t){var e=this.series,i=e.chart,n=i.tooltip,r=i.hoverPoint;r&&r!==this&&r.onMouseOut(),this.firePointEvent("mouseOver"),n&&(!n.shared||e.noSharedTooltip)&&n.refresh(this,t),this.setState("hover"),i.hoverPoint=this},onMouseOut:function(){var t=this.series.chart,e=t.hoverPoints;e&&-1!==Ye(this,e)||(this.firePointEvent("mouseOut"),this.setState(),t.hoverPoint=null)},tooltipFormatter:function(t){var e=this.series,i=e.tooltipOptions,n=p(i.valueDecimals,""),r=i.valuePrefix||"",s=i.valueSuffix||"";return je(e.pointArrayMap||["y"],function(e){e="{point."+e,(r||s)&&(t=t.replace(e+"}",r+e+"}"+s)),t=t.replace(e+"}",e+":,."+n+"f}")}),b(t,{point:this,series:this.series})},firePointEvent:function(t,e,i){var n=this,r=this.series.options;(r.point.events[t]||n.options&&n.options.events&&n.options.events[t])&&this.importEvents(),"click"===t&&r.allowPointSelect&&(i=function(t){n.select(null,t.ctrlKey||t.metaKey||t.shiftKey)}),Qe(this,t,e,i)},importEvents:function(){if(!this.hasImportedEvents){var t,i=e(this.series.options.point,this.options).events;this.events=i;for(t in i)Ze(this,t,i[t]);this.hasImportedEvents=!0}},setState:function(t,i){var n=this.plotX,r=this.plotY,s=this.series,o=s.options.states,a=ii[s.type].marker&&s.options.marker,l=a&&!a.enabled,h=a&&a.states[t],c=h&&h.enabled===!1,d=s.stateMarkerGraphic,u=this.marker||{},p=s.chart,f=this.pointAttr,t=t||"",i=i&&d;t===this.state&&!i||this.selected&&"select"!==t||o[t]&&o[t].enabled===!1||t&&(c||l&&!h.enabled)||t&&u.states&&u.states[t]&&u.states[t].enabled===!1||(this.graphic?(o=a&&this.graphic.symbolName&&f[t].r,this.graphic.attr(e(f[t],o?{x:n-o,y:r-o,width:2*o,height:2*o}:{}))):(t&&h&&(o=h.radius,u=u.symbol||s.symbol,d&&d.currentSymbol!==u&&(d=d.destroy()),d?d[i?"animate":"attr"]({x:n-o,y:r-o}):(s.stateMarkerGraphic=d=p.renderer.symbol(u,n-o,r-o,2*o,2*o).attr(f[t]).add(s.markerGroup),d.currentSymbol=u)),d&&d[t&&p.isInsidePlot(n,r,p.inverted)?"show":"hide"]()),this.state=t)}};var mi=function(){};mi.prototype={isCartesian:!0,type:"line",pointClass:gi,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],init:function(e,i){var n,r,s=this,o=e.series,a=function(t,e){return p(t.options.index,t._i)-p(e.options.index,e._i)};s.chart=e,s.options=i=s.setOptions(i),s.linkedSeries=[],s.bindAxes(),t(s,{name:i.name,state:"",pointAttr:{},visible:i.visible!==!1,selected:i.selected===!0}),Me&&(i.animation=!1),r=i.events;for(n in r)Ze(s,n,r[n]);(r&&r.click||i.point&&i.point.events&&i.point.events.click||i.allowPointSelect)&&(e.runTrackerClick=!0),s.getColor(),s.getSymbol(),je(s.parallelArrays,function(t){s[t+"Data"]=[]}),s.setData(i.data,!1),s.isCartesian&&(e.hasCartesianSeries=!0),o.push(s),s._i=o.length-1,T(o,a),this.yAxis&&T(this.yAxis.series,a),je(o,function(t,e){t.index=e,t.name=t.name||"Series "+(e+1)})},bindAxes:function(){var t,e=this,i=e.options,n=e.chart;je(e.axisTypes||[],function(r){je(n[r],function(n){t=n.options,(i[r]===t.index||i[r]!==_&&i[r]===t.id||i[r]===_&&0===t.index)&&(n.series.push(e),e[r]=n,n.isDirty=!0)}),!e[r]&&e.optionalAxis!==r&&M(18,!0)})},updateParallelArrays:function(t,e){var i=t.series,n=arguments;je(i.parallelArrays,"number"==typeof e?function(n){var r="y"===n&&i.toYData?i.toYData(t):t[n];i[n+"Data"][e]=r}:function(t){Array.prototype[e].apply(i[t+"Data"],Array.prototype.slice.call(n,2))})},autoIncrement:function(){var t=this.options,e=this.xIncrement,e=p(e,t.pointStart,0);return this.pointInterval=p(this.pointInterval,t.pointInterval,1),this.xIncrement=e+this.pointInterval,e},getSegments:function(){var t,e=-1,i=[],n=this.points,r=n.length;if(r)if(this.options.connectNulls){for(t=r;t--;)null===n[t].y&&n.splice(t,1);n.length&&(i=[n])}else je(n,function(t,s){null===t.y?(s>e+1&&i.push(n.slice(e+1,s)),e=s):s===r-1&&i.push(n.slice(e+1,s+1))});this.segments=i},setOptions:function(t){var i=this.chart,n=i.options.plotOptions,i=i.userOptions||{},r=i.plotOptions||{},s=n[this.type];return this.userOptions=t,n=e(s,n.series,t),this.tooltipOptions=e(X.tooltip,X.plotOptions[this.type].tooltip,i.tooltip,r.series&&r.series.tooltip,r[this.type]&&r[this.type].tooltip,t.tooltip),null===s.marker&&delete n.marker,n},getColor:function(){var t,e=this.options,i=this.userOptions,n=this.chart.options.colors,r=this.chart.counters;t=e.color||ii[this.type].color,t||e.colorByPoint||(c(i._colorIndex)?e=i._colorIndex:(i._colorIndex=r.color,e=r.color++),t=n[e]),this.color=t,r.wrapColor(n.length)},getSymbol:function(){var t=this.userOptions,e=this.options.marker,i=this.chart,n=i.options.symbols,i=i.counters;this.symbol=e.symbol,this.symbol||(c(t._symbolIndex)?t=t._symbolIndex:(t._symbolIndex=i.symbol,t=i.symbol++),this.symbol=n[t]),/^url/.test(this.symbol)&&(e.radius=0),i.wrapSymbol(n.length)},drawLegendSymbol:li.drawLineMarker,setData:function(t,e){var i,r=this,a=r.points,l=r.options,h=r.chart,c=null,d=r.xAxis,u=d&&!!d.categories;r.xIncrement=null,r.pointRange=u?1:l.pointRange,r.colorCounter=0;var t=t||[],f=t.length;i=l.turboThreshold;var g=this.xData,m=this.yData,y=r.pointArrayMap,y=y&&y.length;if(je(this.parallelArrays,function(t){r[t+"Data"].length=0}),i&&f>i){for(i=0;null===c&&f>i;)c=t[i],i++;if(o(c)){for(u=p(l.pointStart,0),l=p(l.pointInterval,1),i=0;f>i;i++)g[i]=u,m[i]=t[i],u+=l;r.xIncrement=u}else if(s(c))if(y)for(i=0;f>i;i++)l=t[i],g[i]=l[0],m[i]=l.slice(1,y+1);else for(i=0;f>i;i++)l=t[i],g[i]=l[0],m[i]=l[1];else M(12)}else for(i=0;f>i;i++)t[i]!==_&&(l={series:r},r.pointClass.prototype.applyOptions.apply(l,[t[i]]),r.updateParallelArrays(l,i),u&&l.name)&&(d.names[l.x]=l.name);for(n(m[0])&&M(14,!0),r.data=[],r.options.data=t,i=a&&a.length||0;i--;)a[i]&&a[i].destroy&&a[i].destroy();d&&(d.minRange=d.userMinRange),r.isDirty=r.isDirtyData=h.isDirtyBox=!0,p(e,!0)&&h.redraw(!1)},processData:function(t){var e,i=this.xData,n=this.yData,r=i.length;e=0;var s,o,a=this.xAxis,l=this.options,h=l.cropThreshold,c=this.isCartesian;if(c&&!this.isDirty&&!a.isDirty&&!this.yAxis.isDirty&&!t)return!1;for(c&&this.sorted&&(!h||r>h||this.forceCrop)&&(t=a.min,a=a.max,i[r-1]a?(i=[],n=[]):(i[0]a)&&(e=this.cropData(this.xData,this.yData,t,a),i=e.xData,n=e.yData,e=e.start,s=!0)),a=i.length-1;a>=0;a--)r=i[a]-i[a-1],r>0&&(o===_||o>r)?o=r:0>r&&this.requireSorting&&M(15);this.cropped=s,this.cropStart=e,this.processedXData=i,this.processedYData=n,null===l.pointRange&&(this.pointRange=o||1),this.closestPointRange=o},cropData:function(t,e,i,n){var r,s=t.length,o=0,a=s,l=p(this.cropShoulder,1);for(r=0;s>r;r++)if(t[r]>=i){o=ue(0,r-l);break}for(;s>r;r++)if(t[r]>n){a=r+l;break}return{xData:t.slice(o,a),yData:e.slice(o,a),start:o,end:a}},generatePoints:function(){var t,e,i,n,r=this.options.data,s=this.data,o=this.processedXData,a=this.processedYData,l=this.pointClass,h=o.length,c=this.cropStart||0,d=this.hasGroupedData,p=[];for(s||d||(s=[],s.length=r.length,s=this.data=s),n=0;h>n;n++)e=c+n,d?p[n]=(new l).init(this,[o[n]].concat(u(a[n]))):(s[e]?i=s[e]:r[e]!==_&&(s[e]=i=(new l).init(this,r[e],o[n])),p[n]=i);if(s&&(h!==(t=s.length)||d))for(n=0;t>n;n++)n===c&&!d&&(n+=h),s[n]&&(s[n].destroyElements(),s[n].plotX=_);this.data=s,this.points=p},setStackedPoints:function(){if(this.options.stacking&&(this.visible===!0||this.chart.options.chart.ignoreHiddenSeries===!1)){var t,e,i,n,r,s=this.processedXData,o=this.processedYData,a=[],l=o.length,h=this.options,c=h.threshold,d=h.stack,h=h.stacking,u=this.stackKey,p="-"+u,f=this.negStacks,g=this.yAxis,m=g.stacks,y=g.oldStacks;for(i=0;l>i;i++)n=s[i],r=o[i],e=(t=f&&c>r)?p:u,m[e]||(m[e]={}),m[e][n]||(y[e]&&y[e][n]?(m[e][n]=y[e][n],m[e][n].total=null):m[e][n]=new B(g,g.options.stackLabels,t,n,d,h)),e=m[e][n],e.points[this.index]=[e.cum||0],"percent"===h?(t=t?u:p,f&&m[t]&&m[t][n]?(t=m[t][n],e.total=t.total=ue(t.total,e.total)+fe(r)||0):e.total+=fe(r)||0):e.total+=r||0,e.cum=(e.cum||0)+(r||0),e.points[this.index].push(e.cum),a[i]=e.cum;"percent"===h&&(g.usePercentage=!0),this.stackedYData=a,g.oldStacks={}}},setPercentStacks:function(){var t=this,e=t.stackKey,i=t.yAxis.stacks;je([e,"-"+e],function(e){for(var n,r,s,o=t.xData.length;o--;)r=t.xData[o],n=(s=i[e]&&i[e][r])&&s.points[t.index],(r=n)&&(s=s.total?100/s.total:0,r[0]=I(r[0]*s),r[1]=I(r[1]*s),t.stackedYData[o]=r[1])})},getExtremes:function(t){var e,i=this.yAxis,n=this.processedXData,r=[],s=0;e=this.xAxis.getExtremes();var o,a,l,h,c=e.min,d=e.max,t=t||this.stackedYData||this.processedYData;for(e=t.length,h=0;e>h;h++)if(a=n[h],l=t[h],o=null!==l&&l!==_&&(!i.isLog||l.length||l>0),a=this.getExtremesFromAll||this.cropped||(n[h+1]||a)>=c&&(n[h-1]||a)<=d,o&&a)if(o=l.length)for(;o--;)null!==l[o]&&(r[s++]=l[o]);else r[s++]=l;this.dataMin=p(void 0,C(r)),this.dataMax=p(void 0,P(r))},translate:function(){this.processedXData||this.processData(),this.generatePoints();for(var t=this.options,e=t.stacking,i=this.xAxis,n=i.categories,r=this.yAxis,s=this.points,a=s.length,l=!!this.modifyValue,h=t.pointPlacement,d="between"===h||o(h),u=t.threshold,t=0;a>t;t++){var f=s[t],g=f.x,m=f.y,y=f.low,v=e&&r.stacks[(this.negStacks&&u>m?"-":"")+this.stackKey];r.isLog&&0>=m&&(f.y=m=null),f.plotX=i.translate(g,0,0,0,1,h,"flags"===this.type),e&&this.visible&&v&&v[g]&&(v=v[g],m=v.points[this.index],y=m[0],m=m[1],0===y&&(y=p(u,r.min)),r.isLog&&0>=y&&(y=null),f.total=f.stackTotal=v.total,f.percentage="percent"===e&&f.y/v.total*100,f.stackY=m,v.setOffset(this.pointXOffset||0,this.barW||0)),f.yBottom=c(y)?r.translate(y,0,1,0,1):null,l&&(m=this.modifyValue(m,f)),f.plotY="number"==typeof m&&1/0!==m?r.translate(m,0,1,0,1):_,f.clientX=d?i.translate(g,0,0,0,1):f.plotX,f.negative=f.y<(u||0),f.category=n&&n[f.x]!==_?n[f.x]:f.x}this.getSegments()},setTooltipPoints:function(t){var e,i,n,r,s=[],o=this.xAxis,a=o&&o.getExtremes(),l=o?o.tooltipLen||o.len:this.chart.plotSizeX,h=[];if(this.options.enableMouseTracking!==!1){for(t&&(this.tooltipPoints=null),je(this.segments||this.points,function(t){s=s.concat(t)}),o&&o.reversed&&(s=s.reverse()),this.orderTooltipPoints&&this.orderTooltipPoints(s),t=s.length,r=0;t>r;r++)if(o=s[r],e=o.x,e>=a.min&&e<=a.max)for(n=s[r+1],e=i===_?0:i+1,i=s[r+1]?pe(ue(0,ce((o.clientX+(n?n.wrappedClientX||n.clientX:l))/2)),l):l;e>=0&&i>=e;)h[e++]=o;this.tooltipPoints=h}},tooltipHeaderFormatter:function(t){var e,i=this.tooltipOptions,n=i.dateTimeLabelFormats,r=i.xDateFormat||n.year,s=this.xAxis,a=s&&"datetime"===s.options.type,i=i.headerFormat,s=s&&s.closestPointRange;if(a&&!r)if(s){for(e in j)if(j[e]>=s){r=n[e];break}}else r=n.day;return a&&r&&o(t.key)&&(i=i.replace("{point.key}","{point.key:"+r+"}")),b(i,{point:t,series:this})},onMouseOver:function(){var t=this.chart,e=t.hoverSeries;e&&e!==this&&e.onMouseOut(),this.options.events.mouseOver&&Qe(this,"mouseOver"),this.setState("hover"),t.hoverSeries=this},onMouseOut:function(){var t=this.options,e=this.chart,i=e.tooltip,n=e.hoverPoint;n&&n.onMouseOut(),this&&t.events.mouseOut&&Qe(this,"mouseOut"),i&&!t.stickyTracking&&(!i.shared||this.noSharedTooltip)&&i.hide(),this.setState(),e.hoverSeries=null},animate:function(e){var i,n=this,s=n.chart,o=s.renderer;i=n.options.animation;var a,l=s.clipBox,h=s.inverted;i&&!r(i)&&(i=ii[n.type].animation),a="_sharedClip"+i.duration+i.easing,e?(e=s[a],i=s[a+"m"],e||(s[a]=e=o.clipRect(t(l,{width:0})),s[a+"m"]=i=o.clipRect(-99,h?-s.plotLeft:-s.plotTop,99,h?s.chartWidth:s.chartHeight)),n.group.clip(e),n.markerGroup.clip(i),n.sharedClipKey=a):((e=s[a])&&(e.animate({width:s.plotSizeX},i),s[a+"m"].animate({width:s.plotSizeX+99},i)),n.animate=null,n.animationTimeout=setTimeout(function(){n.afterAnimate()},i.duration))},afterAnimate:function(){var t=this.chart,e=this.sharedClipKey,i=this.group;i&&this.options.clip!==!1&&(i.clip(t.clipRect),this.markerGroup.clip()),setTimeout(function(){e&&t[e]&&(t[e]=t[e].destroy(),t[e+"m"]=t[e+"m"].destroy())},100)},drawPoints:function(){var e,i,n,r,s,o,a,l,h,c,d=this.points,u=this.chart,f=this.options.marker,g=this.pointAttr[""],m=this.markerGroup;if(f.enabled||this._hasPointMarkers)for(r=d.length;r--;)s=d[r],i=ce(s.plotX),n=s.plotY,h=s.graphic,a=s.marker||{},e=f.enabled&&a.enabled===_||a.enabled,c=u.isInsidePlot(he(i),n,u.inverted),e&&n!==_&&!isNaN(n)&&null!==s.y?(e=s.pointAttr[s.selected?"select":""]||g,o=e.r,a=p(a.symbol,this.symbol),l=0===a.indexOf("url"),h?h.attr({visibility:c?Ae?"inherit":"visible":"hidden"}).animate(t({x:i-o,y:n-o},h.symbolName?{width:2*o,height:2*o}:{})):c&&(o>0||l)&&(s.graphic=u.renderer.symbol(a,i-o,n-o,2*o,2*o).attr(e).add(m))):h&&(s.graphic=h.destroy())},convertAttribs:function(t,e,i,n){var r,s,o=this.pointAttrToOptions,a={},t=t||{},e=e||{},i=i||{},n=n||{};for(r in o)s=o[r],a[r]=p(t[s],e[r],i[r],n[r]);return a},getAttribs:function(){var e,i=this,n=i.options,r=ii[i.type].marker?n.marker:n,s=r.states,o=s.hover,a=i.color;e={stroke:a,fill:a};var l,h,d=i.points||[],u=[],p=i.pointAttrToOptions;l=n.turboThreshold;var f,g=n.negativeColor,m=r.lineColor;if(n.marker?(o.radius=o.radius||r.radius+2,o.lineWidth=o.lineWidth||r.lineWidth+1):o.color=o.color||oi(o.color||a).brighten(o.brightness).get(),u[""]=i.convertAttribs(r,e),je(["hover","select"],function(t){u[t]=i.convertAttribs(s[t],u[""])}),i.pointAttr=u,a=d.length,!l||l>a)for(;a--;){if(l=d[a],(r=l.options&&l.options.marker||l.options)&&r.enabled===!1&&(r.radius=0),l.negative&&g&&(l.color=l.fillColor=g),e=n.colorByPoint||l.color,l.options)for(f in p)c(r[p[f]])&&(e=!0);e?(r=r||{},h=[],s=r.states||{},e=s.hover=s.hover||{},n.marker||(e.color=e.color||o.color||oi(l.color).brighten(e.brightness||o.brightness).get()),h[""]=i.convertAttribs(t({color:l.color,fillColor:l.color,lineColor:null===m?l.color:_},r),u[""]),h.hover=i.convertAttribs(s.hover,u.hover,h[""]),h.select=i.convertAttribs(s.select,u.select,h[""])):h=u,l.pointAttr=h}},destroy:function(){var t,e,i,n,r,s=this,o=s.chart,a=/AppleWebKit\/533/.test(xe),l=s.data||[];for(Qe(s,"destroy"),Ke(s),je(s.axisTypes||[],function(t){(r=s[t])&&(h(r.series,s),r.isDirty=r.forceRedraw=!0)}),s.legendItem&&s.chart.legend.destroyItem(s),e=l.length;e--;)(i=l[e])&&i.destroy&&i.destroy();s.points=null,clearTimeout(s.animationTimeout),je("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),function(e){s[e]&&(t=a&&"group"===e?"hide":"destroy",s[e][t]())}),o.hoverSeries===s&&(o.hoverSeries=null),h(o.series,s);for(n in s)delete s[n]},getSegmentPath:function(t){var e=this,i=[],n=e.options.step;return je(t,function(r,s){var o,a=r.plotX,l=r.plotY; +e.getPointSpline?i.push.apply(i,e.getPointSpline(t,r,s)):(i.push(s?"L":"M"),n&&s&&(o=t[s-1],"right"===n?i.push(o.plotX,l):"center"===n?i.push((o.plotX+a)/2,o.plotY,(o.plotX+a)/2,l):i.push(a,o.plotY)),i.push(r.plotX,r.plotY))}),i},getGraphPath:function(){var t,e=this,i=[],n=[];return je(e.segments,function(r){t=e.getSegmentPath(r),r.length>1?i=i.concat(t):n.push(r[0])}),e.singlePoints=n,e.graphPath=i},drawGraph:function(){var t=this,e=this.options,i=[["graph",e.lineColor||this.color]],n=e.lineWidth,r=e.dashStyle,s="square"!==e.linecap,o=this.getGraphPath(),a=e.negativeColor;a&&i.push(["graphNeg",a]),je(i,function(i,a){var l=i[0],h=t[l];h?(ei(h),h.animate({d:o})):n&&o.length&&(h={stroke:i[1],"stroke-width":n,zIndex:1},r?h.dashstyle=r:s&&(h["stroke-linecap"]=h["stroke-linejoin"]="round"),t[l]=t.chart.renderer.path(o).attr(h).add(t.group).shadow(!a&&e.shadow))})},clipNeg:function(){var t,e=this.options,i=this.chart,n=i.renderer,r=e.negativeColor||e.negativeFillColor,s=this.graph,o=this.area,a=this.posClip,l=this.negClip;t=i.chartWidth;var h=i.chartHeight,c=ue(t,h),d=this.yAxis;r&&(s||o)&&(r=he(d.toPixels(e.threshold||0,!0)),0>r&&(c-=r),e={x:0,y:0,width:c,height:r},c={x:0,y:r,width:c,height:c},i.inverted&&(e.height=c.y=i.plotWidth-r,n.isVML&&(e={x:i.plotWidth-r-i.plotLeft,y:0,width:t,height:h},c={x:r+i.plotLeft-t,y:0,width:i.plotLeft+r,height:t})),d.reversed?(i=c,t=e):(i=e,t=c),a?(a.animate(i),l.animate(t)):(this.posClip=a=n.clipRect(i),this.negClip=l=n.clipRect(t),s&&this.graphNeg&&(s.clip(a),this.graphNeg.clip(l)),o&&(o.clip(a),this.areaNeg.clip(l))))},invertGroups:function(){function t(){var t={width:e.yAxis.len,height:e.xAxis.len};je(["group","markerGroup"],function(i){e[i]&&e[i].attr(t).invert()})}var e=this,i=e.chart;e.xAxis&&(Ze(i,"resize",t),Ze(e,"destroy",function(){Ke(i,"resize",t)}),t(),e.invertGroups=t)},plotGroup:function(t,e,i,n,r){var s=this[t],o=!s;return o&&(this[t]=s=this.chart.renderer.g(e).attr({visibility:i,zIndex:n||.1}).add(r)),s[o?"attr":"animate"](this.getPlotBox()),s},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var t,e=this.chart,i=this.options,n=i.animation&&!!this.animate&&e.renderer.isSVG,r=this.visible?"visible":"hidden",s=i.zIndex,o=this.hasRendered,a=e.seriesGroup;t=this.plotGroup("group","series",r,s,a),this.markerGroup=this.plotGroup("markerGroup","markers",r,s,a),n&&this.animate(!0),this.getAttribs(),t.inverted=this.isCartesian?e.inverted:!1,this.drawGraph&&(this.drawGraph(),this.clipNeg()),this.drawDataLabels&&this.drawDataLabels(),this.visible&&this.drawPoints(),this.options.enableMouseTracking!==!1&&this.drawTracker(),e.inverted&&this.invertGroups(),i.clip!==!1&&!this.sharedClipKey&&!o&&t.clip(e.clipRect),n?this.animate():o||this.afterAnimate(),this.isDirty=this.isDirtyData=!1,this.hasRendered=!0},redraw:function(){var t=this.chart,e=this.isDirtyData,i=this.group,n=this.xAxis,r=this.yAxis;i&&(t.inverted&&i.attr({width:t.plotWidth,height:t.plotHeight}),i.animate({translateX:p(n&&n.left,t.plotLeft),translateY:p(r&&r.top,t.plotTop)})),this.translate(),this.setTooltipPoints(!0),this.render(),e&&Qe(this,"updatedData")},setState:function(t){var e=this.options,i=this.graph,n=this.graphNeg,r=e.states,e=e.lineWidth,t=t||"";this.state!==t&&(this.state=t,r[t]&&r[t].enabled===!1||(t&&(e=r[t].lineWidth||e+1),i&&!i.dashstyle&&(t={"stroke-width":e},i.attr(t),n&&n.attr(t))))},setVisible:function(t,e){var i,n=this,r=n.chart,s=n.legendItem,o=r.options.chart.ignoreHiddenSeries,a=n.visible;i=(n.visible=t=n.userOptions.visible=t===_?!a:t)?"show":"hide",je(["group","dataLabelsGroup","markerGroup","tracker"],function(t){n[t]&&n[t][i]()}),r.hoverSeries===n&&n.onMouseOut(),s&&r.legend.colorizeItem(n,t),n.isDirty=!0,n.options.stacking&&je(r.series,function(t){t.options.stacking&&t.visible&&(t.isDirty=!0)}),je(n.linkedSeries,function(e){e.setVisible(t,!1)}),o&&(r.isDirtyBox=!0),e!==!1&&r.redraw(),Qe(n,i)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(t){this.selected=t=t===_?!this.selected:t,this.checkbox&&(this.checkbox.checked=t),Qe(this,t?"select":"unselect")},drawTracker:Xe.drawTrackerGraph},t(N.prototype,{addSeries:function(t,e,i){var n,r=this;return t&&(e=p(e,!0),Qe(r,"addSeries",{options:t},function(){n=r.initSeries(t),r.isDirtyLegend=!0,r.linkSeries(),e&&r.redraw(i)})),n},addAxis:function(t,i,n,r){var s=i?"xAxis":"yAxis",o=this.options;new z(this,e(t,{index:this[s].length,isX:i})),o[s]=u(o[s]||{}),o[s].push(t),p(n,!0)&&this.redraw(r)},showLoading:function(e){var i=this.options,n=this.loadingDiv,r=i.loading;n||(this.loadingDiv=n=g(ze,{className:"highcharts-loading"},t(r.style,{zIndex:10,display:Be}),this.container),this.loadingSpan=g("span",null,r.labelStyle,n)),this.loadingSpan.innerHTML=e||i.lang.loading,this.loadingShown||(f(n,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),ti(n,{opacity:r.style.opacity},{duration:r.showDuration||0}),this.loadingShown=!0)},hideLoading:function(){var t=this.options,e=this.loadingDiv;e&&ti(e,{opacity:0},{duration:t.loading.hideDuration||100,complete:function(){f(e,{display:Be})}}),this.loadingShown=!1}}),t(gi.prototype,{update:function(t,e,i){var n,s=this,o=s.series,a=s.graphic,l=o.data,h=o.chart,c=o.options,e=p(e,!0);s.firePointEvent("update",{options:t},function(){s.applyOptions(t),r(t)&&(o.getAttribs(),a&&(t&&t.marker&&t.marker.symbol?s.graphic=a.destroy():a.attr(s.pointAttr[s.state||""])),t&&t.dataLabels&&s.dataLabel&&(s.dataLabel=s.dataLabel.destroy())),n=Ye(s,l),o.updateParallelArrays(s,n),c.data[n]=s.options,o.isDirty=o.isDirtyData=!0,!o.fixedBox&&o.hasCartesianSeries&&(h.isDirtyBox=!0),"point"===c.legendType&&h.legend.destroyItem(s),e&&h.redraw(i)})},remove:function(t,e){var i,n=this,r=n.series,s=r.points,o=r.chart,a=r.data;D(e,o),t=p(t,!0),n.firePointEvent("remove",null,function(){i=Ye(n,a),a.length===s.length&&s.splice(i,1),a.splice(i,1),r.options.data.splice(i,1),r.updateParallelArrays(n,"splice",i,1),n.destroy(),r.isDirty=!0,r.isDirtyData=!0,t&&o.redraw()})}}),t(mi.prototype,{addPoint:function(t,e,i,n){var r,s=this.options,o=this.data,a=this.graph,l=this.area,h=this.chart,c=this.xAxis&&this.xAxis.names,d=a&&a.shift||0,u=s.data,f=this.xData;if(D(n,h),i&&je([a,l,this.graphNeg,this.areaNeg],function(t){t&&(t.shift=d+1)}),l&&(l.isArea=!0),e=p(e,!0),n={series:this},this.pointClass.prototype.applyOptions.apply(n,[t]),a=n.x,l=f.length,this.requireSorting&&aa;)l--;this.updateParallelArrays(n,"splice",l),this.updateParallelArrays(n,l),c&&(c[a]=n.name),u.splice(l,0,t),r&&(this.data.splice(l,0,null),this.processData()),"point"===s.legendType&&this.generatePoints(),i&&(o[0]&&o[0].remove?o[0].remove(!1):(o.shift(),this.updateParallelArrays(n,"shift"),u.shift())),this.isDirtyData=this.isDirty=!0,e&&(this.getAttribs(),h.redraw())},remove:function(t,e){var i=this,n=i.chart,t=p(t,!0);i.isRemoving||(i.isRemoving=!0,Qe(i,"remove",null,function(){i.destroy(),n.isDirtyLegend=n.isDirtyBox=!0,n.linkSeries(),t&&n.redraw(e)})),i.isRemoving=!1},update:function(i,n){var r,s=this.chart,o=this.type,a=He[o].prototype,i=e(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},i);this.remove(!1);for(r in a)a.hasOwnProperty(r)&&(this[r]=_);t(this,He[i.type||o].prototype),this.init(s,i),p(n,!0)&&s.redraw(!1)}}),t(z.prototype,{update:function(i,n){var r=this.chart,i=r.options[this.coll][this.options.index]=e(this.userOptions,i);this.destroy(!0),this._addedPlotLB=this.userMin=this.userMax=_,this.init(r,t(i,{events:_})),r.isDirtyBox=!0,p(n,!0)&&r.redraw()},remove:function(t){var e=this.chart,i=this.coll;je(this.series,function(t){t.remove(!1)}),h(e.axes,this),h(e[i],this),e.options[i].splice(this.options.index,1),je(e[i],function(t,e){t.options.index=e}),this.destroy(),e.isDirtyBox=!0,p(t,!0)&&e.redraw()},setTitle:function(t,e){this.update({title:t},e)},setCategories:function(t,e){this.update({categories:t},e)}});var yi=m(mi);He.line=yi,ii.area=e(We,{threshold:0});var vi=m(mi,{type:"area",getSegments:function(){var t,e,i,n,r,s=[],o=[],a=[],l=this.xAxis,h=this.yAxis,c=h.stacks[this.stackKey],d={},u=this.points,p=this.options.connectNulls;if(this.options.stacking&&!this.cropped){for(n=0;n=0;e--)s=p(t[e].yBottom,o),et&&r>l?(r=ue(t,l),o=2*l-r):t>r&&l>r&&(r=pe(t,l),o=2*l-r),o>c&&o>l?(o=ue(c,l),r=2*l-o):c>o&&l>o&&(o=pe(c,l),r=2*l-o),e.rightContX=s,e.rightContY=o}return i?(e=["C",h.rightContX||h.plotX,h.rightContY||h.plotY,n||a,r||l,a,l],h.rightContX=h.rightContY=null):e=["M",a,l],e}}),He.spline=yi,ii.areaspline=e(ii.area),vi=vi.prototype,yi=m(yi,{type:"areaspline",closedStacks:!0,getSegmentPath:vi.getSegmentPath,closeSegment:vi.closeSegment,drawGraph:vi.drawGraph,drawLegendSymbol:li.drawRectangle}),He.areaspline=yi,ii.column=e(We,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0}),yi=m(mi,{type:"column",pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",r:"borderRadius"},cropShoulder:0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0,init:function(){mi.prototype.init.apply(this,arguments);var t=this,e=t.chart;e.hasRendered&&je(e.series,function(e){e.type===t.type&&(e.isDirty=!0)})},getColumnMetrics:function(){var t,e,i=this,n=i.options,r=i.xAxis,s=i.yAxis,o=r.reversed,a={},l=0;n.grouping===!1?l=1:je(i.chart.series,function(n){var r=n.options,o=n.yAxis;n.type===i.type&&n.visible&&s.len===o.len&&s.pos===o.pos&&(r.stacking?(t=n.stackKey,a[t]===_&&(a[t]=l++),e=a[t]):r.grouping!==!1&&(e=l++),n.columnIndex=e)});var r=pe(fe(r.transA)*(r.ordinalSlope||n.pointRange||r.closestPointRange||1),r.len),h=r*n.groupPadding,d=(r-2*h)/l,u=n.pointWidth,n=c(u)?(d-u)/2:d*n.pointPadding,u=p(u,d-2*n);return i.columnMetrics={width:u,offset:n+(h+((o?l-(i.columnIndex||0):i.columnIndex)||0)*d-r/2)*(o?-1:1)}},translate:function(){var t=this.chart,e=this.options,i=e.borderWidth,n=this.yAxis,r=this.translatedThreshold=n.getThreshold(e.threshold),s=p(e.minPointLength,5),e=this.getColumnMetrics(),o=e.width,a=this.barW=de(ue(o,1+2*i)),l=this.pointXOffset=e.offset,h=-(i%2?.5:0),c=i%2?.5:1;t.renderer.isVML&&t.inverted&&(c+=1),mi.prototype.translate.apply(this),je(this.points,function(t){var e,i=p(t.yBottom,r),d=pe(ue(-999-i,t.plotY),n.len+999+i),u=t.plotX+l,f=a,g=pe(d,i),d=ue(d,i)-g;fe(d)s?i-s:r-(n.translate(t.y,0,1,0,1)<=r?s:0))),t.barX=u,t.pointWidth=o,i=fe(u)<.5,f=he(u+f)+h,u=he(u)+h,f-=u,e=fe(g)<.5,d=he(g+d)+c,g=he(g)+c,d-=g,i&&(u+=1,f-=1),e&&(g-=1,d+=1),t.shapeType="rect",t.shapeArgs={x:u,y:g,width:f,height:d}})},getSymbol:Oe,drawLegendSymbol:li.drawRectangle,drawGraph:Oe,drawPoints:function(){var t,i=this,n=this.chart,r=i.options,s=n.renderer,o=n.options.animationLimit||250;je(i.points,function(a){var l=a.plotY,h=a.graphic;l===_||isNaN(l)||null===a.y?h&&(a.graphic=h.destroy()):(t=a.shapeArgs,h?(ei(h),h[n.pointCount{series.name}
',pointFormat:"x: {point.x}
y: {point.y}
",followPointer:!0},stickyTracking:!1}),yi=m(mi,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],takeOrdinalPosition:!1,drawTracker:Xe.drawTrackerPoint,drawGraph:function(){this.options.lineWidth&&mi.prototype.drawGraph.call(this)},setTooltipPoints:Oe}),He.scatter=yi,ii.pie=e(We,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}}),We={type:"pie",isCartesian:!1,pointClass:m(gi,{init:function(){gi.prototype.init.apply(this,arguments);var e,i=this;return i.y<0&&(i.y=null),t(i,{visible:i.visible!==!1,name:p(i.name,"Slice")}),e=function(t){i.slice("select"===t.type)},Ze(i,"select",e),Ze(i,"unselect",e),i},setVisible:function(t){var e,i=this,n=i.series,r=n.chart;i.visible=i.options.visible=t=t===_?!i.visible:t,n.options.data[Ye(i,n.data)]=i.options,e=t?"show":"hide",je(["graphic","dataLabel","connector","shadowGroup"],function(t){i[t]&&i[t][e]()}),i.legendItem&&r.legend.colorizeItem(i,t),!n.isDirty&&n.options.ignoreHiddenPoint&&(n.isDirty=!0,r.redraw())},slice:function(t,e,i){var n=this.series;D(i,n.chart),p(e,!0),this.sliced=this.options.sliced=t=c(t)?t:!this.sliced,n.options.data[Ye(this,n.data)]=this.options,t=t?this.slicedTranslation:{translateX:0,translateY:0},this.graphic.animate(t),this.shadowGroup&&this.shadowGroup.animate(t)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:Oe,animate:function(t){var e=this,i=e.points,n=e.startAngleRad;t||(je(i,function(t){var i=t.graphic,t=t.shapeArgs;i&&(i.attr({r:e.center[3]/2,start:n,end:n}),i.animate({r:t.r,start:t.start,end:t.end},e.options.animation))}),e.animate=null)},setData:function(t,e){mi.prototype.setData.call(this,t,!1),this.processData(),this.generatePoints(),p(e,!0)&&this.chart.redraw()},generatePoints:function(){var t,e,i,n,r=0,s=this.options.ignoreHiddenPoint;for(mi.prototype.generatePoints.call(this),e=this.points,i=e.length,t=0;i>t;t++)n=e[t],r+=s&&!n.visible?0:n.y;for(this.total=r,t=0;i>t;t++)n=e[t],n.percentage=r>0?n.y/r*100:0,n.total=r},translate:function(t){this.generatePoints();var e,i,n,r,s,o=0,a=this.options,l=a.slicedOffset,h=l+a.borderWidth,c=a.startAngle||0,d=this.startAngleRad=ye/180*(c-90),c=(this.endAngleRad=ye/180*((a.endAngle||c+360)-90))-d,u=this.points,p=a.dataLabels.distance,a=a.ignoreHiddenPoint,f=u.length;for(t||(this.center=t=this.getCenter()),this.getX=function(e,i){return n=le.asin((e-t[1])/(t[2]/2+p)),t[0]+(i?-1:1)*ge(n)*(t[2]/2+p)},r=0;f>r;r++)s=u[r],e=d+o*c,(!a||s.visible)&&(o+=s.percentage/100),i=d+o*c,s.shapeType="arc",s.shapeArgs={x:t[0],y:t[1],r:t[2]/2,innerR:t[3]/2,start:he(1e3*e)/1e3,end:he(1e3*i)/1e3},n=(i+e)/2,n>.75*c&&(n-=2*ye),s.slicedTranslation={translateX:he(ge(n)*l),translateY:he(me(n)*l)},e=ge(n)*t[2]/2,i=me(n)*t[2]/2,s.tooltipPos=[t[0]+.7*e,t[1]+.7*i],s.half=-ye/2>n||n>ye/2?1:0,s.angle=n,h=pe(h,p/2),s.labelPos=[t[0]+e+ge(n)*p,t[1]+i+me(n)*p,t[0]+e+ge(n)*h,t[1]+i+me(n)*h,t[0]+e,t[1]+i,0>p?"center":s.half?"right":"left",n]},setTooltipPoints:Oe,drawGraph:null,drawPoints:function(){var e,i,n,r,s=this,o=s.chart.renderer,a=s.options.shadow;a&&!s.shadowGroup&&(s.shadowGroup=o.g("shadow").add(s.group)),je(s.points,function(l){i=l.graphic,r=l.shapeArgs,n=l.shadowGroup,a&&!n&&(n=l.shadowGroup=o.g("shadow").add(s.shadowGroup)),e=l.sliced?l.slicedTranslation:{translateX:0,translateY:0},n&&n.attr(e),i?i.animate(t(r,e)):l.graphic=i=o.arc(r).setRadialReference(s.center).attr(l.pointAttr[l.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(e).add(s.group).shadow(a,n),void 0!==l.visible&&l.setVisible(l.visible)})},sortByAngle:function(t,e){t.sort(function(t,i){return void 0!==t.angle&&(i.angle-t.angle)*e})},drawTracker:Xe.drawTrackerPoint,drawLegendSymbol:li.drawRectangle,getCenter:hi.getCenter,getSymbol:Oe},We=m(mi,We),He.pie=We,mi.prototype.drawDataLabels=function(){var i,n,r,s,o=this,a=o.options,l=a.cursor,h=a.dataLabels,a=o.points;(h.enabled||o._hasPointLabels)&&(o.dlProcessOptions&&o.dlProcessOptions(h),s=o.plotGroup("dataLabelsGroup","data-labels",o.visible?"visible":"hidden",h.zIndex||6),n=h,je(a,function(a){var d,u,f,g=a.dataLabel,m=a.connector,y=!0;if(i=a.options&&a.options.dataLabels,d=p(i&&i.enabled,n.enabled),g&&!d)a.dataLabel=g.destroy();else if(d){if(h=e(n,i),d=h.rotation,u=a.getLabelConfig(),r=h.format?b(h.format,u):h.formatter.call(u,h),h.style.color=p(h.color,h.style.color,o.color,"black"),g)c(r)?(g.attr({text:r}),y=!1):(a.dataLabel=g=g.destroy(),m&&(a.connector=m.destroy()));else if(c(r)){g={fill:h.backgroundColor,stroke:h.borderColor,"stroke-width":h.borderWidth,r:h.borderRadius||0,rotation:d,padding:h.padding,zIndex:1};for(f in g)g[f]===_&&delete g[f];g=a.dataLabel=o.chart.renderer[d?"text":"label"](r,0,-999,null,null,null,h.useHTML).attr(g).css(t(h.style,l&&{cursor:l})).add(s).shadow(h.shadow)}g&&o.alignDataLabel(a,g,h,null,y)}}))},mi.prototype.alignDataLabel=function(e,i,n,r,s){var o=this.chart,a=o.inverted,l=p(e.plotX,-999),h=p(e.plotY,-999),c=i.getBBox();(e=this.visible&&(e.series.forceDL||o.isInsidePlot(e.plotX,e.plotY,a)))&&(r=t({x:a?o.plotWidth-h:l,y:he(a?o.plotHeight-l:h),width:0,height:0},r),t(n,{width:c.width,height:c.height}),n.rotation?(a={align:n.align,x:r.x+n.x+r.width/2,y:r.y+n.y+r.height/2},i[s?"attr":"animate"](a)):(i.align(n,null,r),a=i.alignAttr,"justify"===p(n.overflow,"justify")?this.justifyDataLabel(i,n,a,c,r,s):p(n.crop,!0)&&(e=o.isInsidePlot(a.x,a.y)&&o.isInsidePlot(a.x+c.width,a.y+c.height)))),e||(i.attr({y:-999}),i.placed=!1)},mi.prototype.justifyDataLabel=function(t,e,i,n,r,s){var o,a,l=this.chart,h=e.align,c=e.verticalAlign;o=i.x,0>o&&("right"===h?e.align="left":e.x=-o,a=!0),o=i.x+n.width,o>l.plotWidth&&("left"===h?e.align="right":e.x=l.plotWidth-o,a=!0),o=i.y,0>o&&("bottom"===c?e.verticalAlign="top":e.y=-o,a=!0),o=i.y+n.height,o>l.plotHeight&&("top"===c?e.verticalAlign="bottom":e.y=l.plotHeight-o,a=!0),a&&(t.placed=!s,t.align(e,null,r))},He.pie&&(He.pie.prototype.drawDataLabels=function(){var t,e,i,n,r,s,o,a,l,h,c,d,u=this,f=u.data,g=u.chart,m=u.options.dataLabels,y=p(m.connectorPadding,10),v=p(m.connectorWidth,1),x=g.plotWidth,g=g.plotHeight,b=p(m.softConnector,!0),w=m.distance,k=u.center,S=k[2]/2,T=k[1],C=w>0,A=[[],[]],L=[0,0,0,0],M=function(t,e){return e.y-t.y};if(u.visible&&(m.enabled||u._hasPointLabels)){for(mi.prototype.drawDataLabels.apply(u),je(f,function(t){t.dataLabel&&t.visible&&A[t.half].push(t)}),c=0;!o&&f[c];)o=f[c]&&f[c].dataLabel&&(f[c].dataLabel.getBBox().height||21),c++;for(c=2;c--;){var I,f=[],D=[],E=A[c],O=E.length;if(u.sortByAngle(E,c-.5),w>0){for(d=T-S-w;T+S+w>=d;d+=o)f.push(d);if(r=f.length,O>r){for(t=[].concat(E),t.sort(M),d=O;d--;)t[d].rank=d;for(d=O;d--;)E[d].rank>=r&&E.splice(d,1);O=E.length}for(d=0;O>d;d++){t=E[d],s=t.labelPos,t=9999;var R,z;for(z=0;r>z;z++)R=fe(f[z]-s[1]),t>R&&(t=R,I=z);if(d>I&&null!==f[d])I=d;else for(O-d+I>r&&null!==f[d]&&(I=r-O+d);null===f[I];)I++;D.push({i:I,y:f[I]}),f[I]=null}D.sort(M)}for(d=0;O>d;d++)t=E[d],s=t.labelPos,n=t.dataLabel,h=t.visible===!1?"hidden":"visible",t=s[1],w>0?(r=D.pop(),I=r.i,l=r.y,(t>l&&null!==f[I+1]||l>t&&null!==f[I-1])&&(l=t)):l=t,a=m.justify?k[0]+(c?-1:1)*(S+w):u.getX(0===I||I===f.length-1?t:l,c),n._attr={visibility:h,align:s[6]},n._pos={x:a+m.x+({left:y,right:-y}[s[6]]||0),y:l+m.y-10},n.connX=a,n.connY=l,null===this.options.size&&(r=n.width,y>a-r?L[3]=ue(he(r-a+y),L[3]):a+r>x-y&&(L[1]=ue(he(a+r-x+y),L[1])),0>l-o/2?L[0]=ue(he(-l+o/2),L[0]):l+o/2>g&&(L[2]=ue(he(l+o/2-g),L[2])))}(0===P(L)||this.verifyDataLabelOverflow(L))&&(this.placeDataLabels(),C&&v&&je(this.points,function(t){e=t.connector,s=t.labelPos,(n=t.dataLabel)&&n._pos?(h=n._attr.visibility,a=n.connX,l=n.connY,i=b?["M",a+("left"===s[6]?5:-5),l,"C",a,l,2*s[2]-s[4],2*s[3]-s[5],s[2],s[3],"L",s[4],s[5]]:["M",a+("left"===s[6]?5:-5),l,"L",s[2],s[3],"L",s[4],s[5]],e?(e.animate({d:i}),e.attr("visibility",h)):t.connector=e=u.chart.renderer.path(i).attr({"stroke-width":v,stroke:m.connectorColor||t.color||"#606060",visibility:h}).add(u.group)):e&&(t.connector=e.destroy())}))}},He.pie.prototype.placeDataLabels=function(){je(this.points,function(t){var e,t=t.dataLabel;t&&((e=t._pos)?(t.attr(t._attr),t[t.moved?"animate":"attr"](e),t.moved=!0):t&&t.attr({y:-999}))})},He.pie.prototype.alignDataLabel=Oe,He.pie.prototype.verifyDataLabelOverflow=function(t){var e,i=this.center,n=this.options,r=n.center,s=n=n.minSize||80;return null!==r[0]?s=ue(i[2]-ue(t[1],t[3]),n):(s=ue(i[2]-t[1]-t[3],n),i[0]+=(t[3]-t[1])/2),null!==r[1]?s=ue(pe(s,i[2]-ue(t[0],t[2])),n):(s=ue(pe(s,i[2]-t[0]-t[2]),n),i[1]+=(t[0]-t[2])/2),sp(this.translatedThreshold,o.plotSizeY),c=p(n.inside,!!this.options.stacking);l&&(r=e(l),a&&(r={x:o.plotWidth-r.y-r.height,y:o.plotHeight-r.x-r.width,width:r.height,height:r.width}),!c)&&(a?(r.x+=h?0:r.width,r.width=0):(r.y+=h?r.height:0,r.height=0)),n.align=p(n.align,!a||c?"center":h?"right":"left"),n.verticalAlign=p(n.verticalAlign,a||c?"middle":h?"top":"bottom"),mi.prototype.alignDataLabel.call(this,t,i,n,r,s)}),t(Highcharts,{Axis:z,Chart:N,Color:oi,Point:gi,Tick:R,Tooltip:F,Renderer:H,Series:mi,SVGElement:O,SVGRenderer:ai,arrayMin:C,arrayMax:P,charts:Re,dateFormat:G,format:b,pathAnim:Y,getOptions:function(){return X},hasBidiBug:Le,isTouchDevice:Ce,numberFormat:y,seriesTypes:He,setOptions:function(t){return X=e(!0,X,t),E(),X},addEvent:Ze,removeEvent:Ke,createElement:g,discardElement:L,css:f,each:je,extend:t,map:Ue,merge:e,pick:p,splat:u,extendClass:m,pInt:i,wrap:x,svg:Ae,canvas:Me,vml:!Ae&&!Me,product:"Highcharts",version:"3.0.8"})}(),function(){var t=Highcharts,e=t.Chart,i=t.addEvent,n=t.createElement,r=t.discardElement,s=t.css,o=t.merge,a=t.each,l=t.extend,h=Math.max,c=document,d=window,u="ontouchstart"in c.documentElement,p=t.setOptions({lang:{downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",exportButtonTitle:"Export to raster or vector image",printButtonTitle:"Print the chart"}});p.navigation={menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF"},menuItemStyle:{padding:"0 5px",background:"none",color:"#303030",fontSize:u?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{align:"right",backgroundColor:{linearGradient:[0,0,0,20],stops:[[.4,"#F7F7F7"],[.6,"#E3E3E3"]]},borderColor:"#B0B0B0",borderRadius:3,borderWidth:1,height:20,hoverBorderColor:"#909090",hoverSymbolFill:"#81A7CF",hoverSymbolStroke:"#4572A5",symbolFill:"#E0E0E0",symbolStroke:"#A0A0A0",symbolX:11.5,symbolY:10.5,verticalAlign:"top",width:24,y:10}},p.exporting={type:"image/png",url:"http://export.highcharts.com/",width:800,buttons:{exportButton:{symbol:"exportIcon",x:-10,symbolFill:"#A8BF77",hoverSymbolFill:"#768F3E",_titleKey:"exportButtonTitle",menuItems:[{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]},printButton:{symbol:"printIcon",x:-36,symbolFill:"#B5C9DF",hoverSymbolFill:"#779ABF",_titleKey:"printButtonTitle",onclick:function(){this.print()}}}},l(e.prototype,{getSVG:function(t){var e,i,s,h,d,u,p=this,f=o(p.options,t);return c.createElementNS||(c.createElementNS=function(t,e){var i=c.createElement(e);return i.getBBox=function(){return p.renderer.Element.prototype.getBBox.apply({element:i})},i}),e=n("div",null,{position:"absolute",top:"-9999em",width:p.chartWidth+"px",height:p.chartHeight+"px"},c.body),l(f.chart,{renderTo:e,forExport:!0}),f.exporting.enabled=!1,f.chart.plotBackgroundImage=null,f.series=[],a(p.series,function(t){s=t.options,s.animation=!1,s.showCheckbox=!1,s&&s.marker&&/^url\(/.test(s.marker.symbol)&&(s.marker.symbol="circle"),s.data=[],a(t.data,function(t){h=t.config,d={x:t.x,y:t.y,name:t.name},"object"==typeof h&&t.config&&h.constructor!=Array&&l(d,h),s.data.push(d),(u=t.config&&t.config.marker)&&/^url\(/.test(u.symbol)&&delete u.symbol}),f.series.push(s)}),t=new Highcharts.Chart(f),i=t.container.innerHTML,f=null,t.destroy(),r(e),i=i.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/isTracker="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/id=([^" >]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(t){return t.toLowerCase()}),i=i.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'"),2==i.match(/ xmlns="/g).length&&(i=i.replace(/xmlns="[^"]+"/,"")),i},exportChart:function(t,e){var i,s=this.getSVG(e);t=o(this.options.exporting,t),i=n("form",{method:"post",action:t.url},{display:"none"},c.body),a(["filename","type","width","svg"],function(e){n("input",{type:"hidden",name:e,value:{filename:t.filename||"chart",type:t.type,width:t.width,svg:s}[e]},null,i)}),i.submit(),r(i)},print:function(){var t=this,e=t.container,i=[],n=e.parentNode,r=c.body,s=r.childNodes;t.isPrinting||(t.isPrinting=!0,a(s,function(t,e){1==t.nodeType&&(i[e]=t.style.display,t.style.display="none")}),r.appendChild(e),d.print(),setTimeout(function(){n.appendChild(e),a(s,function(t,e){1==t.nodeType&&(t.style.display=i[e])}),t.isPrinting=!1},1e3))},contextMenu:function(e,r,o,c,d,p){var f,g,m=this,y=m.options.navigation,v=y.menuItemStyle,x=m.chartWidth,b=m.chartHeight,w="cache-"+e,k=m[w],S=h(d,p);k||(m[w]=k=n("div",{className:"highcharts-"+e},{position:"absolute",zIndex:1e3,padding:S+"px"},m.container),f=n("div",null,l({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},y.menuStyle),k),g=function(){s(k,{display:"none"})},i(k,"mouseleave",g),a(r,function(e){e&&(n("div",{onmouseover:function(){s(this,y.menuItemHoverStyle)},onmouseout:function(){s(this,v)},innerHTML:e.text||t.getOptions().lang[e.textKey]},l({cursor:"pointer"},v),f)[u?"ontouchstart":"onclick"]=function(){g(),e.onclick.apply(m,arguments)})}),m.exportMenuWidth=k.offsetWidth,m.exportMenuHeight=k.offsetHeight),e={display:"block"},o+m.exportMenuWidth>x?e.right=x-o-d-S+"px":e.left=o-S+"px",c+p+m.exportMenuHeight>b?e.bottom=b-c-S+"px":e.top=c+p-S+"px",s(k,e)},addButton:function(e){function i(){r.attr(m),n.attr(g)}var n,r,s,a=this,h=a.renderer,c=o(a.options.navigation.buttonOptions,e),d=c.onclick,u=c.menuItems,p=c.width,f=c.height;e=c.borderWidth;var g={stroke:c.borderColor},m={stroke:c.symbolStroke,fill:c.symbolFill};c.enabled!==!1&&(n=h.rect(0,0,p,f,c.borderRadius,e).align(c,!0).attr(l({fill:c.backgroundColor,"stroke-width":e,zIndex:19},g)).add(),s=h.rect(0,0,p,f,0).align(c).attr({fill:"rgba(255, 255, 255, 0.001)",title:t.getOptions().lang[c._titleKey],zIndex:21}).css({cursor:"pointer"}).on("mouseover",function(){r.attr({stroke:c.hoverSymbolStroke,fill:c.hoverSymbolFill}),n.attr({stroke:c.hoverBorderColor})}).on("mouseout",i).on("click",i).add(),u&&(d=function(){i();var t=s.getBBox();a.contextMenu("export-menu",u,t.x,t.y,p,f)}),s.on("click",function(){d.apply(a,arguments)}),r=h.symbol(c.symbol,c.symbolX,c.symbolY,(c.symbolSize||12)/2).align(c,!0).attr(l(m,{"stroke-width":c.symbolStrokeWidth||1,zIndex:20})).add())}}),t.Renderer.prototype.symbols.exportIcon=function(t,e,i){return["M",t-i,e+i,"L",t+i,e+i,t+i,e+.5*i,t-i,e+.5*i,"Z","M",t,e+.5*i,"L",t-.5*i,e-i/3,t-i/6,e-i/3,t-i/6,e-i,t+i/6,e-i,t+i/6,e-i/3,t+.5*i,e-i/3,"Z"]},t.Renderer.prototype.symbols.printIcon=function(t,e,i){return["M",t-i,e+.5*i,"L",t+i,e+.5*i,t+i,e-i/3,t-i,e-i/3,"Z","M",t-.5*i,e-i/3,"L",t-.5*i,e-i,t+.5*i,e-i,t+.5*i,e-i/3,"Z","M",t-.5*i,e+.5*i,"L",t-.75*i,e+i,t+.75*i,e+i,t+.5*i,e+.5*i,"Z"]},e.prototype.callbacks.push(function(t){var e,i=t.options.exporting,n=i.buttons;if(i.enabled!==!1)for(e in n)t.addButton(n[e])})}();var createWindows=function(t,e,i){return function(n){createWindowsWithData(n,t,e,i)}},updatePortletPositions=function(t,e){return function(){if(t){var i=$(this).sortable("serialize");colId=$(this).attr("id").charAt($(this).attr("id").length-1),portletArray=getPortletArray(i),jsonResult={col:colId,positions:portletArray},portletArray.length>0&&$.ajax({type:"PUT",url:"../channels/"+e+"/windows",data:{_method:"PUT",page:JSON.stringify(jsonResult)},dataType:"json"})}}},decoratePortlet=function(t){return function(){var e=$(this).find(".portlet-header");return e.append(""),thisObject=$(this),"true"==t?(thisObject.find(".wtype").prepend(""),thisObject.find(".wtype-chart_window").append(""),thisObject.find(".wtype").append(""),thisObject.find(".portlet-header").css("cursor","move")):$(".column").sortable({disabled:!0}),$(this).attr("id")}},uiEditClick=function(t){return function(){var e=$(this).parents(".portlet:first").attr("id").substring(8),i="";$("#chartConfig"+e).load("/channels/"+t+"/charts/"+e+"/edit",function(){i=$("#chartOptions"+e).html(),"undefined"!=i&&i.length>2&&$.each(i.split("&"),setupChartForm(e)),$("#button"+e).click(function(){updateChart(e,!0,450,250,t,!0),$("#chartConfig"+e).dialog("close")})}).dialog({title:"Chart Options",modal:!0,resizable:!1,width:500,dialogClass:"dev-info-dialog"})}},uiViewClick=function(t){return function(){var e=$(this).parents(".portlet:first").find(".portlet-content").offset().left,i=$(this).parents(".portlet:first").find(".portlet-content").offset().top,n=$(this).parents(".portlet:first").attr("id").substring(8);$("body").append(''),$.get("/channels/"+t+"/windows/"+n+"/iframe",function(t){var e=t.replace(/id=\"iframe[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?[0-9]?\"/,"");$("#iframeinner"+n).text(e)}),$("#iframepopup"+n).dialog({resizable:!1,width:"300px",position:[e+200,i-200],title:"Chart Iframe",dialogClass:"dev-info-dialog"})}},uiCloseClick=function(t){return function(){var e=$(this).parents(".portlet:first").attr("id").substring(8),i=$(this).parents(".portlet:first"); +$.update("/channels/"+t+"/windows/"+e+"/hide",function(){i.hide("drop",function(){i.remove()})})}};!function(t){function e(){var e=i(this);return isNaN(e.datetime)||t(this).text(n(e.datetime)),this}function i(e){if(e=t(e),!e.data("timeago")){e.data("timeago",{datetime:s.datetime(e)});var i=t.trim(e.text());i.length>0&&e.attr("title",i)}return e.data("timeago")}function n(t){return s.inWords(r(t))}function r(t){return(new Date).getTime()-t.getTime()}t.timeago=function(e){return e instanceof Date?n(e):"string"==typeof e?n(t.timeago.parse(e)):n(t.timeago.datetime(e))};var s=t.timeago;t.extend(t.timeago,{settings:{refreshMillis:6e4,allowFuture:!1,strings:{prefixAgo:null,prefixFromNow:null,suffixAgo:"ago",suffixFromNow:"from now",seconds:"less than a minute",minute:"about a minute",minutes:"%d minutes",hour:"about an hour",hours:"about %d hours",day:"a day",days:"%d days",month:"about a month",months:"%d months",year:"about a year",years:"%d years",numbers:[]}},inWords:function(e){function i(i,r){var s=t.isFunction(i)?i(r,e):i,o=n.numbers&&n.numbers[r]||r;return s.replace(/%d/i,o)}var n=this.settings.strings,r=n.prefixAgo,s=n.suffixAgo;this.settings.allowFuture&&(0>e&&(r=n.prefixFromNow,s=n.suffixFromNow),e=Math.abs(e));var o=e/1e3,a=o/60,l=a/60,h=l/24,c=h/365,d=45>o&&i(n.seconds,Math.round(o))||90>o&&i(n.minute,1)||45>a&&i(n.minutes,Math.round(a))||90>a&&i(n.hour,1)||24>l&&i(n.hours,Math.round(l))||48>l&&i(n.day,1)||30>h&&i(n.days,Math.floor(h))||60>h&&i(n.month,1)||365>h&&i(n.months,Math.floor(h/30))||2>c&&i(n.year,1)||i(n.years,Math.floor(c));return t.trim([r,d,s].join(" "))},parse:function(e){var i=t.trim(e);return i=i.replace(/\.\d\d\d+/,""),i=i.replace(/-/,"/").replace(/-/,"/"),i=i.replace(/T/," ").replace(/Z/," UTC"),i=i.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"),new Date(i)},datetime:function(e){var i="time"===t(e).get(0).tagName.toLowerCase(),n=i?t(e).attr("datetime"):t(e).attr("title");return s.parse(n)}}),t.fn.timeago=function(){var t=this;t.each(e);var i=s.settings;return i.refreshMillis>0&&setInterval(function(){t.each(e)},i.refreshMillis),t},document.createElement("abbr"),document.createElement("time")}(jQuery),function(t){function e(t,e){return e.measureText(t).width}function i(t,e){return e.text(t),e.width()}var n,r,s,o=!1;t.fn.shorten=function(){var o={},a=arguments,l=a.callee;if(a.length)if(a[0].constructor==Object)o=a[0];else{if("options"==a[0])return t(this).eq(0).data("shorten-options");o={width:parseInt(a[0]),tail:a[1]}}this.css("visibility","hidden");var h=t.extend({},l.defaults,o);return this.each(function(){var a,c=t(this),d=c.text(),u=d.length,p=t("").html(h.tail).text(),f={shortened:!1,textOverflow:!1};if(a="none"!=c.css("float")?h.width||c.width():h.width||c.parent().width(),0>a)return!0;if(c.data("shorten-options",h),this.style.display="inline-block",this.style.whiteSpace="nowrap",n){var g=t(this),m=document.createElement("canvas");ctx=m.getContext("2d"),g.html(m),ctx.font=g.css("font-style")+" "+g.css("font-variant")+" "+g.css("font-weight")+" "+Math.ceil(parseFloat(g.css("font-size")))+"px "+g.css("font-family"),r=ctx,s=e}else g=t('
'),$td=t("td",g),t(this).html(g),r=$td,s=i;if(g=s.call(this,d,r),a>g)return c.text(d),this.style.visibility="visible",c.data("shorten-info",f),!0;if(h.tooltip&&this.setAttribute("title",d),l._native&&!o.width&&(m=t(""+h.tail+"").text(),1==m.length&&8230==m.charCodeAt(0)))return c.text(d),this.style.overflow="hidden",this.style[l._native]="ellipsis",this.style.visibility="visible",f.shortened=!0,f.textOverflow="ellipsis",c.data("shorten-info",f),!0;p=s.call(this,p,r),a-=p,p=1.15*a,g-p>0&&(p=d.substring(0,Math.ceil(u*(p/g))),s.call(this,p,r)>a&&(d=p,u=d.length));do u--,d=d.substring(0,u);while(s.call(this,d,r)>=a);return c.html(t.trim(t("").text(d).html())+h.tail),this.style.visibility="visible",f.shortened=!0,c.data("shorten-info",f),!0})};var a=document.documentElement.style;"textOverflow"in a?o="textOverflow":"OTextOverflow"in a&&(o="OTextOverflow"),"undefined"!=typeof Modernizr&&Modernizr.canvastext?n=Modernizr.canvastext:(a=document.createElement("canvas"),n=!(!a.getContext||!a.getContext("2d")||"function"!=typeof a.getContext("2d").fillText)),t.fn.shorten._is_canvasTextSupported=n,t.fn.shorten._native=o,t.fn.shorten.defaults={tail:"…",tooltip:!0}}(jQuery),function(t){window.NestedFormEvents=function(){this.addFields=t.proxy(this.addFields,this),this.removeFields=t.proxy(this.removeFields,this)},NestedFormEvents.prototype={addFields:function(e){var i=e.currentTarget,n=t(i).data("association"),r=t("#"+t(i).data("blueprint-id")),s=r.data("blueprint"),o=(t(i).closest(".fields").closestChild("input, textarea, select").eq(0).attr("name")||"").replace(new RegExp("[[a-z_]+]$"),"");if(o)for(var a=o.match(/[a-z_]+_attributes(?=\]\[(new_)?\d+\])/g)||[],l=o.match(/[0-9]+/g)||[],h=0;h0;)for(var n=i.shift(),r=n.children(),s=0;s=a&&l>n||l>=r&&r>a||a>n&&r>l}),a=l+1;var c=0;for(var h in o)if(o[h].selected){var d=o[h].start+c;e&&i.tabString==t.value.substring(d,d+i.tabString.length)?(t.value=t.value.substring(0,d)+t.value.substring(d+i.tabString.length),c-=i.tabString.length):e||(t.value=t.value.substring(0,d)+i.tabString+t.value.substring(d),c+=i.tabString.length)}t.focus();var u=n+(c>0?i.tabString.length:0>c?-i.tabString.length:0),p=r+c;t.setSelectionRange(u,p)}}function n(e,i,n){var r=document.selection.createRange();if(e==r.parentElement())if(""==r.text)if(i){var s=r.getBookmark();r.moveStart("character",-n.tabString.length),n.tabString==r.text?r.text="":(r.moveToBookmark(s),r.moveEnd("character",n.tabString.length),n.tabString==r.text&&(r.text="")),r.collapse(!0),r.select()}else r.text=n.tabString,r.collapse(!1),r.select();else{var o=r.text,a=o.length,l=o.split("\r\n"),h=document.body.createTextRange();h.moveToElementText(e),h.setEndPoint("EndToStart",r);var c=h.text,d=c.split("\r\n"),u=c.length,p=document.body.createTextRange();p.moveToElementText(e),p.setEndPoint("StartToEnd",r);var f=p.text,g=document.body.createTextRange();g.moveToElementText(e),g.setEndPoint("StartToEnd",h);var m=g.text,y=t(e).html();t("#r3").text(u+" + "+a+" + "+f.length+" = "+y.length),u+m.length0?x.setEndPoint("StartToEnd",h):x.setEndPoint("StartToStart",h),x.setEndPoint("EndToEnd",r),x.select()}}t.fn.tabby=function(i){var n=t.extend({},t.fn.tabby.defaults,i),r=t.fn.tabby.pressed;return this.each(function(){$this=t(this);var i=t.meta?t.extend({},n,$this.data()):n;$this.bind("keydown",function(n){var s=t.fn.tabby.catch_kc(n);return 16==s&&(r.shft=!0),17==s&&(r.ctrl=!0,setTimeout("$.fn.tabby.pressed.ctrl = false;",1e3)),18==s&&(r.alt=!0,setTimeout("$.fn.tabby.pressed.alt = false;",1e3)),9!=s||r.ctrl||r.alt?void 0:(n.preventDefault,r.last=s,setTimeout("$.fn.tabby.pressed.last = null;",0),e(t(n.target).get(0),r.shft,i),!1)}).bind("keyup",function(e){16==t.fn.tabby.catch_kc(e)&&(r.shft=!1)}).bind("blur",function(e){9==r.last&&t(e.target).one("focus",function(){r.last=null}).get(0).focus()})})},t.fn.tabby.catch_kc=function(t){return t.keyCode?t.keyCode:t.charCode?t.charCode:t.which},t.fn.tabby.pressed={shft:!1,ctrl:!1,alt:!1,last:null},t.fn.tabby.defaults={tabString:String.fromCharCode(9)}}(jQuery),function(t,e,i){var n={required:"The %s field is required.",matches:"The %s field does not match the %s field.",valid_email:"The %s field must contain a valid email address.",min_length:"The %s field must be at least %s characters in length.",max_length:"The %s field must not exceed %s characters in length.",exact_length:"The %s field must be exactly %s characters in length.",greater_than:"The %s field must contain a number greater than %s.",less_than:"The %s field must contain a number less than %s.",alpha:"The %s field must only contain alphabetical characters.",alpha_numeric:"The %s field must only contain alpha-numeric characters.",alpha_dash:"The %s field must only contain alpha-numeric characters, underscores, and dashes.",numeric:"The %s field must contain only numbers.",integer:"The %s field must contain an integer."},r=function(){},s=/^(.+)\[(.+)\]$/,o=/^[0-9]+$/,a=/^\-?[0-9]+$/,l=/^\-?[0-9]*\.?[0-9]+$/,h=/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}$/i,c=/^[a-z]+$/i,d=/^[a-z0-9]+$/i,u=/^[a-z0-9_-]+$/i,p=function(t,i,n){for(this.callback=n||r,this.errors=[],this.fields={},this.form=e.forms[t]||{},this.messages={},this.handlers={},t=0,n=i.length;n>t;t++){var s=i[t];s.name&&s.rules&&(this.fields[s.name]={name:s.name,display:s.display||s.name,rules:s.rules,type:null,value:null,checked:null})}this.form.onsubmit=function(t){return function(e){try{return t._validateForm(e)}catch(i){}}}(this)};p.prototype.setMessage=function(t,e){return this.messages[t]=e,this},p.prototype.registerCallback=function(t,e){return t&&"string"==typeof t&&e&&"function"==typeof e&&(this.handlers[t]=e),this},p.prototype._validateForm=function(t){this.errors=[];for(var e in this.fields)if(this.fields.hasOwnProperty(e)){var n=this.fields[e]||{},r=this.form[n.name];r&&r!==i&&(n.type=r.type,n.value=r.value,n.checked=r.checked),this._validateField(n)}if("function"==typeof this.callback&&this.callback(this.errors,t),this.errors.length>0){if(!t||!t.preventDefault)return!1;t.preventDefault()}return!0},p.prototype._validateField=function(t){var e=t.rules.split("|");if(-1!==t.rules.indexOf("required")||t.value&&""!==t.value&&t.value!==i)for(var r=0,o=e.length;o>r;r++){var a=e[r],l=null,h=!1;if((parts=s.exec(a))&&(a=parts[1],l=parts[2]),"function"==typeof this._hooks[a]?this._hooks[a].apply(this,[t,l])||(h=!0):"callback_"===a.substring(0,9)&&(a=a.substring(9,a.length),"function"==typeof this.handlers[a]&&this.handlers[a].apply(this,[t.value])===!1&&(h=!0)),h){(e=this.messages[a]||n[a])?(t=e.replace("%s",t.display),l&&(t=t.replace("%s",this.fields[l]?this.fields[l].display:l)),this.errors.push(t)):this.errors.push("An error has occurred with the "+t.display+" field.");break}}},p.prototype._hooks={required:function(t){var e=t.value;return"checkbox"===t.type?t.checked===!0:null!==e&&""!==e},matches:function(t,e){return(el=this.form[e])?t.value===el.value:!1},valid_email:function(t){return h.test(t.value)},min_length:function(t,e){return o.test(e)?t.value.length>=e:!1},max_length:function(t,e){return o.test(e)?t.value.length<=e:!1},exact_length:function(t,e){return o.test(e)?t.value.length==e:!1},greater_than:function(t,e){return l.test(t.value)?parseFloat(t.value)>parseFloat(e):!1},less_than:function(t,e){return l.test(t.value)?parseFloat(t.value)="0"&&"7">=i?parseInt(t.substring(1),8):"u"===i||"x"===i?parseInt(t.substring(2),16):t.charCodeAt(1)}function i(t){return 32>t?(16>t?"\\x0":"\\x")+t.toString(16):(t=String.fromCharCode(t),("\\"===t||"-"===t||"["===t||"]"===t)&&(t="\\"+t),t)}function n(t){for(var n=t.substring(1,t.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),t=[],r=[],s="^"===n[0],o=s?1:0,a=n.length;a>o;++o){var l=n[o];if(/\\[bdsw]/i.test(l))t.push(l);else{var h,l=e(l);a>o+2&&"-"===n[o+1]?(h=e(n[o+2]),o+=2):h=l,r.push([l,h]),65>h||l>122||(65>h||l>90||r.push([32|Math.max(65,l),32|Math.min(h,90)]),97>h||l>122||r.push([-33&Math.max(97,l),-33&Math.min(h,122)]))}}for(r.sort(function(t,e){return t[0]-e[0]||e[1]-t[1]}),n=[],l=[0/0,0/0],o=0;oa[0]&&(a[1]+1>a[0]&&r.push("-"),r.push(i(a[1])));return r.push("]"),r.join("")}function r(t){for(var e=t.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),i=e.length,r=[],a=0,l=0;i>a;++a){var h=e[a];"("===h?++l:"\\"===h.charAt(0)&&(h=+h.substring(1))&&l>=h&&(r[h]=-1)}for(a=1;aa;++a)h=e[a],"("===h?(++l,void 0===r[l]&&(e[a]="(?:")):"\\"===h.charAt(0)&&(h=+h.substring(1))&&l>=h&&(e[a]="\\"+r[l]);for(l=a=0;i>a;++a)"^"===e[a]&&"^"!==e[a+1]&&(e[a]="");if(t.ignoreCase&&o)for(a=0;i>a;++a)h=e[a],t=h.charAt(0),h.length>=2&&"["===t?e[a]=n(h):"\\"!==t&&(e[a]=h.replace(/[A-Za-z]/g,function(t){return t=t.charCodeAt(0),"["+String.fromCharCode(-33&t,32|t)+"]"}));return e.join("")}for(var s=0,o=!1,a=!1,l=0,h=t.length;h>l;++l){var c=t[l];if(c.ignoreCase)a=!0;else if(/[a-z]/i.test(c.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){o=!0,a=!1;break}}for(var d={b:8,t:9,n:10,v:11,f:12,r:13},u=[],l=0,h=t.length;h>l;++l){if(c=t[l],c.global||c.multiline)throw Error(""+c);u.push("(?:"+r(c)+")")}return RegExp(u.join("|"),a?"gi":"g")}function e(t){function e(t){switch(t.nodeType){case 1:if(n.test(t.className))break;for(var i=t.firstChild;i;i=i.nextSibling)e(i);i=t.nodeName,("BR"===i||"LI"===i)&&(r[a]="\n",o[a<<1]=s++,o[a++<<1|1]=t);break;case 3:case 4:i=t.nodeValue,i.length&&(i=l?i.replace(/\r\n?/g,"\n"):i.replace(/[\t\n\r ]+/g," "),r[a]=i,o[a<<1]=s,s+=i.length,o[a++<<1|1]=t)}}var i,n=/(?:^|\s)nocode(?:\s|$)/,r=[],s=0,o=[],a=0;t.currentStyle?i=t.currentStyle.whiteSpace:window.getComputedStyle&&(i=document.defaultView.getComputedStyle(t,q).getPropertyValue("white-space"));var l=i&&"pre"===i.substring(0,3);return e(t),{a:r.join("").replace(/\n$/,""),c:o}}function i(t,e,i,n){e&&(t={a:e,d:t},i(t),n.push.apply(n,t.e))}function n(e,n){function r(t){for(var e=t.d,h=[e,"pln"],c=0,d=t.a.match(s)||[],u={},p=0,f=d.length;f>p;++p){var g,m=d[p],y=u[m],v=void 0;if("string"==typeof y)g=!1;else{var x=o[m.charAt(0)];if(x)v=m.match(x[1]),y=x[0];else{for(g=0;l>g;++g)if(x=n[g],v=m.match(x[1])){y=x[0];break}v||(y="pln")}!(g=y.length>=5&&"lang-"===y.substring(0,5))||v&&"string"==typeof v[1]||(g=!1,y="src"),g||(u[m]=y)}if(x=c,c+=m.length,g){g=v[1];var b=m.indexOf(g),w=b+g.length;v[2]&&(w=m.length-v[2].length,b=w-g.length),y=y.substring(5),i(e+x,m.substring(0,b),r,h),i(e+x+b,g,a(y,g),h),i(e+x+w,m.substring(w),r,h)}else h.push(e+x,y)}t.e=h}var s,o={};!function(){for(var i=e.concat(n),r=[],a={},l=0,h=i.length;h>l;++l){var c=i[l],d=c[3];if(d)for(var u=d.length;--u>=0;)o[d.charAt(u)]=c;c=c[1],d=""+c,a.hasOwnProperty(d)||(r.push(c),a[d]=q)}r.push(/[\S\s]/),s=t(r)}();var l=n.length;return r}function r(t){var e=[],i=[];t.tripleQuotedStrings?e.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):t.multiLineStrings?e.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,q,"'\"`"]):e.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]),t.verbatimStrings&&i.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var r=t.hashComments;return r&&(t.cStyleComments?(r>1?e.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):e.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),i.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):e.push(["com",/^#[^\n\r]*/,q,"#"])),t.cStyleComments&&(i.push(["com",/^\/\/[^\n\r]*/,q]),i.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q])),t.regexLiterals&&i.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]),(r=t.types)&&i.push(["typ",r]),t=(""+t.keywords).replace(/^ | $/g,""),t.length&&i.push(["kwd",RegExp("^(?:"+t.replace(/[\s,]+/g,"|")+")\\b"),q]),e.push(["pln",/^\s+/,q," \r\n  "]),i.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]),n(e,i)}function s(t,e){function i(t){switch(t.nodeType){case 1:if(s.test(t.className))break;if("BR"===t.nodeName)n(t),t.parentNode&&t.parentNode.removeChild(t);else for(t=t.firstChild;t;t=t.nextSibling)i(t);break;case 3:case 4:if(l){var e=t.nodeValue,r=e.match(o);if(r){var h=e.substring(0,r.index);t.nodeValue=h,(e=e.substring(r.index+r[0].length))&&t.parentNode.insertBefore(a.createTextNode(e),t.nextSibling),n(t),h||t.parentNode.removeChild(t)}}}}function n(t){function e(t,i){var n=i?t.cloneNode(!1):t,r=t.parentNode;if(r){var r=e(r,1),s=t.nextSibling;r.appendChild(n);for(var o=s;o;o=s)s=o.nextSibling,r.appendChild(o)}return n}for(;!t.nextSibling;)if(t=t.parentNode,!t)return;for(var i,t=e(t.nextSibling,0);(i=t.parentNode)&&1===i.nodeType;)t=i;h.push(t)}var r,s=/(?:^|\s)nocode(?:\s|$)/,o=/\r\n?|\n/,a=t.ownerDocument;t.currentStyle?r=t.currentStyle.whiteSpace:window.getComputedStyle&&(r=a.defaultView.getComputedStyle(t,q).getPropertyValue("white-space"));var l=r&&"pre"===r.substring(0,3);for(r=a.createElement("LI");t.firstChild;)r.appendChild(t.firstChild);for(var h=[r],c=0;cc;++c)r=h[c],r.className="L"+(c+u)%10,r.firstChild||r.appendChild(a.createTextNode(" ")),d.appendChild(r);t.appendChild(d)}function o(t,e){for(var i=e.length;--i>=0;){var n=e[i];x.hasOwnProperty(n)?window.console&&console.warn("cannot override language handler %s",n):x[n]=t}}function a(t,e){return t&&x.hasOwnProperty(t)||(t=/^\s*f;)d[f]!==d[f+2]?(d[p++]=d[f++],d[p++]=d[f++]):f+=2;for(u=p,f=p=0;u>f;){for(var g=d[f],m=d[f+1],y=f+2;u>=y+2&&d[y+1]===m;)y+=2;d[p++]=g,d[p++]=m,f=y}for(d.length=p;c>r;){var v,x=h[r+2]||l,b=d[t+2]||l,y=Math.min(x,b),w=h[r+1];if(1!==w.nodeType&&(v=o.substring(n,y))){s&&(v=v.replace(i,"\r")),w.nodeValue=v;var k=w.ownerDocument,S=k.createElement("SPAN");S.className=d[t+1];var T=w.parentNode;T.replaceChild(S,w),S.appendChild(w),x>n&&(h[r+1]=w=k.createTextNode(o.substring(y,x)),T.insertBefore(w,S.nextSibling))}n=y,n>=x&&(r+=2),n>=b&&(t+=2)}}catch(C){"console"in window&&console.log(C&&C.stack?C.stack:C)}}var h=["break,continue,do,else,for,if,return,while"],c=[[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],d=[c,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],u=[c,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],p=[u,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],c=[c,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],f=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],g=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],h=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],m=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,y=/\S/,v=r({keywords:[d,p,c,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+f,g,h],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),x={};o(v,["default-code"]),o(n([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]),o(n([["pln",/^\s+/,q," \r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]),o(n([],[["atv",/^[\S\s]+/]]),["uq.val"]),o(r({keywords:d,hashComments:!0,cStyleComments:!0,types:m}),["c","cc","cpp","cxx","cyc","m"]),o(r({keywords:"null,true,false"}),["json"]),o(r({keywords:p,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:m}),["cs"]),o(r({keywords:u,cStyleComments:!0}),["java"]),o(r({keywords:h,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]),o(r({keywords:f,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py"]),o(r({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]),o(r({keywords:g,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]),o(r({keywords:c,cStyleComments:!0,regexLiterals:!0}),["js"]),o(r({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]),o(n([],[["str",/^[\S\s]+/]]),["regex"]),window.prettyPrintOne=function(t,e,i){var n=document.createElement("PRE");return n.innerHTML=t,i&&s(n,i),l({g:e,i:i,h:n}),n.innerHTML},window.prettyPrint=function(t){function e(){for(var i=window.PR_SHOULD_USE_CONTINUATION?h.now()+250:1/0;d=0){var a,p,o=o.match(u);if(p=!o){p=r;for(var f=void 0,g=p.firstChild;g;g=g.nextSibling)var m=g.nodeType,f=1===m?f?p:g:3===m?y.test(g.nodeValue)?p:f:f;p=(a=f===p?void 0:f)&&"CODE"===a.tagName}for(p&&(o=a.className.match(u)),o&&(o=o[1]),p=!1,f=r.parentNode;f;f=f.parentNode)if(("pre"===f.tagName||"code"===f.tagName||"xmp"===f.tagName)&&f.className&&f.className.indexOf("prettyprint")>=0){p=!0;break}p||((p=(p=r.className.match(/\blinenums\b(?::(\d+))?/))?p[1]&&p[1].length?+p[1]:!0:!1)&&s(r,p),c={g:o,h:r,i:p},l(c))}}do;++o)n.push(i[r][o]);var i=q,h=Date;h.now||(h={now:function(){return+new Date}});var c,d=0,u=/\blang(?:uage)?-([\w.]+)(?!\S)/;e()},window.PR={createSimpleLexer:n,registerLangHandler:o,sourceDecorator:r,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}}(),!function(t){t(function(){window.prettyPrint&&prettyPrint()})}(window.jQuery),$(document).ready(function(){$(".response").click(function(){var t=$(this).data("response_type");$(".response").removeClass("active"),$(".response-"+t).addClass("active"),$(".format").hide(),$(".format-"+t).show()})}),$(document).ready(function(){$("#talkback_command_add").click(function(){$(this).hide(),$("#talkback_command_add_form").removeClass("hide")})}); \ No newline at end of file diff --git a/public/assets/application-9a8391e7623b717b5e3815c9802c8c19.js.gz b/public/assets/application-9a8391e7623b717b5e3815c9802c8c19.js.gz new file mode 100644 index 0000000..23a6197 Binary files /dev/null and b/public/assets/application-9a8391e7623b717b5e3815c9802c8c19.js.gz differ diff --git a/public/assets/application-c2ba8a3fdde171077398b657e1ae7906.css b/public/assets/application-c2ba8a3fdde171077398b657e1ae7906.css new file mode 100644 index 0000000..0570ac9 --- /dev/null +++ b/public/assets/application-c2ba8a3fdde171077398b657e1ae7906.css @@ -0,0 +1,103 @@ +/*! + * Bootstrap v3.1.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width: 768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media (min-width: 992px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width: 768px){.container{width:750px}}@media (min-width: 992px){.container{width:970px}}@media (min-width: 1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media (min-width: 768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width: 992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width: 1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width: 767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="date"]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width: 768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width: 768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url("../fonts/glyphicons-halflings-regular.eot");src:url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/glyphicons-halflings-regular.woff") format("woff"),url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 992px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:none}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width: 992px){.navbar{border-radius:4px}}@media (min-width: 992px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width: 992px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width: 992px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 992px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 992px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width: 992px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:none}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width: 992px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width: 991px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width: 992px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width: 992px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width: 768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width: 991px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width: 992px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width: 992px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width: 991px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width: 991px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.428571429;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width: 768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group .list-group-item:first-child{border-top:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tfoot>tr:first-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tfoot>tr:first-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>td{border-top:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.428571429px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width: 768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top .arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right .arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom .arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left .arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.5) 0), color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, color-stop(rgba(0,0,0,0.0001) 0), color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:none;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width: 768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none !important}@media (max-width: 767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none !important}@media (min-width: 768px) and (max-width: 991px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none !important}@media (min-width: 992px) and (max-width: 1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none !important}@media (min-width: 1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width: 767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none !important}}@media (min-width: 1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none !important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none !important}}.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #222 0, #282828 100%);background-image:linear-gradient(to bottom, #222 0, #282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:linear-gradient(to bottom, #428bca 0, #3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:linear-gradient(to bottom, #428bca 0, #3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}code{word-wrap:break-word;white-space:normal}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute !important;clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */.ui-widget{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1em}.ui-widget-content{border:1px solid #dddddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333333}.ui-widget-content a{color:#333333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#ffffff;font-weight:bold}.ui-widget-header a{color:#ffffff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #cccccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-widget :active{outline:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#ffffff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#ffffff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#ffffff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-off{background-position:-96px -144px}.ui-icon-radio-on{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.50;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.20;filter:Alpha(Opacity=20);-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px} /*! +* jQuery UI Resizable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Resizable#theming +*/.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} /*! +* jQuery UI Selectable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Selectable#theming +*/.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}/*! + * jQuery UI Accordion 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */.ui-accordion{width:100%}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1}.ui-accordion .ui-accordion-li-fix{display:inline}.ui-accordion .ui-accordion-header-active{border-bottom:0 !important}.ui-accordion .ui-accordion-header a{display:block;font-size:1em;padding:.5em .5em .5em .7em}.ui-accordion-icons .ui-accordion-header a{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1}.ui-accordion .ui-accordion-content-active{display:block}/*! + * jQuery UI Autocomplete 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */.ui-autocomplete{position:absolute;cursor:default}* html .ui-autocomplete{width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left}.ui-menu .ui-menu{margin-top:-3px}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1}.ui-menu .ui-menu-item a.ui-state-hover,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}/*! + * jQuery UI Button 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none !important;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}/*! + * jQuery UI Dialog 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}/*! + * jQuery UI Slider 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} /*! +* jQuery UI Tabs 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Tabs#theming +*/.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 .2em 1px 0;border-bottom:0 !important;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{margin-bottom:0;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-state-processing a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tabs .ui-tabs-hide{display:none !important}/*! + * jQuery UI Datepicker 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}/*! +* jQuery UI Progressbar 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Progressbar#theming +*/.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.navbar-collapse{max-height:350px}.breadcrumb{margin-top:10px;margin-bottom:20px}.table td{word-break:break-word}body{padding-top:70px}.break-word{word-break:break-word}.col-pad{padding:0 15px}.form-horizontal .multiline-label{margin-top:-10px}.nested-fields{border:1px solid #d6d6d6;padding:10px 10px 0 10px;max-width:275px}.customcode,.customcode .str,.customcode .lit,.customcode .pln{color:#00ab9b}.response-div{margin-top:12px;font-size:0.8em}.response{background-color:#ddd;margin:0 1px;border:1px solid #555;padding:2px;font-weight:bold;color:#555;cursor:pointer}.response:hover{background-color:#eeb}.response.active{background-color:#beb;cursor:initial}.format-json,.format-xml{display:none}.format-block{min-height:200px}.format-block-lg{min-height:350px}html,body{height:100%}#wrap{min-height:100%;height:auto;margin:0 auto -30px;padding:0 0 60px}#footer{padding-top:5px;border-top:1px solid #ddd;height:30px;background-color:#f5f5f5}#footer .container{background-color:#f5f5f5}@media (max-width: 767px){#footer span{display:block;text-align:center;float:none !important}}.infobox{vertical-align:bottom}.spanlink{cursor:pointer}.boldlink{font-weight:bold}.apps a:hover,.apps:hover div{text-decoration:none}.commentarea{width:300px;height:80px}#options{float:right;text-align:right}#login{padding:6px;border:1px solid #bbbbbb;border-collapse:separate;border-spacing:3px;background-color:#eeeeee;background:-webkit-gradient(linear, left top, right top, from(#ddd), to(#f5f5f5));background:-moz-linear-gradient(left, #ddd, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd', endColorstr='#f5f5f5', GradientType=1)}#channel_info{padding-bottom:20px}.signed_in_channel_header{display:inline-block}.public_private_icon{display:inline-block}.signed_in_channel_header{width:300px;height:10px}#list_progress_bar{width:300px;height:10px}.public_channel_box{margin:5px;border-radius:7px;height:300px;border:solid 1px red;display:inline-block;width:260px;vertical-align:top}.public_channel_inner{margin-left:10px;margin-right:5px}.public_channel_name{height:11px;font-size:1.3em;font-weight:bold;color:#2565A5}.public_channel_user{height:15px;margin-left:7px;font-size:0.9em}.progressbar{height:10px}.public_channel_desc{height:140px;word-break:break-all}.public_channel_url{height:10px}.public_channel_tags{height:57px;margin-bottom:10px;overflow:hidden}.public_channel_thumbnail{position:absolute;border:2px solid red;display:none}h1.channel_info{margin:0;padding-top:10px}div.list_tags{padding-top:20px}.channelLinks{padding:0 0 0 0;margin-bottom:15px}.channelLinks li{padding:7px;border:1px solid #ccc;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;display:inline;margin:0 0 0 0;list-style:none}#comments{width:100%}#commentsmain{float:left;width:190px;background-color:#fffff9;border:1px dashed #d0d0d0;padding:5px;margin-right:16px;overflow:hidden;display:none}.commentlink{float:left;width:100%}#public_statuses{width:455px;height:380px;overflow:auto;font-size:1.5em}#public_statuses div{margin-left:15px}.statusIFrame{border:1px solid #ccc;background-color:#ffffff}.userlogin{display:none}.login_info{font-weight:bold;text-align:right;font-size:12px}.round{-moz-border-radius:7px;-webkit-border-radius:7px}.text_center{text-align:center}.big{font-size:18px}.large{font-size:20px}.xlarge{font-size:30px}.small{font-size:12px}.action{margin-right:20px;position:relative;top:35px;font-weight:bold;padding:10px}.action_reverse{margin-right:20px;position:relative;top:35px;font-weight:bold;background-color:#d62020;padding:8px;color:#000000}.action_reverse a{color:#FFFFFF}.section_header_reverse{margin:15px 0 5px 0;display:inline-block;font-weight:bold;color:#FFFFFF;background-color:#d62020;padding:8px}.nicetable{font-size:14px;border:1px solid #bbbbbb}.nicetable-borderless{font-size:14px;border:none}.nicetable-borderless p{margin-left:20px;margin-top:5px;margin-bottom:10px}.nicetable-borderless h3{margin-bottom:0}.nicetable-borderless h3.signed_in_channel_header{margin-bottom:10px}.nicetable .header{font-weight:bold;background-color:#e5e5e5}.nicetable .header td{padding-top:3px}.nicetable td{padding:2px 10px;border-bottom:1px solid #bbbbbb;word-wrap:word}.nicetable .stripe{background-color:#f9f9f9}.nicetable .disabled{background-color:#eee}.nicetable .disabled a{color:#888}.fulltable{width:95%}.fullform{width:100%;margin-bottom:1.5em}.deletecol{width:1em}.table_no_header{font-size:14px}.table_no_header td{padding:2px 10px}.table_no_header .left{font-weight:bold}.max_width_400{max-width:40;word-wrap:break-word}.helplink{float:right;margin-top:3px}.votediv,.votedivphoto,.votedivlink{color:#3478e3}.votedivlink{padding-right:20px}.votediv{float:right;display:none}.voteicon{padding:2px;background:#f8f8f8;border:1px solid #ddd;cursor:pointer}.voteicon:hover{text-decoration:none}.voteicon img{position:relative;top:3px}.nestedcomment{padding-left:30px}.commenttable{padding:0;margin:0;width:100%}.commenttable td{padding:4px 10px 4px 5px}.commentchannel{color:#f08600;font-weight:bold}.commentbody{color:#333333}.commentdiv{width:100%;padding:5px 0 5px 0;font-size:12px;border-top:1px solid #aaa}.gravatar{border:1px solid #999}.noavatar{width:50px;height:50px;border:1px solid #ddd;color:#ddd;text-align:center}.noavatartext{padding-top:5px}.prettydate{color:#aaa}.username a{color:#3478E3;font-weight:bold}.timeago{font-size:0.8em;color:#ccc}.pagination{font-size:14px}.centerme{display:table;margin:0 auto}.fixedwidth{width:960px;display:table;margin:0 auto}.code{margin:10px 0;background-color:#fafafa;white-space:pre-wrap;font:12px Monaco, Lucida Console, monospace;color:#000000;border:1px solid #bbbbbb;padding:10px}.apps{padding:0 30px 40px 0;font-size:20px;float:left;text-align:center;margin:0 auto;width:150px}input[type="text"].shortfield{width:30px}input[type="text"].midfield{width:120px}textarea.tweet{margin-top:0.5em;width:40em;height:3em}.errorExplanation{width:95%;background-color:#ffffe0;display:table;margin-bottom:20px;padding:10px;border:1px solid #aaaaaa}#error{color:red}.field_with_errors{display:inline}.warning_box{margin:15px 0 15px 0;padding:10px;background-color:#fc3;color:#000;border:1px solid #f90}#maincontent{float:left;width:980px;padding-bottom:20px;margin-left:10px;overflow:false}#maincontent.thin{width:400px}#maincontent.medium{width:500px}#maincontent .thinghttptable{table-layout:fixed;width:400px;word-wrap:break-word}#maincontent .thinghttptable .url{width:100px}#maincontent .thinghttptable .apikey{width:80px}input#upload_csv{padding-top:5px;margin:20px 0}#sidebar.wide{width:520px}#sidebar.medium{width:470px}#sidebar.narrow{width:470px;margin-left:520px}#sidebar .helplink{float:right;margin-top:5px;font-weight:normal;font-size:12px}.FL{float:left}.FR{float:right}.FN{float:none}.DT{display:table}.CL{clear:left}.CR{clear:right}.CB{clear:both}.UL{text-decoration:underline}.TAR{text-align:right}.TAC{text-align:center}.VAT{vertical-align:top}.PB10{padding-bottom:10px}.PR20{padding-right:20px}.PL20{padding-left:20px}.PL30{padding-left:30px}.MT10{margin-top:5px}.MR20{margin-right:20px}.MR60{margin-right:60px;margin-bottom:20px}.ML20{margin-left:20px}.ML60{margin-left:60px}.W50{width:50%}.W100{width:100%}.left20{position:relative;left:-20px}.up2{position:relative;top:-2px}.up20{position:relative;top:-20px}input.video_narrow{width:100px}#feature_signup a{border-bottom:3px solid #d62020;text-decoration:none;font-weight:bold}#feature_signup a:hover{text-decoration:none}#nav{list-style:none;padding:0 10px 0 92px;margin:0}#nav li{float:left;margin:0px 0px 0px 10px;padding:0px 15px 0px 0px;position:relative;font-size:14px;line-height:1.4;zoom:1}#nav li:last-child{padding:0}#nav .current-cat a,#nav .current_page_item a{color:#d62020;border-bottom:5px solid #2565A5}#nav .current-cat li a,#nav .current_page_item li a{color:#000}#nav .current-cat li a:hover,#nav .current_page_item li a:hover{color:#d62020;border-bottom:5px solid #2565A5}#nav li a{text-transform:uppercase;font-weight:bold;text-decoration:none;color:#000;border:none;text-decoration:none;float:left;border-bottom:5px solid #FFFFFF}#nav li a:hover{color:#d62020;border-bottom:5px solid #aaa}#nav li span{width:12px;height:20px;background:url("arrow-down.gif") no-repeat left 7px;margin:0;padding:0;position:absolute;right:0;top:0}#nav ul{display:none}#nav li span.child{width:12px;height:20px;background:url("arrow-right.gif") no-repeat left 10px;margin:0;padding:0;position:absolute;right:0;top:0}#nav li a.rss{background:url(rss_feed.png) right 0px no-repeat;padding:0px 30px 0px 0}#nav li a.rss:hover{background:url(rss_feed.png) right -24px no-repeat;padding:0px 30px 0px 0;border-bottom:0 solid #aaa}.ui-widget{font-size:.8em}.ui-widget-header{border:1px solid #0867A3;background:#0867a3 none top right no-repeat}.ui-progressbar{height:5px}.ui-progressbar-value{background-color:green}.ui-widget-content a{color:blue;text-decoration:underline;margin:0}.ui-widget-content p{margin:0 0 10px 10px}.column{width:470px;float:left;padding-bottom:50px;padding-left:5px}.portlet{margin:0 1em 1em 0}.portlet-header{margin:0.3em;padding:7px 7px 7px 7px}.portlet-header .ui-icon{float:right;margin-top:-2px;cursor:pointer;cursor:hand}.portlet-content{padding:0.4em}.ui-sortable-placeholder{border:1px dotted black;visibility:visible !important;height:50px !important}.ui-sortable-placeholder *{visibility:hidden}.buttonlets{float:left;overflow:hidden;max-width:95px}.tweetButton{width:80px}.facebookButton{width:85px}.googleplusButton{width:70px}.padded{margin-top:2px}.ui-button{height:19px;line-height:1em}.ui-button-text-only .ui-button-text{padding:0.2em 1em 0.2em 0.4em;font-size:12px}.ui-state-active{border:1px solid #2565a5;background:#ddd none 50% 50% repeat-x;color:#2565a5}.ui-state-default{border:1px solid #ccc;color:#2565a5}.ui-state-hover{background:#ccc none 50% 50% repeat-x}.topLink{font-size:16px}.developerlink{padding:7px;margin-left:10px;border-bottom-left-radius:15px;border-bottom-right-radius:15px;-webkit-border-bottom-left-radius:15px;-webkit-border-bottom-right-radius:15px;-moz-border-bottom-left-radius:15px;-moz-border-bottom-right-radius:15px;background-color:#aaa}.addpluginlink{color:white;padding:7px;margin-left:10px;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;background-color:#aaa;cursor:pointer}.addpluginlink:hover{background-color:#ccc}.pluginrectangle{display:none;background-color:#aaa;border-radius:5px;position:absolute;height:70%;width:100%;top:30px;right:0}.developerlink:hover{background-color:#ccc}.developerlink a{color:white;text-decoration:none}.channelInfo{max-width:500px}.channelDescription{width:450px;height:60px}.socialButtons{float:right;display:inline}.dev-info-dialog{border:2px solid #bbb}.dev-info-dialog .ui-dialog-titlebar{background-color:#aaa;color:white}.dev-info-dialog a{text-decoration:underline}.ui-tabs{height:100%}.dev-info-dialog ul{list-style-type:none;background-color:whitesmoke}#devInfo{font-size:1.2em}.dev-info-dialog ul li{display:inline;list-style-type:none}.dev_info_table1{margin-bottom:10px}.dev_info_table2{margin-left:10px}.dev_info_table2 td{max-width:300px}.watchButtonLabel{white-space:nowrap;padding-right:10px}.watchButtonImage{float:left;background-position:left;background-image:url("eye.png");background-repeat:no-repeat;width:19px;height:16px}.watchButtonPadding{padding-right:5px}.chartOptions{display:none}.fade{display:none;font-size:1.2em}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-hover a,.ui-state-hover a:hover{color:#d82020;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#d82020;text-decoration:none}.ui-widget :active{outline:none}.ui-tabs .ui-tabs-panel{padding-top:0}.addportlet{padding:5px;width:50px;margin:5px;border-radius:5px;border:2px solid red;cursor:pointer;display:inline-block}.channel_stats_location{clear:right;float:right;width:475px;padding-top:23px}.channel_stats_text{font-weight:bold;font-size:1.2em}.channel_time_text{color:black;font-size:1em}.recent_status{font-family:sans-serif;margin:4px}.timeago{font-size:0.8em;color:#ccc;margin-left:10px}.com{color:#93a1a1}.lit{color:#195f91}.pun,.opn,.clo{color:#93a1a1}.fun{color:#dc322f}.str,.atv{color:#D14}.kwd,.prettyprint .tag{color:#1e347b}.typ,.atn,.dec,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:20px;text-shadow:0 1px 0 #fff}.affix-top,.affix{position:static}#bootstrap-sidebar{background-color:#eee;border:1px solid #bbb;border-radius:5px;padding:2px 0}#bootstrap-sidebar li a:hover{background-color:#fafafa}#bootstrap-sidebar li.active{border:0 #666 solid;border-right-width:4px}@media (min-width: 979px){#bootstrap-sidebar.affix-top,#bootstrap-sidebar.affix{position:fixed;top:90px;width:228px}} diff --git a/public/assets/application-c2ba8a3fdde171077398b657e1ae7906.css.gz b/public/assets/application-c2ba8a3fdde171077398b657e1ae7906.css.gz new file mode 100644 index 0000000..96feebd Binary files /dev/null and b/public/assets/application-c2ba8a3fdde171077398b657e1ae7906.css.gz differ diff --git a/public/assets/application-cef60c60a5550b2bf95cf2102b747be8.css b/public/assets/application-cef60c60a5550b2bf95cf2102b747be8.css new file mode 100644 index 0000000..d87cd01 --- /dev/null +++ b/public/assets/application-cef60c60a5550b2bf95cf2102b747be8.css @@ -0,0 +1,99 @@ +.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top, #fff 0, #e0e0e0 100%);background-image:linear-gradient(to bottom, #fff 0, #e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe0e0e0',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-primary{background-image:-webkit-linear-gradient(top, #428bca 0, #2d6ca2 100%);background-image:linear-gradient(to bottom, #428bca 0, #2d6ca2 100%);background-repeat:repeat-x;border-color:#2b669a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff2d6ca2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #419641 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #419641 100%);background-repeat:repeat-x;border-color:#3e8f3e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff419641',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #eb9316 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #eb9316 100%);background-repeat:repeat-x;border-color:#e38d13;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffeb9316',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c12e2a 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc12e2a',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #2aabd2 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2aabd2',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar-default{background-image:-webkit-linear-gradient(top, #fff 0, #f8f8f8 100%);background-image:linear-gradient(to bottom, #fff 0, #f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f3f3f3 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff3f3f3',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.075);box-shadow:inset 0 3px 9px rgba(0,0,0,0.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top, #3c3c3c 0, #222 100%);background-image:linear-gradient(to bottom, #3c3c3c 0, #222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top, #222 0, #282828 100%);background-image:linear-gradient(to bottom, #222 0, #282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff282828',GradientType=0);-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,0.25);box-shadow:inset 0 3px 9px rgba(0,0,0,0.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-linear-gradient(top, #dff0d8 0, #c8e5bc 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-linear-gradient(top, #d9edf7 0, #b9def0 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #f8efc0 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-linear-gradient(top, #f2dede 0, #e7c3c3 100%);background-image:linear-gradient(to bottom, #f2dede 0, #e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-linear-gradient(top, #ebebeb 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #ebebeb 0, #f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top, #428bca 0, #3071a9 100%);background-image:linear-gradient(to bottom, #428bca 0, #3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top, #5cb85c 0, #449d44 100%);background-image:linear-gradient(to bottom, #5cb85c 0, #449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top, #5bc0de 0, #31b0d5 100%);background-image:linear-gradient(to bottom, #5bc0de 0, #31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top, #f0ad4e 0, #ec971f 100%);background-image:linear-gradient(to bottom, #f0ad4e 0, #ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top, #d9534f 0, #c9302c 100%);background-image:linear-gradient(to bottom, #d9534f 0, #c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top, #428bca 0, #3278b3 100%);background-image:linear-gradient(to bottom, #428bca 0, #3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top, #f5f5f5 0, #e8e8e8 100%);background-image:linear-gradient(to bottom, #f5f5f5 0, #e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top, #428bca 0, #357ebd 100%);background-image:linear-gradient(to bottom, #428bca 0, #357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top, #dff0d8 0, #d0e9c6 100%);background-image:linear-gradient(to bottom, #dff0d8 0, #d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top, #d9edf7 0, #c4e3f3 100%);background-image:linear-gradient(to bottom, #d9edf7 0, #c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top, #fcf8e3 0, #faf2cc 100%);background-image:linear-gradient(to bottom, #fcf8e3 0, #faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top, #f2dede 0, #ebcccc 100%);background-image:linear-gradient(to bottom, #f2dede 0, #ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-linear-gradient(top, #e8e8e8 0, #f5f5f5 100%);background-image:linear-gradient(to bottom, #e8e8e8 0, #f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)}code{word-wrap:break-word;white-space:normal}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute !important;clip:rect(1px 1px 1px 1px);clip:rect(1px, 1px, 1px, 1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}/*! + * jQuery UI CSS Framework 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ctl=themeroller&ffDefault=Trebuchet%20MS,%20Tahoma,%20Verdana,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=03_highlight_soft.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=08_diagonals_thick.png&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=01_flat.png&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px + */.ui-widget{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS, Tahoma, Verdana, Arial, sans-serif;font-size:1em}.ui-widget-content{border:1px solid #dddddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333333}.ui-widget-content a{color:#333333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#ffffff;font-weight:bold}.ui-widget-header a{color:#ffffff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #cccccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-widget :active{outline:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#ffffff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#ffffff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#ffffff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-off{background-position:-96px -144px}.ui-icon-radio-on{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.50;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.20;filter:Alpha(Opacity=20);-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px} /*! +* jQuery UI Resizable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Resizable#theming +*/.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} /*! +* jQuery UI Selectable 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Selectable#theming +*/.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}/*! + * jQuery UI Accordion 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */.ui-accordion{width:100%}.ui-accordion .ui-accordion-header{cursor:pointer;position:relative;margin-top:1px;zoom:1}.ui-accordion .ui-accordion-li-fix{display:inline}.ui-accordion .ui-accordion-header-active{border-bottom:0 !important}.ui-accordion .ui-accordion-header a{display:block;font-size:1em;padding:.5em .5em .5em .7em}.ui-accordion-icons .ui-accordion-header a{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;margin-top:-2px;position:relative;top:1px;margin-bottom:2px;overflow:auto;display:none;zoom:1}.ui-accordion .ui-accordion-content-active{display:block}/*! + * jQuery UI Autocomplete 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */.ui-autocomplete{position:absolute;cursor:default}* html .ui-autocomplete{width:1px}.ui-menu{list-style:none;padding:2px;margin:0;display:block;float:left}.ui-menu .ui-menu{margin-top:-3px}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;float:left;clear:left;width:100%}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:.2em .4em;line-height:1.5;zoom:1}.ui-menu .ui-menu-item a.ui-state-hover,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}/*! + * jQuery UI Button 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;text-decoration:none !important;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}/*! + * jQuery UI Dialog 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block;margin:1px}.ui-dialog .ui-dialog-titlebar-close:hover,.ui-dialog .ui-dialog-titlebar-close:focus{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}/*! + * jQuery UI Slider 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} /*! +* jQuery UI Tabs 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Tabs#theming +*/.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:1px;margin:0 .2em 1px 0;border-bottom:0 !important;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{margin-bottom:0;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-selected a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-state-processing a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tabs .ui-tabs-hide{display:none !important}/*! + * jQuery UI Datepicker 1.8.24 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}/*! +* jQuery UI Progressbar 1.8.24 +* +* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT or GPL Version 2 licenses. +* http://jquery.org/license +* +* http://docs.jquery.com/UI/Progressbar#theming +*/.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.customcode,.customcode .str,.customcode .lit,.customcode .pln{color:#00ab9b}.response-div{margin-top:12px;font-size:0.8em}.response{background-color:#ddd;margin:0 1px;border:1px solid #555;padding:2px;font-weight:bold;color:#555;cursor:pointer}.response:hover{background-color:#eeb}.response.active{background-color:#beb;cursor:initial}.format-json,.format-xml{display:none}.format-block{min-height:200px}.format-block-lg{min-height:350px}.infobox{vertical-align:bottom}.spanlink{cursor:pointer}.boldlink{font-weight:bold}#logo{float:left;margin:0 0 0 0}#logo a{color:#d62020}#logo a span,.paygray{color:#666666}#logo a:hover,.apps a:hover,.apps:hover div{text-decoration:none}.commentarea{width:300px;height:80px}#logo.small{font-size:30px;color:#666666}#options{float:right;text-align:right}#login{padding:6px;border:1px solid #bbbbbb;border-collapse:separate;border-spacing:3px;background-color:#eeeeee;background:-webkit-gradient(linear, left top, right top, from(#ddd), to(#f5f5f5));background:-moz-linear-gradient(left, #ddd, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#dddddd', endColorstr='#f5f5f5', GradientType=1)}#menu{height:40px;margin:0 auto;border:1px solid #dddddd;background-color:#d6d6d6;background:-webkit-gradient(linear, left top, left bottom, from(#eee), to(#bbb));background:-moz-linear-gradient(top, #eee, #bbb);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#bbbbbb')}#menu div{float:left;height:40px}#menu div a{color:#777777;padding:10px 30px;display:block;font-weight:bold}#menu div:hover{background-color:#cccccc}#menu div:hover a{color:#000000;text-decoration:none}#menu .selected,#menu .selected:hover{background-color:#e5e5e5}#menu .selected a{color:#000000}#channel_info{padding-bottom:20px}.signed_in_channel_header{display:inline-block}.public_private_icon{display:inline-block}.signed_in_channel_header{width:300px;height:10px}#list_progress_bar{width:300px;height:10px}.public_channel_box{margin:5px;border-radius:7px;height:300px;border:solid 1px red;display:inline-block;width:30%;vertical-align:top}.public_channel_inner{margin-left:10px;margin-right:5px}.public_channel_name{height:11px;font-size:1.3em;font-weight:bold;color:#2565A5}.public_channel_user{height:15px;margin-left:7px;font-size:0.9em}.progressbar{height:10px}.public_channel_desc{height:140px;word-break:break-all}.public_channel_url{height:10px}.public_channel_tags{height:57px;margin-bottom:10px;overflow:hidden}.public_channel_thumbnail{position:absolute;border:2px solid red;display:none}h1.channel_info{margin:0;padding-top:10px}div.list_tags{padding-top:20px}.channelLinks{padding:0 0 0 0;margin-bottom:15px}.channelLinks li{padding:7px;border:1px solid #ccc;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px;display:inline;margin:0 0 0 0;list-style:none}#comments{width:100%}#commentsmain{float:left;width:190px;background-color:#fffff9;border:1px dashed #d0d0d0;padding:5px;margin-right:16px;overflow:hidden;display:none}.commentlink{float:left;width:100%}#public_statuses{width:455px;height:380px;overflow:auto;font-size:1.5em}#public_statuses div{margin-left:15px}.statusIFrame{border:1px solid #ccc;background-color:#ffffff}.userlogin{display:none}.login_info{font-weight:bold;text-align:right;font-size:12px}.round{-moz-border-radius:7px;-webkit-border-radius:7px}.text_center{text-align:center}.big{font-size:18px}.large{font-size:20px}.xlarge{font-size:30px}.small{font-size:12px}.action{margin-right:20px;position:relative;top:35px;font-weight:bold;padding:10px}.action_reverse{margin-right:20px;position:relative;top:35px;font-weight:bold;background-color:#d62020;padding:8px;color:#000000}.action_reverse a{color:#FFFFFF}.section_header_reverse{font-weight:bold;color:#FFFFFF;background-color:#d62020;padding:8px}.nicetable{font-size:14px;border:1px solid #bbbbbb}.nicetable-borderless{font-size:14px;border:none}.nicetable-borderless p{margin-left:20px;margin-top:5px;margin-bottom:10px}.nicetable-borderless h3{margin-bottom:0}.nicetable-borderless h3.signed_in_channel_header{margin-bottom:10px}.nicetable .header{font-weight:bold;background-color:#e5e5e5}.nicetable .header td{padding-top:3px}.nicetable td{padding:2px 10px;border-bottom:1px solid #bbbbbb;word-wrap:word}.nicetable .stripe{background-color:#f9f9f9}.nicetable .disabled{background-color:#eee}.nicetable .disabled a{color:#888}.fulltable{width:95%}.fullform{width:100%;margin-bottom:1.5em}.deletecol{width:1em}.table_no_header{font-size:14px}.table_no_header td{padding:2px 10px}.table_no_header .left{font-weight:bold}.max_width_400{max-width:40;word-wrap:break-word}.helplink{float:right;margin-top:3px}.votediv,.votedivphoto,.votedivlink{color:#3478e3}.votedivlink{padding-right:20px}.votediv{float:right;display:none}.voteicon{padding:2px;background:#f8f8f8;border:1px solid #ddd;cursor:pointer}.voteicon:hover{text-decoration:none}.voteicon img{position:relative;top:3px}.nestedcomment{padding-left:30px}.commenttable{padding:0;margin:0;width:100%}.commenttable td{padding:4px 10px 4px 5px}.commentchannel{color:#f08600;font-weight:bold}.commentbody{color:#333333}.commentdiv{width:100%;padding:5px 0 5px 0;font-size:12px;border-top:1px solid #aaa}.gravatar{border:1px solid #999}.noavatar{width:50px;height:50px;border:1px solid #ddd;color:#ddd;text-align:center}.noavatartext{padding-top:5px}.prettydate{color:#aaa}.username a{color:#3478E3;font-weight:bold}.timeago{font-size:0.8em;color:#ccc}.pagination{font-size:14px}.centerme{display:table;margin:0 auto}.fixedwidth{width:960px;display:table;margin:0 auto}.code{margin:10px 0;background-color:#fafafa;white-space:pre-wrap;font:12px Monaco, Lucida Console, monospace;color:#000000;border:1px solid #bbbbbb;padding:10px}.apps{padding:20px 30px 30px 30px;font-size:20px;float:left;text-align:center;margin:0 auto;width:150px}input[type="text"].shortfield{width:30px}input[type="text"].midfield{width:120px}textarea.tweet{margin-top:0.5em;width:40em;height:3em}.errorExplanation{width:95%;background-color:#ffffe0;display:table;margin-bottom:20px;padding:10px;border:1px solid #aaaaaa}#error{color:red}.field_with_errors{display:inline}.warning_box{margin:15px 0 15px 0;padding:10px;background-color:#fc3;color:#000;border:1px solid #f90}#wrapper{min-height:100%;position:relative}#header{margin:0 auto}#head_wrap{width:940px;margin:0 auto;padding-left:10px;padding-right:10px}#menuwrap{padding:0 0;clear:both}#content{width:975px;padding:23px 0 58px 0;min-height:400px}.content{width:975px;padding:23px 0 58px 0;min-height:400px}#maincontent{float:left;width:980px;padding-bottom:20px;margin-left:10px;overflow:false}#maincontent.thin{width:400px}#maincontent.medium{width:500px}#maincontent .thinghttptable{table-layout:fixed;width:400px;word-wrap:break-word}#maincontent .thinghttptable .url{width:100px}#maincontent .thinghttptable .apikey{width:80px}#maincontent.medium .table_no_header{table-layout:fixed;width:440px;word-wrap:break-word}#maincontent.medium .table_no_header .left{width:180px}input#upload_csv{padding-top:5px;margin:20px 0}#sidebar{font-size:14px;width:50%;padding-right:10px;margin-top:10px;margin-left:460px;margin-right:0;border:1px solid #ccc;border-radius:15px;-webkit-border-radius:15px;-moz-border-radius:15px}#sidebar.wide{width:520px}#sidebar.medium{width:470px}#sidebar.narrow{width:470px;margin-left:520px}#sidebar ul{list-style:none;margin:15px 20px 30px 0}#sidebar ul li ul li{margin:0}#sidebar h2{color:#666;margin:0 0 6px 0;padding:0 0}#sidebar .helplink{float:right;margin-top:3px;margin-right:5px}#footer{clear:both;text-align:center;font-size:16px;font-family:Georgia, serif;padding-bottom:5px}#footer a{color:#0867A3}#footer a:hover{color:#0066ff;text-decoration:underline}#footer .copy{padding:5px;font-size:11px}#footer .copy a{color:#D62020;text-decoration:underline}#footer .copy a:hover{color:#890707;text-decoration:underline}.FL{float:left}.FR{float:right}.FN{float:none}.DT{display:table}.CL{clear:left}.CR{clear:right}.CB{clear:both}.UL{text-decoration:underline}.TAR{text-align:right}.TAC{text-align:center}.VAT{vertical-align:top}.PB10{padding-bottom:10px}.PR20{padding-right:20px}.PL20{padding-left:20px}.PL30{padding-left:30px}.MT10{margin-top:5px}.MR20{margin-right:20px}.MR60{margin-right:60px;margin-bottom:20px}.ML20{margin-left:20px}.ML60{margin-left:60px}.W50{width:50%}.W100{width:100%}.left20{position:relative;left:-20px}.up2{position:relative;top:-2px}.up20{position:relative;top:-20px}input.video_narrow{width:100px}#front{text-align:center}#features{clear:both}.feature{float:left;width:300px;margin-right:0}.feature h1{font-size:20px;color:#0867A3}#feature_signup a{border-bottom:3px solid #d62020;text-decoration:none;font-weight:bold}#feature_signup a:hover{text-decoration:none}#nav{list-style:none;padding:0 10px 0 92px;margin:0}#nav li{float:left;margin:0px 0px 0px 10px;padding:0px 15px 0px 0px;position:relative;font-size:14px;line-height:1.4;zoom:1}#nav li:last-child{padding:0}#nav .current-cat a,#nav .current_page_item a{color:#d62020;border-bottom:5px solid #2565A5}#nav .current-cat li a,#nav .current_page_item li a{color:#000}#nav .current-cat li a:hover,#nav .current_page_item li a:hover{color:#d62020;border-bottom:5px solid #2565A5}#nav li a{text-transform:uppercase;font-weight:bold;text-decoration:none;color:#000;border:none;text-decoration:none;float:left;border-bottom:5px solid #FFFFFF}#nav li a:hover{color:#d62020;border-bottom:5px solid #aaa}#nav li span{width:12px;height:20px;background:url("arrow-down.gif") no-repeat left 7px;margin:0;padding:0;position:absolute;right:0;top:0}#nav ul{display:none}#nav li span.child{width:12px;height:20px;background:url("arrow-right.gif") no-repeat left 10px;margin:0;padding:0;position:absolute;right:0;top:0}#nav li a.rss{background:url(rss_feed.png) right 0px no-repeat;padding:0px 30px 0px 0}#nav li a.rss:hover{background:url(rss_feed.png) right -24px no-repeat;padding:0px 30px 0px 0;border-bottom:0 solid #aaa}.ui-widget{font-size:.8em}.ui-widget-header{border:1px solid #0867A3;background:#0867a3 none top right no-repeat}.ui-progressbar{height:5px}.ui-progressbar-value{background-color:green}.ui-widget-content a{color:blue;text-decoration:underline;margin:0}.ui-widget-content p{margin:0 0 10px 10px}.column{width:470px;float:left;padding-bottom:50px;padding-left:5px}.portlet{margin:0 1em 1em 0}.portlet-header{margin:0.3em;padding:7px 7px 7px 7px}.portlet-header .ui-icon{float:right;margin-top:-2px;cursor:pointer;cursor:hand}.portlet-content{padding:0.4em}.ui-sortable-placeholder{border:1px dotted black;visibility:visible !important;height:50px !important}.ui-sortable-placeholder *{visibility:hidden}.buttonlets{float:left;overflow:hidden;max-width:95px}.tweetButton{width:80px}.facebookButton{width:85px}.googleplusButton{width:70px}.padded{margin-top:2px}.ui-button{height:19px;line-height:1em}.ui-button-text-only .ui-button-text{padding:0.2em 1em 0.2em 0.4em;font-size:12px}.ui-state-active{border:1px solid #2565a5;background:#ddd none 50% 50% repeat-x;color:#2565a5}.ui-state-default{border:1px solid #ccc;color:#2565a5}.ui-state-hover{background:#ccc none 50% 50% repeat-x}.topLink{font-size:16px}.developerlink{padding:7px;margin-left:10px;border-bottom-left-radius:15px;border-bottom-right-radius:15px;-webkit-border-bottom-left-radius:15px;-webkit-border-bottom-right-radius:15px;-moz-border-bottom-left-radius:15px;-moz-border-bottom-right-radius:15px;background-color:#aaa}.addpluginlink{color:white;padding:7px;margin-left:10px;border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;background-color:#aaa;cursor:pointer}.addpluginlink:hover{background-color:#ccc}.pluginrectangle{display:none;background-color:#aaa;border-radius:5px;position:absolute;height:70%;width:100%;top:30px;right:0}.developerlink:hover{background-color:#ccc}.developerlink a{color:white;text-decoration:none}.channelInfo{max-width:500px}.channelDescription{width:450px;height:60px}.socialButtons{float:right;display:inline}.dev-info-dialog{border:2px solid #bbb}.dev-info-dialog .ui-dialog-titlebar{background-color:#aaa;color:white}.dev-info-dialog a{text-decoration:underline}.ui-tabs{height:100%}.dev-info-dialog ul{list-style-type:none;background-color:whitesmoke}#devInfo{font-size:1.2em}.dev-info-dialog ul li{display:inline;list-style-type:none}.dev_info_table1{margin-bottom:10px}.dev_info_table2{margin-left:10px}.dev_info_table2 td{max-width:300px}.watchButtonLabel{white-space:nowrap;padding-right:10px}.watchButtonImage{float:left;background-position:left;background-image:url("eye.png");background-repeat:no-repeat;width:19px;height:16px}.watchButtonPadding{padding-right:5px}.chartOptions{display:none}.fade{display:none;font-size:1.2em}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-hover a,.ui-state-hover a:hover{color:#d82020;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #d82020;background:#f5cece url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#d82020}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#d82020;text-decoration:none}.ui-widget :active{outline:none}.ui-tabs .ui-tabs-panel{padding-top:0}.addportlet{padding:5px;width:50px;margin:5px;border-radius:5px;border:2px solid red;cursor:pointer;display:inline-block}.channel_stats_location{clear:right;float:right;width:475px;padding-top:23px}.channel_stats_text{font-weight:bold;font-size:1.2em}.channel_time_text{color:black;font-size:1em}.recent_status{font-family:sans-serif;margin:4px}.timeago{font-size:0.8em;color:#ccc;margin-left:10px}.com{color:#93a1a1}.lit{color:#195f91}.pun,.opn,.clo{color:#93a1a1}.fun{color:#dc322f}.str,.atv{color:#D14}.kwd,.prettyprint .tag{color:#1e347b}.typ,.atn,.dec,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:20px;text-shadow:0 1px 0 #fff}.affix-top,.affix{position:static}#bootstrap-sidebar{background-color:#eee;border:1px solid #bbb;border-radius:5px;padding:2px 0}#bootstrap-sidebar li a:hover{background-color:#fafafa}#bootstrap-sidebar li.active{border:0 #666 solid;border-right-width:4px}@media (min-width: 979px){#bootstrap-sidebar.affix-top,#bootstrap-sidebar.affix{position:fixed;top:30px;width:228px}} diff --git a/public/assets/application-cef60c60a5550b2bf95cf2102b747be8.css.gz b/public/assets/application-cef60c60a5550b2bf95cf2102b747be8.css.gz new file mode 100644 index 0000000..3b1a4d6 Binary files /dev/null and b/public/assets/application-cef60c60a5550b2bf95cf2102b747be8.css.gz differ diff --git a/public/assets/eye-b67d3d940541ae7d0b469ed20ee92fe3.png b/public/assets/eye-b67d3d940541ae7d0b469ed20ee92fe3.png new file mode 100644 index 0000000..209f8c2 Binary files /dev/null and b/public/assets/eye-b67d3d940541ae7d0b469ed20ee92fe3.png differ diff --git a/public/assets/eye.png b/public/assets/eye.png new file mode 100644 index 0000000..209f8c2 Binary files /dev/null and b/public/assets/eye.png differ diff --git a/public/assets/flag_gray-319110a59d1d75cad2d8f29af88fdb23.gif b/public/assets/flag_gray-319110a59d1d75cad2d8f29af88fdb23.gif new file mode 100644 index 0000000..b0a565a Binary files /dev/null and b/public/assets/flag_gray-319110a59d1d75cad2d8f29af88fdb23.gif differ diff --git a/public/assets/flag_red-16607fd54284010c4e95d5e9a3935b40.gif b/public/assets/flag_red-16607fd54284010c4e95d5e9a3935b40.gif new file mode 100644 index 0000000..1c4d62d Binary files /dev/null and b/public/assets/flag_red-16607fd54284010c4e95d5e9a3935b40.gif differ diff --git a/public/assets/front-b28e4f9d550ff0101a0140b1fb1ec1da.png b/public/assets/front-b28e4f9d550ff0101a0140b1fb1ec1da.png new file mode 100644 index 0000000..265e75c Binary files /dev/null and b/public/assets/front-b28e4f9d550ff0101a0140b1fb1ec1da.png differ diff --git a/public/assets/icon_location_24-40aef0eb9d6824f7538c1056c90a2156.png b/public/assets/icon_location_24-40aef0eb9d6824f7538c1056c90a2156.png new file mode 100644 index 0000000..e4df926 Binary files /dev/null and b/public/assets/icon_location_24-40aef0eb9d6824f7538c1056c90a2156.png differ diff --git a/public/assets/icon_rss-3ce0d86e00a9e937993988e73720950e.gif b/public/assets/icon_rss-3ce0d86e00a9e937993988e73720950e.gif new file mode 100644 index 0000000..316f769 Binary files /dev/null and b/public/assets/icon_rss-3ce0d86e00a9e937993988e73720950e.gif differ diff --git a/public/assets/icons/InfoBox-54072dd9794a709a9fee5ab80d4be545.png b/public/assets/icons/InfoBox-54072dd9794a709a9fee5ab80d4be545.png new file mode 100755 index 0000000..dd413d9 Binary files /dev/null and b/public/assets/icons/InfoBox-54072dd9794a709a9fee5ab80d4be545.png differ diff --git a/public/assets/icons/Locked-84572b6d8c7a390e424483b16f28410f.png b/public/assets/icons/Locked-84572b6d8c7a390e424483b16f28410f.png new file mode 100644 index 0000000..6f285c7 Binary files /dev/null and b/public/assets/icons/Locked-84572b6d8c7a390e424483b16f28410f.png differ diff --git a/public/assets/icons/Public_32-2bcfb892862a4396e3a5593a5e1df202.png b/public/assets/icons/Public_32-2bcfb892862a4396e3a5593a5e1df202.png new file mode 100644 index 0000000..4db4fee Binary files /dev/null and b/public/assets/icons/Public_32-2bcfb892862a4396e3a5593a5e1df202.png differ diff --git a/public/assets/icons/Unlocked-226c08041c55d88ecf7898dffe6568aa.png b/public/assets/icons/Unlocked-226c08041c55d88ecf7898dffe6568aa.png new file mode 100644 index 0000000..8b5b5e0 Binary files /dev/null and b/public/assets/icons/Unlocked-226c08041c55d88ecf7898dffe6568aa.png differ diff --git a/public/assets/icons/delete-9a7fbc7ba573f4ab735f66bc17466a84.png b/public/assets/icons/delete-9a7fbc7ba573f4ab735f66bc17466a84.png new file mode 100755 index 0000000..08f2493 Binary files /dev/null and b/public/assets/icons/delete-9a7fbc7ba573f4ab735f66bc17466a84.png differ diff --git a/public/assets/images/eye.png b/public/assets/images/eye.png new file mode 100644 index 0000000..209f8c2 Binary files /dev/null and b/public/assets/images/eye.png differ diff --git a/public/assets/images/ui-bg_diagonals-thick_18_b81900_40x40-7cff5779324125bfa623755a21cb7d08.png b/public/assets/images/ui-bg_diagonals-thick_18_b81900_40x40-7cff5779324125bfa623755a21cb7d08.png new file mode 100755 index 0000000..954e22d Binary files /dev/null and b/public/assets/images/ui-bg_diagonals-thick_18_b81900_40x40-7cff5779324125bfa623755a21cb7d08.png differ diff --git a/public/assets/images/ui-bg_diagonals-thick_20_666666_40x40-e3476d26e53f4b2bdba1cbd4216bd169.png b/public/assets/images/ui-bg_diagonals-thick_20_666666_40x40-e3476d26e53f4b2bdba1cbd4216bd169.png new file mode 100755 index 0000000..64ece57 Binary files /dev/null and b/public/assets/images/ui-bg_diagonals-thick_20_666666_40x40-e3476d26e53f4b2bdba1cbd4216bd169.png differ diff --git a/public/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png b/public/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png new file mode 100644 index 0000000..64ece57 Binary files /dev/null and b/public/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png differ diff --git a/public/assets/images/ui-bg_flat_10_000000_40x100-b4d9562e67d66d83845d2edeaae222d7.png b/public/assets/images/ui-bg_flat_10_000000_40x100-b4d9562e67d66d83845d2edeaae222d7.png new file mode 100755 index 0000000..abdc010 Binary files /dev/null and b/public/assets/images/ui-bg_flat_10_000000_40x100-b4d9562e67d66d83845d2edeaae222d7.png differ diff --git a/public/assets/images/ui-bg_glass_100_f6f6f6_1x400-4d37c970a424e84d47dd48ae788eaef8.png b/public/assets/images/ui-bg_glass_100_f6f6f6_1x400-4d37c970a424e84d47dd48ae788eaef8.png new file mode 100755 index 0000000..9b383f4 Binary files /dev/null and b/public/assets/images/ui-bg_glass_100_f6f6f6_1x400-4d37c970a424e84d47dd48ae788eaef8.png differ diff --git a/public/assets/images/ui-bg_glass_100_f6f6f6_1x400.png b/public/assets/images/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100644 index 0000000..9b383f4 Binary files /dev/null and b/public/assets/images/ui-bg_glass_100_f6f6f6_1x400.png differ diff --git a/public/assets/images/ui-bg_glass_100_fdf5ce_1x400-657936ddb303bcc8c34554da5279debe.png b/public/assets/images/ui-bg_glass_100_fdf5ce_1x400-657936ddb303bcc8c34554da5279debe.png new file mode 100755 index 0000000..a23baad Binary files /dev/null and b/public/assets/images/ui-bg_glass_100_fdf5ce_1x400-657936ddb303bcc8c34554da5279debe.png differ diff --git a/public/assets/images/ui-bg_glass_65_ffffff_1x400-5f18db79610dfa0b148ff6335bbc42cb.png b/public/assets/images/ui-bg_glass_65_ffffff_1x400-5f18db79610dfa0b148ff6335bbc42cb.png new file mode 100755 index 0000000..42ccba2 Binary files /dev/null and b/public/assets/images/ui-bg_glass_65_ffffff_1x400-5f18db79610dfa0b148ff6335bbc42cb.png differ diff --git a/public/assets/images/ui-bg_glass_65_ffffff_1x400.png b/public/assets/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000..42ccba2 Binary files /dev/null and b/public/assets/images/ui-bg_glass_65_ffffff_1x400.png differ diff --git a/public/assets/images/ui-bg_gloss-wave_35_f6a828_500x100-93fadea558da2231315ae756b3be6bbf.png b/public/assets/images/ui-bg_gloss-wave_35_f6a828_500x100-93fadea558da2231315ae756b3be6bbf.png new file mode 100755 index 0000000..39d5824 Binary files /dev/null and b/public/assets/images/ui-bg_gloss-wave_35_f6a828_500x100-93fadea558da2231315ae756b3be6bbf.png differ diff --git a/public/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100-4310274c0febae96f7f3d2f54b0a4f42.png b/public/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100-4310274c0febae96f7f3d2f54b0a4f42.png new file mode 100755 index 0000000..f127367 Binary files /dev/null and b/public/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100-4310274c0febae96f7f3d2f54b0a4f42.png differ diff --git a/public/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/public/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100644 index 0000000..f127367 Binary files /dev/null and b/public/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png differ diff --git a/public/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100-21008ee33c710d7e484d7f88f2c7dc21.png b/public/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100-21008ee33c710d7e484d7f88f2c7dc21.png new file mode 100755 index 0000000..359397a Binary files /dev/null and b/public/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100-21008ee33c710d7e484d7f88f2c7dc21.png differ diff --git a/public/assets/images/ui-icons_222222_256x240-d83eeaaf84f04ca2c5d6a684bc7629af.png b/public/assets/images/ui-icons_222222_256x240-d83eeaaf84f04ca2c5d6a684bc7629af.png new file mode 100755 index 0000000..b273ff1 Binary files /dev/null and b/public/assets/images/ui-icons_222222_256x240-d83eeaaf84f04ca2c5d6a684bc7629af.png differ diff --git a/public/assets/images/ui-icons_228ef1_256x240-65e412c112f4e7ee270afb71005fd17d.png b/public/assets/images/ui-icons_228ef1_256x240-65e412c112f4e7ee270afb71005fd17d.png new file mode 100755 index 0000000..a641a37 Binary files /dev/null and b/public/assets/images/ui-icons_228ef1_256x240-65e412c112f4e7ee270afb71005fd17d.png differ diff --git a/public/assets/images/ui-icons_ef8c08_256x240-8b462cb27e07227bac8bd0020d9933e4.png b/public/assets/images/ui-icons_ef8c08_256x240-8b462cb27e07227bac8bd0020d9933e4.png new file mode 100755 index 0000000..85e63e9 Binary files /dev/null and b/public/assets/images/ui-icons_ef8c08_256x240-8b462cb27e07227bac8bd0020d9933e4.png differ diff --git a/public/assets/images/ui-icons_ef8c08_256x240.png b/public/assets/images/ui-icons_ef8c08_256x240.png new file mode 100644 index 0000000..85e63e9 Binary files /dev/null and b/public/assets/images/ui-icons_ef8c08_256x240.png differ diff --git a/public/assets/images/ui-icons_ffd27a_256x240-3d95bb913fb70688654b00e8ed1eb247.png b/public/assets/images/ui-icons_ffd27a_256x240-3d95bb913fb70688654b00e8ed1eb247.png new file mode 100755 index 0000000..e117eff Binary files /dev/null and b/public/assets/images/ui-icons_ffd27a_256x240-3d95bb913fb70688654b00e8ed1eb247.png differ diff --git a/public/assets/images/ui-icons_ffffff_256x240-2066cf4b1373355dbf4a2031099e1a04.png b/public/assets/images/ui-icons_ffffff_256x240-2066cf4b1373355dbf4a2031099e1a04.png new file mode 100755 index 0000000..42f8f99 Binary files /dev/null and b/public/assets/images/ui-icons_ffffff_256x240-2066cf4b1373355dbf4a2031099e1a04.png differ diff --git a/public/assets/images/ui-icons_ffffff_256x240.png b/public/assets/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000..42f8f99 Binary files /dev/null and b/public/assets/images/ui-icons_ffffff_256x240.png differ diff --git a/public/assets/manifest-27c2ec8d97bd8487cae01bba17cdddb9.json b/public/assets/manifest-27c2ec8d97bd8487cae01bba17cdddb9.json new file mode 100644 index 0000000..19eabd7 --- /dev/null +++ b/public/assets/manifest-27c2ec8d97bd8487cae01bba17cdddb9.json @@ -0,0 +1 @@ +{"files":{"GitHub_ThingSpeak_API-f39bba3caddbf4af63e208b8552a98ac.jpg":{"logical_path":"GitHub_ThingSpeak_API.jpg","mtime":"2014-02-08T20:02:14-05:00","size":26303,"digest":"f39bba3caddbf4af63e208b8552a98ac"},"ThingSpeak_Logo-3139b15204b5af565fca3a5f342ef19c.png":{"logical_path":"ThingSpeak_Logo.png","mtime":"2014-02-08T20:02:14-05:00","size":9258,"digest":"3139b15204b5af565fca3a5f342ef19c"},"eye-b67d3d940541ae7d0b469ed20ee92fe3.png":{"logical_path":"eye.png","mtime":"2014-02-08T20:02:14-05:00","size":3294,"digest":"b67d3d940541ae7d0b469ed20ee92fe3"},"flag_gray-319110a59d1d75cad2d8f29af88fdb23.gif":{"logical_path":"flag_gray.gif","mtime":"2014-02-08T20:02:14-05:00","size":983,"digest":"319110a59d1d75cad2d8f29af88fdb23"},"flag_red-16607fd54284010c4e95d5e9a3935b40.gif":{"logical_path":"flag_red.gif","mtime":"2014-02-08T20:02:14-05:00","size":987,"digest":"16607fd54284010c4e95d5e9a3935b40"},"front-b28e4f9d550ff0101a0140b1fb1ec1da.png":{"logical_path":"front.png","mtime":"2014-02-08T20:02:14-05:00","size":17717,"digest":"b28e4f9d550ff0101a0140b1fb1ec1da"},"icon_location_24-40aef0eb9d6824f7538c1056c90a2156.png":{"logical_path":"icon_location_24.png","mtime":"2014-02-08T20:01:43-05:00","size":618,"digest":"40aef0eb9d6824f7538c1056c90a2156"},"icon_rss-3ce0d86e00a9e937993988e73720950e.gif":{"logical_path":"icon_rss.gif","mtime":"2014-02-08T20:02:14-05:00","size":1008,"digest":"3ce0d86e00a9e937993988e73720950e"},"icons/InfoBox-54072dd9794a709a9fee5ab80d4be545.png":{"logical_path":"icons/InfoBox.png","mtime":"2014-02-08T20:02:14-05:00","size":837,"digest":"54072dd9794a709a9fee5ab80d4be545"},"icons/Locked-84572b6d8c7a390e424483b16f28410f.png":{"logical_path":"icons/Locked.png","mtime":"2014-02-08T20:02:14-05:00","size":1882,"digest":"84572b6d8c7a390e424483b16f28410f"},"icons/Public_32-2bcfb892862a4396e3a5593a5e1df202.png":{"logical_path":"icons/Public_32.png","mtime":"2014-02-08T20:02:14-05:00","size":4788,"digest":"2bcfb892862a4396e3a5593a5e1df202"},"icons/Unlocked-226c08041c55d88ecf7898dffe6568aa.png":{"logical_path":"icons/Unlocked.png","mtime":"2014-02-08T20:02:14-05:00","size":1652,"digest":"226c08041c55d88ecf7898dffe6568aa"},"icons/delete-9a7fbc7ba573f4ab735f66bc17466a84.png":{"logical_path":"icons/delete.png","mtime":"2014-02-08T20:02:14-05:00","size":715,"digest":"9a7fbc7ba573f4ab735f66bc17466a84"},"my_house_status_update-526a896242134f12bf2882dfad48fe24.png":{"logical_path":"my_house_status_update.png","mtime":"2014-02-08T20:02:14-05:00","size":13437,"digest":"526a896242134f12bf2882dfad48fe24"},"rails-6a9a73b3eeba7d35c79c3de6fc98b6f1.png":{"logical_path":"rails.png","mtime":"2014-02-08T20:02:14-05:00","size":6646,"digest":"6a9a73b3eeba7d35c79c3de6fc98b6f1"},"react-99715cc1aac81b13fdc4384378c9cf0e.png":{"logical_path":"react.png","mtime":"2014-02-08T20:02:14-05:00","size":2996,"digest":"99715cc1aac81b13fdc4384378c9cf0e"},"scheduled_thinghttp-b525411c648770d5252475ab92925006.png":{"logical_path":"scheduled_thinghttp.png","mtime":"2014-02-08T20:02:14-05:00","size":8677,"digest":"b525411c648770d5252475ab92925006"},"shading-4c8cafd8b85355f46eedb553ece6a663.png":{"logical_path":"shading.png","mtime":"2014-02-08T20:02:14-05:00","size":565,"digest":"4c8cafd8b85355f46eedb553ece6a663"},"social_sensor_network_logo-2cc4b27d8115a3efcf38c0c6539d06fe.png":{"logical_path":"social_sensor_network_logo.png","mtime":"2014-02-08T20:02:14-05:00","size":15370,"digest":"2cc4b27d8115a3efcf38c0c6539d06fe"},"social_sensor_network_main-f2114a6f96a027de3c3b39aefd11a34b.png":{"logical_path":"social_sensor_network_main.png","mtime":"2014-02-08T20:02:14-05:00","size":132931,"digest":"f2114a6f96a027de3c3b39aefd11a34b"},"talkback-a8f0046a06cddead53bfe73e0a1b11b1.png":{"logical_path":"talkback.png","mtime":"2014-02-08T20:02:14-05:00","size":5183,"digest":"a8f0046a06cddead53bfe73e0a1b11b1"},"thinghttp-b22d0641869d4b49e8fdc1441d19bd9d.png":{"logical_path":"thinghttp.png","mtime":"2014-02-08T20:02:14-05:00","size":5918,"digest":"b22d0641869d4b49e8fdc1441d19bd9d"},"thingtweet-2f829197927298b1eb724a072adb072a.png":{"logical_path":"thingtweet.png","mtime":"2014-02-08T20:02:14-05:00","size":4075,"digest":"2f829197927298b1eb724a072adb072a"},"tweetcontrol-5fa1225bb39f188b215d5897b37c2c18.png":{"logical_path":"tweetcontrol.png","mtime":"2014-02-08T20:02:14-05:00","size":13429,"digest":"5fa1225bb39f188b215d5897b37c2c18"},"application-9a8391e7623b717b5e3815c9802c8c19.js":{"logical_path":"application.js","mtime":"2014-02-09T22:53:12-05:00","size":194479,"digest":"9a8391e7623b717b5e3815c9802c8c19"},"application-cef60c60a5550b2bf95cf2102b747be8.css":{"logical_path":"application.css","mtime":"2014-01-23T13:40:31-05:00","size":57211,"digest":"cef60c60a5550b2bf95cf2102b747be8"},"images/ui-bg_diagonals-thick_18_b81900_40x40-7cff5779324125bfa623755a21cb7d08.png":{"logical_path":"images/ui-bg_diagonals-thick_18_b81900_40x40.png","mtime":"2014-02-08T20:01:44-05:00","size":260,"digest":"7cff5779324125bfa623755a21cb7d08"},"images/ui-bg_diagonals-thick_20_666666_40x40-e3476d26e53f4b2bdba1cbd4216bd169.png":{"logical_path":"images/ui-bg_diagonals-thick_20_666666_40x40.png","mtime":"2014-02-08T20:01:44-05:00","size":251,"digest":"e3476d26e53f4b2bdba1cbd4216bd169"},"images/ui-bg_flat_10_000000_40x100-b4d9562e67d66d83845d2edeaae222d7.png":{"logical_path":"images/ui-bg_flat_10_000000_40x100.png","mtime":"2014-02-08T20:02:14-05:00","size":178,"digest":"b4d9562e67d66d83845d2edeaae222d7"},"images/ui-bg_glass_100_f6f6f6_1x400-4d37c970a424e84d47dd48ae788eaef8.png":{"logical_path":"images/ui-bg_glass_100_f6f6f6_1x400.png","mtime":"2014-02-08T20:01:44-05:00","size":104,"digest":"4d37c970a424e84d47dd48ae788eaef8"},"images/ui-bg_glass_100_fdf5ce_1x400-657936ddb303bcc8c34554da5279debe.png":{"logical_path":"images/ui-bg_glass_100_fdf5ce_1x400.png","mtime":"2014-02-08T20:02:14-05:00","size":125,"digest":"657936ddb303bcc8c34554da5279debe"},"images/ui-bg_glass_65_ffffff_1x400-5f18db79610dfa0b148ff6335bbc42cb.png":{"logical_path":"images/ui-bg_glass_65_ffffff_1x400.png","mtime":"2014-02-08T20:02:14-05:00","size":105,"digest":"5f18db79610dfa0b148ff6335bbc42cb"},"images/ui-bg_gloss-wave_35_f6a828_500x100-93fadea558da2231315ae756b3be6bbf.png":{"logical_path":"images/ui-bg_gloss-wave_35_f6a828_500x100.png","mtime":"2014-02-08T20:02:14-05:00","size":3762,"digest":"93fadea558da2231315ae756b3be6bbf"},"images/ui-bg_highlight-soft_100_eeeeee_1x100-4310274c0febae96f7f3d2f54b0a4f42.png":{"logical_path":"images/ui-bg_highlight-soft_100_eeeeee_1x100.png","mtime":"2014-02-08T20:01:44-05:00","size":90,"digest":"4310274c0febae96f7f3d2f54b0a4f42"},"images/ui-bg_highlight-soft_75_ffe45c_1x100-21008ee33c710d7e484d7f88f2c7dc21.png":{"logical_path":"images/ui-bg_highlight-soft_75_ffe45c_1x100.png","mtime":"2014-02-08T20:02:14-05:00","size":129,"digest":"21008ee33c710d7e484d7f88f2c7dc21"},"images/ui-icons_222222_256x240-d83eeaaf84f04ca2c5d6a684bc7629af.png":{"logical_path":"images/ui-icons_222222_256x240.png","mtime":"2014-02-08T20:02:14-05:00","size":4369,"digest":"d83eeaaf84f04ca2c5d6a684bc7629af"},"images/ui-icons_228ef1_256x240-65e412c112f4e7ee270afb71005fd17d.png":{"logical_path":"images/ui-icons_228ef1_256x240.png","mtime":"2014-02-08T20:02:14-05:00","size":4369,"digest":"65e412c112f4e7ee270afb71005fd17d"},"images/ui-icons_ef8c08_256x240-8b462cb27e07227bac8bd0020d9933e4.png":{"logical_path":"images/ui-icons_ef8c08_256x240.png","mtime":"2014-02-08T20:02:14-05:00","size":4369,"digest":"8b462cb27e07227bac8bd0020d9933e4"},"images/ui-icons_ffd27a_256x240-3d95bb913fb70688654b00e8ed1eb247.png":{"logical_path":"images/ui-icons_ffd27a_256x240.png","mtime":"2014-02-08T20:02:14-05:00","size":4369,"digest":"3d95bb913fb70688654b00e8ed1eb247"},"images/ui-icons_ffffff_256x240-2066cf4b1373355dbf4a2031099e1a04.png":{"logical_path":"images/ui-icons_ffffff_256x240.png","mtime":"2014-02-08T20:02:14-05:00","size":4369,"digest":"2066cf4b1373355dbf4a2031099e1a04"},"application-29a45c9a6c794a4499e57fc0bb19c87f.css":{"logical_path":"application.css","mtime":"2014-02-04T19:11:10-05:00","size":57343,"digest":"29a45c9a6c794a4499e57fc0bb19c87f"},"application-7190531a22e0dae7db2fbb715e0d2fe5.css":{"logical_path":"application.css","mtime":"2014-02-10T15:32:08-05:00","size":56487,"digest":"7190531a22e0dae7db2fbb715e0d2fe5"},"thingspeak_logo-95d6e7cb7f17bbbc1526407176244ca8.png":{"logical_path":"thingspeak_logo.png","mtime":"2014-02-10T17:38:24-05:00","size":1609,"digest":"95d6e7cb7f17bbbc1526407176244ca8"},"application-6b141b11b3826cf03d9c3fa5cc7fd6dd.css":{"logical_path":"application.css","mtime":"2014-02-12T23:32:37-05:00","size":158587,"digest":"6b141b11b3826cf03d9c3fa5cc7fd6dd"},"application-1369f895a819b8f9cb3fdb98c04ee8e0.js":{"logical_path":"application.js","mtime":"2014-02-13T18:46:07-05:00","size":194482,"digest":"1369f895a819b8f9cb3fdb98c04ee8e0"},"application-c2ba8a3fdde171077398b657e1ae7906.css":{"logical_path":"application.css","mtime":"2014-02-13T21:26:08-05:00","size":157975,"digest":"c2ba8a3fdde171077398b657e1ae7906"}},"assets":{"GitHub_ThingSpeak_API.jpg":"GitHub_ThingSpeak_API-f39bba3caddbf4af63e208b8552a98ac.jpg","ThingSpeak_Logo.png":"ThingSpeak_Logo-3139b15204b5af565fca3a5f342ef19c.png","eye.png":"eye-b67d3d940541ae7d0b469ed20ee92fe3.png","flag_gray.gif":"flag_gray-319110a59d1d75cad2d8f29af88fdb23.gif","flag_red.gif":"flag_red-16607fd54284010c4e95d5e9a3935b40.gif","front.png":"front-b28e4f9d550ff0101a0140b1fb1ec1da.png","icon_location_24.png":"icon_location_24-40aef0eb9d6824f7538c1056c90a2156.png","icon_rss.gif":"icon_rss-3ce0d86e00a9e937993988e73720950e.gif","icons/InfoBox.png":"icons/InfoBox-54072dd9794a709a9fee5ab80d4be545.png","icons/Locked.png":"icons/Locked-84572b6d8c7a390e424483b16f28410f.png","icons/Public_32.png":"icons/Public_32-2bcfb892862a4396e3a5593a5e1df202.png","icons/Unlocked.png":"icons/Unlocked-226c08041c55d88ecf7898dffe6568aa.png","icons/delete.png":"icons/delete-9a7fbc7ba573f4ab735f66bc17466a84.png","my_house_status_update.png":"my_house_status_update-526a896242134f12bf2882dfad48fe24.png","rails.png":"rails-6a9a73b3eeba7d35c79c3de6fc98b6f1.png","react.png":"react-99715cc1aac81b13fdc4384378c9cf0e.png","scheduled_thinghttp.png":"scheduled_thinghttp-b525411c648770d5252475ab92925006.png","shading.png":"shading-4c8cafd8b85355f46eedb553ece6a663.png","social_sensor_network_logo.png":"social_sensor_network_logo-2cc4b27d8115a3efcf38c0c6539d06fe.png","social_sensor_network_main.png":"social_sensor_network_main-f2114a6f96a027de3c3b39aefd11a34b.png","talkback.png":"talkback-a8f0046a06cddead53bfe73e0a1b11b1.png","thinghttp.png":"thinghttp-b22d0641869d4b49e8fdc1441d19bd9d.png","thingtweet.png":"thingtweet-2f829197927298b1eb724a072adb072a.png","tweetcontrol.png":"tweetcontrol-5fa1225bb39f188b215d5897b37c2c18.png","application.js":"application-1369f895a819b8f9cb3fdb98c04ee8e0.js","application.css":"application-c2ba8a3fdde171077398b657e1ae7906.css","images/ui-bg_diagonals-thick_18_b81900_40x40.png":"images/ui-bg_diagonals-thick_18_b81900_40x40-7cff5779324125bfa623755a21cb7d08.png","images/ui-bg_diagonals-thick_20_666666_40x40.png":"images/ui-bg_diagonals-thick_20_666666_40x40-e3476d26e53f4b2bdba1cbd4216bd169.png","images/ui-bg_flat_10_000000_40x100.png":"images/ui-bg_flat_10_000000_40x100-b4d9562e67d66d83845d2edeaae222d7.png","images/ui-bg_glass_100_f6f6f6_1x400.png":"images/ui-bg_glass_100_f6f6f6_1x400-4d37c970a424e84d47dd48ae788eaef8.png","images/ui-bg_glass_100_fdf5ce_1x400.png":"images/ui-bg_glass_100_fdf5ce_1x400-657936ddb303bcc8c34554da5279debe.png","images/ui-bg_glass_65_ffffff_1x400.png":"images/ui-bg_glass_65_ffffff_1x400-5f18db79610dfa0b148ff6335bbc42cb.png","images/ui-bg_gloss-wave_35_f6a828_500x100.png":"images/ui-bg_gloss-wave_35_f6a828_500x100-93fadea558da2231315ae756b3be6bbf.png","images/ui-bg_highlight-soft_100_eeeeee_1x100.png":"images/ui-bg_highlight-soft_100_eeeeee_1x100-4310274c0febae96f7f3d2f54b0a4f42.png","images/ui-bg_highlight-soft_75_ffe45c_1x100.png":"images/ui-bg_highlight-soft_75_ffe45c_1x100-21008ee33c710d7e484d7f88f2c7dc21.png","images/ui-icons_222222_256x240.png":"images/ui-icons_222222_256x240-d83eeaaf84f04ca2c5d6a684bc7629af.png","images/ui-icons_228ef1_256x240.png":"images/ui-icons_228ef1_256x240-65e412c112f4e7ee270afb71005fd17d.png","images/ui-icons_ef8c08_256x240.png":"images/ui-icons_ef8c08_256x240-8b462cb27e07227bac8bd0020d9933e4.png","images/ui-icons_ffd27a_256x240.png":"images/ui-icons_ffd27a_256x240-3d95bb913fb70688654b00e8ed1eb247.png","images/ui-icons_ffffff_256x240.png":"images/ui-icons_ffffff_256x240-2066cf4b1373355dbf4a2031099e1a04.png","thingspeak_logo.png":"thingspeak_logo-95d6e7cb7f17bbbc1526407176244ca8.png"}} \ No newline at end of file diff --git a/public/assets/my_house_status_update-526a896242134f12bf2882dfad48fe24.png b/public/assets/my_house_status_update-526a896242134f12bf2882dfad48fe24.png new file mode 100644 index 0000000..4cb4421 Binary files /dev/null and b/public/assets/my_house_status_update-526a896242134f12bf2882dfad48fe24.png differ diff --git a/public/assets/rails-6a9a73b3eeba7d35c79c3de6fc98b6f1.png b/public/assets/rails-6a9a73b3eeba7d35c79c3de6fc98b6f1.png new file mode 100644 index 0000000..d5edc04 Binary files /dev/null and b/public/assets/rails-6a9a73b3eeba7d35c79c3de6fc98b6f1.png differ diff --git a/public/assets/shading-4c8cafd8b85355f46eedb553ece6a663.png b/public/assets/shading-4c8cafd8b85355f46eedb553ece6a663.png new file mode 100644 index 0000000..b0aaeca Binary files /dev/null and b/public/assets/shading-4c8cafd8b85355f46eedb553ece6a663.png differ diff --git a/public/assets/social_sensor_network_logo-2cc4b27d8115a3efcf38c0c6539d06fe.png b/public/assets/social_sensor_network_logo-2cc4b27d8115a3efcf38c0c6539d06fe.png new file mode 100644 index 0000000..690b8a4 Binary files /dev/null and b/public/assets/social_sensor_network_logo-2cc4b27d8115a3efcf38c0c6539d06fe.png differ diff --git a/public/assets/social_sensor_network_main-f2114a6f96a027de3c3b39aefd11a34b.png b/public/assets/social_sensor_network_main-f2114a6f96a027de3c3b39aefd11a34b.png new file mode 100644 index 0000000..a7a4562 Binary files /dev/null and b/public/assets/social_sensor_network_main-f2114a6f96a027de3c3b39aefd11a34b.png differ diff --git a/public/assets/thingspeak_logo-95d6e7cb7f17bbbc1526407176244ca8.png b/public/assets/thingspeak_logo-95d6e7cb7f17bbbc1526407176244ca8.png new file mode 100644 index 0000000..5f4fa2e Binary files /dev/null and b/public/assets/thingspeak_logo-95d6e7cb7f17bbbc1526407176244ca8.png differ diff --git a/public/favicon.ico b/public/favicon.ico index e69de29..6a4f004 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/resque/favicon.ico b/public/resque/favicon.ico new file mode 100644 index 0000000..5fb5deb Binary files /dev/null and b/public/resque/favicon.ico differ diff --git a/public/resque/idle.png b/public/resque/idle.png new file mode 100755 index 0000000..50ffda6 Binary files /dev/null and b/public/resque/idle.png differ diff --git a/public/resque/jquery-1.3.2.min.js b/public/resque/jquery-1.3.2.min.js new file mode 100644 index 0000000..b1ae21d --- /dev/null +++ b/public/resque/jquery-1.3.2.min.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="
";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/public/resque/jquery.relatize_date.js b/public/resque/jquery.relatize_date.js new file mode 100644 index 0000000..2fcfdbf --- /dev/null +++ b/public/resque/jquery.relatize_date.js @@ -0,0 +1,95 @@ +// All credit goes to Rick Olson. +(function($) { + $.fn.relatizeDate = function() { + return $(this).each(function() { + if ($(this).hasClass( 'relatized' )) return + $(this).text( $.relatizeDate(this) ).addClass( 'relatized' ) + }) + } + + $.relatizeDate = function(element) { + return $.relatizeDate.timeAgoInWords( new Date($(element).text()) ) + } + + // shortcut + $r = $.relatizeDate + + $.extend($.relatizeDate, { + shortDays: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ], + days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + shortMonths: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ], + months: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ], + + /** + * Given a formatted string, replace the necessary items and return. + * Example: Time.now().strftime("%B %d, %Y") => February 11, 2008 + * @param {String} format The formatted string used to format the results + */ + strftime: function(date, format) { + var day = date.getDay(), month = date.getMonth(); + var hours = date.getHours(), minutes = date.getMinutes(); + + var pad = function(num) { + var string = num.toString(10); + return new Array((2 - string.length) + 1).join('0') + string + }; + + return format.replace(/\%([aAbBcdHImMpSwyY])/g, function(part) { + switch(part[1]) { + case 'a': return $r.shortDays[day]; break; + case 'A': return $r.days[day]; break; + case 'b': return $r.shortMonths[month]; break; + case 'B': return $r.months[month]; break; + case 'c': return date.toString(); break; + case 'd': return pad(date.getDate()); break; + case 'H': return pad(hours); break; + case 'I': return pad((hours + 12) % 12); break; + case 'm': return pad(month + 1); break; + case 'M': return pad(minutes); break; + case 'p': return hours > 12 ? 'PM' : 'AM'; break; + case 'S': return pad(date.getSeconds()); break; + case 'w': return day; break; + case 'y': return pad(date.getFullYear() % 100); break; + case 'Y': return date.getFullYear().toString(); break; + } + }) + }, + + timeAgoInWords: function(targetDate, includeTime) { + return $r.distanceOfTimeInWords(targetDate, new Date(), includeTime); + }, + + /** + * Return the distance of time in words between two Date's + * Example: '5 days ago', 'about an hour ago' + * @param {Date} fromTime The start date to use in the calculation + * @param {Date} toTime The end date to use in the calculation + * @param {Boolean} Include the time in the output + */ + distanceOfTimeInWords: function(fromTime, toTime, includeTime) { + var delta = parseInt((toTime.getTime() - fromTime.getTime()) / 1000, 10); + if (delta < 60) { + return 'just now'; + } else if (delta < 120) { + return 'about a minute ago'; + } else if (delta < (45*60)) { + return (parseInt(delta / 60, 10)).toString() + ' minutes ago'; + } else if (delta < (120*60)) { + return 'about an hour ago'; + } else if (delta < (24*60*60)) { + return 'about ' + (parseInt(delta / 3600, 10)).toString() + ' hours ago'; + } else if (delta < (48*60*60)) { + return '1 day ago'; + } else { + var days = (parseInt(delta / 86400, 10)).toString(); + if (days > 5) { + var fmt = '%B %d, %Y' + if (includeTime) fmt += ' %I:%M %p' + return $r.strftime(fromTime, fmt); + } else { + return days + " days ago" + } + } + } + }) +})(jQuery); diff --git a/public/resque/poll.png b/public/resque/poll.png new file mode 100755 index 0000000..ca632c4 Binary files /dev/null and b/public/resque/poll.png differ diff --git a/public/resque/ranger.js b/public/resque/ranger.js new file mode 100644 index 0000000..0e1568f --- /dev/null +++ b/public/resque/ranger.js @@ -0,0 +1,78 @@ +$(function() { + var poll_interval = 2 + + var relatizer = function(){ + var dt = $(this).text(), relatized = $.relatizeDate(this) + if ($(this).parents("a").length > 0 || $(this).is("a")) { + $(this).relatizeDate() + if (!$(this).attr('title')) { + $(this).attr('title', dt) + } + } else { + $(this) + .text('') + .append( $('') + .append('' + dt + + '' + + relatized + '') ) + } + }; + + $('.time').each(relatizer); + + $('.time a.toggle_format .date_time').hide() + + var format_toggler = function(){ + $('.time a.toggle_format span').toggle() + $(this).attr('title', $('span:hidden',this).text()) + return false + }; + + $('.time a.toggle_format').click(format_toggler); + + $('.backtrace').click(function() { + $(this).next().toggle() + return false + }) + + $('a[rel=poll]').click(function() { + var href = $(this).attr('href') + $(this).parent().text('Starting...') + $("#main").addClass('polling') + + setInterval(function() { + $.ajax({dataType: 'text', type: 'get', url: href, + success: function(data) { + $('#main').html(data) + $('#main .time').relatizeDate() + }, + error: function(data) { + if (data.status == '401') { window.location.href = '/' } + } + }) + }, poll_interval * 1000) + + return false + }) + + $('ul.failed li').hover(function() { + $(this).addClass('hover'); + }, function() { + $(this).removeClass('hover'); + }) + + $('ul.failed a[rel=retry]').click(function() { + var href = $(this).attr('href'); + $(this).text('Retrying...'); + var parent = $(this).parent(); + $.ajax({dataType: 'text', type: 'get', url: href, success: function(data) { + parent.html('Retried ' + data + ''); + relatizer.apply($('.time', parent)); + $('.date_time', parent).hide(); + $('a.toggle_format span', parent).click(format_toggler); + }}); + return false; + }) + + +}) \ No newline at end of file diff --git a/public/resque/reset.css b/public/resque/reset.css new file mode 100644 index 0000000..b026b6d --- /dev/null +++ b/public/resque/reset.css @@ -0,0 +1,44 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +dl, dt, dd, ul, li, +form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + border: 0; + outline: 0; + font-weight: inherit; + font-style: normal; + font-size: 100%; + font-family: inherit; +} + +body { + line-height: 1; +} + +ul { + list-style: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +caption, th, td { + text-align: left; + font-weight: normal; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content: ""; +} + +blockquote, q { + quotes: "" ""; +} \ No newline at end of file diff --git a/public/resque/style.css b/public/resque/style.css new file mode 100644 index 0000000..046e940 --- /dev/null +++ b/public/resque/style.css @@ -0,0 +1,91 @@ +html { background:#efefef; font-family:Arial, Verdana, sans-serif; font-size:13px; } +body { padding:0; margin:0; } + +.header { background:#000; padding:8px 5% 0 5%; border-bottom:1px solid #444;border-bottom:5px solid #ce1212;} +.header h1 { color:#333; font-size:90%; font-weight:bold; margin-bottom:6px;} +.header ul li { display:inline;} +.header ul li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; padding:8px; -webkit-border-top-right-radius:6px; -webkit-border-top-left-radius:6px; -moz-border-radius-topleft:6px; -moz-border-radius-topright:6px; } +.header ul li a:hover { background:#333;} +.header ul li.current a { background:#ce1212; font-weight:bold; color:#fff;} + +.header .namespace { position: absolute; right: 75px; top: 10px; color: #7A7A7A; } + +.subnav { padding:2px 5% 7px 5%; background:#ce1212; font-size:90%;} +.subnav li { display:inline;} +.subnav li a { color:#fff; text-decoration:none; margin-right:10px; display:inline-block; background:#dd5b5b; padding:5px; -webkit-border-radius:3px; -moz-border-radius:3px;} +.subnav li.current a { background:#fff; font-weight:bold; color:#ce1212;} +.subnav li a:active { background:#b00909;} + +#main { padding:10px 5%; background:#fff; overflow:hidden; } +#main .logo { float:right; margin:10px;} +#main span.hl { background:#efefef; padding:2px;} +#main h1 { margin:10px 0; font-size:190%; font-weight:bold; color:#ce1212;} +#main h2 { margin:10px 0; font-size:130%;} +#main table { width:100%; margin:10px 0;} +#main table tr td, #main table tr th { border:1px solid #ccc; padding:6px;} +#main table tr th { background:#efefef; color:#888; font-size:15px; font-weight:bold;} +#main table tr td.no-data { text-align:center; padding:40px 0; color:#999; font-style:italic; font-size:130%;} +#main a { color:#111;} +#main p { margin:5px 0;} +#main p.intro { margin-bottom:15px; font-size:85%; color:#999; margin-top:0; line-height:1.3;} +#main h1.wi { margin-bottom:5px;} +#main p.sub { font-size:95%; color:#999;} + +#main table.queues { width:40%;} +#main table.queues td.queue { font-weight:bold; width:50%;} +#main table.queues tr.failure td { background:#ffecec; font-size:90%; color:#d37474;} +#main table.queues tr.failure td a{ color:#d37474;} +#main table.queues tr.first_failure td { border-top:2px solid #d37474; } + +#main table.jobs td.class { font-family:Monaco, "Courier New", monospace; font-size:90%; width:50%;} +#main table.jobs td.args{ width:50%;} + +#main table.workers td.icon {width:1%; background:#efefef;text-align:center;} +#main table.workers td.icon img { height: 16px; width: 16px; } +#main table.workers td.where { width:25%;} +#main table.workers td.queues { width:35%;} +#main .queue-tag { background:#b1d2e9; padding:2px; margin:0 3px; font-size:80%; text-decoration:none; text-transform:uppercase; font-weight:bold; color:#3274a2; -webkit-border-radius:4px; -moz-border-radius:4px;} +#main .queue-tag a { color: #3274A2; text-decoration: none; } +#main table.workers td.queues.queue { width:10%;} +#main table.workers td.process { width:35%;} +#main table.workers td.process span.waiting { color:#999; font-size:90%;} +#main table.workers td.process small { font-size:80%; margin-left:5px;} +#main table.workers td.process code { font-family:Monaco, "Courier New", monospace; font-size:90%;} +#main table.workers td.process small a { color:#999;} +#main.polling table.workers tr.working td { background:#f4ffe4; color:#7ac312;} +#main.polling table.workers tr.working td.where a { color:#7ac312;} +#main.polling table.workers tr.working td.process code { font-weight:bold;} + + +#main table.stats th { font-size:100%; width:40%; color:#000;} +#main hr { border:0; border-top:5px solid #efefef; margin:15px 0;} + +#footer { padding:10px 5%; background:#efefef; color:#999; font-size:85%; line-height:1.5; border-top:5px solid #ccc; padding-top:10px;} +#footer p a { color:#999;} + +#main p.poll { background:url(poll.png) no-repeat 0 2px; padding:3px 0; padding-left:23px; float:right; font-size:85%; } + +#main ul.failed {} +#main ul.failed li {background:-webkit-gradient(linear, left top, left bottom, from(#efefef), to(#fff)) #efefef; margin-top:10px; padding:10px; overflow:hidden; -webkit-border-radius:5px; border:1px solid #ccc; } +#main ul.failed li dl dt {font-size:80%; color:#999; width:60px; float:left; padding-top:1px; text-align:right;} +#main ul.failed li dl dd {margin-bottom:10px; margin-left:70px;} +#main ul.failed li dl dd .retried { float:right; text-align: right; } +#main ul.failed li dl dd .retried .remove { display:none; margin-top: 8px; } +#main ul.failed li.hover dl dd .retried .remove { display:block; } +#main ul.failed li dl dd .controls { display:none; float:right; } +#main ul.failed li.hover dl dd .controls { display:block; } +#main ul.failed li dl dd code, #main ul.failed li dl dd pre { font-family:Monaco, "Courier New", monospace; font-size:90%; white-space: pre-wrap;} +#main ul.failed li dl dd.error a {font-family:Monaco, "Courier New", monospace; font-size:90%; } +#main ul.failed li dl dd.error pre { margin-top:3px; line-height:1.3;} + +#main p.pagination { background:#efefef; padding:10px; overflow:hidden; text-align:center} +#main p.pagination a.less { float:left;} +#main p.pagination a.more { float:right;} + +#main form {float:right; margin-top:-10px;margin-left:10px;} + +#main .time a.toggle_format {text-decoration:none;} + +#failed tr.total td {background-color: #FFECEC; color: #D37474; font-size: 15px; font-weight: bold;} +#failed .center {text-align: center;} +#failed .failed_class { padding-left: 20px; font-size:12px; } \ No newline at end of file diff --git a/public/resque/working.png b/public/resque/working.png new file mode 100755 index 0000000..06f1ee3 Binary files /dev/null and b/public/resque/working.png differ diff --git a/public/robots.txt b/public/robots.txt index 085187f..f36fcfa 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,5 +1,10 @@ -# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-Agent: * -# Disallow: / +User-Agent: * +Disallow: /apps/thinghttp/ +Disallow: /update +Disallow: *.json +Disallow: *.jsonp +Disallow: *.xml +Disallow: *.txt +Disallow: *.csv +Disallow: /channels/*/charts +Disallow: /channels/public/ diff --git a/spec/controllers/apps_controller_spec.rb b/spec/controllers/apps_controller_spec.rb new file mode 100644 index 0000000..641213a --- /dev/null +++ b/spec/controllers/apps_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe AppsController do + +end diff --git a/spec/controllers/channels_controller_spec.rb b/spec/controllers/channels_controller_spec.rb new file mode 100644 index 0000000..6c5b3be --- /dev/null +++ b/spec/controllers/channels_controller_spec.rb @@ -0,0 +1,113 @@ +require 'spec_helper' + +describe ChannelsController do + + describe "Logged In" do + before :each do + @user = FactoryGirl.create(:user) + @channel = FactoryGirl.create(:channel) + @user.channels.push @channel + @tag = FactoryGirl.create(:tag) + @apikey = FactoryGirl.create(:api_key) + controller.stub(:current_user).and_return(@user) + controller.stub(:current_user_session).and_return(true) + + end + it "should show the channels private page" do + get :show, :id => @channel.id + response.should render_template(:private_show) + end + + it "should allow a new channel to be created" do + post :create + response.should be_redirect + channel_id = Channel.find(:all).last.id + response.should redirect_to( channel_path(channel_id, :anchor => "channelsettings")) + end + + it "should allow a channel to be edited" do + @channel.public_flag = true + put :update, id: @channel, channel: {name: 'new name'}, tags: FactoryGirl.attributes_for(:tag) + @channel.reload + @channel.name.should eq('new name') + response.should redirect_to channel_path(@channel.id) + end + it "should allow a channel to be deleted " do + delete :destroy, :id => @channel.id + response.should redirect_to channels_path + @channel_no_more = Channel.find_by_id(@channel.id) + @channel_no_more.should be_nil + end + + + end + + describe "Not Logged In" do + before :each do + without_timestamping_of Channel do + @channel = FactoryGirl.create(:channel, :updated_at => Time.now - RATE_LIMIT_FREQUENCY.to_i.seconds, :public_flag => false) + end + @apikey = FactoryGirl.create(:api_key, :channel => @channel) + end + + it "should only display public channels" do + get :public + response.should render_template('public') + end + + it "should show paginated list of public channels as json" do + get :public, :format => :json + JSON.parse(response.body).keys.include?('pagination').should be_true + end + + it "should show the channels public page" do + get :show, :id => @channel.id + response.should render_template(:public_show) + end + + it "should redirect to login when creating a new channel" do + post :create + + response.should be_redirect + response.should redirect_to(login_path) + response.status.should == 302 + end + + it "should be allowed to send data via get to update channel" do + get :post_data, {:key => "0S5G2O7FAB5K0J6Z", :field1 => "0", :status => "ThisIsATest"} + + response.body.to_i.should > 0 + response.should be_successful + end + + if defined?(React) + describe "updates a channel and executes a TalkBack command" do + before :each do + @talkback = FactoryGirl.create(:talkback) + @command = FactoryGirl.create(:command) + @command2 = FactoryGirl.create(:command, :position => nil, :command_string => 'quote"test') + end + + it 'returns the command string' do + post :post_data, {:key => '0S5G2O7FAB5K0J6Z', :field1 => '70', :talkback_key => @talkback.api_key} + response.body.should eq("MyString") + end + it 'returns JSON' do + post :post_data, {:key => '0S5G2O7FAB5K0J6Z', :field1 => '70', :talkback_key => @talkback.api_key, :format => 'json'} + JSON.parse(response.body)['command_string'].should eq("MyString") + JSON.parse(response.body)['position'].should eq(nil) + JSON.parse(response.body)['executed_at'].should_not eq(nil) + end + it 'returns XML' do + post :post_data, {:key => '0S5G2O7FAB5K0J6Z', :field1 => '70', :talkback_key => @talkback.api_key, :format => 'xml'} + Nokogiri::XML(response.body).css('command-string').text.should eq("MyString") + Nokogiri::XML(response.body).css('position').text.should eq('') + Nokogiri::XML(response.body).css('executed-at').text.should_not eq('') + end + end + end + + end + +end + diff --git a/spec/controllers/charts_controller_spec.rb b/spec/controllers/charts_controller_spec.rb index 0addc59..bc328be 100644 --- a/spec/controllers/charts_controller_spec.rb +++ b/spec/controllers/charts_controller_spec.rb @@ -1,5 +1,24 @@ require 'spec_helper' describe ChartsController do + before :each do + @user = FactoryGirl.create(:user) + + controller.stub(:current_user).and_return(@user) + controller.stub(:current_user_session).and_return(true) + @channel = FactoryGirl.create(:channel, :user => @user) + + + + end + + describe "responding to a GET index" do + render_views + it "has a 'select' selector for 'dynamic'" do + get :index, :channel_id => @channel.id + response.should be_successful + response.should have_selector("select#dynamic_0") + end + end end diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb new file mode 100644 index 0000000..562bf1a --- /dev/null +++ b/spec/controllers/comments_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe CommentsController do + +end diff --git a/spec/controllers/feed_controller_spec.rb b/spec/controllers/feed_controller_spec.rb index 7d40b1a..5aa9b4f 100644 --- a/spec/controllers/feed_controller_spec.rb +++ b/spec/controllers/feed_controller_spec.rb @@ -1,5 +1,64 @@ require 'spec_helper' describe FeedController do + before :each do + @user = FactoryGirl.create(:user) + @channel = FactoryGirl.create(:channel) + now = Time.utc(2013,1,1) + @feed1 = FactoryGirl.create(:feed, :field1 => 10, :channel => @channel, :created_at => now, :entry_id => 1) + + @feed = FactoryGirl.create(:feed, :field1 => 10, :channel => @channel, :created_at => now, :entry_id => 2) + @feed = FactoryGirl.create(:feed, :field1 => 9, :channel => @channel, :created_at => now, :entry_id => 3) + @feed = FactoryGirl.create(:feed, :field1 => 7, :channel => @channel, :created_at => now, :entry_id => 4) + @feed = FactoryGirl.create(:feed, :field1 => 6, :channel => @channel, :created_at => now, :entry_id => 5) + @feed = FactoryGirl.create(:feed, :field1 => 5, :channel => @channel, :created_at => now, :entry_id => 6) + @feed = FactoryGirl.create(:feed, :field1 => 4, :channel => @channel, :created_at => now, :entry_id => 7) + @channel.last_entry_id = @feed.entry_id + @channel.save + + @user.channels.push @channel + @tag = FactoryGirl.create(:tag) + @apikey = FactoryGirl.create(:api_key) + controller.stub(:current_user).and_return(@user) + controller.stub(:current_user_session).and_return(true) + + end + + it "should get feeds" do + get :show, {id: @feed1.id, channel_id: @channel.id} + response.should be_successful + response.body.should eq("{\"created_at\":\"2013-01-01T00:00:00+00:00\",\"entry_id\":1}" ) + end + + it "should get last feed" do + get :show, {id: 'last', channel_id: @channel.id} + response.should be_successful + response.body.should eq("{\"created_at\":\"2013-01-01T00:00:00+00:00\",\"entry_id\":7}" ) + end + + it "should get feed last_average" do + get :last_average, {channel_id: @channel.id, average: 10} + response.should be_successful + jsonResponse = JSON.parse(response.body) + + jsonResponse["field1"].should eq("7.285714285714286") + + end + + it "should get last_median" do + get :last_median, {channel_id: @channel.id, median: 10} + response.should be_successful + jsonResponse = JSON.parse(response.body) + jsonResponse["field1"].should eq("7.0") + end + + it "should get last_sum" do + get :last_sum, {channel_id: @channel.id, sum: 10} + response.should be_successful + jsonResponse = JSON.parse(response.body) + jsonResponse["field1"].should eq("51.0") + end + end + diff --git a/spec/controllers/maps_controller_spec.rb b/spec/controllers/maps_controller_spec.rb new file mode 100644 index 0000000..1bcb2bf --- /dev/null +++ b/spec/controllers/maps_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe MapsController do + +end diff --git a/spec/controllers/pipes_controller_spec.rb b/spec/controllers/pipes_controller_spec.rb new file mode 100644 index 0000000..68a0b0c --- /dev/null +++ b/spec/controllers/pipes_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe PipesController do + +end diff --git a/spec/controllers/plugins_controller_spec.rb b/spec/controllers/plugins_controller_spec.rb new file mode 100644 index 0000000..9b4c8b2 --- /dev/null +++ b/spec/controllers/plugins_controller_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe PluginsController do + before :each do + @user = FactoryGirl.create(:user) + controller.stub(:current_user).and_return(@user) + controller.stub(:current_user_session).and_return(true) + + @plugin = FactoryGirl.create(:plugin, :user => @user) + @channel = FactoryGirl.create(:channel, :user => @user) + end + + describe "GET 'private_plugins' for plugin" do + it "should return plugin windows" do + get 'private_plugins', :channel_id => @channel.id + response.should be_successful + end + end + +end diff --git a/spec/controllers/tags_controller_spec.rb b/spec/controllers/tags_controller_spec.rb new file mode 100644 index 0000000..6067cb7 --- /dev/null +++ b/spec/controllers/tags_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe TagsController do + +end diff --git a/spec/controllers/user_sessions_controller_spec.rb b/spec/controllers/user_sessions_controller_spec.rb new file mode 100644 index 0000000..4f8b046 --- /dev/null +++ b/spec/controllers/user_sessions_controller_spec.rb @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +require 'spec_helper' + +describe UserSessionsController do + before :each do + @user = FactoryGirl.create(:user) + activate_authlogic + @user_session = UserSession.create(@user) + controller.stub(:current_user).and_return(@user) + controller.stub(:current_user_session).and_return(@user_session) + end + + describe "for logged in user" do + it "should logout the user" do + get 'destroy' + response.should redirect_to(root_path) + end + end +end + +describe UserSessionsController do + before :each do + @user = FactoryGirl.create(:user) + activate_authlogic +# @user_session = UserSession.create(@user) +# controller.stub(:current_user).and_return(@user) +# controller.stub(:current_user_session).and_return(@user_session) + end + it "should allow a new user to login" do + get 'new' + response.should be_success + response.should render_template('new') + end + + it "should create user session" do + post 'create' , {:userlogin => "", :user_session=>{"remember_me"=>"false", "login"=>@user.login, "password"=>"foobar", "remember_id"=>"1"}, "commit" => "Sign In"} + user_session = UserSession.find + user_session.should_not be_nil + user_session.user.should == @user + response.should redirect_to ('/channels') + + end + +end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb new file mode 100644 index 0000000..a8b9d25 --- /dev/null +++ b/spec/controllers/users_controller_spec.rb @@ -0,0 +1,80 @@ +require 'spec_helper' + +describe UsersController do + before :each do + @user = FactoryGirl.create(:user) + # controller.stub(:current_user).and_return(@user) + # controller.stub(:current_user_session).and_return(true) + # @channel = FactoryGirl.create(:channel) + end + + # create a valid authlogic session + #def create_valid_session + # activate_authlogic + # UserSession.create(@user, true) #create an authlogic session + #end + + # get the curent_user + #def current_user; @current_user ||= @user; end + + describe "api" do + render_views + + it "should show login in public json info" do + get :profile, :glob => @user.login, :format => 'json' + JSON.parse(response.body)['login'].should eq(@user.login) + end + + it "should not show email in public json info" do + get :profile, :glob => @user.login, :format => 'json' + JSON.parse(response.body)['email'].should eq(nil) + end + + it "should show email in private json info" do + get :profile, :glob => @user.login, :format => 'json', :key => @user.api_key + JSON.parse(response.body)['email'].should eq(@user.email) + end + + end + + #describe "existing account" do + #render_views + + #it "has a current_user" do + # create_valid_session + # current_user.should_not be_false + #end + + #it "generates a new api_key" do + # create_valid_session + # old_key = @user.set_new_api_key! + # post :new_api_key + # response.should be_successful + # assigns[:user].api_key.should != old_key + #end + #end + + describe "new account" do + render_views + + it "assigns new user" do + get :new + response.should be_successful + response.should have_selector("#user_submit") + assigns[:user].should_not be_nil + end + it "should create a new user if user parameters are complete" do + post :create, :user => {"login"=>"xxx", "email"=>"xxx@insomnia-consulting.org", "time_zone"=>"Eastern Time (US & Canada)", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"} + response.code.should == "302" + response.should redirect_to(channels_path) + end + + it "should have a valid api_key" do + post :create, :user => {"login"=>"xxx", "email"=>"xxx@insomnia-consulting.org", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"} + assigns[:user].api_key.length.should eq(16) + end + + end + +end + diff --git a/spec/controllers/windows_controller_spec.rb b/spec/controllers/windows_controller_spec.rb new file mode 100644 index 0000000..cac6ce4 --- /dev/null +++ b/spec/controllers/windows_controller_spec.rb @@ -0,0 +1,136 @@ +require 'spec_helper' + +describe WindowsController do + before :each do + @user = FactoryGirl.create(:user) + + controller.stub(:current_user).and_return(@user) + controller.stub(:current_user_session).and_return(true) + + @channel = FactoryGirl.create(:channel, :user => @user) + + @window = FactoryGirl.create(:window) + @channel.windows << @window + + end + + describe "PUT 'hide' for window" do + it "should update the show_flag on that window" do + put 'hide', :channel_id => @channel.id, :id => @window.id + response.should be_successful + end + end + + describe "POST 'update'" do + it "should allow an update" do + post 'update', :channel_id => @channel.id, :page => "{\"col\":0,\"positions\":[#{@window.id}]}" + response.should be_success + end + end + + describe "POST 'update' with invalid position" do + + it "should fail" do + post 'update', :channel_id => @channel.id, :page => "{\"col\":0,\"positions\":[999]}" + response.should be_success + end + end + describe "When getting " do + + it "should render private_windows json" do + get 'private_windows', :channel_id => @channel.id, :format => :json + response.should be_successful + end + it "should render show_flag = false" do + @channel.windows[0].show_flag = false + @channel.save + get 'hidden_windows', {:channel_id => @channel.id, :visibility_flag => "private" }, :format => :json + + response.status.should == 200 + end + end + +end + +describe WindowsController do + render_views + before :each do + @channel = FactoryGirl.create(:channel) + @window = FactoryGirl.create(:chart_window) + @window_detail = FactoryGirl.create(:chart_window_detail) + @window.window_detail = @window_detail + @channel.windows << @window + end + + describe "POST 'update'" do + it "should fail with no current user" do + post 'update', :channel_id => @channel.id, :page => "{\"col\":0,\"positions\":[" + @window.id.to_s + "]}" + response.status.should == 302 + end + end + + + describe "When getting " do + it "should render json" do + get 'index', :channel_id => @channel.id, :format => :json + response.status.should == 200 + response.body == @channel.windows.to_json + end + + + it "should not render show_flag = false" do + + @channel.windows.each do |window| + window.show_flag = false + end + saved = @channel.save + saved.should be_true + + get 'index', :channel_id => @channel.id, :format => :json + + response.status.should == 200 + + result = JSON.parse(response.body) + result.size.should == 0 + end + + end + + describe "GET 'iframe' for window" do + it "should return html with gsub for iframe" do + get 'iframe', :channel_id => @channel.id, :id => @window.id + response.should be_success + response.body.should == "" + + col 0 + end +end diff --git a/spec/factories/plugin_window_details.rb b/spec/factories/plugin_window_details.rb new file mode 100644 index 0000000..5265e85 --- /dev/null +++ b/spec/factories/plugin_window_details.rb @@ -0,0 +1,19 @@ +# == Schema Information +# +# Table name: plugin_window_details +# +# id :integer not null, primary key +# plugin_id :integer +# plugin_window_id :integer +# created_at :datetime +# updated_at :datetime +# + +# Read about factories at https://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :plugin_window_detail do + plugin_id 1 + plugin_window_id 1 + end +end diff --git a/spec/factories/portlet_window_details.rb b/spec/factories/portlet_window_details.rb new file mode 100644 index 0000000..413602a --- /dev/null +++ b/spec/factories/portlet_window_details.rb @@ -0,0 +1,17 @@ +# == Schema Information +# +# Table name: portlet_window_details +# +# id :integer not null, primary key +# portlet_window_id :integer +# created_at :datetime +# updated_at :datetime +# + +# Read about factories at http://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :portlet_window_detail do + portlet_window_id 1 + end +end diff --git a/spec/factories/tag.rb b/spec/factories/tag.rb new file mode 100644 index 0000000..f1e8c7b --- /dev/null +++ b/spec/factories/tag.rb @@ -0,0 +1,5 @@ +FactoryGirl.define do + factory :tag do + name "Tag name" + end +end diff --git a/spec/factories/user.rb b/spec/factories/user.rb new file mode 100644 index 0000000..0f61e19 --- /dev/null +++ b/spec/factories/user.rb @@ -0,0 +1,13 @@ +FactoryGirl.define do + factory :user do + sequence(:login) {|n| "name#{n}" } + sequence(:email) {|n| "email#{n}@example.com" } + password "foobar" + password_confirmation {|u| u.password} + bio "" + website "" + time_zone "London" + api_key 'ED1HVHNEH2BZD0AB' + end +end + diff --git a/spec/factories/user_sessions.rb b/spec/factories/user_sessions.rb new file mode 100644 index 0000000..d2bf458 --- /dev/null +++ b/spec/factories/user_sessions.rb @@ -0,0 +1,4 @@ +FactoryGirl.define do + factory :user_session do + end +end diff --git a/spec/factories/windows.rb b/spec/factories/windows.rb new file mode 100644 index 0000000..e017238 --- /dev/null +++ b/spec/factories/windows.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: windows +# +# id :integer not null, primary key +# channel_id :integer +# position :integer +# created_at :datetime +# updated_at :datetime +# html :text +# col :integer +# title :string(255) +# wtype :string(255) +# name :string(255) +# type :string(255) +# private_flag :boolean default(FALSE) +# show_flag :boolean default(TRUE) +# + +# Read about factories at http://github.com/thoughtbot/factory_girl + +FactoryGirl.define do + factory :window do + channel_id 1 + position 1 + html "" + col 0 + end +end diff --git a/spec/helpers/feed_helper_spec.rb b/spec/helpers/feed_helper_spec.rb index 3218620..12b5990 100644 --- a/spec/helpers/feed_helper_spec.rb +++ b/spec/helpers/feed_helper_spec.rb @@ -1,15 +1,106 @@ require 'spec_helper' -# Specs in this file have access to a helper object that includes -# the FeedHelper. For example: -# -# describe FeedHelper do -# describe "string concat" do -# it "concats two strings with spaces" do -# helper.concat_strings("this","that").should == "this that" -# end -# end -# end describe FeedHelper do - pending "add some examples to (or delete) #{__FILE__}" + describe "feed_select_data" do + before :each do + @channel = FactoryGirl.create(:channel) + end + it "extracts selection criteria from the request parameters with no time params" do + #params = {:average => 10} + helper.stub(:params).and_return(params) + only = Feed.select_options(@channel, params) + only.should include(:created_at, :entry_id) + end + it "extracts selection criteria from the request parameters " do + params = {:average => 10} + helper.stub(:params).and_return(params) + only = Feed.select_options(@channel, params) + only.should include(:created_at) + end + end + describe "feeds_into_averages" do + before :each do + userAttr = FactoryGirl.attributes_for(:user) + @user = User.create!(userAttr) + + @channel = FactoryGirl.create(:channel, :user => @user) + now = Time.utc(2013,1,1) + feed1 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now) + feed2 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 5.minutes) + feed3 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 8.minutes) + end + + it "averages feed values based on a timeslice" do + feeds = Feed.find(:all, :order => :created_at) + params = {:average => 10} + helper.stub(:params).and_return(params) + + timeslices = helper.feeds_into_averages(feeds, params) + timeslices.size.should eq(2) + end + end + describe "feeds_into_median" do + before :each do + userAttr = FactoryGirl.attributes_for(:user) + @user = User.create!(userAttr) + + @channel = FactoryGirl.create(:channel, :user => @user) + now = Time.utc(2013,1,1) + feed1 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now) + feed2 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 5.minutes) + feed3 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 8.minutes) + end + + it "median feed values based on a timeslice" do + feeds = Feed.find(:all, :order => :created_at) + params = {:median => 10} + helper.stub(:params).and_return(params) + + timeslices = helper.feeds_into_medians(feeds, params) + timeslices.size.should eq(2) + end + end + describe "feeds_into_sums" do + before :each do + userAttr = FactoryGirl.attributes_for(:user) + @user = User.create!(userAttr) + + @channel = FactoryGirl.create(:channel, :user => @user) + now = Time.utc(2013,1,1) + feed1 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now) + feed2 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 5.minutes) + feed3 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 8.minutes) + end + + it "sum feed values based on a timeslice" do + feeds = Feed.find(:all, :order => :created_at) + params = {:sum => 10} + helper.stub(:params).and_return(params) + + timeslices = helper.feeds_into_sums(feeds, params) + timeslices.size.should eq(2) + end + end + describe "feeds_into_timescales" do + before :each do + userAttr = FactoryGirl.attributes_for(:user) + @user = User.create!(userAttr) + + @channel = FactoryGirl.create(:channel, :user => @user) + now = Time.utc(2013,1,1) + feed1 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now) + feed2 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 5.minutes) + feed3 = FactoryGirl.create(:feed, :channel => @channel, :created_at => now - 8.minutes) + end + + it "timescale feed values based on a timeslice" do + feeds = Feed.find(:all, :order => :created_at) + params = {:timescale => 10} + helper.stub(:params).and_return(params) + + timeslices = helper.feeds_into_timescales(feeds, params) + timeslices.size.should eq(2) + end + end end + diff --git a/spec/models/api_key_spec.rb b/spec/models/api_key_spec.rb index b7e45d3..d15c022 100644 --- a/spec/models/api_key_spec.rb +++ b/spec/models/api_key_spec.rb @@ -1,24 +1,23 @@ -require 'spec_helper' - -describe ApiKey do - pending "add some examples to (or delete) #{__FILE__}" -end - - - - - # == Schema Information # # Table name: api_keys # -# id :integer(4) not null, primary key +# id :integer not null, primary key # api_key :string(16) -# channel_id :integer(4) -# user_id :integer(4) -# write_flag :boolean(1) default(FALSE) +# channel_id :integer +# user_id :integer +# write_flag :boolean default(FALSE) # created_at :datetime # updated_at :datetime # note :string(255) # +require 'spec_helper' + +describe ApiKey do + +end + + + + diff --git a/spec/models/channel_spec.rb b/spec/models/channel_spec.rb new file mode 100644 index 0000000..a8a1507 --- /dev/null +++ b/spec/models/channel_spec.rb @@ -0,0 +1,127 @@ +# encoding: UTF-8 +# == Schema Information +# +# Table name: channels +# +# id :integer not null, primary key +# user_id :integer +# name :string(255) +# description :string(255) +# latitude :decimal(15, 10) +# longitude :decimal(15, 10) +# field1 :string(255) +# field2 :string(255) +# field3 :string(255) +# field4 :string(255) +# field5 :string(255) +# field6 :string(255) +# field7 :string(255) +# field8 :string(255) +# scale1 :integer +# scale2 :integer +# scale3 :integer +# scale4 :integer +# scale5 :integer +# scale6 :integer +# scale7 :integer +# scale8 :integer +# created_at :datetime +# updated_at :datetime +# elevation :string(255) +# last_entry_id :integer +# public_flag :boolean default(FALSE) +# options1 :string(255) +# options2 :string(255) +# options3 :string(255) +# options4 :string(255) +# options5 :string(255) +# options6 :string(255) +# options7 :string(255) +# options8 :string(255) +# social :boolean default(FALSE) +# slug :string(255) +# status :string(255) +# url :string(255) +# video_id :string(255) +# video_type :string(255) +# clearing :boolean default(FALSE), not null +# ranking :integer +# + +require 'spec_helper' + +describe Channel do + it "should be valid" do + channel = Channel.new + channel.should be_valid + end + + it "should accept utf8" do + channel = Channel.create(:name => "ǎ") + channel.reload + channel.name.should == "ǎ" + end + + it "should have no plugins when created" do + channel = Channel.create + channel.set_windows + channel.save + channel.name.should == "Channel #{channel.id}" + channel.windows.size.should == 2 + end + + it "should have video iframe after updated" do + channel = Channel.create! + video_id = "xxxxxx" + channel.assign_attributes({:video_id => video_id, :video_type => "youtube"}) + channel.set_windows + channel.save + window = channel.windows.where({:wtype => :video }) + window[0].html.should == "" + end + + it "should have private windows" do + channel = Channel.create! + channel.assign_attributes({:field1 => "Test"}) + channel.set_windows + channel.save + showFlag = true + channel.private_windows(showFlag).count.should == 2 #2 private windows - 1 field and 1 status + end + + # this is necessary so that the existing API is not broken + # https://thingspeak.com/channels/9/feed.json?results=10 should have 'channel' as the first key + it "should include root in json by default" do + channel = Channel.create + channel.as_json.keys.include?('channel').should be_true + end + + it "should not include root using public_options" do + channel = Channel.create + channel.as_json(Channel.public_options).keys.include?('channel').should be_false + end + + describe 'testing scopes' do + before :each do + @public_channel = FactoryGirl.create(:channel, :public_flag => true, :last_entry_id => 10) + @private_channel = FactoryGirl.create(:channel, :public_flag => false, :last_entry_id => 10) + end + it 'should show public channels' do + channels = Channel.public_viewable + channels.count.should == 1 + end + it 'should show active channels' do + channels = Channel.active + channels.count.should == 2 + end + it 'should show selected channels' do + channels = Channel.by_array([@public_channel.id, @private_channel.id]) + channels.count.should == 2 + end + it 'should show tagged channels' do + @public_channel.save_tags('sensor') + channels = Channel.with_tag('sensor') + channels.count.should == 1 + end + end +end diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb new file mode 100644 index 0000000..f6ec946 --- /dev/null +++ b/spec/models/comment_spec.rb @@ -0,0 +1,21 @@ +# == Schema Information +# +# Table name: comments +# +# id :integer not null, primary key +# parent_id :integer +# body :text +# flags :integer +# user_id :integer +# ip_address :string(255) +# created_at :datetime +# updated_at :datetime +# channel_id :integer +# + +require 'spec_helper' + +describe Comment do + +end + diff --git a/spec/models/failedlogin_spec.rb b/spec/models/failedlogin_spec.rb new file mode 100644 index 0000000..bf9dc38 --- /dev/null +++ b/spec/models/failedlogin_spec.rb @@ -0,0 +1,17 @@ +# == Schema Information +# +# Table name: failedlogins +# +# id :integer not null, primary key +# login :string(255) +# password :string(255) +# ip_address :string(255) +# created_at :datetime +# updated_at :datetime +# + +require 'spec_helper' + +describe Failedlogin do + +end diff --git a/spec/models/header_spec.rb b/spec/models/header_spec.rb new file mode 100644 index 0000000..2e8d103 --- /dev/null +++ b/spec/models/header_spec.rb @@ -0,0 +1,18 @@ +# == Schema Information +# +# Table name: headers +# +# id :integer not null, primary key +# name :string(255) +# value :string(255) +# created_at :datetime +# updated_at :datetime +# thinghttp_id :integer +# + +require 'spec_helper' + +describe Header do + +end + diff --git a/spec/models/pipe_spec.rb b/spec/models/pipe_spec.rb new file mode 100644 index 0000000..3e7683b --- /dev/null +++ b/spec/models/pipe_spec.rb @@ -0,0 +1,20 @@ +# == Schema Information +# +# Table name: pipes +# +# id :integer not null, primary key +# name :string(255) not null +# url :string(255) not null +# slug :string(255) not null +# created_at :datetime +# updated_at :datetime +# parse :string(255) +# cache :integer +# + +require 'spec_helper' + +describe Pipe do + +end + diff --git a/spec/models/plugin_spec.rb b/spec/models/plugin_spec.rb new file mode 100644 index 0000000..f447a7e --- /dev/null +++ b/spec/models/plugin_spec.rb @@ -0,0 +1,134 @@ +# == Schema Information +# +# Table name: plugins +# +# id :integer not null, primary key +# name :string(255) +# user_id :integer +# html :text +# css :text +# js :text +# created_at :datetime +# updated_at :datetime +# private_flag :boolean default(TRUE) +# + +require 'spec_helper' + +describe Plugin do + + before :each do + @user = FactoryGirl.create(:user) + @channel = FactoryGirl.create(:channel, :user => @user) + @window = FactoryGirl.create(:plugin_window, :channel => @channel) + + end + it "should be valid" do + plugin = Plugin.new + plugin.should be_valid + end + + it "should confirm has_[public\private]_windows" do + plugin = Plugin.new + + window = PluginWindow.new + window.private_flag = true + window.channel_id = 1 + plugin.windows << window + + plugin.has_private_windows(1).should be_true + plugin.has_public_windows(1).should be_false + end + + it "new, public plugin should get 2 plugin windows" do + plugin = Plugin.new + plugin.private_flag = false + plugin.public?.should be_true + #Private plugins have one window.. + #Public plugins have a private window and a public window + + plugin.make_windows @channel.id, "localhost" + plugin.windows.size.should eq(2) + + end + + it "new, private window should not be showing" do + plugin = Plugin.new + plugin.private_flag = true + plugin.public?.should be_false + #Private plugins have one window.. + + plugin.make_windows @channel.id, "localhost" + plugin.windows.size.should eq(1) + window = plugin.windows[0] + window.show_flag.should be_false + + end + + it "should destroy public windows when changing plugin from public to private" do + plugin = Plugin.new + plugin.private_flag = true + plugin.public?.should be_false + #Private plugins have one window.. + plugin.make_windows @channel.id, "localhost" + plugin.windows.size.should eq(1) + + plugin.private_flag = false + plugin.save + + plugin.make_windows @channel.id, "localhost" + plugin.windows.size.should eq(2) + + plugin.private_flag = true + plugin.save + plugin.make_windows @channel.id, "localhost" + plugin.windows.size.should eq(1) + + + end + + it "should allow only private_windows to be retrieved" do + plugin = Plugin.new + plugin.private_flag = false + plugin.public?.should be_true + #Private window has private_dashboard_visibility only + plugin.make_windows @channel.id, "localhost" + plugin.windows.size.should eq(2) + plugin.private_dashboard_windows(@channel.id).size.should eq(1) + end + it "should allow only public_windows to be retrieved" do + plugin = Plugin.new + plugin.private_flag = false + plugin.public?.should be_true + #Private window has private_dashboard_visibility only + plugin.make_windows @channel.id, "localhost" + plugin.windows.size.should eq(2) + plugin.public_dashboard_windows(@channel.id).size.should eq(1) + end + + it "should cascade delete to Window" do + plugin = Plugin.new + + plugin.make_windows @channel.id, "localhost" + + window_id = plugin.windows[0].id + + plugin.destroy + + windows = Window.find_all_by_id(window_id) + + windows.size.should eq(0) + + end + + it "should have windows associated with separate channels" do + channel2 = FactoryGirl.create(:channel, :user => @user) + plugin = Plugin.new + plugin.make_windows @channel.id, "localhost" + plugin.make_windows channel2.id, "localhost" + plugin.windows.size.should eq(2) + plugin.private_dashboard_windows(@channel.id).size.should eq(1) + plugin.private_dashboard_windows(channel2.id).size.should eq(1) + + end +end diff --git a/spec/models/plugin_window_detail_spec.rb b/spec/models/plugin_window_detail_spec.rb new file mode 100644 index 0000000..e61ce35 --- /dev/null +++ b/spec/models/plugin_window_detail_spec.rb @@ -0,0 +1,54 @@ +# == Schema Information +# +# Table name: plugin_window_details +# +# id :integer not null, primary key +# plugin_id :integer +# plugin_window_id :integer +# created_at :datetime +# updated_at :datetime +# + +require 'spec_helper' + +describe PluginWindowDetail do + before :each do + @channel = FactoryGirl.create(:channel) + @plugin = FactoryGirl.create(:plugin) + end + + it "should be valid" do + winDetail = PluginWindowDetail.new + winDetail.should be_valid + end + it "should allow windows plugin association" do + window = Window.new_from @plugin, @channel.id, :private, "localhost" + @plugin.windows << window + @plugin.save + window.should be_valid + + window.window_detail.should_not be_nil + end +end + +describe PluginWindowDetail do + before :each do + @user = FactoryGirl.create(:user) + @channel = FactoryGirl.create(:channel, :user => @user) + @plugin = FactoryGirl.create(:plugin, :user => @user) + end + it "should differentiate between public plugin_window and private plugin_window" do + + window = Window.new_from @plugin, @channel.id, true, "localhost" + @plugin.windows << window + @plugin.save + plugin = PluginWindowDetail.find_all_by_plugin_id(@plugin.id) + plugin.length.should == 1 + + window = Window.new_from @plugin, @channel.id, false, "localhost" + @plugin.windows << window + @plugin.save + plugin = PluginWindowDetail.find_all_by_plugin_id(@plugin.id) + plugin.length.should == 2 + end +end diff --git a/spec/models/tag_spec.rb b/spec/models/tag_spec.rb new file mode 100644 index 0000000..436629f --- /dev/null +++ b/spec/models/tag_spec.rb @@ -0,0 +1,15 @@ +# == Schema Information +# +# Table name: tags +# +# id :integer not null, primary key +# name :string(255) +# created_at :datetime +# updated_at :datetime +# + +require 'spec_helper' + +describe Tag do + +end diff --git a/spec/models/tagging_spec.rb b/spec/models/tagging_spec.rb new file mode 100644 index 0000000..dcf7aa6 --- /dev/null +++ b/spec/models/tagging_spec.rb @@ -0,0 +1,16 @@ +# == Schema Information +# +# Table name: taggings +# +# id :integer not null, primary key +# tag_id :integer +# channel_id :integer +# created_at :datetime +# updated_at :datetime +# + +require 'spec_helper' + +describe Tagging do + +end diff --git a/spec/models/twitter_account_spec.rb b/spec/models/twitter_account_spec.rb new file mode 100644 index 0000000..a433510 --- /dev/null +++ b/spec/models/twitter_account_spec.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: twitter_accounts +# +# id :integer not null, primary key +# screen_name :string(255) +# user_id :integer +# twitter_id :integer +# token :string(255) +# secret :string(255) +# created_at :datetime +# updated_at :datetime +# api_key :string(17) not null +# + +require 'spec_helper' + +describe TwitterAccount do + +end + + diff --git a/spec/models/watching_spec.rb b/spec/models/watching_spec.rb new file mode 100644 index 0000000..1c2d89b --- /dev/null +++ b/spec/models/watching_spec.rb @@ -0,0 +1,16 @@ +# == Schema Information +# +# Table name: watchings +# +# id :integer not null, primary key +# user_id :integer +# channel_id :integer +# created_at :datetime +# updated_at :datetime +# + +require 'spec_helper' + +describe Watching do + +end diff --git a/spec/models/window_spec.rb b/spec/models/window_spec.rb new file mode 100644 index 0000000..07557c0 --- /dev/null +++ b/spec/models/window_spec.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: windows +# +# id :integer not null, primary key +# channel_id :integer +# position :integer +# created_at :datetime +# updated_at :datetime +# html :text +# col :integer +# title :string(255) +# wtype :string(255) +# name :string(255) +# type :string(255) +# private_flag :boolean default(FALSE) +# show_flag :boolean default(TRUE) +# + +require 'spec_helper' + +describe Window do + it "should be valid" do + window = Window.new + window.should be_valid + end +end + + diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb new file mode 100644 index 0000000..c742dd8 --- /dev/null +++ b/spec/routing/routing_spec.rb @@ -0,0 +1,12 @@ +require "spec_helper" + +describe "routes for Widgets" do + it "routes / to the pages controller" do + { :get => "/" }.should route_to(:controller => "pages", :action => "home") + end + it "routes /channels/:id to the channels controller" do + { :get => "/channels/1" }.should route_to(:controller => "channels", :action => "show", :id => "1") + end +end + + diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..16ca63b --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,61 @@ +# This file is copied to spec/ when you run 'rails generate rspec:install' +ENV["RAILS_ENV"] ||= 'test' +require File.expand_path("../../config/environment", __FILE__) +require 'rspec/rails' +require 'authlogic/test_case' + +include Authlogic::TestCase + +# Requires supporting ruby files with custom matchers and macros, etc, +# in spec/support/ and its subdirectories. +Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} + +RSpec.configure do |config| + # == Mock Framework + # + # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: + # + # config.mock_with :mocha + # config.mock_with :flexmock + # config.mock_with :rr + config.mock_with :rspec + + # Use color in STDOUT + config.color_enabled = true + + # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures + config.fixture_path = "#{::Rails.root}/spec/fixtures" + + # If you're not using ActiveRecord, or you'd prefer not to run each of your + # examples within a transaction, remove the following line or assign false + # instead of true. + config.use_transactional_fixtures = false + config.before(:suite) do + DatabaseCleaner.strategy = :truncation + end + + config.before(:each) do + DatabaseCleaner.start + end + + config.after(:each) do + DatabaseCleaner.clean + end +end + +def ppp(obj) + puts ERB::Util.html_escape(obj.pretty_inspect).gsub(" ", ' '*2).gsub("\t", ' '*4).gsub("\n", "
\n") +end + +def without_timestamping_of(*klasses) + if block_given? + klasses.delete_if { |klass| !klass.record_timestamps } + klasses.each { |klass| klass.record_timestamps = false } + begin + yield + ensure + klasses.each { |klass| klass.record_timestamps = true } + end + end + end + diff --git a/spec/support/matchers/simple_matcher.rb b/spec/support/matchers/simple_matcher.rb new file mode 100644 index 0000000..6771ae2 --- /dev/null +++ b/spec/support/matchers/simple_matcher.rb @@ -0,0 +1,21 @@ +RSpec::Matchers.define :be_even do + match do |given| + given % 2 == 0 + end + + +end + +RSpec::Matchers.define :have_ids_of do |objects| + match do |given| + (given.map &:id).sort.should == (objects.map &:id).sort + end +end + +# def should_have_ids_of(objcts) +# simple_matcher("should have id of"){|given | (given.map &:id).sort.should == (objects.map &:id).sort} +# end +# +# def be_even +# simple_matcher("an even number") { |given| given % 2 == 0 } +# end diff --git a/test/fixtures/daily_feeds.yml b/test/fixtures/daily_feeds.yml new file mode 100644 index 0000000..f13a384 --- /dev/null +++ b/test/fixtures/daily_feeds.yml @@ -0,0 +1,25 @@ +# == Schema Information +# +# Table name: daily_feeds +# +# id :integer not null, primary key +# channel_id :integer +# date :date +# calculation :string(20) +# result :string(255) +# field :integer +# + +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +one: + channel_id: 1 + date: 2014-01-21 + calculation: MyString + result: MyString + +two: + channel_id: 1 + date: 2014-01-21 + calculation: MyString + result: MyString diff --git a/test/unit/daily_feed_test.rb b/test/unit/daily_feed_test.rb new file mode 100644 index 0000000..a1ae49f --- /dev/null +++ b/test/unit/daily_feed_test.rb @@ -0,0 +1,19 @@ +# == Schema Information +# +# Table name: daily_feeds +# +# id :integer not null, primary key +# channel_id :integer +# date :date +# calculation :string(20) +# result :string(255) +# field :integer +# + +require 'test_helper' + +class DailyFeedTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end