summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PythonTBC/__init__.py0
-rw-r--r--PythonTBC/settings.py163
-rw-r--r--PythonTBC/urls.py18
-rw-r--r--PythonTBC/wsgi.py32
-rw-r--r--manage.py10
-rw-r--r--tbc/__init__.py0
-rw-r--r--tbc/admin.py8
-rw-r--r--tbc/forms.py34
-rw-r--r--tbc/models.py75
-rwxr-xr-xtbc/static/css/base.css6183
-rwxr-xr-xtbc/static/css/responsive.css1109
-rwxr-xr-xtbc/static/js/.jshintrc12
-rwxr-xr-xtbc/static/js/bootstrap-affix.js117
-rwxr-xr-xtbc/static/js/bootstrap-alert.js99
-rwxr-xr-xtbc/static/js/bootstrap-button.js105
-rwxr-xr-xtbc/static/js/bootstrap-carousel.js207
-rwxr-xr-xtbc/static/js/bootstrap-collapse.js167
-rwxr-xr-xtbc/static/js/bootstrap-dropdown.js169
-rwxr-xr-xtbc/static/js/bootstrap-modal.js247
-rwxr-xr-xtbc/static/js/bootstrap-popover.js114
-rwxr-xr-xtbc/static/js/bootstrap-scrollspy.js162
-rwxr-xr-xtbc/static/js/bootstrap-tab.js144
-rwxr-xr-xtbc/static/js/bootstrap-tooltip.js361
-rwxr-xr-xtbc/static/js/bootstrap-transition.js60
-rwxr-xr-xtbc/static/js/bootstrap-typeahead.js335
-rwxr-xr-xtbc/static/js/jquery.js5
-rwxr-xr-xtbc/static/js/tests/index.html56
-rwxr-xr-xtbc/static/js/tests/phantom.js63
-rwxr-xr-xtbc/static/js/tests/server.js14
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-affix.js25
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-alert.js62
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-button.js102
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-carousel.js81
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-collapse.js94
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-dropdown.js151
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-modal.js137
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-phantom.js21
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-popover.js113
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-scrollspy.js37
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-tab.js86
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-tooltip.js294
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-transition.js13
-rwxr-xr-xtbc/static/js/tests/unit/bootstrap-typeahead.js236
-rwxr-xr-xtbc/static/js/tests/vendor/jquery.js5
-rwxr-xr-xtbc/static/js/tests/vendor/qunit.css232
-rwxr-xr-xtbc/static/js/tests/vendor/qunit.js1510
-rw-r--r--tbc/static/uploads/Hardik/C++/Chapter1.ipynb158
-rw-r--r--tbc/static/uploads/Hardik/C++/Chapter2.ipynb608
-rw-r--r--tbc/static/uploads/Hardik/C++/Chapter3.ipynb377
-rw-r--r--tbc/static/uploads/Hardik/C++/Chapter4.ipynb455
-rw-r--r--tbc/static/uploads/Hardik/C++/screenshots/Chapter13.pngbin0 -> 17699 bytes
-rw-r--r--tbc/static/uploads/Hardik/C++/screenshots/Chapter4.pngbin0 -> 10832 bytes
-rw-r--r--tbc/static/uploads/Hardik/C++/screenshots/xyz.pngbin0 -> 70584 bytes
-rw-r--r--tbc/static/uploads/Hardik/C/images/certificate.pngbin0 -> 71052 bytes
-rw-r--r--tbc/static/uploads/Hardik/C/images/pr.jpegbin0 -> 63824 bytes
-rw-r--r--tbc/static/uploads/Hardik/C/images/scipy.pngbin0 -> 14314 bytes
-rw-r--r--tbc/static/uploads/Hardik/C/newton.py35
-rw-r--r--tbc/static/uploads/Hardik/C/newton_raphson.py132
-rw-r--r--tbc/static/uploads/Hardik/C/nr.py51
-rw-r--r--tbc/static/uploads/Hardik/C: The Basics/Chapter16.ipynb305
-rw-r--r--tbc/static/uploads/Hardik/C: The Basics/Chapter17.ipynb322
-rw-r--r--tbc/static/uploads/Hardik/C: The Basics/Chapter18.ipynb57
-rw-r--r--tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter13.pngbin0 -> 17699 bytes
-rw-r--r--tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter5.pngbin0 -> 57409 bytes
-rw-r--r--tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter6.pngbin0 -> 21873 bytes
-rw-r--r--tbc/static/uploads/Hardik/PHP/Chapter13.pngbin0 -> 17699 bytes
-rw-r--r--tbc/static/uploads/Hardik/PHP/Chapter4.pngbin0 -> 10832 bytes
-rw-r--r--tbc/static/uploads/Hardik/PHP/Chapter6.pngbin0 -> 21873 bytes
-rw-r--r--tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter5.ipynb427
-rw-r--r--tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter6.ipynb603
-rw-r--r--tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter7.ipynb727
-rw-r--r--tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/Chapter7.pngbin0 -> 14314 bytes
-rw-r--r--tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/nb.pngbin0 -> 89584 bytes
-rw-r--r--tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/try.pngbin0 -> 63444 bytes
-rw-r--r--tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter10.ipynb719
-rw-r--r--tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter8.ipynb432
-rw-r--r--tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter9.ipynb379
-rw-r--r--tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter2.pngbin0 -> 19760 bytes
-rw-r--r--tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter4.pngbin0 -> 10832 bytes
-rw-r--r--tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/xyz.pngbin0 -> 70584 bytes
-rwxr-xr-xtbc/templates/base.html116
-rw-r--r--tbc/templates/base1.html75
-rw-r--r--tbc/templates/tbc/book-details.html28
-rw-r--r--tbc/templates/tbc/browse-books.html25
-rw-r--r--tbc/templates/tbc/login.html8
-rw-r--r--tbc/templates/tbc/profile.html8
-rw-r--r--tbc/templates/tbc/register.html8
-rw-r--r--tbc/templates/tbc/submit-book.html9
-rw-r--r--tbc/templates/tbc/upload-chapters.html16
-rw-r--r--tbc/templates/tbc/upload-images.html11
-rw-r--r--tbc/tests.py16
-rw-r--r--tbc/urls.py17
-rw-r--r--tbc/views.py235
93 files changed, 19627 insertions, 0 deletions
diff --git a/PythonTBC/__init__.py b/PythonTBC/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/PythonTBC/__init__.py
diff --git a/PythonTBC/settings.py b/PythonTBC/settings.py
new file mode 100644
index 0000000..243adf0
--- /dev/null
+++ b/PythonTBC/settings.py
@@ -0,0 +1,163 @@
+# Django settings for PythonTBC project.
+
+from os.path import *
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+ ('Hardik Ghaghada', 'hardik@fossee.in'),
+)
+
+MANAGERS = ADMINS
+PROJDIR = abspath(dirname(__file__))
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ 'NAME': 'pythontbc', # Or path to database file if using sqlite3.
+ # The following settings are not used with sqlite3:
+ 'USER': 'root',
+ 'PASSWORD': 'Pyth0n321',
+ 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
+ 'PORT': '', # Set to empty string for default.
+ }
+}
+
+# Hosts/domain names that are valid for this site; required if DEBUG is False
+# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
+ALLOWED_HOSTS = []
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# In a Windows environment this must be set to your system time zone.
+TIME_ZONE = 'Asia/Calcutta'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# If you set this to False, Django will not format dates, numbers and
+# calendars according to the current locale.
+USE_L10N = True
+
+# If you set this to False, Django will not use timezone-aware datetimes.
+USE_TZ = True
+
+# Absolute filesystem path to the directory that will hold user-uploaded files.
+# Example: "/var/www/example.com/media/"
+MEDIA_ROOT = join(PROJDIR, '../tbc/static/uploads')
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash.
+# Examples: "http://example.com/media/", "http://media.example.com/"
+MEDIA_URL = '/tbc/static/uploads/'
+
+# Absolute path to the directory static files should be collected to.
+# Don't put anything in this directory yourself; store your static files
+# in apps' "static/" subdirectories and in STATICFILES_DIRS.
+# Example: "/var/www/example.com/static/"
+STATIC_ROOT = ''
+
+# URL prefix for static files.
+# Example: "http://example.com/static/", "http://static.example.com/"
+STATIC_URL = '/static/'
+
+# Additional locations of static files
+STATICFILES_DIRS = (
+ # Put strings here, like "/home/html/static" or "C:/www/django/static".
+ # Always use forward slashes, even on Windows.
+ # Don't forget to use absolute paths, not relative paths.
+ join(PROJDIR, '../tbc/static'),
+)
+
+# List of finder classes that know how to find static files in
+# various locations.
+STATICFILES_FINDERS = (
+ 'django.contrib.staticfiles.finders.FileSystemFinder',
+ 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
+# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
+)
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = 'a8zm$)bj&k9p2$1*biby#mo5fga#8$sr4&cmz%h=vum-xkbkme'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+ 'django.template.loaders.filesystem.Loader',
+ 'django.template.loaders.app_directories.Loader',
+# 'django.template.loaders.eggs.Loader',
+)
+
+MIDDLEWARE_CLASSES = (
+ 'django.middleware.common.CommonMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ # Uncomment the next line for simple clickjacking protection:
+ # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+)
+
+ROOT_URLCONF = 'PythonTBC.urls'
+
+# Python dotted path to the WSGI application used by Django's runserver.
+WSGI_APPLICATION = 'PythonTBC.wsgi.application'
+
+TEMPLATE_DIRS = (
+ # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+ # Always use forward slashes, even on Windows.
+ # Don't forget to use absolute paths, not relative paths.
+ join(PROJDIR, '../tbc/templates'),
+)
+
+INSTALLED_APPS = (
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.sites',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ # Uncomment the next line to enable the admin:
+ 'django.contrib.admin',
+ # Uncomment the next line to enable admin documentation:
+ # 'django.contrib.admindocs',
+ 'tbc',
+)
+
+SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
+
+# A sample logging configuration. The only tangible logging
+# performed by this configuration is to send an email to
+# the site admins on every HTTP 500 error when DEBUG=False.
+# See http://docs.djangoproject.com/en/dev/topics/logging for
+# more details on how to customize your logging configuration.
+LOGGING = {
+ 'version': 1,
+ 'disable_existing_loggers': False,
+ 'filters': {
+ 'require_debug_false': {
+ '()': 'django.utils.log.RequireDebugFalse'
+ }
+ },
+ 'handlers': {
+ 'mail_admins': {
+ 'level': 'ERROR',
+ 'filters': ['require_debug_false'],
+ 'class': 'django.utils.log.AdminEmailHandler'
+ }
+ },
+ 'loggers': {
+ 'django.request': {
+ 'handlers': ['mail_admins'],
+ 'level': 'ERROR',
+ 'propagate': True,
+ },
+ }
+}
diff --git a/PythonTBC/urls.py b/PythonTBC/urls.py
new file mode 100644
index 0000000..7664952
--- /dev/null
+++ b/PythonTBC/urls.py
@@ -0,0 +1,18 @@
+from django.conf.urls import patterns, include, url
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+admin.autodiscover()
+
+urlpatterns = patterns('',
+ # Examples:
+ # url(r'^$', 'PythonTBC.views.home', name='home'),
+ # url(r'^PythonTBC/', include('PythonTBC.foo.urls')),
+
+ # Uncomment the admin/doc line below to enable admin documentation:
+ # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+ # Uncomment the next line to enable the admin:
+ url(r'^admin/', include(admin.site.urls)),
+ url(r'^', include('tbc.urls', namespace='tbc')),
+)
diff --git a/PythonTBC/wsgi.py b/PythonTBC/wsgi.py
new file mode 100644
index 0000000..0af9947
--- /dev/null
+++ b/PythonTBC/wsgi.py
@@ -0,0 +1,32 @@
+"""
+WSGI config for PythonTBC project.
+
+This module contains the WSGI application used by Django's development server
+and any production WSGI deployments. It should expose a module-level variable
+named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
+this application via the ``WSGI_APPLICATION`` setting.
+
+Usually you will have the standard Django WSGI application here, but it also
+might make sense to replace the whole Django WSGI application with a custom one
+that later delegates to the Django one. For example, you could introduce WSGI
+middleware here, or combine a Django application with an application of another
+framework.
+
+"""
+import os
+
+# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
+# if running multiple sites in the same mod_wsgi process. To fix this, use
+# mod_wsgi daemon mode with each site in its own daemon process, or use
+# os.environ["DJANGO_SETTINGS_MODULE"] = "PythonTBC.settings"
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PythonTBC.settings")
+
+# This application object is used by any WSGI server configured to use this
+# file. This includes Django's development server, if the WSGI_APPLICATION
+# setting points here.
+from django.core.wsgi import get_wsgi_application
+application = get_wsgi_application()
+
+# Apply WSGI middleware here.
+# from helloworld.wsgi import HelloWorldApplication
+# application = HelloWorldApplication(application)
diff --git a/manage.py b/manage.py
new file mode 100644
index 0000000..a5e5c15
--- /dev/null
+++ b/manage.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PythonTBC.settings")
+
+ from django.core.management import execute_from_command_line
+
+ execute_from_command_line(sys.argv)
diff --git a/tbc/__init__.py b/tbc/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tbc/__init__.py
diff --git a/tbc/admin.py b/tbc/admin.py
new file mode 100644
index 0000000..959ce84
--- /dev/null
+++ b/tbc/admin.py
@@ -0,0 +1,8 @@
+from models import *
+from django.contrib import admin
+
+admin.site.register(Profile)
+admin.site.register(Book)
+admin.site.register(Reviewer)
+admin.site.register(Chapters)
+admin.site.register(ScreenShots)
diff --git a/tbc/forms.py b/tbc/forms.py
new file mode 100644
index 0000000..685b04f
--- /dev/null
+++ b/tbc/forms.py
@@ -0,0 +1,34 @@
+from django import forms
+from django.db import models
+from django.contrib.auth.models import User
+from django.contrib.auth.forms import UserCreationForm, UserChangeForm
+
+from tbc.models import *
+
+
+class UserProfileForm(forms.ModelForm):
+ class Meta:
+ model = Profile
+ exclude = ('user')
+
+
+class UserRegisterForm(UserCreationForm):
+ class Meta:
+ model = User
+ fields = ('first_name', 'last_name', 'email',
+ 'username', 'password1', 'password2')
+
+
+class UserLoginForm(forms.Form):
+ username = forms.CharField(widget=forms.TextInput(attrs={
+ 'class': 'form-control',
+ 'placeholder': 'Username'}), label='')
+ password = forms.CharField(widget=forms.PasswordInput(attrs={
+ 'class': 'form-control',
+ 'placeholder': 'Password'}), label='')
+
+
+class BookForm(forms.ModelForm):
+ class Meta:
+ model = Book
+ exclude = ('contributor')
diff --git a/tbc/models.py b/tbc/models.py
new file mode 100644
index 0000000..2749a8f
--- /dev/null
+++ b/tbc/models.py
@@ -0,0 +1,75 @@
+from django.db import models
+from django.contrib.auth.models import User
+from PythonTBC import settings
+
+
+CATEGORY = (("computer science", "Computer Science"),
+ ("chemical engg", "Chemical Engg"),
+ ("aerospace engg", "Aerospace Engg"),
+ ("electronics engg", "Electronics Engg"),
+ ("thermodynamics", "Thermodynamics"),
+ ("mechanical engg", "Mechanical Engg"),
+ ("mathematics", "Mathematics"))
+
+GENDER = (("male", "Male"),
+ ("female", "Female"))
+
+def get_notebook_dir(instance, filename):
+ return '%s/%s/%s' % (instance.book.contributor, instance.book.name, filename)
+
+
+def get_image_dir(instance, filename):
+ return '%s/%s/screenshots/%s' % (instance.book.contributor, instance.book.name, filename)
+
+
+class Profile(models.Model):
+ """Model to store profile of a user."""
+ user = models.ForeignKey(User)
+ about = models.CharField(max_length=256)
+ insti_org = models.CharField(max_length=128)
+ dept_desg = models.CharField(max_length=32)
+ dob = models.DateField()
+ gender = models.CharField(max_length=10, choices=GENDER)
+ phone_no = models.CharField(max_length=15)
+ def __unicode__(self):
+ name = self.user.first_name or 'Profile'
+ return '%s'%(name)
+
+
+class Reviewer(models.Model):
+ name = models.CharField(max_length=32)
+ email = models.EmailField()
+ def __unicode__(self):
+ name = self.name or 'Reviewer'
+ return '%s'%(name)
+
+class Book(models.Model):
+ """Model to store the book details"""
+ name = models.CharField(max_length=32)
+ author = models.CharField(max_length=32)
+ category = models.CharField(max_length=32, choices=CATEGORY)
+ publisher = models.CharField(max_length=50)
+ isbn = models.CharField(max_length=20)
+ no_chapters = models.IntegerField(max_length=2)
+ contributor = models.ForeignKey(Profile)
+ reviewer = models.ForeignKey(Reviewer)
+ def __unicode__(self):
+ name = self.name or 'Book'
+ return '%s'%(name)
+
+class Chapters(models.Model):
+ name = models.CharField(max_length=200)
+ notebook = models.FileField(upload_to=get_notebook_dir)
+ book = models.ForeignKey(Book)
+ def __unicode__(self):
+ name = self.name or 'Chapter'
+ return '%s'%(name)
+
+
+class ScreenShots(models.Model):
+ caption = models.CharField(max_length=128)
+ image = models.FileField(upload_to=get_image_dir)
+ book = models.ForeignKey(Book)
+ def __unicode__(self):
+ name = self.caption or 'ScreenShots'
+ return '%s'%(name)
diff --git a/tbc/static/css/base.css b/tbc/static/css/base.css
new file mode 100755
index 0000000..1c3572e
--- /dev/null
+++ b/tbc/static/css/base.css
@@ -0,0 +1,6183 @@
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2013 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @mdo and @fat.
+ */
+
+.clearfix {
+ *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+ display: block;
+}
+
+audio,
+canvas,
+video {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+}
+
+audio:not([controls]) {
+ display: none;
+}
+
+html {
+ font-size: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+ outline: thin dotted #333;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+ outline: 0;
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+img {
+ width: auto\9;
+ height: 225px;
+ max-width: 300px;
+ vertical-align: middle;
+ border: 0;
+ -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img,
+.google-maps img {
+ max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+ margin: 0;
+ font-size: 100%;
+ vertical-align: middle;
+}
+
+button,
+input {
+ *overflow: visible;
+ line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ cursor: pointer;
+ -webkit-appearance: button;
+}
+
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+ cursor: pointer;
+}
+
+input[type="search"] {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+ -webkit-appearance: none;
+}
+
+textarea {
+ overflow: auto;
+ vertical-align: top;
+}
+
+@media print {
+ * {
+ color: #000 !important;
+ text-shadow: none !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) ")";
+ }
+ .ir a:after,
+ 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;
+ }
+ @page {
+ margin: 0.5cm;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+}
+
+body {
+ margin: 0;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 20px;
+ color: #333333;
+ background-color: #ffffff;
+}
+
+a {
+ color: #0088cc;
+ text-decoration: none;
+}
+
+a:hover,
+a:focus {
+ color: #005580;
+ text-decoration: underline;
+}
+
+.img-rounded {
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+.img-polaroid {
+ padding: 4px;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+ -webkit-border-radius: 500px;
+ -moz-border-radius: 500px;
+ border-radius: 500px;
+}
+
+.row {
+ margin-left: -20px;
+ *zoom: 1;
+}
+
+.row:before,
+.row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.row:after {
+ clear: both;
+}
+
+[class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+ width: 940px;
+}
+
+.span12 {
+ width: 940px;
+}
+
+.span11 {
+ width: 860px;
+}
+
+.span10 {
+ width: 780px;
+}
+
+.span9 {
+ width: 700px;
+}
+
+.span8 {
+ width: 620px;
+}
+
+.span7 {
+ width: 540px;
+}
+
+.span6 {
+ width: 460px;
+}
+
+.span5 {
+ width: 380px;
+}
+
+.span4 {
+ width: 300px;
+}
+
+.span3 {
+ width: 220px;
+}
+
+.span2 {
+ width: 140px;
+}
+
+.span1 {
+ width: 60px;
+}
+
+.offset12 {
+ margin-left: 980px;
+}
+
+.offset11 {
+ margin-left: 900px;
+}
+
+.offset10 {
+ margin-left: 820px;
+}
+
+.offset9 {
+ margin-left: 740px;
+}
+
+.offset8 {
+ margin-left: 660px;
+}
+
+.offset7 {
+ margin-left: 580px;
+}
+
+.offset6 {
+ margin-left: 500px;
+}
+
+.offset5 {
+ margin-left: 420px;
+}
+
+.offset4 {
+ margin-left: 340px;
+}
+
+.offset3 {
+ margin-left: 260px;
+}
+
+.offset2 {
+ margin-left: 180px;
+}
+
+.offset1 {
+ margin-left: 100px;
+}
+
+.row-fluid {
+ width: 100%;
+ *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.row-fluid:after {
+ clear: both;
+}
+
+.row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.127659574468085%;
+ *margin-left: 2.074468085106383%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+}
+
+.row-fluid .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 2.127659574468085%;
+}
+
+.row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+ width: 91.48936170212765%;
+ *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+ width: 82.97872340425532%;
+ *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+ width: 74.46808510638297%;
+ *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+ width: 65.95744680851064%;
+ *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+ width: 57.44680851063829%;
+ *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+ width: 48.93617021276595%;
+ *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+ width: 40.42553191489362%;
+ *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+ width: 31.914893617021278%;
+ *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+ width: 23.404255319148934%;
+ *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+ width: 14.893617021276595%;
+ *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+ width: 6.382978723404255%;
+ *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+ margin-left: 104.25531914893617%;
+ *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+ margin-left: 102.12765957446808%;
+ *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+ margin-left: 95.74468085106382%;
+ *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+ margin-left: 93.61702127659574%;
+ *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+ margin-left: 87.23404255319149%;
+ *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+ margin-left: 85.1063829787234%;
+ *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+ margin-left: 78.72340425531914%;
+ *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+ margin-left: 76.59574468085106%;
+ *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+ margin-left: 70.2127659574468%;
+ *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+ margin-left: 68.08510638297872%;
+ *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+ margin-left: 61.70212765957446%;
+ *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+ margin-left: 59.574468085106375%;
+ *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+ margin-left: 53.191489361702125%;
+ *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+ margin-left: 51.063829787234035%;
+ *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+ margin-left: 44.68085106382979%;
+ *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+ margin-left: 42.5531914893617%;
+ *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+ margin-left: 36.170212765957444%;
+ *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+ margin-left: 34.04255319148936%;
+ *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+ margin-left: 27.659574468085104%;
+ *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+ margin-left: 25.53191489361702%;
+ *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+ margin-left: 19.148936170212764%;
+ *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+ margin-left: 17.02127659574468%;
+ *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+ margin-left: 10.638297872340425%;
+ *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+ margin-left: 8.51063829787234%;
+ *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+ display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+ float: right;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ *zoom: 1;
+}
+
+.container:before,
+.container:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.container:after {
+ clear: both;
+}
+
+.container-fluid {
+ padding-right: 20px;
+ padding-left: 20px;
+ *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.container-fluid:after {
+ clear: both;
+}
+
+p {
+ margin: 0 0 10px;
+}
+
+.lead {
+ margin-bottom: 20px;
+ font-size: 21px;
+ font-weight: 200;
+ line-height: 30px;
+}
+
+small {
+ font-size: 85%;
+}
+
+strong {
+ font-weight: bold;
+}
+
+em {
+ font-style: italic;
+}
+
+cite {
+ font-style: normal;
+}
+
+.muted {
+ color: #999999;
+}
+
+a.muted:hover,
+a.muted:focus {
+ color: #808080;
+}
+
+.text-warning {
+ color: #c09853;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+ color: #a47e3c;
+}
+
+.text-error {
+ color: #b94a48;
+}
+
+a.text-error:hover,
+a.text-error:focus {
+ color: #953b39;
+}
+
+.text-info {
+ color: #3a87ad;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+ color: #2d6987;
+}
+
+.text-success {
+ color: #468847;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+ color: #356635;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-right {
+ text-align: right;
+}
+
+.text-center {
+ text-align: center;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin: 10px 0;
+ font-family: inherit;
+ font-weight: bold;
+ line-height: 20px;
+ color: inherit;
+ text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+ font-weight: normal;
+ line-height: 1;
+ color: #999999;
+}
+
+h1,
+h2,
+h3 {
+ line-height: 40px;
+}
+
+h1 {
+ font-size: 38.5px;
+}
+
+h2 {
+ font-size: 31.5px;
+}
+
+h3 {
+ font-size: 24.5px;
+}
+
+h4 {
+ font-size: 17.5px;
+}
+
+h5 {
+ font-size: 14px;
+}
+
+h6 {
+ font-size: 11.9px;
+}
+
+h1 small {
+ font-size: 24.5px;
+}
+
+h2 small {
+ font-size: 17.5px;
+}
+
+h3 small {
+ font-size: 14px;
+}
+
+h4 small {
+ font-size: 14px;
+}
+
+.page-header {
+ padding-bottom: 9px;
+ margin: 20px 0 30px;
+ border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+ padding: 0;
+ margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+ margin-bottom: 0;
+}
+
+li {
+ line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+ margin-left: 0;
+ list-style: none;
+}
+
+ul.inline,
+ol.inline {
+ margin-left: 0;
+ list-style: none;
+}
+
+ul.inline > li,
+ol.inline > li {
+ display: inline-block;
+ *display: inline;
+ padding-right: 5px;
+ padding-left: 5px;
+ *zoom: 1;
+}
+
+dl {
+ margin-bottom: 20px;
+}
+
+dt,
+dd {
+ line-height: 20px;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 10px;
+}
+
+.dl-horizontal {
+ *zoom: 1;
+}
+
+.dl-horizontal:before,
+.dl-horizontal:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.dl-horizontal:after {
+ clear: both;
+}
+
+.dl-horizontal dt {
+ float: left;
+ width: 160px;
+ overflow: hidden;
+ clear: left;
+ text-align: right;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.dl-horizontal dd {
+ margin-left: 180px;
+}
+
+hr {
+ margin: 20px 0;
+ border: 0;
+ border-top: 1px solid #eeeeee;
+ border-bottom: 1px solid #ffffff;
+}
+
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+blockquote {
+ padding: 0 0 0 15px;
+ margin: 0 0 20px;
+ border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+ margin-bottom: 0;
+ font-size: 17.5px;
+ font-weight: 300;
+ line-height: 1.25;
+}
+
+blockquote small {
+ display: block;
+ line-height: 20px;
+ color: #999999;
+}
+
+blockquote small:before {
+ content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+ float: right;
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid #eeeeee;
+ border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+ text-align: right;
+}
+
+blockquote.pull-right small:before {
+ content: '';
+}
+
+blockquote.pull-right small:after {
+ content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+
+address {
+ display: block;
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 20px;
+}
+
+code,
+pre {
+ padding: 0 3px 2px;
+ font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+ font-size: 12px;
+ color: #333333;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+code {
+ padding: 2px 4px;
+ color: #d14;
+ white-space: nowrap;
+ background-color: #f7f7f9;
+ border: 1px solid #e1e1e8;
+}
+
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 20px;
+ word-break: break-all;
+ word-wrap: break-word;
+ white-space: pre;
+ white-space: pre-wrap;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+pre.prettyprint {
+ margin-bottom: 20px;
+}
+
+pre code {
+ padding: 0;
+ color: inherit;
+ white-space: pre;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border: 0;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+form {
+ margin: 0 0 20px;
+}
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: 20px;
+ font-size: 21px;
+ line-height: 40px;
+ color: #333333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+ font-size: 15px;
+ color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+ display: block;
+ margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+ display: inline-block;
+ height: 20px;
+ padding: 4px 6px;
+ margin-bottom: 10px;
+ font-size: 14px;
+ line-height: 20px;
+ color: #555555;
+ vertical-align: middle;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+input,
+textarea,
+.uneditable-input {
+ width: 206px;
+}
+
+textarea {
+ height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+ background-color: #ffffff;
+ border: 1px solid #cccccc;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-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 linear 0.2s, box-shadow linear 0.2s;
+ -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+ -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+ transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+ border-color: rgba(82, 168, 236, 0.8);
+ outline: 0;
+ outline: thin dotted \9;
+ /* IE6-9 */
+
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ *margin-top: 0;
+ line-height: normal;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+ width: auto;
+}
+
+select,
+input[type="file"] {
+ height: 30px;
+ /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+ *margin-top: 4px;
+ /* For IE7, add top margin to align select with labels */
+
+ line-height: 30px;
+}
+
+select {
+ width: 220px;
+ background-color: #ffffff;
+ border: 1px solid #cccccc;
+}
+
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted #333;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+ color: #999999;
+ cursor: not-allowed;
+ background-color: #fcfcfc;
+ border-color: #cccccc;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+ overflow: hidden;
+ white-space: nowrap;
+}
+
+.uneditable-textarea {
+ width: auto;
+ height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+ color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+ color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+ color: #999999;
+}
+
+.radio,
+.checkbox {
+ min-height: 20px;
+ padding-left: 20px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+ float: left;
+ margin-left: -20px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+ padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+ display: inline-block;
+ padding-top: 5px;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+ margin-left: 10px;
+}
+
+.input-mini {
+ width: 60px;
+}
+
+.input-small {
+ width: 90px;
+}
+
+.input-medium {
+ width: 150px;
+}
+
+.input-large {
+ width: 210px;
+}
+
+.input-xlarge {
+ width: 270px;
+}
+
+.input-xxlarge {
+ width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+ float: none;
+ margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+ display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+ margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+ margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+ width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+ width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+ width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+ width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+ width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+ width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+ width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+ width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+ width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+ width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+ width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+ width: 46px;
+}
+
+.controls-row {
+ *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.controls-row:after {
+ clear: both;
+}
+
+.controls-row [class*="span"],
+.row-fluid .controls-row [class*="span"] {
+ float: left;
+}
+
+.controls-row .checkbox[class*="span"],
+.controls-row .radio[class*="span"] {
+ padding-top: 5px;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+ cursor: not-allowed;
+ background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+ background-color: transparent;
+}
+
+.control-group.warning .control-label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+ color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+ color: #c09853;
+}
+
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+ border-color: #c09853;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+ border-color: #a47e3c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+ color: #c09853;
+ background-color: #fcf8e3;
+ border-color: #c09853;
+}
+
+.control-group.error .control-label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+ color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+ color: #b94a48;
+}
+
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+ border-color: #b94a48;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+ border-color: #953b39;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+ color: #b94a48;
+ background-color: #f2dede;
+ border-color: #b94a48;
+}
+
+.control-group.success .control-label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+ color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+ color: #468847;
+}
+
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+ border-color: #468847;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+ border-color: #356635;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+ color: #468847;
+ background-color: #dff0d8;
+ border-color: #468847;
+}
+
+.control-group.info .control-label,
+.control-group.info .help-block,
+.control-group.info .help-inline {
+ color: #3a87ad;
+}
+
+.control-group.info .checkbox,
+.control-group.info .radio,
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+ color: #3a87ad;
+}
+
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+ border-color: #3a87ad;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.info input:focus,
+.control-group.info select:focus,
+.control-group.info textarea:focus {
+ border-color: #2d6987;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+}
+
+.control-group.info .input-prepend .add-on,
+.control-group.info .input-append .add-on {
+ color: #3a87ad;
+ background-color: #d9edf7;
+ border-color: #3a87ad;
+}
+
+input:focus:invalid,
+textarea:focus:invalid,
+select:focus:invalid {
+ color: #b94a48;
+ border-color: #ee5f5b;
+}
+
+input:focus:invalid:focus,
+textarea:focus:invalid:focus,
+select:focus:invalid:focus {
+ border-color: #e9322d;
+ -webkit-box-shadow: 0 0 6px #f8b9b7;
+ -moz-box-shadow: 0 0 6px #f8b9b7;
+ box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+ padding: 19px 20px 20px;
+ margin-top: 20px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #e5e5e5;
+ *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.form-actions:after {
+ clear: both;
+}
+
+.help-block,
+.help-inline {
+ color: #595959;
+}
+
+.help-block {
+ display: block;
+ margin-bottom: 10px;
+}
+
+.help-inline {
+ display: inline-block;
+ *display: inline;
+ padding-left: 5px;
+ vertical-align: middle;
+ *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+ display: inline-block;
+ margin-bottom: 10px;
+ font-size: 0;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input,
+.input-append .dropdown-menu,
+.input-prepend .dropdown-menu,
+.input-append .popover,
+.input-prepend .popover {
+ font-size: 14px;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+ position: relative;
+ margin-bottom: 0;
+ *margin-left: 0;
+ vertical-align: top;
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+ z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+ display: inline-block;
+ width: auto;
+ height: 20px;
+ min-width: 16px;
+ padding: 4px 5px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 20px;
+ text-align: center;
+ text-shadow: 0 1px 0 #ffffff;
+ background-color: #eeeeee;
+ border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn,
+.input-append .btn-group > .dropdown-toggle,
+.input-prepend .btn-group > .dropdown-toggle {
+ vertical-align: top;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+ background-color: #a9dba9;
+ border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+ margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+
+.input-append input + .btn-group .btn:last-child,
+.input-append select + .btn-group .btn:last-child,
+.input-append .uneditable-input + .btn-group .btn:last-child {
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.input-append .add-on,
+.input-append .btn,
+.input-append .btn-group {
+ margin-left: -1px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child,
+.input-append .btn-group:last-child > .dropdown-toggle {
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.input-prepend.input-append input + .btn-group .btn,
+.input-prepend.input-append select + .btn-group .btn,
+.input-prepend.input-append .uneditable-input + .btn-group .btn {
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+ margin-right: -1px;
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+ margin-left: -1px;
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .btn-group:first-child {
+ margin-left: 0;
+}
+
+input.search-query {
+ padding-right: 14px;
+ padding-right: 4px \9;
+ padding-left: 14px;
+ padding-left: 4px \9;
+ /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+ margin-bottom: 0;
+ -webkit-border-radius: 15px;
+ -moz-border-radius: 15px;
+ border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+ -webkit-border-radius: 14px 0 0 14px;
+ -moz-border-radius: 14px 0 0 14px;
+ border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+ -webkit-border-radius: 0 14px 14px 0;
+ -moz-border-radius: 0 14px 14px 0;
+ border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+ -webkit-border-radius: 0 14px 14px 0;
+ -moz-border-radius: 0 14px 14px 0;
+ border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+ -webkit-border-radius: 14px 0 0 14px;
+ -moz-border-radius: 14px 0 0 14px;
+ border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+ display: inline-block;
+ *display: inline;
+ margin-bottom: 0;
+ vertical-align: middle;
+ *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+ display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+ display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+ margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+ padding-left: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+ float: left;
+ margin-right: 3px;
+ margin-left: 0;
+}
+
+.control-group {
+ margin-bottom: 10px;
+}
+
+legend + .control-group {
+ margin-top: 20px;
+ -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+ margin-bottom: 20px;
+ *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.form-horizontal .control-group:after {
+ clear: both;
+}
+
+.form-horizontal .control-label {
+ float: left;
+ width: 160px;
+ padding-top: 5px;
+ text-align: right;
+}
+
+.form-horizontal .controls {
+ *display: inline-block;
+ *padding-left: 20px;
+ margin-left: 180px;
+ *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+ *padding-left: 180px;
+}
+
+.form-horizontal .help-block {
+ margin-bottom: 0;
+}
+
+.form-horizontal input + .help-block,
+.form-horizontal select + .help-block,
+.form-horizontal textarea + .help-block,
+.form-horizontal .uneditable-input + .help-block,
+.form-horizontal .input-prepend + .help-block,
+.form-horizontal .input-append + .help-block {
+ margin-top: 10px;
+}
+
+.form-horizontal .form-actions {
+ padding-left: 180px;
+}
+
+table {
+ max-width: 100%;
+ background-color: transparent;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+.table {
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+ padding: 8px;
+ line-height: 20px;
+ text-align: left;
+ vertical-align: top;
+ border-top: 1px solid #dddddd;
+}
+
+.table th {
+ font-weight: bold;
+}
+
+.table thead th {
+ vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+ border-top: 0;
+}
+
+.table tbody + tbody {
+ border-top: 2px solid #dddddd;
+}
+
+.table .table {
+ background-color: #ffffff;
+}
+
+.table-condensed th,
+.table-condensed td {
+ padding: 4px 5px;
+}
+
+.table-bordered {
+ border: 1px solid #dddddd;
+ border-collapse: separate;
+ *border-collapse: collapse;
+ border-left: 0;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+ border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+ border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child > th:first-child,
+.table-bordered tbody:first-child tr:first-child > td:first-child,
+.table-bordered tbody:first-child tr:first-child > th:first-child {
+ -webkit-border-top-left-radius: 4px;
+ border-top-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child > th:last-child,
+.table-bordered tbody:first-child tr:first-child > td:last-child,
+.table-bordered tbody:first-child tr:first-child > th:last-child {
+ -webkit-border-top-right-radius: 4px;
+ border-top-right-radius: 4px;
+ -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:first-child,
+.table-bordered tbody:last-child tr:last-child > td:first-child,
+.table-bordered tbody:last-child tr:last-child > th:first-child,
+.table-bordered tfoot:last-child tr:last-child > td:first-child,
+.table-bordered tfoot:last-child tr:last-child > th:first-child {
+ -webkit-border-bottom-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:last-child,
+.table-bordered tbody:last-child tr:last-child > td:last-child,
+.table-bordered tbody:last-child tr:last-child > th:last-child,
+.table-bordered tfoot:last-child tr:last-child > td:last-child,
+.table-bordered tfoot:last-child tr:last-child > th:last-child {
+ -webkit-border-bottom-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
+ -webkit-border-bottom-left-radius: 0;
+ border-bottom-left-radius: 0;
+ -moz-border-radius-bottomleft: 0;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
+ -webkit-border-bottom-right-radius: 0;
+ border-bottom-right-radius: 0;
+ -moz-border-radius-bottomright: 0;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+ -webkit-border-top-left-radius: 4px;
+ border-top-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+ -webkit-border-top-right-radius: 4px;
+ border-top-right-radius: 4px;
+ -moz-border-radius-topright: 4px;
+}
+
+.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 td[class*="span"],
+table th[class*="span"],
+.row-fluid table td[class*="span"],
+.row-fluid table th[class*="span"] {
+ display: table-cell;
+ float: none;
+ margin-left: 0;
+}
+
+.table td.span1,
+.table th.span1 {
+ float: none;
+ width: 44px;
+ margin-left: 0;
+}
+
+.table td.span2,
+.table th.span2 {
+ float: none;
+ width: 124px;
+ margin-left: 0;
+}
+
+.table td.span3,
+.table th.span3 {
+ float: none;
+ width: 204px;
+ margin-left: 0;
+}
+
+.table td.span4,
+.table th.span4 {
+ float: none;
+ width: 284px;
+ margin-left: 0;
+}
+
+.table td.span5,
+.table th.span5 {
+ float: none;
+ width: 364px;
+ margin-left: 0;
+}
+
+.table td.span6,
+.table th.span6 {
+ float: none;
+ width: 444px;
+ margin-left: 0;
+}
+
+.table td.span7,
+.table th.span7 {
+ float: none;
+ width: 524px;
+ margin-left: 0;
+}
+
+.table td.span8,
+.table th.span8 {
+ float: none;
+ width: 604px;
+ margin-left: 0;
+}
+
+.table td.span9,
+.table th.span9 {
+ float: none;
+ width: 684px;
+ margin-left: 0;
+}
+
+.table td.span10,
+.table th.span10 {
+ float: none;
+ width: 764px;
+ margin-left: 0;
+}
+
+.table td.span11,
+.table th.span11 {
+ float: none;
+ width: 844px;
+ margin-left: 0;
+}
+
+.table td.span12,
+.table th.span12 {
+ float: none;
+ width: 924px;
+ margin-left: 0;
+}
+
+.table tbody tr.success > td {
+ background-color: #dff0d8;
+}
+
+.table tbody tr.error > td {
+ background-color: #f2dede;
+}
+
+.table tbody tr.warning > td {
+ background-color: #fcf8e3;
+}
+
+.table tbody tr.info > td {
+ background-color: #d9edf7;
+}
+
+.table-hover tbody tr.success:hover > td {
+ background-color: #d0e9c6;
+}
+
+.table-hover tbody tr.error:hover > td {
+ background-color: #ebcccc;
+}
+
+.table-hover tbody tr.warning:hover > td {
+ background-color: #faf2cc;
+}
+
+.table-hover tbody tr.info:hover > td {
+ background-color: #c4e3f3;
+}
+
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline-block;
+ width: 14px;
+ height: 14px;
+ margin-top: 1px;
+ *margin-right: .3em;
+ line-height: 14px;
+ vertical-align: text-top;
+ background-image: url("../img/glyphicons-halflings.png");
+ background-position: 14px 14px;
+ background-repeat: no-repeat;
+}
+
+/* White icons with optional class, or on hover/focus/active states of certain elements */
+
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:focus > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > li > a:focus > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:focus > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"],
+.dropdown-submenu:focus > a > [class*=" icon-"] {
+ background-image: url("../img/glyphicons-halflings-white.png");
+}
+
+.icon-glass {
+ background-position: 0 0;
+}
+
+.icon-music {
+ background-position: -24px 0;
+}
+
+.icon-search {
+ background-position: -48px 0;
+}
+
+.icon-envelope {
+ background-position: -72px 0;
+}
+
+.icon-heart {
+ background-position: -96px 0;
+}
+
+.icon-star {
+ background-position: -120px 0;
+}
+
+.icon-star-empty {
+ background-position: -144px 0;
+}
+
+.icon-user {
+ background-position: -168px 0;
+}
+
+.icon-film {
+ background-position: -192px 0;
+}
+
+.icon-th-large {
+ background-position: -216px 0;
+}
+
+.icon-th {
+ background-position: -240px 0;
+}
+
+.icon-th-list {
+ background-position: -264px 0;
+}
+
+.icon-ok {
+ background-position: -288px 0;
+}
+
+.icon-remove {
+ background-position: -312px 0;
+}
+
+.icon-zoom-in {
+ background-position: -336px 0;
+}
+
+.icon-zoom-out {
+ background-position: -360px 0;
+}
+
+.icon-off {
+ background-position: -384px 0;
+}
+
+.icon-signal {
+ background-position: -408px 0;
+}
+
+.icon-cog {
+ background-position: -432px 0;
+}
+
+.icon-trash {
+ background-position: -456px 0;
+}
+
+.icon-home {
+ background-position: 0 -24px;
+}
+
+.icon-file {
+ background-position: -24px -24px;
+}
+
+.icon-time {
+ background-position: -48px -24px;
+}
+
+.icon-road {
+ background-position: -72px -24px;
+}
+
+.icon-download-alt {
+ background-position: -96px -24px;
+}
+
+.icon-download {
+ background-position: -120px -24px;
+}
+
+.icon-upload {
+ background-position: -144px -24px;
+}
+
+.icon-inbox {
+ background-position: -168px -24px;
+}
+
+.icon-play-circle {
+ background-position: -192px -24px;
+}
+
+.icon-repeat {
+ background-position: -216px -24px;
+}
+
+.icon-refresh {
+ background-position: -240px -24px;
+}
+
+.icon-list-alt {
+ background-position: -264px -24px;
+}
+
+.icon-lock {
+ background-position: -287px -24px;
+}
+
+.icon-flag {
+ background-position: -312px -24px;
+}
+
+.icon-headphones {
+ background-position: -336px -24px;
+}
+
+.icon-volume-off {
+ background-position: -360px -24px;
+}
+
+.icon-volume-down {
+ background-position: -384px -24px;
+}
+
+.icon-volume-up {
+ background-position: -408px -24px;
+}
+
+.icon-qrcode {
+ background-position: -432px -24px;
+}
+
+.icon-barcode {
+ background-position: -456px -24px;
+}
+
+.icon-tag {
+ background-position: 0 -48px;
+}
+
+.icon-tags {
+ background-position: -25px -48px;
+}
+
+.icon-book {
+ background-position: -48px -48px;
+}
+
+.icon-bookmark {
+ background-position: -72px -48px;
+}
+
+.icon-print {
+ background-position: -96px -48px;
+}
+
+.icon-camera {
+ background-position: -120px -48px;
+}
+
+.icon-font {
+ background-position: -144px -48px;
+}
+
+.icon-bold {
+ background-position: -167px -48px;
+}
+
+.icon-italic {
+ background-position: -192px -48px;
+}
+
+.icon-text-height {
+ background-position: -216px -48px;
+}
+
+.icon-text-width {
+ background-position: -240px -48px;
+}
+
+.icon-align-left {
+ background-position: -264px -48px;
+}
+
+.icon-align-center {
+ background-position: -288px -48px;
+}
+
+.icon-align-right {
+ background-position: -312px -48px;
+}
+
+.icon-align-justify {
+ background-position: -336px -48px;
+}
+
+.icon-list {
+ background-position: -360px -48px;
+}
+
+.icon-indent-left {
+ background-position: -384px -48px;
+}
+
+.icon-indent-right {
+ background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+ background-position: -432px -48px;
+}
+
+.icon-picture {
+ background-position: -456px -48px;
+}
+
+.icon-pencil {
+ background-position: 0 -72px;
+}
+
+.icon-map-marker {
+ background-position: -24px -72px;
+}
+
+.icon-adjust {
+ background-position: -48px -72px;
+}
+
+.icon-tint {
+ background-position: -72px -72px;
+}
+
+.icon-edit {
+ background-position: -96px -72px;
+}
+
+.icon-share {
+ background-position: -120px -72px;
+}
+
+.icon-check {
+ background-position: -144px -72px;
+}
+
+.icon-move {
+ background-position: -168px -72px;
+}
+
+.icon-step-backward {
+ background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+ background-position: -216px -72px;
+}
+
+.icon-backward {
+ background-position: -240px -72px;
+}
+
+.icon-play {
+ background-position: -264px -72px;
+}
+
+.icon-pause {
+ background-position: -288px -72px;
+}
+
+.icon-stop {
+ background-position: -312px -72px;
+}
+
+.icon-forward {
+ background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+ background-position: -360px -72px;
+}
+
+.icon-step-forward {
+ background-position: -384px -72px;
+}
+
+.icon-eject {
+ background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+ background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+ background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+ background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+ background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+ background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+ background-position: -72px -96px;
+}
+
+.icon-question-sign {
+ background-position: -96px -96px;
+}
+
+.icon-info-sign {
+ background-position: -120px -96px;
+}
+
+.icon-screenshot {
+ background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+ background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+ background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+ background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+ background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+ background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+ background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+ background-position: -312px -96px;
+}
+
+.icon-share-alt {
+ background-position: -336px -96px;
+}
+
+.icon-resize-full {
+ background-position: -360px -96px;
+}
+
+.icon-resize-small {
+ background-position: -384px -96px;
+}
+
+.icon-plus {
+ background-position: -408px -96px;
+}
+
+.icon-minus {
+ background-position: -433px -96px;
+}
+
+.icon-asterisk {
+ background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+ background-position: 0 -120px;
+}
+
+.icon-gift {
+ background-position: -24px -120px;
+}
+
+.icon-leaf {
+ background-position: -48px -120px;
+}
+
+.icon-fire {
+ background-position: -72px -120px;
+}
+
+.icon-eye-open {
+ background-position: -96px -120px;
+}
+
+.icon-eye-close {
+ background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+ background-position: -144px -120px;
+}
+
+.icon-plane {
+ background-position: -168px -120px;
+}
+
+.icon-calendar {
+ background-position: -192px -120px;
+}
+
+.icon-random {
+ width: 16px;
+ background-position: -216px -120px;
+}
+
+.icon-comment {
+ background-position: -240px -120px;
+}
+
+.icon-magnet {
+ background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+ background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+ background-position: -313px -119px;
+}
+
+.icon-retweet {
+ background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+ background-position: -360px -120px;
+}
+
+.icon-folder-close {
+ width: 16px;
+ background-position: -384px -120px;
+}
+
+.icon-folder-open {
+ width: 16px;
+ background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+ background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+ background-position: -456px -118px;
+}
+
+.icon-hdd {
+ background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+ background-position: -24px -144px;
+}
+
+.icon-bell {
+ background-position: -48px -144px;
+}
+
+.icon-certificate {
+ background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+ background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+ background-position: -120px -144px;
+}
+
+.icon-hand-right {
+ background-position: -144px -144px;
+}
+
+.icon-hand-left {
+ background-position: -168px -144px;
+}
+
+.icon-hand-up {
+ background-position: -192px -144px;
+}
+
+.icon-hand-down {
+ background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+ background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+ background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+ background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+ background-position: -312px -144px;
+}
+
+.icon-globe {
+ background-position: -336px -144px;
+}
+
+.icon-wrench {
+ background-position: -360px -144px;
+}
+
+.icon-tasks {
+ background-position: -384px -144px;
+}
+
+.icon-filter {
+ background-position: -408px -144px;
+}
+
+.icon-briefcase {
+ background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+ background-position: -456px -144px;
+}
+
+.dropup,
+.dropdown {
+ position: relative;
+}
+
+.dropdown-toggle {
+ *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+ outline: 0;
+}
+
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ vertical-align: top;
+ border-top: 4px solid #000000;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+ content: "";
+}
+
+.dropdown .caret {
+ margin-top: 8px;
+ margin-left: 2px;
+}
+
+.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;
+ background-color: #ffffff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ *border-right-width: 2px;
+ *border-bottom-width: 2px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.dropdown-menu .divider {
+ *width: 100%;
+ height: 1px;
+ margin: 9px 1px;
+ *margin: -5px 0 5px;
+ overflow: hidden;
+ background-color: #e5e5e5;
+ border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 20px;
+ color: #333333;
+ white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus,
+.dropdown-submenu:hover > a,
+.dropdown-submenu:focus > a {
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #0081c2;
+ background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+ background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+ background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #0081c2;
+ background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+ background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+ background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+ background-repeat: repeat-x;
+ outline: 0;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #999999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ cursor: default;
+ background-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.open {
+ *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+ display: block;
+}
+
+.dropdown-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 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 #000000;
+ content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+ position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+ top: 0;
+ left: 100%;
+ margin-top: -6px;
+ margin-left: -1px;
+ -webkit-border-radius: 0 6px 6px 6px;
+ -moz-border-radius: 0 6px 6px 6px;
+ border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover > .dropdown-menu {
+ display: block;
+}
+
+.dropup .dropdown-submenu > .dropdown-menu {
+ top: auto;
+ bottom: 0;
+ margin-top: 0;
+ margin-bottom: -2px;
+ -webkit-border-radius: 5px 5px 5px 0;
+ -moz-border-radius: 5px 5px 5px 0;
+ border-radius: 5px 5px 5px 0;
+}
+
+.dropdown-submenu > a:after {
+ display: block;
+ float: right;
+ width: 0;
+ height: 0;
+ margin-top: 5px;
+ margin-right: -10px;
+ border-color: transparent;
+ border-left-color: #cccccc;
+ border-style: solid;
+ border-width: 5px 0 5px 5px;
+ content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+ border-left-color: #ffffff;
+}
+
+.dropdown-submenu.pull-left {
+ float: none;
+}
+
+.dropdown-submenu.pull-left > .dropdown-menu {
+ left: -100%;
+ margin-left: 10px;
+ -webkit-border-radius: 6px 0 6px 6px;
+ -moz-border-radius: 6px 0 6px 6px;
+ border-radius: 6px 0 6px 6px;
+}
+
+.dropdown .dropdown-menu .nav-header {
+ padding-right: 20px;
+ padding-left: 20px;
+}
+
+.typeahead {
+ z-index: 1051;
+ margin-top: 2px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+ -moz-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-large {
+ padding: 24px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+.well-small {
+ padding: 9px;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+.fade {
+ opacity: 0;
+ -webkit-transition: opacity 0.15s linear;
+ -moz-transition: opacity 0.15s linear;
+ -o-transition: opacity 0.15s linear;
+ transition: opacity 0.15s linear;
+}
+
+.fade.in {
+ opacity: 1;
+}
+
+.collapse {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition: height 0.35s ease;
+ -moz-transition: height 0.35s ease;
+ -o-transition: height 0.35s ease;
+ transition: height 0.35s ease;
+}
+
+.collapse.in {
+ height: auto;
+}
+
+.close {
+ float: right;
+ font-size: 20px;
+ font-weight: bold;
+ line-height: 20px;
+ color: #000000;
+ text-shadow: 0 1px 0 #ffffff;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+ color: #000000;
+ text-decoration: none;
+ cursor: pointer;
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+}
+
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+}
+
+.btn {
+ display: inline-block;
+ *display: inline;
+ padding: 4px 12px;
+ margin-bottom: 0;
+ *margin-left: .3em;
+ font-size: 14px;
+ line-height: 20px;
+ color: #333333;
+ text-align: center;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+ vertical-align: middle;
+ cursor: pointer;
+ background-color: #f5f5f5;
+ *background-color: #e6e6e6;
+ background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+ background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+ background-repeat: repeat-x;
+ border: 1px solid #cccccc;
+ *border: 0;
+ border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ border-bottom-color: #b3b3b3;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ *zoom: 1;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:focus,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+ color: #333333;
+ background-color: #e6e6e6;
+ *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+ background-color: #cccccc \9;
+}
+
+.btn:first-child {
+ *margin-left: 0;
+}
+
+.btn:hover,
+.btn:focus {
+ color: #333333;
+ text-decoration: none;
+ background-position: 0 -15px;
+ -webkit-transition: background-position 0.1s linear;
+ -moz-transition: background-position 0.1s linear;
+ -o-transition: background-position 0.1s linear;
+ transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+ outline: thin dotted #333;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+ background-image: none;
+ outline: 0;
+ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+ cursor: default;
+ background-image: none;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.btn-large {
+ padding: 11px 19px;
+ font-size: 17.5px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+.btn-large [class^="icon-"],
+.btn-large [class*=" icon-"] {
+ margin-top: 4px;
+}
+
+.btn-small {
+ padding: 2px 10px;
+ font-size: 11.9px;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+.btn-small [class^="icon-"],
+.btn-small [class*=" icon-"] {
+ margin-top: 0;
+}
+
+.btn-mini [class^="icon-"],
+.btn-mini [class*=" icon-"] {
+ margin-top: -1px;
+}
+
+.btn-mini {
+ padding: 0 6px;
+ font-size: 10.5px;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+ padding-right: 0;
+ padding-left: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+ color: rgba(255, 255, 255, 0.75);
+}
+
+.btn-primary {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #006dcc;
+ *background-color: #0044cc;
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+ color: #ffffff;
+ background-color: #0044cc;
+ *background-color: #003bb3;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+ background-color: #003399 \9;
+}
+
+.btn-warning {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #faa732;
+ *background-color: #f89406;
+ background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+ background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+ background-image: -o-linear-gradient(top, #fbb450, #f89406);
+ background-image: linear-gradient(to bottom, #fbb450, #f89406);
+ background-repeat: repeat-x;
+ border-color: #f89406 #f89406 #ad6704;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+ color: #ffffff;
+ background-color: #f89406;
+ *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+ background-color: #c67605 \9;
+}
+
+.btn-danger {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #da4f49;
+ *background-color: #bd362f;
+ background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+ background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+ background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+ background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+ background-repeat: repeat-x;
+ border-color: #bd362f #bd362f #802420;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+ color: #ffffff;
+ background-color: #bd362f;
+ *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+ background-color: #942a25 \9;
+}
+
+.btn-success {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #5bb75b;
+ *background-color: #51a351;
+ background-image: -moz-linear-gradient(top, #62c462, #51a351);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+ background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+ background-image: -o-linear-gradient(top, #62c462, #51a351);
+ background-image: linear-gradient(to bottom, #62c462, #51a351);
+ background-repeat: repeat-x;
+ border-color: #51a351 #51a351 #387038;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+ color: #ffffff;
+ background-color: #51a351;
+ *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+ background-color: #408140 \9;
+}
+
+.btn-info {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #49afcd;
+ *background-color: #2f96b4;
+ background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+ background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+ background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+ background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+ background-repeat: repeat-x;
+ border-color: #2f96b4 #2f96b4 #1f6377;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+ color: #ffffff;
+ background-color: #2f96b4;
+ *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+ background-color: #24748c \9;
+}
+
+.btn-inverse {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #363636;
+ *background-color: #222222;
+ background-image: -moz-linear-gradient(top, #444444, #222222);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+ background-image: -webkit-linear-gradient(top, #444444, #222222);
+ background-image: -o-linear-gradient(top, #444444, #222222);
+ background-image: linear-gradient(to bottom, #444444, #222222);
+ background-repeat: repeat-x;
+ border-color: #222222 #222222 #000000;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:focus,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+ color: #ffffff;
+ background-color: #222222;
+ *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+ background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+ *padding-top: 7px;
+ *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+ *padding-top: 1px;
+ *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+ background-color: transparent;
+ background-image: none;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+}
+
+.btn-link {
+ color: #0088cc;
+ cursor: pointer;
+ border-color: transparent;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+ color: #005580;
+ text-decoration: underline;
+ background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus {
+ color: #333333;
+ text-decoration: none;
+}
+
+.btn-group {
+ position: relative;
+ display: inline-block;
+ *display: inline;
+ *margin-left: .3em;
+ font-size: 0;
+ white-space: nowrap;
+ vertical-align: middle;
+ *zoom: 1;
+}
+
+.btn-group:first-child {
+ *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+ margin-left: 5px;
+}
+
+.btn-toolbar {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ font-size: 0;
+}
+
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group {
+ margin-left: 5px;
+}
+
+.btn-group > .btn {
+ position: relative;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+ margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu,
+.btn-group > .popover {
+ font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+ font-size: 10.5px;
+}
+
+.btn-group > .btn-small {
+ font-size: 11.9px;
+}
+
+.btn-group > .btn-large {
+ font-size: 17.5px;
+}
+
+.btn-group > .btn:first-child {
+ margin-left: 0;
+ -webkit-border-bottom-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ border-top-left-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+ -webkit-border-top-right-radius: 4px;
+ border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+ margin-left: 0;
+ -webkit-border-bottom-left-radius: 6px;
+ border-bottom-left-radius: 6px;
+ -webkit-border-top-left-radius: 6px;
+ border-top-left-radius: 6px;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+ -webkit-border-top-right-radius: 6px;
+ border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+ z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+ *padding-top: 5px;
+ padding-right: 8px;
+ *padding-bottom: 5px;
+ padding-left: 8px;
+ -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+ *padding-top: 2px;
+ padding-right: 5px;
+ *padding-bottom: 2px;
+ padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+ *padding-top: 5px;
+ *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+ *padding-top: 7px;
+ padding-right: 12px;
+ *padding-bottom: 7px;
+ padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+ background-image: none;
+ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+ background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+ background-color: #0044cc;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+ background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+ background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+ background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+ background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+ background-color: #222222;
+}
+
+.btn .caret {
+ margin-top: 8px;
+ margin-left: 0;
+}
+
+.btn-large .caret {
+ margin-top: 6px;
+}
+
+.btn-large .caret {
+ border-top-width: 5px;
+ border-right-width: 5px;
+ border-left-width: 5px;
+}
+
+.btn-mini .caret,
+.btn-small .caret {
+ margin-top: 8px;
+}
+
+.dropup .btn-large .caret {
+ border-bottom-width: 5px;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+ border-top-color: #ffffff;
+ border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+ display: inline-block;
+ *display: inline;
+ /* IE7 inline-block hack */
+
+ *zoom: 1;
+}
+
+.btn-group-vertical > .btn {
+ display: block;
+ float: none;
+ max-width: 100%;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.btn-group-vertical > .btn + .btn {
+ margin-top: -1px;
+ margin-left: 0;
+}
+
+.btn-group-vertical > .btn:first-child {
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical > .btn:last-child {
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical > .btn-large:first-child {
+ -webkit-border-radius: 6px 6px 0 0;
+ -moz-border-radius: 6px 6px 0 0;
+ border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical > .btn-large:last-child {
+ -webkit-border-radius: 0 0 6px 6px;
+ -moz-border-radius: 0 0 6px 6px;
+ border-radius: 0 0 6px 6px;
+}
+
+.alert {
+ padding: 8px 35px 8px 14px;
+ margin-bottom: 20px;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+ background-color: #fcf8e3;
+ border: 1px solid #fbeed5;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.alert,
+.alert h4 {
+ color: #c09853;
+}
+
+.alert h4 {
+ margin: 0;
+}
+
+.alert .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ line-height: 20px;
+}
+
+.alert-success {
+ color: #468847;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+
+.alert-success h4 {
+ color: #468847;
+}
+
+.alert-danger,
+.alert-error {
+ color: #b94a48;
+ background-color: #f2dede;
+ border-color: #eed3d7;
+}
+
+.alert-danger h4,
+.alert-error h4 {
+ color: #b94a48;
+}
+
+.alert-info {
+ color: #3a87ad;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+
+.alert-info h4 {
+ color: #3a87ad;
+}
+
+.alert-block {
+ padding-top: 14px;
+ padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+ margin-bottom: 0;
+}
+
+.alert-block p + p {
+ margin-top: 5px;
+}
+
+.nav {
+ margin-bottom: 20px;
+ margin-left: 0;
+ list-style: none;
+}
+
+.nav > li > a {
+ display: block;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee;
+}
+
+.nav > li > a > img {
+ max-width: none;
+}
+
+.nav > .pull-right {
+ float: right;
+}
+
+.nav-header {
+ display: block;
+ padding: 3px 15px;
+ font-size: 11px;
+ font-weight: bold;
+ line-height: 20px;
+ color: #999999;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+ text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+ margin-top: 9px;
+}
+
+.nav-list {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+ margin-right: -15px;
+ margin-left: -15px;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+ padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover,
+.nav-list > .active > a:focus {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+ background-color: #0088cc;
+}
+
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ margin-right: 2px;
+}
+
+.nav-list .divider {
+ *width: 100%;
+ height: 1px;
+ margin: 9px 1px;
+ *margin: -5px 0 5px;
+ overflow: hidden;
+ background-color: #e5e5e5;
+ border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+ *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+ clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+ float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+ padding-right: 12px;
+ padding-left: 12px;
+ margin-right: 2px;
+ line-height: 14px;
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+ margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ line-height: 20px;
+ border: 1px solid transparent;
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus {
+ border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover,
+.nav-tabs > .active > a:focus {
+ color: #555555;
+ cursor: default;
+ background-color: #ffffff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover,
+.nav-pills > .active > a:focus {
+ color: #ffffff;
+ background-color: #0088cc;
+}
+
+.nav-stacked > li {
+ float: none;
+}
+
+.nav-stacked > li > a {
+ margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+ border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+ border: 1px solid #ddd;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+ -webkit-border-top-right-radius: 4px;
+ border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ border-top-left-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+ -webkit-border-bottom-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover,
+.nav-tabs.nav-stacked > li > a:focus {
+ z-index: 2;
+ border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+ margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+ margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+ -webkit-border-radius: 0 0 6px 6px;
+ -moz-border-radius: 0 0 6px 6px;
+ border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+ margin-top: 6px;
+ border-top-color: #0088cc;
+ border-bottom-color: #0088cc;
+}
+
+.nav .dropdown-toggle:hover .caret,
+.nav .dropdown-toggle:focus .caret {
+ border-top-color: #005580;
+ border-bottom-color: #005580;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+ margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+ border-top-color: #fff;
+ border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+ border-top-color: #555555;
+ border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover,
+.nav > .dropdown.active > a:focus {
+ cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover,
+.nav > li.dropdown.open.active > a:focus {
+ color: #ffffff;
+ background-color: #999999;
+ border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret,
+.nav li.dropdown.open a:focus .caret {
+ border-top-color: #ffffff;
+ border-bottom-color: #ffffff;
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover,
+.tabs-stacked .open > a:focus {
+ border-color: #999999;
+}
+
+.tabbable {
+ *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.tabbable:after {
+ clear: both;
+}
+
+.tab-content {
+ overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+ border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+ display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+ display: block;
+}
+
+.tabs-below > .nav-tabs {
+ border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+ margin-top: -1px;
+ margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover,
+.tabs-below > .nav-tabs > li > a:focus {
+ border-top-color: #ddd;
+ border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover,
+.tabs-below > .nav-tabs > .active > a:focus {
+ border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+ float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+ min-width: 74px;
+ margin-right: 0;
+ margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+ float: left;
+ margin-right: 19px;
+ border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+ margin-right: -1px;
+ -webkit-border-radius: 4px 0 0 4px;
+ -moz-border-radius: 4px 0 0 4px;
+ border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover,
+.tabs-left > .nav-tabs > li > a:focus {
+ border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover,
+.tabs-left > .nav-tabs .active > a:focus {
+ border-color: #ddd transparent #ddd #ddd;
+ *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+ float: right;
+ margin-left: 19px;
+ border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+ margin-left: -1px;
+ -webkit-border-radius: 0 4px 4px 0;
+ -moz-border-radius: 0 4px 4px 0;
+ border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover,
+.tabs-right > .nav-tabs > li > a:focus {
+ border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover,
+.tabs-right > .nav-tabs .active > a:focus {
+ border-color: #ddd #ddd #ddd transparent;
+ *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+ color: #999999;
+}
+
+.nav > .disabled > a:hover,
+.nav > .disabled > a:focus {
+ text-decoration: none;
+ cursor: default;
+ background-color: transparent;
+}
+
+.navbar {
+ *position: relative;
+ *z-index: 2;
+ margin-bottom: 20px;
+ overflow: visible;
+}
+
+.navbar-inner {
+ min-height: 40px;
+ padding-right: 20px;
+ padding-left: 20px;
+ background-color: #fafafa;
+ background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+ background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+ background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+ background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+ background-repeat: repeat-x;
+ border: 1px solid #d4d4d4;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
+ *zoom: 1;
+ -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+ -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar-inner:before,
+.navbar-inner:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.navbar-inner:after {
+ clear: both;
+}
+
+.navbar .container {
+ width: auto;
+}
+
+.nav-collapse.collapse {
+ height: auto;
+ overflow: visible;
+}
+
+.navbar .brand {
+ display: block;
+ float: left;
+ padding: 10px 20px 10px;
+ margin-left: -20px;
+ font-size: 20px;
+ font-weight: 200;
+ color: #777777;
+ text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .brand:hover,
+.navbar .brand:focus {
+ text-decoration: none;
+}
+
+.navbar-text {
+ margin-bottom: 0;
+ line-height: 40px;
+ color: #777777;
+}
+
+.navbar-link {
+ color: #777777;
+}
+
+.navbar-link:hover,
+.navbar-link:focus {
+ color: #333333;
+}
+
+.navbar .divider-vertical {
+ height: 40px;
+ margin: 0 9px;
+ border-right: 1px solid #ffffff;
+ border-left: 1px solid #f2f2f2;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+ margin-top: 5px;
+}
+
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn,
+.navbar .input-prepend .btn-group,
+.navbar .input-append .btn-group {
+ margin-top: 0;
+}
+
+.navbar-form {
+ margin-bottom: 0;
+ *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.navbar-form:after {
+ clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+ margin-top: 5px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+ display: inline-block;
+ margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+ margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+ margin-top: 5px;
+ white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+ margin-top: 0;
+}
+
+.navbar-search {
+ position: relative;
+ float: left;
+ margin-top: 5px;
+ margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+ padding: 4px 14px;
+ margin-bottom: 0;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-border-radius: 15px;
+ -moz-border-radius: 15px;
+ border-radius: 15px;
+}
+
+.navbar-static-top {
+ position: static;
+ margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: 1030;
+ margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+ border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+ border-width: 1px 0 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+ padding-right: 0;
+ padding-left: 0;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+ width: 940px;
+}
+
+.navbar-fixed-top {
+ top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+ -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+ bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+ -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+ position: relative;
+ left: 0;
+ display: block;
+ float: left;
+ margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+ float: right;
+ margin-right: 0;
+}
+
+.navbar .nav > li {
+ float: left;
+}
+
+.navbar .nav > li > a {
+ float: none;
+ padding: 10px 15px 10px;
+ color: #777777;
+ text-decoration: none;
+ text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+ margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+ color: #333333;
+ text-decoration: none;
+ background-color: transparent;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+ color: #555555;
+ text-decoration: none;
+ background-color: #e5e5e5;
+ -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+ -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+ box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+ display: none;
+ float: right;
+ padding: 7px 10px;
+ margin-right: 5px;
+ margin-left: 5px;
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #ededed;
+ *background-color: #e5e5e5;
+ background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
+ background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
+ background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
+ background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
+ background-repeat: repeat-x;
+ border-color: #e5e5e5 #e5e5e5 #bfbfbf;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:focus,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+ color: #ffffff;
+ background-color: #e5e5e5;
+ *background-color: #d9d9d9;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+ background-color: #cccccc \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+ display: block;
+ width: 18px;
+ height: 2px;
+ background-color: #f5f5f5;
+ -webkit-border-radius: 1px;
+ -moz-border-radius: 1px;
+ border-radius: 1px;
+ -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+ -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+ margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+ position: absolute;
+ top: -7px;
+ left: 9px;
+ display: inline-block;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-left: 7px solid transparent;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+ position: absolute;
+ top: -6px;
+ left: 10px;
+ display: inline-block;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #ffffff;
+ border-left: 6px solid transparent;
+ content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+ top: auto;
+ bottom: -7px;
+ border-top: 7px solid #ccc;
+ border-bottom: 0;
+ border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+ top: auto;
+ bottom: -6px;
+ border-top: 6px solid #ffffff;
+ border-bottom: 0;
+}
+
+.navbar .nav li.dropdown > a:hover .caret,
+.navbar .nav li.dropdown > a:focus .caret {
+ border-top-color: #333333;
+ border-bottom-color: #333333;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+ color: #555555;
+ background-color: #e5e5e5;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+ border-top-color: #777777;
+ border-bottom-color: #777777;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+ border-top-color: #555555;
+ border-bottom-color: #555555;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+ right: 12px;
+ left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+ right: 13px;
+ left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+ right: 100%;
+ left: auto;
+ margin-right: -1px;
+ margin-left: 0;
+ -webkit-border-radius: 6px 0 6px 6px;
+ -moz-border-radius: 6px 0 6px 6px;
+ border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse .navbar-inner {
+ background-color: #1b1b1b;
+ background-image: -moz-linear-gradient(top, #222222, #111111);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+ background-image: -webkit-linear-gradient(top, #222222, #111111);
+ background-image: -o-linear-gradient(top, #222222, #111111);
+ background-image: linear-gradient(to bottom, #222222, #111111);
+ background-repeat: repeat-x;
+ border-color: #252525;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+ color: #999999;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover,
+.navbar-inverse .brand:focus,
+.navbar-inverse .nav > li > a:focus {
+ color: #ffffff;
+}
+
+.navbar-inverse .brand {
+ color: #999999;
+}
+
+.navbar-inverse .navbar-text {
+ color: #999999;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+ color: #ffffff;
+ background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+ color: #ffffff;
+ background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+ color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover,
+.navbar-inverse .navbar-link:focus {
+ color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+ border-right-color: #222222;
+ border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+ color: #ffffff;
+ background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > a:hover .caret,
+.navbar-inverse .nav li.dropdown > a:focus .caret {
+ border-top-color: #ffffff;
+ border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+ border-top-color: #999999;
+ border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+ border-top-color: #ffffff;
+ border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+ color: #ffffff;
+ background-color: #515151;
+ border-color: #111111;
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+ -webkit-transition: none;
+ -moz-transition: none;
+ -o-transition: none;
+ transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+ color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+ color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+ color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+ padding: 5px 15px;
+ color: #333333;
+ text-shadow: 0 1px 0 #ffffff;
+ background-color: #ffffff;
+ border: 0;
+ outline: 0;
+ -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+ -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #0e0e0e;
+ *background-color: #040404;
+ background-image: -moz-linear-gradient(top, #151515, #040404);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+ background-image: -webkit-linear-gradient(top, #151515, #040404);
+ background-image: -o-linear-gradient(top, #151515, #040404);
+ background-image: linear-gradient(to bottom, #151515, #040404);
+ background-repeat: repeat-x;
+ border-color: #040404 #040404 #000000;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:focus,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+ color: #ffffff;
+ background-color: #040404;
+ *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+ background-color: #000000 \9;
+}
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin: 0 0 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.breadcrumb > li {
+ display: inline-block;
+ *display: inline;
+ text-shadow: 0 1px 0 #ffffff;
+ *zoom: 1;
+}
+
+.breadcrumb > li > .divider {
+ padding: 0 5px;
+ color: #ccc;
+}
+
+.breadcrumb > .active {
+ color: #999999;
+}
+
+.pagination {
+ margin: 20px 0;
+}
+
+.pagination ul {
+ display: inline-block;
+ *display: inline;
+ margin-bottom: 0;
+ margin-left: 0;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ *zoom: 1;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination ul > li {
+ display: inline;
+}
+
+.pagination ul > li > a,
+.pagination ul > li > span {
+ float: left;
+ padding: 4px 12px;
+ line-height: 20px;
+ text-decoration: none;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+ border-left-width: 0;
+}
+
+.pagination ul > li > a:hover,
+.pagination ul > li > a:focus,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+ background-color: #f5f5f5;
+}
+
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+ color: #999999;
+ cursor: default;
+}
+
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover,
+.pagination ul > .disabled > a:focus {
+ color: #999999;
+ cursor: default;
+ background-color: transparent;
+}
+
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+ border-left-width: 1px;
+ -webkit-border-bottom-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ border-top-left-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-topleft: 4px;
+}
+
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+ -webkit-border-top-right-radius: 4px;
+ border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-bottomright: 4px;
+}
+
+.pagination-centered {
+ text-align: center;
+}
+
+.pagination-right {
+ text-align: right;
+}
+
+.pagination-large ul > li > a,
+.pagination-large ul > li > span {
+ padding: 11px 19px;
+ font-size: 17.5px;
+}
+
+.pagination-large ul > li:first-child > a,
+.pagination-large ul > li:first-child > span {
+ -webkit-border-bottom-left-radius: 6px;
+ border-bottom-left-radius: 6px;
+ -webkit-border-top-left-radius: 6px;
+ border-top-left-radius: 6px;
+ -moz-border-radius-bottomleft: 6px;
+ -moz-border-radius-topleft: 6px;
+}
+
+.pagination-large ul > li:last-child > a,
+.pagination-large ul > li:last-child > span {
+ -webkit-border-top-right-radius: 6px;
+ border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 6px;
+ border-bottom-right-radius: 6px;
+ -moz-border-radius-topright: 6px;
+ -moz-border-radius-bottomright: 6px;
+}
+
+.pagination-mini ul > li:first-child > a,
+.pagination-small ul > li:first-child > a,
+.pagination-mini ul > li:first-child > span,
+.pagination-small ul > li:first-child > span {
+ -webkit-border-bottom-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ -webkit-border-top-left-radius: 3px;
+ border-top-left-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -moz-border-radius-topleft: 3px;
+}
+
+.pagination-mini ul > li:last-child > a,
+.pagination-small ul > li:last-child > a,
+.pagination-mini ul > li:last-child > span,
+.pagination-small ul > li:last-child > span {
+ -webkit-border-top-right-radius: 3px;
+ border-top-right-radius: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ -moz-border-radius-topright: 3px;
+ -moz-border-radius-bottomright: 3px;
+}
+
+.pagination-small ul > li > a,
+.pagination-small ul > li > span {
+ padding: 2px 10px;
+ font-size: 11.9px;
+}
+
+.pagination-mini ul > li > a,
+.pagination-mini ul > li > span {
+ padding: 0 6px;
+ font-size: 10.5px;
+}
+
+.pager {
+ margin: 20px 0;
+ text-align: center;
+ list-style: none;
+ *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.pager:after {
+ clear: both;
+}
+
+.pager li {
+ display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 15px;
+ -moz-border-radius: 15px;
+ border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+
+.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: #999999;
+ cursor: default;
+ background-color: #fff;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #000000;
+}
+
+.modal-backdrop.fade {
+ opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+ opacity: 0.8;
+ filter: alpha(opacity=80);
+}
+
+.modal {
+ position: fixed;
+ top: 10%;
+ left: 50%;
+ z-index: 1050;
+ width: 560px;
+ margin-left: -280px;
+ background-color: #ffffff;
+ border: 1px solid #999;
+ border: 1px solid rgba(0, 0, 0, 0.3);
+ *border: 1px solid #999;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+ outline: none;
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box;
+}
+
+.modal.fade {
+ top: -25%;
+ -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+ -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+ -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+ transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+ top: 10%;
+}
+
+.modal-header {
+ padding: 9px 15px;
+ border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+ margin-top: 2px;
+}
+
+.modal-header h3 {
+ margin: 0;
+ line-height: 30px;
+}
+
+.modal-body {
+ position: relative;
+ max-height: 400px;
+ padding: 15px;
+ overflow-y: auto;
+}
+
+.modal-form {
+ margin-bottom: 0;
+}
+
+.modal-footer {
+ padding: 14px 15px 15px;
+ margin-bottom: 0;
+ text-align: right;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ -webkit-border-radius: 0 0 6px 6px;
+ -moz-border-radius: 0 0 6px 6px;
+ border-radius: 0 0 6px 6px;
+ *zoom: 1;
+ -webkit-box-shadow: inset 0 1px 0 #ffffff;
+ -moz-box-shadow: inset 0 1px 0 #ffffff;
+ box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.modal-footer:after {
+ clear: both;
+}
+
+.modal-footer .btn + .btn {
+ margin-bottom: 0;
+ margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+ margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+ margin-left: 0;
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1030;
+ display: block;
+ font-size: 11px;
+ line-height: 1.4;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ visibility: visible;
+}
+
+.tooltip.in {
+ opacity: 0.8;
+ filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+ padding: 5px 0;
+ margin-top: -3px;
+}
+
+.tooltip.right {
+ padding: 0 5px;
+ margin-left: 3px;
+}
+
+.tooltip.bottom {
+ padding: 5px 0;
+ margin-top: 3px;
+}
+
+.tooltip.left {
+ padding: 0 5px;
+ margin-left: -3px;
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: 8px;
+ color: #ffffff;
+ text-align: center;
+ text-decoration: none;
+ background-color: #000000;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ 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-top-color: #000000;
+ border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-right-color: #000000;
+ border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-left-color: #000000;
+ border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-bottom-color: #000000;
+ border-width: 0 5px 5px;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1010;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ text-align: left;
+ white-space: normal;
+ background-color: #ffffff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+}
+
+.popover.top {
+ margin-top: -10px;
+}
+
+.popover.right {
+ margin-left: 10px;
+}
+
+.popover.bottom {
+ margin-top: 10px;
+}
+
+.popover.left {
+ margin-left: -10px;
+}
+
+.popover-title {
+ padding: 8px 14px;
+ margin: 0;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 18px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ -webkit-border-radius: 5px 5px 0 0;
+ -moz-border-radius: 5px 5px 0 0;
+ border-radius: 5px 5px 0 0;
+}
+
+.popover-title:empty {
+ display: none;
+}
+
+.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 {
+ bottom: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-top-color: #999;
+ border-top-color: rgba(0, 0, 0, 0.25);
+ border-bottom-width: 0;
+}
+
+.popover.top .arrow:after {
+ bottom: 1px;
+ margin-left: -10px;
+ border-top-color: #ffffff;
+ border-bottom-width: 0;
+}
+
+.popover.right .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-right-color: #999;
+ border-right-color: rgba(0, 0, 0, 0.25);
+ border-left-width: 0;
+}
+
+.popover.right .arrow:after {
+ bottom: -10px;
+ left: 1px;
+ border-right-color: #ffffff;
+ border-left-width: 0;
+}
+
+.popover.bottom .arrow {
+ top: -11px;
+ left: 50%;
+ margin-left: -11px;
+ border-bottom-color: #999;
+ border-bottom-color: rgba(0, 0, 0, 0.25);
+ border-top-width: 0;
+}
+
+.popover.bottom .arrow:after {
+ top: 1px;
+ margin-left: -10px;
+ border-bottom-color: #ffffff;
+ border-top-width: 0;
+}
+
+.popover.left .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-left-color: #999;
+ border-left-color: rgba(0, 0, 0, 0.25);
+ border-right-width: 0;
+}
+
+.popover.left .arrow:after {
+ right: 1px;
+ bottom: -10px;
+ border-left-color: #ffffff;
+ border-right-width: 0;
+}
+
+.thumbnails {
+ margin-left: -20px;
+ list-style: none;
+ *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.thumbnails:after {
+ clear: both;
+}
+
+.row-fluid .thumbnails {
+ margin-left: 0;
+}
+
+.thumbnails > li {
+ float: left;
+ margin-bottom: 20px;
+ margin-left: 20px;
+}
+
+.thumbnail {
+ display: block;
+ padding: 4px;
+ line-height: 20px;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus {
+ border-color: #0088cc;
+ -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+ -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+ box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+ display: block;
+ max-width: 100%;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+.thumbnail .caption {
+ padding: 9px;
+ color: #555555;
+}
+
+.media,
+.media-body {
+ overflow: hidden;
+ *overflow: visible;
+ 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 {
+ margin-left: 0;
+ list-style: none;
+}
+
+.label,
+.badge {
+ display: inline-block;
+ padding: 2px 4px;
+ font-size: 11.844px;
+ font-weight: bold;
+ line-height: 14px;
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ white-space: nowrap;
+ vertical-align: baseline;
+ background-color: #999999;
+}
+
+.label {
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+
+.badge {
+ padding-right: 9px;
+ padding-left: 9px;
+ -webkit-border-radius: 9px;
+ -moz-border-radius: 9px;
+ border-radius: 9px;
+}
+
+.label:empty,
+.badge:empty {
+ display: none;
+}
+
+a.label:hover,
+a.label:focus,
+a.badge:hover,
+a.badge:focus {
+ color: #ffffff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+ background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+ background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+ background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+ background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+ background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+ background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+ background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+ background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+ background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+ background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+ top: 0;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@-moz-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@-ms-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+@-o-keyframes progress-bar-stripes {
+ from {
+ background-position: 0 0;
+ }
+ to {
+ background-position: 40px 0;
+ }
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+
+.progress {
+ height: 20px;
+ margin-bottom: 20px;
+ overflow: hidden;
+ background-color: #f7f7f7;
+ background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+ background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+ background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+ background-repeat: repeat-x;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+ -moz-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;
+ color: #ffffff;
+ text-align: center;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ background-color: #0e90d2;
+ background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+ background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+ background-image: -o-linear-gradient(top, #149bdf, #0480be);
+ background-image: linear-gradient(to bottom, #149bdf, #0480be);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ -moz-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-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-transition: width 0.6s ease;
+ -moz-transition: width 0.6s ease;
+ -o-transition: width 0.6s ease;
+ transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+ -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+ background-color: #149bdf;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ 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: -moz-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: -o-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);
+ -webkit-background-size: 40px 40px;
+ -moz-background-size: 40px 40px;
+ -o-background-size: 40px 40px;
+ background-size: 40px 40px;
+}
+
+.progress.active .bar {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ -moz-animation: progress-bar-stripes 2s linear infinite;
+ -ms-animation: progress-bar-stripes 2s linear infinite;
+ -o-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+ background-color: #dd514c;
+ background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+ background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+ background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+ background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+ background-color: #ee5f5b;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ 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: -moz-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: -o-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-success .bar,
+.progress .bar-success {
+ background-color: #5eb95e;
+ background-image: -moz-linear-gradient(top, #62c462, #57a957);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+ background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+ background-image: -o-linear-gradient(top, #62c462, #57a957);
+ background-image: linear-gradient(to bottom, #62c462, #57a957);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+ background-color: #62c462;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ 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: -moz-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: -o-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-info .bar,
+.progress .bar-info {
+ background-color: #4bb1cf;
+ background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+ background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+ background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+ background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+ background-color: #5bc0de;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ 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: -moz-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: -o-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-warning .bar,
+.progress .bar-warning {
+ background-color: #faa732;
+ background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+ background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+ background-image: -o-linear-gradient(top, #fbb450, #f89406);
+ background-image: linear-gradient(to bottom, #fbb450, #f89406);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+ background-color: #fbb450;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+ 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: -moz-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: -o-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);
+}
+
+.accordion {
+ margin-bottom: 20px;
+}
+
+.accordion-group {
+ margin-bottom: 2px;
+ border: 1px solid #e5e5e5;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.accordion-heading {
+ border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+ display: block;
+ padding: 8px 15px;
+}
+
+.accordion-toggle {
+ cursor: pointer;
+}
+
+.accordion-inner {
+ padding: 9px 15px;
+ border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+ position: relative;
+ margin-bottom: 20px;
+ line-height: 1;
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+}
+
+.carousel-inner > .item {
+ position: relative;
+ display: none;
+ -webkit-transition: 0.6s ease-in-out left;
+ -moz-transition: 0.6s ease-in-out left;
+ -o-transition: 0.6s ease-in-out left;
+ transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ 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: 40%;
+ left: 15px;
+ width: 40px;
+ height: 40px;
+ margin-top: -20px;
+ font-size: 60px;
+ font-weight: 100;
+ line-height: 30px;
+ color: #ffffff;
+ text-align: center;
+ background: #222222;
+ border: 3px solid #ffffff;
+ -webkit-border-radius: 23px;
+ -moz-border-radius: 23px;
+ border-radius: 23px;
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+.carousel-control.right {
+ right: 15px;
+ left: auto;
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+ color: #ffffff;
+ text-decoration: none;
+ opacity: 0.9;
+ filter: alpha(opacity=90);
+}
+
+.carousel-indicators {
+ position: absolute;
+ top: 15px;
+ right: 15px;
+ z-index: 5;
+ margin: 0;
+ list-style: none;
+}
+
+.carousel-indicators li {
+ display: block;
+ float: left;
+ width: 10px;
+ height: 10px;
+ margin-left: 5px;
+ text-indent: -999px;
+ background-color: #ccc;
+ background-color: rgba(255, 255, 255, 0.25);
+ border-radius: 5px;
+}
+
+.carousel-indicators .active {
+ background-color: #fff;
+}
+
+.carousel-caption {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 15px;
+ background: #333333;
+ background: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+ line-height: 20px;
+ color: #ffffff;
+}
+
+.carousel-caption h4 {
+ margin: 0 0 5px;
+}
+
+.carousel-caption p {
+ margin-bottom: 0;
+}
+
+.hero-unit {
+ padding: 60px;
+ padding-top: 20px;
+ margin-bottom: 30px;
+ font-size: 18px;
+ font-weight: 200;
+ line-height: 30px;
+ color: inherit;
+ background-color: #eeeeee;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+.hero-unit h1 {
+ margin-bottom: 0;
+ font-size: 60px;
+ line-height: 1;
+ letter-spacing: -1px;
+ color: inherit;
+}
+
+.hero-unit li {
+ line-height: 30px;
+}
+
+.pull-right {
+ float: right;
+}
+
+.pull-left {
+ float: left;
+}
+
+.hide {
+ display: none;
+}
+
+.show {
+ display: block;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.affix {
+ position: fixed;
+}
+
+
+.title {
+ border-bottom: 1px solid #E1E2E1;
+}
+
+.module-list {
+ border-right: 1px solid #E1E1E2;
+ float: left;
+ height: 220px;
+ margin: 20px 0 0 20px;
+ padding: 10px;
+ position: relative;
+ width: 300px;
+}
diff --git a/tbc/static/css/responsive.css b/tbc/static/css/responsive.css
new file mode 100755
index 0000000..c0bba15
--- /dev/null
+++ b/tbc/static/css/responsive.css
@@ -0,0 +1,1109 @@
+/*!
+ * Bootstrap Responsive v2.3.2
+ *
+ * Copyright 2013 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @mdo and @fat.
+ */
+
+.clearfix {
+ *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+@-ms-viewport {
+ width: device-width;
+}
+
+.hidden {
+ display: none;
+ visibility: hidden;
+}
+
+.visible-phone {
+ display: none !important;
+}
+
+.visible-tablet {
+ display: none !important;
+}
+
+.hidden-desktop {
+ display: none !important;
+}
+
+.visible-desktop {
+ display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+ .visible-desktop {
+ display: none !important ;
+ }
+ .visible-tablet {
+ display: inherit !important;
+ }
+ .hidden-tablet {
+ display: none !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+ .visible-desktop {
+ display: none !important;
+ }
+ .visible-phone {
+ display: inherit !important;
+ }
+ .hidden-phone {
+ display: none !important;
+ }
+}
+
+.visible-print {
+ display: none !important;
+}
+
+@media print {
+ .visible-print {
+ display: inherit !important;
+ }
+ .hidden-print {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-left: -30px;
+ *zoom: 1;
+ }
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 30px;
+ }
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 1170px;
+ }
+ .span12 {
+ width: 1170px;
+ }
+ .span11 {
+ width: 1070px;
+ }
+ .span10 {
+ width: 970px;
+ }
+ .span9 {
+ width: 870px;
+ }
+ .span8 {
+ width: 770px;
+ }
+ .span7 {
+ width: 670px;
+ }
+ .span6 {
+ width: 570px;
+ }
+ .span5 {
+ width: 470px;
+ }
+ .span4 {
+ width: 370px;
+ }
+ .span3 {
+ width: 270px;
+ }
+ .span2 {
+ width: 170px;
+ }
+ .span1 {
+ width: 70px;
+ }
+ .offset12 {
+ margin-left: 1230px;
+ }
+ .offset11 {
+ margin-left: 1130px;
+ }
+ .offset10 {
+ margin-left: 1030px;
+ }
+ .offset9 {
+ margin-left: 930px;
+ }
+ .offset8 {
+ margin-left: 830px;
+ }
+ .offset7 {
+ margin-left: 730px;
+ }
+ .offset6 {
+ margin-left: 630px;
+ }
+ .offset5 {
+ margin-left: 530px;
+ }
+ .offset4 {
+ margin-left: 430px;
+ }
+ .offset3 {
+ margin-left: 330px;
+ }
+ .offset2 {
+ margin-left: 230px;
+ }
+ .offset1 {
+ margin-left: 130px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.564102564102564%;
+ *margin-left: 2.5109110747408616%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 2.564102564102564%;
+ }
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+ .row-fluid .span11 {
+ width: 91.45299145299145%;
+ *width: 91.39979996362975%;
+ }
+ .row-fluid .span10 {
+ width: 82.90598290598291%;
+ *width: 82.8527914166212%;
+ }
+ .row-fluid .span9 {
+ width: 74.35897435897436%;
+ *width: 74.30578286961266%;
+ }
+ .row-fluid .span8 {
+ width: 65.81196581196582%;
+ *width: 65.75877432260411%;
+ }
+ .row-fluid .span7 {
+ width: 57.26495726495726%;
+ *width: 57.21176577559556%;
+ }
+ .row-fluid .span6 {
+ width: 48.717948717948715%;
+ *width: 48.664757228587014%;
+ }
+ .row-fluid .span5 {
+ width: 40.17094017094017%;
+ *width: 40.11774868157847%;
+ }
+ .row-fluid .span4 {
+ width: 31.623931623931625%;
+ *width: 31.570740134569924%;
+ }
+ .row-fluid .span3 {
+ width: 23.076923076923077%;
+ *width: 23.023731587561375%;
+ }
+ .row-fluid .span2 {
+ width: 14.52991452991453%;
+ *width: 14.476723040552828%;
+ }
+ .row-fluid .span1 {
+ width: 5.982905982905983%;
+ *width: 5.929714493544281%;
+ }
+ .row-fluid .offset12 {
+ margin-left: 105.12820512820512%;
+ *margin-left: 105.02182214948171%;
+ }
+ .row-fluid .offset12:first-child {
+ margin-left: 102.56410256410257%;
+ *margin-left: 102.45771958537915%;
+ }
+ .row-fluid .offset11 {
+ margin-left: 96.58119658119658%;
+ *margin-left: 96.47481360247316%;
+ }
+ .row-fluid .offset11:first-child {
+ margin-left: 94.01709401709402%;
+ *margin-left: 93.91071103837061%;
+ }
+ .row-fluid .offset10 {
+ margin-left: 88.03418803418803%;
+ *margin-left: 87.92780505546462%;
+ }
+ .row-fluid .offset10:first-child {
+ margin-left: 85.47008547008548%;
+ *margin-left: 85.36370249136206%;
+ }
+ .row-fluid .offset9 {
+ margin-left: 79.48717948717949%;
+ *margin-left: 79.38079650845607%;
+ }
+ .row-fluid .offset9:first-child {
+ margin-left: 76.92307692307693%;
+ *margin-left: 76.81669394435352%;
+ }
+ .row-fluid .offset8 {
+ margin-left: 70.94017094017094%;
+ *margin-left: 70.83378796144753%;
+ }
+ .row-fluid .offset8:first-child {
+ margin-left: 68.37606837606839%;
+ *margin-left: 68.26968539734497%;
+ }
+ .row-fluid .offset7 {
+ margin-left: 62.393162393162385%;
+ *margin-left: 62.28677941443899%;
+ }
+ .row-fluid .offset7:first-child {
+ margin-left: 59.82905982905982%;
+ *margin-left: 59.72267685033642%;
+ }
+ .row-fluid .offset6 {
+ margin-left: 53.84615384615384%;
+ *margin-left: 53.739770867430444%;
+ }
+ .row-fluid .offset6:first-child {
+ margin-left: 51.28205128205128%;
+ *margin-left: 51.175668303327875%;
+ }
+ .row-fluid .offset5 {
+ margin-left: 45.299145299145295%;
+ *margin-left: 45.1927623204219%;
+ }
+ .row-fluid .offset5:first-child {
+ margin-left: 42.73504273504273%;
+ *margin-left: 42.62865975631933%;
+ }
+ .row-fluid .offset4 {
+ margin-left: 36.75213675213675%;
+ *margin-left: 36.645753773413354%;
+ }
+ .row-fluid .offset4:first-child {
+ margin-left: 34.18803418803419%;
+ *margin-left: 34.081651209310785%;
+ }
+ .row-fluid .offset3 {
+ margin-left: 28.205128205128204%;
+ *margin-left: 28.0987452264048%;
+ }
+ .row-fluid .offset3:first-child {
+ margin-left: 25.641025641025642%;
+ *margin-left: 25.53464266230224%;
+ }
+ .row-fluid .offset2 {
+ margin-left: 19.65811965811966%;
+ *margin-left: 19.551736679396257%;
+ }
+ .row-fluid .offset2:first-child {
+ margin-left: 17.094017094017094%;
+ *margin-left: 16.98763411529369%;
+ }
+ .row-fluid .offset1 {
+ margin-left: 11.11111111111111%;
+ *margin-left: 11.004728132387708%;
+ }
+ .row-fluid .offset1:first-child {
+ margin-left: 8.547008547008547%;
+ *margin-left: 8.440625568285142%;
+ }
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 30px;
+ }
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 1156px;
+ }
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 1056px;
+ }
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 956px;
+ }
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 856px;
+ }
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 756px;
+ }
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 656px;
+ }
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 556px;
+ }
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 456px;
+ }
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 356px;
+ }
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 256px;
+ }
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 156px;
+ }
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 56px;
+ }
+ .thumbnails {
+ margin-left: -30px;
+ }
+ .thumbnails > li {
+ margin-left: 30px;
+ }
+ .row-fluid .thumbnails {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .row {
+ margin-left: -20px;
+ *zoom: 1;
+ }
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ min-height: 1px;
+ margin-left: 20px;
+ }
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 724px;
+ }
+ .span12 {
+ width: 724px;
+ }
+ .span11 {
+ width: 662px;
+ }
+ .span10 {
+ width: 600px;
+ }
+ .span9 {
+ width: 538px;
+ }
+ .span8 {
+ width: 476px;
+ }
+ .span7 {
+ width: 414px;
+ }
+ .span6 {
+ width: 352px;
+ }
+ .span5 {
+ width: 290px;
+ }
+ .span4 {
+ width: 228px;
+ }
+ .span3 {
+ width: 166px;
+ }
+ .span2 {
+ width: 104px;
+ }
+ .span1 {
+ width: 42px;
+ }
+ .offset12 {
+ margin-left: 764px;
+ }
+ .offset11 {
+ margin-left: 702px;
+ }
+ .offset10 {
+ margin-left: 640px;
+ }
+ .offset9 {
+ margin-left: 578px;
+ }
+ .offset8 {
+ margin-left: 516px;
+ }
+ .offset7 {
+ margin-left: 454px;
+ }
+ .offset6 {
+ margin-left: 392px;
+ }
+ .offset5 {
+ margin-left: 330px;
+ }
+ .offset4 {
+ margin-left: 268px;
+ }
+ .offset3 {
+ margin-left: 206px;
+ }
+ .offset2 {
+ margin-left: 144px;
+ }
+ .offset1 {
+ margin-left: 82px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.7624309392265194%;
+ *margin-left: 2.709239449864817%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 2.7624309392265194%;
+ }
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+ .row-fluid .span11 {
+ width: 91.43646408839778%;
+ *width: 91.38327259903608%;
+ }
+ .row-fluid .span10 {
+ width: 82.87292817679558%;
+ *width: 82.81973668743387%;
+ }
+ .row-fluid .span9 {
+ width: 74.30939226519337%;
+ *width: 74.25620077583166%;
+ }
+ .row-fluid .span8 {
+ width: 65.74585635359117%;
+ *width: 65.69266486422946%;
+ }
+ .row-fluid .span7 {
+ width: 57.18232044198895%;
+ *width: 57.12912895262725%;
+ }
+ .row-fluid .span6 {
+ width: 48.61878453038674%;
+ *width: 48.56559304102504%;
+ }
+ .row-fluid .span5 {
+ width: 40.05524861878453%;
+ *width: 40.00205712942283%;
+ }
+ .row-fluid .span4 {
+ width: 31.491712707182323%;
+ *width: 31.43852121782062%;
+ }
+ .row-fluid .span3 {
+ width: 22.92817679558011%;
+ *width: 22.87498530621841%;
+ }
+ .row-fluid .span2 {
+ width: 14.3646408839779%;
+ *width: 14.311449394616199%;
+ }
+ .row-fluid .span1 {
+ width: 5.801104972375691%;
+ *width: 5.747913483013988%;
+ }
+ .row-fluid .offset12 {
+ margin-left: 105.52486187845304%;
+ *margin-left: 105.41847889972962%;
+ }
+ .row-fluid .offset12:first-child {
+ margin-left: 102.76243093922652%;
+ *margin-left: 102.6560479605031%;
+ }
+ .row-fluid .offset11 {
+ margin-left: 96.96132596685082%;
+ *margin-left: 96.8549429881274%;
+ }
+ .row-fluid .offset11:first-child {
+ margin-left: 94.1988950276243%;
+ *margin-left: 94.09251204890089%;
+ }
+ .row-fluid .offset10 {
+ margin-left: 88.39779005524862%;
+ *margin-left: 88.2914070765252%;
+ }
+ .row-fluid .offset10:first-child {
+ margin-left: 85.6353591160221%;
+ *margin-left: 85.52897613729868%;
+ }
+ .row-fluid .offset9 {
+ margin-left: 79.8342541436464%;
+ *margin-left: 79.72787116492299%;
+ }
+ .row-fluid .offset9:first-child {
+ margin-left: 77.07182320441989%;
+ *margin-left: 76.96544022569647%;
+ }
+ .row-fluid .offset8 {
+ margin-left: 71.2707182320442%;
+ *margin-left: 71.16433525332079%;
+ }
+ .row-fluid .offset8:first-child {
+ margin-left: 68.50828729281768%;
+ *margin-left: 68.40190431409427%;
+ }
+ .row-fluid .offset7 {
+ margin-left: 62.70718232044199%;
+ *margin-left: 62.600799341718584%;
+ }
+ .row-fluid .offset7:first-child {
+ margin-left: 59.94475138121547%;
+ *margin-left: 59.838368402492065%;
+ }
+ .row-fluid .offset6 {
+ margin-left: 54.14364640883978%;
+ *margin-left: 54.037263430116376%;
+ }
+ .row-fluid .offset6:first-child {
+ margin-left: 51.38121546961326%;
+ *margin-left: 51.27483249088986%;
+ }
+ .row-fluid .offset5 {
+ margin-left: 45.58011049723757%;
+ *margin-left: 45.47372751851417%;
+ }
+ .row-fluid .offset5:first-child {
+ margin-left: 42.81767955801105%;
+ *margin-left: 42.71129657928765%;
+ }
+ .row-fluid .offset4 {
+ margin-left: 37.01657458563536%;
+ *margin-left: 36.91019160691196%;
+ }
+ .row-fluid .offset4:first-child {
+ margin-left: 34.25414364640884%;
+ *margin-left: 34.14776066768544%;
+ }
+ .row-fluid .offset3 {
+ margin-left: 28.45303867403315%;
+ *margin-left: 28.346655695309746%;
+ }
+ .row-fluid .offset3:first-child {
+ margin-left: 25.69060773480663%;
+ *margin-left: 25.584224756083227%;
+ }
+ .row-fluid .offset2 {
+ margin-left: 19.88950276243094%;
+ *margin-left: 19.783119783707537%;
+ }
+ .row-fluid .offset2:first-child {
+ margin-left: 17.12707182320442%;
+ *margin-left: 17.02068884448102%;
+ }
+ .row-fluid .offset1 {
+ margin-left: 11.32596685082873%;
+ *margin-left: 11.219583872105325%;
+ }
+ .row-fluid .offset1:first-child {
+ margin-left: 8.56353591160221%;
+ *margin-left: 8.457152932878806%;
+ }
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 20px;
+ }
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 710px;
+ }
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 648px;
+ }
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 586px;
+ }
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 524px;
+ }
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 462px;
+ }
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 400px;
+ }
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 338px;
+ }
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 276px;
+ }
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 214px;
+ }
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 152px;
+ }
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 90px;
+ }
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 28px;
+ }
+}
+
+@media (max-width: 767px) {
+ body {
+ padding-right: 20px;
+ padding-left: 20px;
+ }
+ .navbar-fixed-top,
+ .navbar-fixed-bottom,
+ .navbar-static-top {
+ margin-right: -20px;
+ margin-left: -20px;
+ }
+ .container-fluid {
+ padding: 0;
+ }
+ .dl-horizontal dt {
+ float: none;
+ width: auto;
+ clear: none;
+ text-align: left;
+ }
+ .dl-horizontal dd {
+ margin-left: 0;
+ }
+ .container {
+ width: auto;
+ }
+ .row-fluid {
+ width: 100%;
+ }
+ .row,
+ .thumbnails {
+ margin-left: 0;
+ }
+ .thumbnails > li {
+ float: none;
+ margin-left: 0;
+ }
+ [class*="span"],
+ .uneditable-input[class*="span"],
+ .row-fluid [class*="span"] {
+ display: block;
+ float: none;
+ width: 100%;
+ margin-left: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .span12,
+ .row-fluid .span12 {
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="offset"]:first-child {
+ margin-left: 0;
+ }
+ .input-large,
+ .input-xlarge,
+ .input-xxlarge,
+ input[class*="span"],
+ select[class*="span"],
+ textarea[class*="span"],
+ .uneditable-input {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .input-prepend input,
+ .input-append input,
+ .input-prepend input[class*="span"],
+ .input-append input[class*="span"] {
+ display: inline-block;
+ width: auto;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 0;
+ }
+ .modal {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ left: 20px;
+ width: auto;
+ margin: 0;
+ }
+ .modal.fade {
+ top: -100px;
+ }
+ .modal.fade.in {
+ top: 20px;
+ }
+}
+
+@media (max-width: 480px) {
+ .nav-collapse {
+ -webkit-transform: translate3d(0, 0, 0);
+ }
+ .page-header h1 small {
+ display: block;
+ line-height: 20px;
+ }
+ input[type="checkbox"],
+ input[type="radio"] {
+ border: 1px solid #ccc;
+ }
+ .form-horizontal .control-label {
+ float: none;
+ width: auto;
+ padding-top: 0;
+ text-align: left;
+ }
+ .form-horizontal .controls {
+ margin-left: 0;
+ }
+ .form-horizontal .control-list {
+ padding-top: 0;
+ }
+ .form-horizontal .form-actions {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .media .pull-left,
+ .media .pull-right {
+ display: block;
+ float: none;
+ margin-bottom: 10px;
+ }
+ .media-object {
+ margin-right: 0;
+ margin-left: 0;
+ }
+ .modal {
+ top: 10px;
+ right: 10px;
+ left: 10px;
+ }
+ .modal-header .close {
+ padding: 10px;
+ margin: -10px;
+ }
+ .carousel-caption {
+ position: static;
+ }
+}
+
+@media (max-width: 979px) {
+ body {
+ padding-top: 0;
+ }
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ position: static;
+ }
+ .navbar-fixed-top {
+ margin-bottom: 20px;
+ }
+ .navbar-fixed-bottom {
+ margin-top: 20px;
+ }
+ .navbar-fixed-top .navbar-inner,
+ .navbar-fixed-bottom .navbar-inner {
+ padding: 5px;
+ }
+ .navbar .container {
+ width: auto;
+ padding: 0;
+ }
+ .navbar .brand {
+ padding-right: 10px;
+ padding-left: 10px;
+ margin: 0 0 0 -5px;
+ }
+ .nav-collapse {
+ clear: both;
+ }
+ .nav-collapse .nav {
+ float: none;
+ margin: 0 0 10px;
+ }
+ .nav-collapse .nav > li {
+ float: none;
+ }
+ .nav-collapse .nav > li > a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > .divider-vertical {
+ display: none;
+ }
+ .nav-collapse .nav .nav-header {
+ color: #777777;
+ text-shadow: none;
+ }
+ .nav-collapse .nav > li > a,
+ .nav-collapse .dropdown-menu a {
+ padding: 9px 15px;
+ font-weight: bold;
+ color: #777777;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ }
+ .nav-collapse .btn {
+ padding: 4px 10px 4px;
+ font-weight: normal;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ }
+ .nav-collapse .dropdown-menu li + li a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > li > a:hover,
+ .nav-collapse .nav > li > a:focus,
+ .nav-collapse .dropdown-menu a:hover,
+ .nav-collapse .dropdown-menu a:focus {
+ background-color: #f2f2f2;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a,
+ .navbar-inverse .nav-collapse .dropdown-menu a {
+ color: #999999;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a:hover,
+ .navbar-inverse .nav-collapse .nav > li > a:focus,
+ .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+ .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+ background-color: #111111;
+ }
+ .nav-collapse.in .btn-group {
+ padding: 0;
+ margin-top: 5px;
+ }
+ .nav-collapse .dropdown-menu {
+ position: static;
+ top: auto;
+ left: auto;
+ display: none;
+ float: none;
+ max-width: none;
+ padding: 0;
+ margin: 0 15px;
+ background-color: transparent;
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ }
+ .nav-collapse .open > .dropdown-menu {
+ display: block;
+ }
+ .nav-collapse .dropdown-menu:before,
+ .nav-collapse .dropdown-menu:after {
+ display: none;
+ }
+ .nav-collapse .dropdown-menu .divider {
+ display: none;
+ }
+ .nav-collapse .nav > li > .dropdown-menu:before,
+ .nav-collapse .nav > li > .dropdown-menu:after {
+ display: none;
+ }
+ .nav-collapse .navbar-form,
+ .nav-collapse .navbar-search {
+ float: none;
+ padding: 10px 15px;
+ margin: 10px 0;
+ border-top: 1px solid #f2f2f2;
+ border-bottom: 1px solid #f2f2f2;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ -moz-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);
+ }
+ .navbar-inverse .nav-collapse .navbar-form,
+ .navbar-inverse .nav-collapse .navbar-search {
+ border-top-color: #111111;
+ border-bottom-color: #111111;
+ }
+ .navbar .nav-collapse .nav.pull-right {
+ float: none;
+ margin-left: 0;
+ }
+ .nav-collapse,
+ .nav-collapse.collapse {
+ height: 0;
+ overflow: hidden;
+ }
+ .navbar .btn-navbar {
+ display: block;
+ }
+ .navbar-static .navbar-inner {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .nav-collapse.collapse {
+ height: auto !important;
+ overflow: visible !important;
+ }
+}
diff --git a/tbc/static/js/.jshintrc b/tbc/static/js/.jshintrc
new file mode 100755
index 0000000..e072269
--- /dev/null
+++ b/tbc/static/js/.jshintrc
@@ -0,0 +1,12 @@
+{
+ "validthis": true,
+ "laxcomma" : true,
+ "laxbreak" : true,
+ "browser" : true,
+ "eqnull" : true,
+ "debug" : true,
+ "devel" : true,
+ "boss" : true,
+ "expr" : true,
+ "asi" : true
+} \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-affix.js b/tbc/static/js/bootstrap-affix.js
new file mode 100755
index 0000000..c1059a8
--- /dev/null
+++ b/tbc/static/js/bootstrap-affix.js
@@ -0,0 +1,117 @@
+/* ==========================================================
+ * bootstrap-affix.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#affix
+ * ==========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+ * ====================== */
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, $.fn.affix.defaults, options)
+ this.$window = $(window)
+ .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
+ this.$element = $(element)
+ this.checkPosition()
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var scrollHeight = $(document).height()
+ , scrollTop = this.$window.scrollTop()
+ , position = this.$element.offset()
+ , offset = this.options.offset
+ , offsetBottom = offset.bottom
+ , offsetTop = offset.top
+ , reset = 'affix affix-top affix-bottom'
+ , affix
+
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
+ if (typeof offsetTop == 'function') offsetTop = offset.top()
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+ affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
+ false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
+ 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
+ 'top' : false
+
+ if (this.affixed === affix) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+ this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
+ }
+
+
+ /* AFFIX PLUGIN DEFINITION
+ * ======================= */
+
+ var old = $.fn.affix
+
+ $.fn.affix = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('affix')
+ , options = typeof option == 'object' && option
+ if (!data) $this.data('affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.affix.Constructor = Affix
+
+ $.fn.affix.defaults = {
+ offset: 0
+ }
+
+
+ /* AFFIX NO CONFLICT
+ * ================= */
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ /* AFFIX DATA-API
+ * ============== */
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ , data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ data.offsetBottom && (data.offset.bottom = data.offsetBottom)
+ data.offsetTop && (data.offset.top = data.offsetTop)
+
+ $spy.affix(data)
+ })
+ })
+
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-alert.js b/tbc/static/js/bootstrap-alert.js
new file mode 100755
index 0000000..9577e62
--- /dev/null
+++ b/tbc/static/js/bootstrap-alert.js
@@ -0,0 +1,99 @@
+/* ==========================================================
+ * bootstrap-alert.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* ALERT CLASS DEFINITION
+ * ====================== */
+
+ var dismiss = '[data-dismiss="alert"]'
+ , Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
+
+ Alert.prototype.close = function (e) {
+ var $this = $(this)
+ , selector = $this.attr('data-target')
+ , $parent
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ $parent = $(selector)
+
+ e && e.preventDefault()
+
+ $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+
+ $parent.trigger(e = $.Event('close'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ $parent
+ .trigger('closed')
+ .remove()
+ }
+
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent.on($.support.transition.end, removeElement) :
+ removeElement()
+ }
+
+
+ /* ALERT PLUGIN DEFINITION
+ * ======================= */
+
+ var old = $.fn.alert
+
+ $.fn.alert = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('alert')
+ if (!data) $this.data('alert', (data = new Alert(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.alert.Constructor = Alert
+
+
+ /* ALERT NO CONFLICT
+ * ================= */
+
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
+
+
+ /* ALERT DATA-API
+ * ============== */
+
+ $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-button.js b/tbc/static/js/bootstrap-button.js
new file mode 100755
index 0000000..4b2a90a
--- /dev/null
+++ b/tbc/static/js/bootstrap-button.js
@@ -0,0 +1,105 @@
+/* ============================================================
+ * bootstrap-button.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#buttons
+ * ============================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* BUTTON PUBLIC CLASS DEFINITION
+ * ============================== */
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, $.fn.button.defaults, options)
+ }
+
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ , $el = this.$element
+ , data = $el.data()
+ , val = $el.is('input') ? 'val' : 'html'
+
+ state = state + 'Text'
+ data.resetText || $el.data('resetText', $el[val]())
+
+ $el[val](data[state] || this.options[state])
+
+ // push to event loop to allow forms to submit
+ setTimeout(function () {
+ state == 'loadingText' ?
+ $el.addClass(d).attr(d, d) :
+ $el.removeClass(d).removeAttr(d)
+ }, 0)
+ }
+
+ Button.prototype.toggle = function () {
+ var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
+
+ $parent && $parent
+ .find('.active')
+ .removeClass('active')
+
+ this.$element.toggleClass('active')
+ }
+
+
+ /* BUTTON PLUGIN DEFINITION
+ * ======================== */
+
+ var old = $.fn.button
+
+ $.fn.button = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('button')
+ , options = typeof option == 'object' && option
+ if (!data) $this.data('button', (data = new Button(this, options)))
+ if (option == 'toggle') data.toggle()
+ else if (option) data.setState(option)
+ })
+ }
+
+ $.fn.button.defaults = {
+ loadingText: 'loading...'
+ }
+
+ $.fn.button.Constructor = Button
+
+
+ /* BUTTON NO CONFLICT
+ * ================== */
+
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ /* BUTTON DATA-API
+ * =============== */
+
+ $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ $btn.button('toggle')
+ })
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-carousel.js b/tbc/static/js/bootstrap-carousel.js
new file mode 100755
index 0000000..c1e8ade
--- /dev/null
+++ b/tbc/static/js/bootstrap-carousel.js
@@ -0,0 +1,207 @@
+/* ==========================================================
+ * bootstrap-carousel.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* CAROUSEL CLASS DEFINITION
+ * ========================= */
+
+ var Carousel = function (element, options) {
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.options.pause == 'hover' && this.$element
+ .on('mouseenter', $.proxy(this.pause, this))
+ .on('mouseleave', $.proxy(this.cycle, this))
+ }
+
+ Carousel.prototype = {
+
+ cycle: function (e) {
+ if (!e) this.paused = false
+ if (this.interval) clearInterval(this.interval);
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+ return this
+ }
+
+ , getActiveIndex: function () {
+ this.$active = this.$element.find('.item.active')
+ this.$items = this.$active.parent().children()
+ return this.$items.index(this.$active)
+ }
+
+ , to: function (pos) {
+ var activeIndex = this.getActiveIndex()
+ , that = this
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) {
+ return this.$element.one('slid', function () {
+ that.to(pos)
+ })
+ }
+
+ if (activeIndex == pos) {
+ return this.pause().cycle()
+ }
+
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+ }
+
+ , pause: function (e) {
+ if (!e) this.paused = true
+ if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
+ }
+ clearInterval(this.interval)
+ this.interval = null
+ return this
+ }
+
+ , next: function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ , prev: function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ , slide: function (type, next) {
+ var $active = this.$element.find('.item.active')
+ , $next = next || $active[type]()
+ , isCycling = this.interval
+ , direction = type == 'next' ? 'left' : 'right'
+ , fallback = type == 'next' ? 'first' : 'last'
+ , that = this
+ , e
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+ e = $.Event('slide', {
+ relatedTarget: $next[0]
+ , direction: direction
+ })
+
+ if ($next.hasClass('active')) return
+
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ this.$element.one('slid', function () {
+ var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+ $nextIndicator && $nextIndicator.addClass('active')
+ })
+ }
+
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ this.$element.one($.support.transition.end, function () {
+ $next.removeClass([type, direction].join(' ')).addClass('active')
+ $active.removeClass(['active', direction].join(' '))
+ that.sliding = false
+ setTimeout(function () { that.$element.trigger('slid') }, 0)
+ })
+ } else {
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger('slid')
+ }
+
+ isCycling && this.cycle()
+
+ return this
+ }
+
+ }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+ * ========================== */
+
+ var old = $.fn.carousel
+
+ $.fn.carousel = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('carousel')
+ , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
+ , action = typeof option == 'string' ? option : options.slide
+ if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+ if (typeof option == 'number') data.to(option)
+ else if (action) data[action]()
+ else if (options.interval) data.pause().cycle()
+ })
+ }
+
+ $.fn.carousel.defaults = {
+ interval: 5000
+ , pause: 'hover'
+ }
+
+ $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL NO CONFLICT
+ * ==================== */
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
+ }
+
+ /* CAROUSEL DATA-API
+ * ================= */
+
+ $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+ var $this = $(this), href
+ , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ , options = $.extend({}, $target.data(), $this.data())
+ , slideIndex
+
+ $target.carousel(options)
+
+ if (slideIndex = $this.attr('data-slide-to')) {
+ $target.data('carousel').pause().to(slideIndex).cycle()
+ }
+
+ e.preventDefault()
+ })
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-collapse.js b/tbc/static/js/bootstrap-collapse.js
new file mode 100755
index 0000000..ae3e4c6
--- /dev/null
+++ b/tbc/static/js/bootstrap-collapse.js
@@ -0,0 +1,167 @@
+/* =============================================================
+ * bootstrap-collapse.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#collapse
+ * =============================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+ * ================================ */
+
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+ if (this.options.parent) {
+ this.$parent = $(this.options.parent)
+ }
+
+ this.options.toggle && this.toggle()
+ }
+
+ Collapse.prototype = {
+
+ constructor: Collapse
+
+ , dimension: function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ , show: function () {
+ var dimension
+ , scroll
+ , actives
+ , hasData
+
+ if (this.transitioning || this.$element.hasClass('in')) return
+
+ dimension = this.dimension()
+ scroll = $.camelCase(['scroll', dimension].join('-'))
+ actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+ if (actives && actives.length) {
+ hasData = actives.data('collapse')
+ if (hasData && hasData.transitioning) return
+ actives.collapse('hide')
+ hasData || actives.data('collapse', null)
+ }
+
+ this.$element[dimension](0)
+ this.transition('addClass', $.Event('show'), 'shown')
+ $.support.transition && this.$element[dimension](this.$element[0][scroll])
+ }
+
+ , hide: function () {
+ var dimension
+ if (this.transitioning || !this.$element.hasClass('in')) return
+ dimension = this.dimension()
+ this.reset(this.$element[dimension]())
+ this.transition('removeClass', $.Event('hide'), 'hidden')
+ this.$element[dimension](0)
+ }
+
+ , reset: function (size) {
+ var dimension = this.dimension()
+
+ this.$element
+ .removeClass('collapse')
+ [dimension](size || 'auto')
+ [0].offsetWidth
+
+ this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+ return this
+ }
+
+ , transition: function (method, startEvent, completeEvent) {
+ var that = this
+ , complete = function () {
+ if (startEvent.type == 'show') that.reset()
+ that.transitioning = 0
+ that.$element.trigger(completeEvent)
+ }
+
+ this.$element.trigger(startEvent)
+
+ if (startEvent.isDefaultPrevented()) return
+
+ this.transitioning = 1
+
+ this.$element[method]('in')
+
+ $.support.transition && this.$element.hasClass('collapse') ?
+ this.$element.one($.support.transition.end, complete) :
+ complete()
+ }
+
+ , toggle: function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
+ }
+
+ }
+
+
+ /* COLLAPSE PLUGIN DEFINITION
+ * ========================== */
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('collapse')
+ , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
+ if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.collapse.defaults = {
+ toggle: true
+ }
+
+ $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSE NO CONFLICT
+ * ==================== */
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
+ }
+
+
+ /* COLLAPSE DATA-API
+ * ================= */
+
+ $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
+ var $this = $(this), href
+ , target = $this.attr('data-target')
+ || e.preventDefault()
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+ , option = $(target).data('collapse') ? 'toggle' : $this.data()
+ $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+ $(target).collapse(option)
+ })
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-dropdown.js b/tbc/static/js/bootstrap-dropdown.js
new file mode 100755
index 0000000..d04da5d
--- /dev/null
+++ b/tbc/static/js/bootstrap-dropdown.js
@@ -0,0 +1,169 @@
+/* ============================================================
+ * bootstrap-dropdown.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+ * ========================= */
+
+ var toggle = '[data-toggle=dropdown]'
+ , Dropdown = function (element) {
+ var $el = $(element).on('click.dropdown.data-api', this.toggle)
+ $('html').on('click.dropdown.data-api', function () {
+ $el.parent().removeClass('open')
+ })
+ }
+
+ Dropdown.prototype = {
+
+ constructor: Dropdown
+
+ , toggle: function (e) {
+ var $this = $(this)
+ , $parent
+ , isActive
+
+ if ($this.is('.disabled, :disabled')) return
+
+ $parent = getParent($this)
+
+ isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement) {
+ // if mobile we we use a backdrop because click events don't delegate
+ $('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus)
+ }
+ $parent.toggleClass('open')
+ }
+
+ $this.focus()
+
+ return false
+ }
+
+ , keydown: function (e) {
+ var $this
+ , $items
+ , $active
+ , $parent
+ , isActive
+ , index
+
+ if (!/(38|40|27)/.test(e.keyCode)) return
+
+ $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ $parent = getParent($this)
+
+ isActive = $parent.hasClass('open')
+
+ if (!isActive || (isActive && e.keyCode == 27)) {
+ if (e.which == 27) $parent.find(toggle).focus()
+ return $this.click()
+ }
+
+ $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+ if (!$items.length) return
+
+ index = $items.index($items.filter(':focus'))
+
+ if (e.keyCode == 38 && index > 0) index-- // up
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index = 0
+
+ $items
+ .eq(index)
+ .focus()
+ }
+
+ }
+
+ function clearMenus() {
+ $('.dropdown-backdrop').remove()
+ $(toggle).each(function () {
+ getParent($(this)).removeClass('open')
+ })
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+ , $parent
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ $parent = selector && $(selector)
+
+ if (!$parent || !$parent.length) $parent = $this.parent()
+
+ return $parent
+ }
+
+
+ /* DROPDOWN PLUGIN DEFINITION
+ * ========================== */
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('dropdown')
+ if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ /* DROPDOWN NO CONFLICT
+ * ==================== */
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ /* APPLY TO STANDARD DROPDOWN ELEMENTS
+ * =================================== */
+
+ $(document)
+ .on('click.dropdown.data-api', clearMenus)
+ .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+ .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
+ .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(window.jQuery);
diff --git a/tbc/static/js/bootstrap-modal.js b/tbc/static/js/bootstrap-modal.js
new file mode 100755
index 0000000..fb0b0db
--- /dev/null
+++ b/tbc/static/js/bootstrap-modal.js
@@ -0,0 +1,247 @@
+/* =========================================================
+ * bootstrap-modal.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#modals
+ * =========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+ * ====================== */
+
+ var Modal = function (element, options) {
+ this.options = options
+ this.$element = $(element)
+ .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+ this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+ }
+
+ Modal.prototype = {
+
+ constructor: Modal
+
+ , toggle: function () {
+ return this[!this.isShown ? 'show' : 'hide']()
+ }
+
+ , show: function () {
+ var that = this
+ , e = $.Event('show')
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.escape()
+
+ this.backdrop(function () {
+ var transition = $.support.transition && that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(document.body) //don't move modals dom position
+ }
+
+ that.$element.show()
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element
+ .addClass('in')
+ .attr('aria-hidden', false)
+
+ that.enforceFocus()
+
+ transition ?
+ that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
+ that.$element.focus().trigger('shown')
+
+ })
+ }
+
+ , hide: function (e) {
+ e && e.preventDefault()
+
+ var that = this
+
+ e = $.Event('hide')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+
+ $(document).off('focusin.modal')
+
+ this.$element
+ .removeClass('in')
+ .attr('aria-hidden', true)
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.hideWithTransition() :
+ this.hideModal()
+ }
+
+ , enforceFocus: function () {
+ var that = this
+ $(document).on('focusin.modal', function (e) {
+ if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+ that.$element.focus()
+ }
+ })
+ }
+
+ , escape: function () {
+ var that = this
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keyup.dismiss.modal', function ( e ) {
+ e.which == 27 && that.hide()
+ })
+ } else if (!this.isShown) {
+ this.$element.off('keyup.dismiss.modal')
+ }
+ }
+
+ , hideWithTransition: function () {
+ var that = this
+ , timeout = setTimeout(function () {
+ that.$element.off($.support.transition.end)
+ that.hideModal()
+ }, 500)
+
+ this.$element.one($.support.transition.end, function () {
+ clearTimeout(timeout)
+ that.hideModal()
+ })
+ }
+
+ , hideModal: function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.removeBackdrop()
+ that.$element.trigger('hidden')
+ })
+ }
+
+ , removeBackdrop: function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ , backdrop: function (callback) {
+ var that = this
+ , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+ .appendTo(document.body)
+
+ this.$backdrop.click(
+ this.options.backdrop == 'static' ?
+ $.proxy(this.$element[0].focus, this.$element[0])
+ : $.proxy(this.hide, this)
+ )
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop.one($.support.transition.end, callback) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ $.support.transition && this.$element.hasClass('fade')?
+ this.$backdrop.one($.support.transition.end, callback) :
+ callback()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+ }
+
+
+ /* MODAL PLUGIN DEFINITION
+ * ======================= */
+
+ var old = $.fn.modal
+
+ $.fn.modal = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('modal')
+ , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+ if (!data) $this.data('modal', (data = new Modal(this, options)))
+ if (typeof option == 'string') data[option]()
+ else if (options.show) data.show()
+ })
+ }
+
+ $.fn.modal.defaults = {
+ backdrop: true
+ , keyboard: true
+ , show: true
+ }
+
+ $.fn.modal.Constructor = Modal
+
+
+ /* MODAL NO CONFLICT
+ * ================= */
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ /* MODAL DATA-API
+ * ============== */
+
+ $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
+ var $this = $(this)
+ , href = $this.attr('href')
+ , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+ , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
+
+ e.preventDefault()
+
+ $target
+ .modal(option)
+ .one('hide', function () {
+ $this.focus()
+ })
+ })
+
+}(window.jQuery);
diff --git a/tbc/static/js/bootstrap-popover.js b/tbc/static/js/bootstrap-popover.js
new file mode 100755
index 0000000..2b323b4
--- /dev/null
+++ b/tbc/static/js/bootstrap-popover.js
@@ -0,0 +1,114 @@
+/* ===========================================================
+ * bootstrap-popover.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#popovers
+ * ===========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* POPOVER PUBLIC CLASS DEFINITION
+ * =============================== */
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+
+ /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
+ ========================================== */
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+
+ constructor: Popover
+
+ , setContent: function () {
+ var $tip = this.tip()
+ , title = this.getTitle()
+ , content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+ $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+ $tip.removeClass('fade top bottom left right in')
+ }
+
+ , hasContent: function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ , getContent: function () {
+ var content
+ , $e = this.$element
+ , o = this.options
+
+ content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
+ || $e.attr('data-content')
+
+ return content
+ }
+
+ , tip: function () {
+ if (!this.$tip) {
+ this.$tip = $(this.options.template)
+ }
+ return this.$tip
+ }
+
+ , destroy: function () {
+ this.hide().$element.off('.' + this.type).removeData(this.type)
+ }
+
+ })
+
+
+ /* POPOVER PLUGIN DEFINITION
+ * ======================= */
+
+ var old = $.fn.popover
+
+ $.fn.popover = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('popover')
+ , options = typeof option == 'object' && option
+ if (!data) $this.data('popover', (data = new Popover(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.popover.Constructor = Popover
+
+ $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
+ placement: 'right'
+ , trigger: 'click'
+ , content: ''
+ , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+ })
+
+
+ /* POPOVER NO CONFLICT
+ * =================== */
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(window.jQuery);
diff --git a/tbc/static/js/bootstrap-scrollspy.js b/tbc/static/js/bootstrap-scrollspy.js
new file mode 100755
index 0000000..3ce5461
--- /dev/null
+++ b/tbc/static/js/bootstrap-scrollspy.js
@@ -0,0 +1,162 @@
+/* =============================================================
+ * bootstrap-scrollspy.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#scrollspy
+ * =============================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* SCROLLSPY CLASS DEFINITION
+ * ========================== */
+
+ function ScrollSpy(element, options) {
+ var process = $.proxy(this.process, this)
+ , $element = $(element).is('body') ? $(window) : $(element)
+ , href
+ this.options = $.extend({}, $.fn.scrollspy.defaults, options)
+ this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
+ this.selector = (this.options.target
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ || '') + ' .nav li > a'
+ this.$body = $('body')
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.prototype = {
+
+ constructor: ScrollSpy
+
+ , refresh: function () {
+ var self = this
+ , $targets
+
+ this.offsets = $([])
+ this.targets = $([])
+
+ $targets = this.$body
+ .find(this.selector)
+ .map(function () {
+ var $el = $(this)
+ , href = $el.data('target') || $el.attr('href')
+ , $href = /^#\w/.test(href) && $(href)
+ return ( $href
+ && $href.length
+ && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ self.offsets.push(this[0])
+ self.targets.push(this[1])
+ })
+ }
+
+ , process: function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+ , maxScroll = scrollHeight - this.$scrollElement.height()
+ , offsets = this.offsets
+ , targets = this.targets
+ , activeTarget = this.activeTarget
+ , i
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets.last()[0])
+ && this.activate ( i )
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate( targets[i] )
+ }
+ }
+
+ , activate: function (target) {
+ var active
+ , selector
+
+ this.activeTarget = target
+
+ $(this.selector)
+ .parent('.active')
+ .removeClass('active')
+
+ selector = this.selector
+ + '[data-target="' + target + '"],'
+ + this.selector + '[href="' + target + '"]'
+
+ active = $(selector)
+ .parent('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active.closest('li.dropdown').addClass('active')
+ }
+
+ active.trigger('activate')
+ }
+
+ }
+
+
+ /* SCROLLSPY PLUGIN DEFINITION
+ * =========================== */
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('scrollspy')
+ , options = typeof option == 'object' && option
+ if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+ $.fn.scrollspy.defaults = {
+ offset: 10
+ }
+
+
+ /* SCROLLSPY NO CONFLICT
+ * ===================== */
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ /* SCROLLSPY DATA-API
+ * ================== */
+
+ $(window).on('load', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ $spy.scrollspy($spy.data())
+ })
+ })
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-tab.js b/tbc/static/js/bootstrap-tab.js
new file mode 100755
index 0000000..3a132c0
--- /dev/null
+++ b/tbc/static/js/bootstrap-tab.js
@@ -0,0 +1,144 @@
+/* ========================================================
+ * bootstrap-tab.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#tabs
+ * ========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+ * ==================== */
+
+ var Tab = function (element) {
+ this.element = $(element)
+ }
+
+ Tab.prototype = {
+
+ constructor: Tab
+
+ , show: function () {
+ var $this = this.element
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
+ , selector = $this.attr('data-target')
+ , previous
+ , $target
+ , e
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ if ( $this.parent('li').hasClass('active') ) return
+
+ previous = $ul.find('.active:last a')[0]
+
+ e = $.Event('show', {
+ relatedTarget: previous
+ })
+
+ $this.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $target = $(selector)
+
+ this.activate($this.parent('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $this.trigger({
+ type: 'shown'
+ , relatedTarget: previous
+ })
+ })
+ }
+
+ , activate: function ( element, container, callback) {
+ var $active = container.find('> .active')
+ , transition = callback
+ && $.support.transition
+ && $active.hasClass('fade')
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+
+ element.addClass('active')
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if ( element.parent('.dropdown-menu') ) {
+ element.closest('li.dropdown').addClass('active')
+ }
+
+ callback && callback()
+ }
+
+ transition ?
+ $active.one($.support.transition.end, next) :
+ next()
+
+ $active.removeClass('in')
+ }
+ }
+
+
+ /* TAB PLUGIN DEFINITION
+ * ===================== */
+
+ var old = $.fn.tab
+
+ $.fn.tab = function ( option ) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('tab')
+ if (!data) $this.data('tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tab.Constructor = Tab
+
+
+ /* TAB NO CONFLICT
+ * =============== */
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ /* TAB DATA-API
+ * ============ */
+
+ $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+ e.preventDefault()
+ $(this).tab('show')
+ })
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-tooltip.js b/tbc/static/js/bootstrap-tooltip.js
new file mode 100755
index 0000000..acd6096
--- /dev/null
+++ b/tbc/static/js/bootstrap-tooltip.js
@@ -0,0 +1,361 @@
+/* ===========================================================
+ * bootstrap-tooltip.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#tooltips
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ===========================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* TOOLTIP PUBLIC CLASS DEFINITION
+ * =============================== */
+
+ var Tooltip = function (element, options) {
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.prototype = {
+
+ constructor: Tooltip
+
+ , init: function (type, element, options) {
+ var eventIn
+ , eventOut
+ , triggers
+ , trigger
+ , i
+
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+ this.enabled = true
+
+ triggers = this.options.trigger.split(' ')
+
+ for (i = triggers.length; i--;) {
+ trigger = triggers[i]
+ if (trigger == 'click') {
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+ } else if (trigger != 'manual') {
+ eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
+ eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+ }
+ }
+
+ this.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+ this.fixTitle()
+ }
+
+ , getOptions: function (options) {
+ options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay
+ , hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ , enter: function (e) {
+ var defaults = $.fn[this.type].defaults
+ , options = {}
+ , self
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ }, this)
+
+ self = $(e.currentTarget)[this.type](options).data(this.type)
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ clearTimeout(this.timeout)
+ self.hoverState = 'in'
+ this.timeout = setTimeout(function() {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ , leave: function (e) {
+ var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+ if (this.timeout) clearTimeout(this.timeout)
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.hoverState = 'out'
+ this.timeout = setTimeout(function() {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ , show: function () {
+ var $tip
+ , pos
+ , actualWidth
+ , actualHeight
+ , placement
+ , tp
+ , e = $.Event('show')
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+ $tip = this.tip()
+ this.setContent()
+
+ if (this.options.animation) {
+ $tip.addClass('fade')
+ }
+
+ placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+ pos = this.getPosition()
+
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
+
+ switch (placement) {
+ case 'bottom':
+ tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
+ break
+ case 'top':
+ tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
+ break
+ case 'left':
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
+ break
+ case 'right':
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
+ break
+ }
+
+ this.applyPlacement(tp, placement)
+ this.$element.trigger('shown')
+ }
+ }
+
+ , applyPlacement: function(offset, placement){
+ var $tip = this.tip()
+ , width = $tip[0].offsetWidth
+ , height = $tip[0].offsetHeight
+ , actualWidth
+ , actualHeight
+ , delta
+ , replace
+
+ $tip
+ .offset(offset)
+ .addClass(placement)
+ .addClass('in')
+
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
+
+ if (placement == 'top' && actualHeight != height) {
+ offset.top = offset.top + height - actualHeight
+ replace = true
+ }
+
+ if (placement == 'bottom' || placement == 'top') {
+ delta = 0
+
+ if (offset.left < 0){
+ delta = offset.left * -2
+ offset.left = 0
+ $tip.offset(offset)
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
+ }
+
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+ } else {
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
+ }
+
+ if (replace) $tip.offset(offset)
+ }
+
+ , replaceArrow: function(delta, dimension, position){
+ this
+ .arrow()
+ .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+ }
+
+ , setContent: function () {
+ var $tip = this.tip()
+ , title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ , hide: function () {
+ var that = this
+ , $tip = this.tip()
+ , e = $.Event('hide')
+
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ function removeWithAnimation() {
+ var timeout = setTimeout(function () {
+ $tip.off($.support.transition.end).detach()
+ }, 500)
+
+ $tip.one($.support.transition.end, function () {
+ clearTimeout(timeout)
+ $tip.detach()
+ })
+ }
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ removeWithAnimation() :
+ $tip.detach()
+
+ this.$element.trigger('hidden')
+
+ return this
+ }
+
+ , fixTitle: function () {
+ var $e = this.$element
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+ }
+ }
+
+ , hasContent: function () {
+ return this.getTitle()
+ }
+
+ , getPosition: function () {
+ var el = this.$element[0]
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+ width: el.offsetWidth
+ , height: el.offsetHeight
+ }, this.$element.offset())
+ }
+
+ , getTitle: function () {
+ var title
+ , $e = this.$element
+ , o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ , tip: function () {
+ return this.$tip = this.$tip || $(this.options.template)
+ }
+
+ , arrow: function(){
+ return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
+ }
+
+ , validate: function () {
+ if (!this.$element[0].parentNode) {
+ this.hide()
+ this.$element = null
+ this.options = null
+ }
+ }
+
+ , enable: function () {
+ this.enabled = true
+ }
+
+ , disable: function () {
+ this.enabled = false
+ }
+
+ , toggleEnabled: function () {
+ this.enabled = !this.enabled
+ }
+
+ , toggle: function (e) {
+ var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
+ self.tip().hasClass('in') ? self.hide() : self.show()
+ }
+
+ , destroy: function () {
+ this.hide().$element.off('.' + this.type).removeData(this.type)
+ }
+
+ }
+
+
+ /* TOOLTIP PLUGIN DEFINITION
+ * ========================= */
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = function ( option ) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('tooltip')
+ , options = typeof option == 'object' && option
+ if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tooltip.Constructor = Tooltip
+
+ $.fn.tooltip.defaults = {
+ animation: true
+ , placement: 'top'
+ , selector: false
+ , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+ , trigger: 'hover focus'
+ , title: ''
+ , delay: 0
+ , html: false
+ , container: false
+ }
+
+
+ /* TOOLTIP NO CONFLICT
+ * =================== */
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(window.jQuery);
diff --git a/tbc/static/js/bootstrap-transition.js b/tbc/static/js/bootstrap-transition.js
new file mode 100755
index 0000000..c4fd401
--- /dev/null
+++ b/tbc/static/js/bootstrap-transition.js
@@ -0,0 +1,60 @@
+/* ===================================================
+ * bootstrap-transition.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#transitions
+ * ===================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+ "use strict"; // jshint ;_;
+
+
+ /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+ * ======================================================= */
+
+ $(function () {
+
+ $.support.transition = (function () {
+
+ var transitionEnd = (function () {
+
+ var el = document.createElement('bootstrap')
+ , transEndEventNames = {
+ 'WebkitTransition' : 'webkitTransitionEnd'
+ , 'MozTransition' : 'transitionend'
+ , 'OTransition' : 'oTransitionEnd otransitionend'
+ , 'transition' : 'transitionend'
+ }
+ , name
+
+ for (name in transEndEventNames){
+ if (el.style[name] !== undefined) {
+ return transEndEventNames[name]
+ }
+ }
+
+ }())
+
+ return transitionEnd && {
+ end: transitionEnd
+ }
+
+ })()
+
+ })
+
+}(window.jQuery); \ No newline at end of file
diff --git a/tbc/static/js/bootstrap-typeahead.js b/tbc/static/js/bootstrap-typeahead.js
new file mode 100755
index 0000000..9cc84d8
--- /dev/null
+++ b/tbc/static/js/bootstrap-typeahead.js
@@ -0,0 +1,335 @@
+/* =============================================================
+ * bootstrap-typeahead.js v2.3.2
+ * http://getbootstrap.com/2.3.2/javascript.html#typeahead
+ * =============================================================
+ * Copyright 2013 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function($){
+
+ "use strict"; // jshint ;_;
+
+
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
+ * ================================= */
+
+ var Typeahead = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, $.fn.typeahead.defaults, options)
+ this.matcher = this.options.matcher || this.matcher
+ this.sorter = this.options.sorter || this.sorter
+ this.highlighter = this.options.highlighter || this.highlighter
+ this.updater = this.options.updater || this.updater
+ this.source = this.options.source
+ this.$menu = $(this.options.menu)
+ this.shown = false
+ this.listen()
+ }
+
+ Typeahead.prototype = {
+
+ constructor: Typeahead
+
+ , select: function () {
+ var val = this.$menu.find('.active').attr('data-value')
+ this.$element
+ .val(this.updater(val))
+ .change()
+ return this.hide()
+ }
+
+ , updater: function (item) {
+ return item
+ }
+
+ , show: function () {
+ var pos = $.extend({}, this.$element.position(), {
+ height: this.$element[0].offsetHeight
+ })
+
+ this.$menu
+ .insertAfter(this.$element)
+ .css({
+ top: pos.top + pos.height
+ , left: pos.left
+ })
+ .show()
+
+ this.shown = true
+ return this
+ }
+
+ , hide: function () {
+ this.$menu.hide()
+ this.shown = false
+ return this
+ }
+
+ , lookup: function (event) {
+ var items
+
+ this.query = this.$element.val()
+
+ if (!this.query || this.query.length < this.options.minLength) {
+ return this.shown ? this.hide() : this
+ }
+
+ items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
+
+ return items ? this.process(items) : this
+ }
+
+ , process: function (items) {
+ var that = this
+
+ items = $.grep(items, function (item) {
+ return that.matcher(item)
+ })
+
+ items = this.sorter(items)
+
+ if (!items.length) {
+ return this.shown ? this.hide() : this
+ }
+
+ return this.render(items.slice(0, this.options.items)).show()
+ }
+
+ , matcher: function (item) {
+ return ~item.toLowerCase().indexOf(this.query.toLowerCase())
+ }
+
+ , sorter: function (items) {
+ var beginswith = []
+ , caseSensitive = []
+ , caseInsensitive = []
+ , item
+
+ while (item = items.shift()) {
+ if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
+ else if (~item.indexOf(this.query)) caseSensitive.push(item)
+ else caseInsensitive.push(item)
+ }
+
+ return beginswith.concat(caseSensitive, caseInsensitive)
+ }
+
+ , highlighter: function (item) {
+ var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
+ return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+ return '<strong>' + match + '</strong>'
+ })
+ }
+
+ , render: function (items) {
+ var that = this
+
+ items = $(items).map(function (i, item) {
+ i = $(that.options.item).attr('data-value', item)
+ i.find('a').html(that.highlighter(item))
+ return i[0]
+ })
+
+ items.first().addClass('active')
+ this.$menu.html(items)
+ return this
+ }
+
+ , next: function (event) {
+ var active = this.$menu.find('.active').removeClass('active')
+ , next = active.next()
+
+ if (!next.length) {
+ next = $(this.$menu.find('li')[0])
+ }
+
+ next.addClass('active')
+ }
+
+ , prev: function (event) {
+ var active = this.$menu.find('.active').removeClass('active')
+ , prev = active.prev()
+
+ if (!prev.length) {
+ prev = this.$menu.find('li').last()
+ }
+
+ prev.addClass('active')
+ }
+
+ , listen: function () {
+ this.$element
+ .on('focus', $.proxy(this.focus, this))
+ .on('blur', $.proxy(this.blur, this))
+ .on('keypress', $.proxy(this.keypress, this))
+ .on('keyup', $.proxy(this.keyup, this))
+
+ if (this.eventSupported('keydown')) {
+ this.$element.on('keydown', $.proxy(this.keydown, this))
+ }
+
+ this.$menu
+ .on('click', $.proxy(this.click, this))
+ .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+ .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
+ }
+
+ , eventSupported: function(eventName) {
+ var isSupported = eventName in this.$element
+ if (!isSupported) {
+ this.$element.setAttribute(eventName, 'return;')
+ isSupported = typeof this.$element[eventName] === 'function'
+ }
+ return isSupported
+ }
+
+ , move: function (e) {
+ if (!this.shown) return
+
+ switch(e.keyCode) {
+ case 9: // tab
+ case 13: // enter
+ case 27: // escape
+ e.preventDefault()
+ break
+
+ case 38: // up arrow
+ e.preventDefault()
+ this.prev()
+ break
+
+ case 40: // down arrow
+ e.preventDefault()
+ this.next()
+ break
+ }
+
+ e.stopPropagation()
+ }
+
+ , keydown: function (e) {
+ this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
+ this.move(e)
+ }
+
+ , keypress: function (e) {
+ if (this.suppressKeyPressRepeat) return
+ this.move(e)
+ }
+
+ , keyup: function (e) {
+ switch(e.keyCode) {
+ case 40: // down arrow
+ case 38: // up arrow
+ case 16: // shift
+ case 17: // ctrl
+ case 18: // alt
+ break
+
+ case 9: // tab
+ case 13: // enter
+ if (!this.shown) return
+ this.select()
+ break
+
+ case 27: // escape
+ if (!this.shown) return
+ this.hide()
+ break
+
+ default:
+ this.lookup()
+ }
+
+ e.stopPropagation()
+ e.preventDefault()
+ }
+
+ , focus: function (e) {
+ this.focused = true
+ }
+
+ , blur: function (e) {
+ this.focused = false
+ if (!this.mousedover && this.shown) this.hide()
+ }
+
+ , click: function (e) {
+ e.stopPropagation()
+ e.preventDefault()
+ this.select()
+ this.$element.focus()
+ }
+
+ , mouseenter: function (e) {
+ this.mousedover = true
+ this.$menu.find('.active').removeClass('active')
+ $(e.currentTarget).addClass('active')
+ }
+
+ , mouseleave: function (e) {
+ this.mousedover = false
+ if (!this.focused && this.shown) this.hide()
+ }
+
+ }
+
+
+ /* TYPEAHEAD PLUGIN DEFINITION
+ * =========================== */
+
+ var old = $.fn.typeahead
+
+ $.fn.typeahead = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ , data = $this.data('typeahead')
+ , options = typeof option == 'object' && option
+ if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.typeahead.defaults = {
+ source: []
+ , items: 8
+ , menu: '<ul class="typeahead dropdown-menu"></ul>'
+ , item: '<li><a href="#"></a></li>'
+ , minLength: 1
+ }
+
+ $.fn.typeahead.Constructor = Typeahead
+
+
+ /* TYPEAHEAD NO CONFLICT
+ * =================== */
+
+ $.fn.typeahead.noConflict = function () {
+ $.fn.typeahead = old
+ return this
+ }
+
+
+ /* TYPEAHEAD DATA-API
+ * ================== */
+
+ $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
+ var $this = $(this)
+ if ($this.data('typeahead')) return
+ $this.typeahead($this.data())
+ })
+
+}(window.jQuery);
diff --git a/tbc/static/js/jquery.js b/tbc/static/js/jquery.js
new file mode 100755
index 0000000..006e953
--- /dev/null
+++ b/tbc/static/js/jquery.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery.min.map
+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window); \ No newline at end of file
diff --git a/tbc/static/js/tests/index.html b/tbc/static/js/tests/index.html
new file mode 100755
index 0000000..976ca16
--- /dev/null
+++ b/tbc/static/js/tests/index.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Bootstrap Plugin Test Suite</title>
+
+ <!-- jquery -->
+ <!--<script src="http://code.jquery.com/jquery-1.7.min.js"></script>-->
+ <script src="vendor/jquery.js"></script>
+
+ <!-- qunit -->
+ <link rel="stylesheet" href="vendor/qunit.css" type="text/css" media="screen" />
+ <script src="vendor/qunit.js"></script>
+
+ <!-- phantomjs logging script-->
+ <script src="unit/bootstrap-phantom.js"></script>
+
+ <!-- plugin sources -->
+ <script src="../../js/bootstrap-transition.js"></script>
+ <script src="../../js/bootstrap-alert.js"></script>
+ <script src="../../js/bootstrap-button.js"></script>
+ <script src="../../js/bootstrap-carousel.js"></script>
+ <script src="../../js/bootstrap-collapse.js"></script>
+ <script src="../../js/bootstrap-dropdown.js"></script>
+ <script src="../../js/bootstrap-modal.js"></script>
+ <script src="../../js/bootstrap-scrollspy.js"></script>
+ <script src="../../js/bootstrap-tab.js"></script>
+ <script src="../../js/bootstrap-tooltip.js"></script>
+ <script src="../../js/bootstrap-popover.js"></script>
+ <script src="../../js/bootstrap-typeahead.js"></script>
+ <script src="../../js/bootstrap-affix.js"></script>
+
+ <!-- unit tests -->
+ <script src="unit/bootstrap-transition.js"></script>
+ <script src="unit/bootstrap-alert.js"></script>
+ <script src="unit/bootstrap-button.js"></script>
+ <script src="unit/bootstrap-carousel.js"></script>
+ <script src="unit/bootstrap-collapse.js"></script>
+ <script src="unit/bootstrap-dropdown.js"></script>
+ <script src="unit/bootstrap-modal.js"></script>
+ <script src="unit/bootstrap-scrollspy.js"></script>
+ <script src="unit/bootstrap-tab.js"></script>
+ <script src="unit/bootstrap-tooltip.js"></script>
+ <script src="unit/bootstrap-popover.js"></script>
+ <script src="unit/bootstrap-typeahead.js"></script>
+ <script src="unit/bootstrap-affix.js"></script>
+</head>
+<body>
+ <div>
+ <h1 id="qunit-header">Bootstrap Plugin Test Suite</h1>
+ <h2 id="qunit-banner"></h2>
+ <h2 id="qunit-userAgent"></h2>
+ <ol id="qunit-tests"></ol>
+ <div id="qunit-fixture"></div>
+ </div>
+</body>
+</html> \ No newline at end of file
diff --git a/tbc/static/js/tests/phantom.js b/tbc/static/js/tests/phantom.js
new file mode 100755
index 0000000..4105bf5
--- /dev/null
+++ b/tbc/static/js/tests/phantom.js
@@ -0,0 +1,63 @@
+// Simple phantom.js integration script
+// Adapted from Modernizr
+
+function waitFor(testFx, onReady, timeOutMillis) {
+ var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s
+ , start = new Date().getTime()
+ , condition = false
+ , interval = setInterval(function () {
+ if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
+ // If not time-out yet and condition not yet fulfilled
+ condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code
+ } else {
+ if (!condition) {
+ // If condition still not fulfilled (timeout but condition is 'false')
+ console.log("'waitFor()' timeout")
+ phantom.exit(1)
+ } else {
+ // Condition fulfilled (timeout and/or condition is 'true')
+ typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled
+ clearInterval(interval) //< Stop this interval
+ }
+ }
+ }, 100) //< repeat check every 100ms
+}
+
+
+if (phantom.args.length === 0 || phantom.args.length > 2) {
+ console.log('Usage: phantom.js URL')
+ phantom.exit()
+}
+
+var page = new WebPage()
+
+// Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
+page.onConsoleMessage = function(msg) {
+ console.log(msg)
+};
+
+page.open(phantom.args[0], function(status){
+ if (status !== "success") {
+ console.log("Unable to access network")
+ phantom.exit()
+ } else {
+ waitFor(function(){
+ return page.evaluate(function(){
+ var el = document.getElementById('qunit-testresult')
+ if (el && el.innerText.match('completed')) {
+ return true
+ }
+ return false
+ })
+ }, function(){
+ var failedNum = page.evaluate(function(){
+ var el = document.getElementById('qunit-testresult')
+ try {
+ return el.getElementsByClassName('failed')[0].innerHTML
+ } catch (e) { }
+ return 10000
+ });
+ phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0)
+ })
+ }
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/server.js b/tbc/static/js/tests/server.js
new file mode 100755
index 0000000..7c8445f
--- /dev/null
+++ b/tbc/static/js/tests/server.js
@@ -0,0 +1,14 @@
+/*
+ * Simple connect server for phantom.js
+ * Adapted from Modernizr
+ */
+
+var connect = require('connect')
+ , http = require('http')
+ , fs = require('fs')
+ , app = connect()
+ .use(connect.static(__dirname + '/../../'));
+
+http.createServer(app).listen(3000);
+
+fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8') \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-affix.js b/tbc/static/js/tests/unit/bootstrap-affix.js
new file mode 100755
index 0000000..c978878
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-affix.js
@@ -0,0 +1,25 @@
+$(function () {
+
+ module("bootstrap-affix")
+
+ test("should provide no conflict", function () {
+ var affix = $.fn.affix.noConflict()
+ ok(!$.fn.affix, 'affix was set back to undefined (org value)')
+ $.fn.affix = affix
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).affix, 'affix method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).affix()[0] == document.body, 'document.body returned')
+ })
+
+ test("should exit early if element is not visible", function () {
+ var $affix = $('<div style="display: none"></div>').affix()
+ $affix.data('affix').checkPosition()
+ ok(!$affix.hasClass('affix'), 'affix class was not added')
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-alert.js b/tbc/static/js/tests/unit/bootstrap-alert.js
new file mode 100755
index 0000000..9a6b514
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-alert.js
@@ -0,0 +1,62 @@
+$(function () {
+
+ module("bootstrap-alerts")
+
+ test("should provide no conflict", function () {
+ var alert = $.fn.alert.noConflict()
+ ok(!$.fn.alert, 'alert was set back to undefined (org value)')
+ $.fn.alert = alert
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).alert, 'alert method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).alert()[0] == document.body, 'document.body returned')
+ })
+
+ test("should fade element out on clicking .close", function () {
+ var alertHTML = '<div class="alert-message warning fade in">'
+ + '<a class="close" href="#" data-dismiss="alert">×</a>'
+ + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>'
+ + '</div>'
+ , alert = $(alertHTML).alert()
+
+ alert.find('.close').click()
+
+ ok(!alert.hasClass('in'), 'remove .in class on .close click')
+ })
+
+ test("should remove element when clicking .close", function () {
+ $.support.transition = false
+
+ var alertHTML = '<div class="alert-message warning fade in">'
+ + '<a class="close" href="#" data-dismiss="alert">×</a>'
+ + '<p><strong>Holy guacamole!</strong> Best check yo self, you\'re not looking too good.</p>'
+ + '</div>'
+ , alert = $(alertHTML).appendTo('#qunit-fixture').alert()
+
+ ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom')
+
+ alert.find('.close').click()
+
+ ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom')
+ })
+
+ test("should not fire closed when close is prevented", function () {
+ $.support.transition = false
+ stop();
+ $('<div class="alert"/>')
+ .bind('close', function (e) {
+ e.preventDefault();
+ ok(true);
+ start();
+ })
+ .bind('closed', function () {
+ ok(false);
+ })
+ .alert('close')
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-button.js b/tbc/static/js/tests/unit/bootstrap-button.js
new file mode 100755
index 0000000..e23ff9e
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-button.js
@@ -0,0 +1,102 @@
+$(function () {
+
+ module("bootstrap-buttons")
+
+ test("should provide no conflict", function () {
+ var button = $.fn.button.noConflict()
+ ok(!$.fn.button, 'button was set back to undefined (org value)')
+ $.fn.button = button
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).button, 'button method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).button()[0] == document.body, 'document.body returned')
+ })
+
+ test("should return set state to loading", function () {
+ var btn = $('<button class="btn" data-loading-text="fat">mdo</button>')
+ equals(btn.html(), 'mdo', 'btn text equals mdo')
+ btn.button('loading')
+ equals(btn.html(), 'fat', 'btn text equals fat')
+ stop()
+ setTimeout(function () {
+ ok(btn.attr('disabled'), 'btn is disabled')
+ ok(btn.hasClass('disabled'), 'btn has disabled class')
+ start()
+ }, 0)
+ })
+
+ test("should return reset state", function () {
+ var btn = $('<button class="btn" data-loading-text="fat">mdo</button>')
+ equals(btn.html(), 'mdo', 'btn text equals mdo')
+ btn.button('loading')
+ equals(btn.html(), 'fat', 'btn text equals fat')
+ stop()
+ setTimeout(function () {
+ ok(btn.attr('disabled'), 'btn is disabled')
+ ok(btn.hasClass('disabled'), 'btn has disabled class')
+ start()
+ stop()
+ }, 0)
+ btn.button('reset')
+ equals(btn.html(), 'mdo', 'btn text equals mdo')
+ setTimeout(function () {
+ ok(!btn.attr('disabled'), 'btn is not disabled')
+ ok(!btn.hasClass('disabled'), 'btn does not have disabled class')
+ start()
+ }, 0)
+ })
+
+ test("should toggle active", function () {
+ var btn = $('<button class="btn">mdo</button>')
+ ok(!btn.hasClass('active'), 'btn does not have active class')
+ btn.button('toggle')
+ ok(btn.hasClass('active'), 'btn has class active')
+ })
+
+ test("should toggle active when btn children are clicked", function () {
+ var btn = $('<button class="btn" data-toggle="button">mdo</button>')
+ , inner = $('<i></i>')
+ btn
+ .append(inner)
+ .appendTo($('#qunit-fixture'))
+ ok(!btn.hasClass('active'), 'btn does not have active class')
+ inner.click()
+ ok(btn.hasClass('active'), 'btn has class active')
+ })
+
+ test("should toggle active when btn children are clicked within btn-group", function () {
+ var btngroup = $('<div class="btn-group" data-toggle="buttons-checkbox"></div>')
+ , btn = $('<button class="btn">fat</button>')
+ , inner = $('<i></i>')
+ btngroup
+ .append(btn.append(inner))
+ .appendTo($('#qunit-fixture'))
+ ok(!btn.hasClass('active'), 'btn does not have active class')
+ inner.click()
+ ok(btn.hasClass('active'), 'btn has class active')
+ })
+
+ test("should check for closest matching toggle", function () {
+ var group = $("<div data-toggle='buttons-radio'></div>")
+ , btn1 = $("<button class='btn active'></button>")
+ , btn2 = $("<button class='btn'></button>")
+ , wrap = $("<div></div>")
+
+ wrap.append(btn1, btn2)
+
+ group
+ .append(wrap)
+ .appendTo($('#qunit-fixture'))
+
+ ok(btn1.hasClass('active'), 'btn1 has active class')
+ ok(!btn2.hasClass('active'), 'btn2 does not have active class')
+ btn2.click()
+ ok(!btn1.hasClass('active'), 'btn1 does not have active class')
+ ok(btn2.hasClass('active'), 'btn2 has active class')
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-carousel.js b/tbc/static/js/tests/unit/bootstrap-carousel.js
new file mode 100755
index 0000000..80b6e13
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-carousel.js
@@ -0,0 +1,81 @@
+$(function () {
+
+ module("bootstrap-carousel")
+
+ test("should provide no conflict", function () {
+ var carousel = $.fn.carousel.noConflict()
+ ok(!$.fn.carousel, 'carousel was set back to undefined (org value)')
+ $.fn.carousel = carousel
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).carousel, 'carousel method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).carousel()[0] == document.body, 'document.body returned')
+ })
+
+ test("should not fire sliden when slide is prevented", function () {
+ $.support.transition = false
+ stop()
+ $('<div class="carousel"/>')
+ .bind('slide', function (e) {
+ e.preventDefault();
+ ok(true);
+ start();
+ })
+ .bind('slid', function () {
+ ok(false);
+ })
+ .carousel('next')
+ })
+
+ test("should fire slide event with direction", function () {
+ var template = '<div id="myCarousel" class="carousel slide"><div class="carousel-inner"><div class="item active"><img alt=""><div class="carousel-caption"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class="left carousel-control" href="#myCarousel" data-slide="prev">&lsaquo;</a><a class="right carousel-control" href="#myCarousel" data-slide="next">&rsaquo;</a></div>'
+ $.support.transition = false
+ stop()
+ $(template).on('slide', function (e) {
+ e.preventDefault()
+ ok(e.direction)
+ ok(e.direction === 'right' || e.direction === 'left')
+ start()
+ }).carousel('next')
+ })
+
+ test("should fire slide event with relatedTarget", function () {
+ var template = '<div id="myCarousel" class="carousel slide"><div class="carousel-inner"><div class="item active"><img alt=""><div class="carousel-caption"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class="item"><img alt=""><div class="carousel-caption"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class="left carousel-control" href="#myCarousel" data-slide="prev">&lsaquo;</a><a class="right carousel-control" href="#myCarousel" data-slide="next">&rsaquo;</a></div>'
+ $.support.transition = false
+ stop()
+ $(template)
+ .on('slide', function (e) {
+ e.preventDefault();
+ ok(e.relatedTarget);
+ ok($(e.relatedTarget).hasClass('item'));
+ start();
+ })
+ .carousel('next')
+ })
+
+ test("should set interval from data attribute", 3,function () {
+ var template = $('<div id="myCarousel" class="carousel slide"> <div class="carousel-inner"> <div class="item active"> <img alt=""> <div class="carousel-caption"> <h4>{{_i}}First Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> <div class="item"> <img alt=""> <div class="carousel-caption"> <h4>{{_i}}Second Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> <div class="item"> <img alt=""> <div class="carousel-caption"> <h4>{{_i}}Third Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> </div> <a class="left carousel-control" href="#myCarousel" data-slide="prev">&lsaquo;</a> <a class="right carousel-control" href="#myCarousel" data-slide="next">&rsaquo;</a> </div>');
+ template.attr("data-interval", 1814);
+
+ template.appendTo("body");
+ $('[data-slide]').first().click();
+ ok($('#myCarousel').data('carousel').options.interval == 1814);
+ $('#myCarousel').remove();
+
+ template.appendTo("body").attr("data-modal", "foobar");
+ $('[data-slide]').first().click();
+ ok($('#myCarousel').data('carousel').options.interval == 1814, "even if there is an data-modal attribute set");
+ $('#myCarousel').remove();
+
+ template.appendTo("body");
+ $('[data-slide]').first().click();
+ $('#myCarousel').attr('data-interval', 1860);
+ $('[data-slide]').first().click();
+ ok($('#myCarousel').data('carousel').options.interval == 1814, "attributes should be read only on intitialization");
+ $('#myCarousel').remove();
+ })
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-collapse.js b/tbc/static/js/tests/unit/bootstrap-collapse.js
new file mode 100755
index 0000000..4c5916e
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-collapse.js
@@ -0,0 +1,94 @@
+$(function () {
+
+ module("bootstrap-collapse")
+
+ test("should provide no conflict", function () {
+ var collapse = $.fn.collapse.noConflict()
+ ok(!$.fn.collapse, 'collapse was set back to undefined (org value)')
+ $.fn.collapse = collapse
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).collapse, 'collapse method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).collapse()[0] == document.body, 'document.body returned')
+ })
+
+ test("should show a collapsed element", function () {
+ var el = $('<div class="collapse"></div>').collapse('show')
+ ok(el.hasClass('in'), 'has class in')
+ ok(/height/.test(el.attr('style')), 'has height set')
+ })
+
+ test("should hide a collapsed element", function () {
+ var el = $('<div class="collapse"></div>').collapse('hide')
+ ok(!el.hasClass('in'), 'does not have class in')
+ ok(/height/.test(el.attr('style')), 'has height set')
+ })
+
+ test("should not fire shown when show is prevented", function () {
+ $.support.transition = false
+ stop()
+ $('<div class="collapse"/>')
+ .bind('show', function (e) {
+ e.preventDefault();
+ ok(true);
+ start();
+ })
+ .bind('shown', function () {
+ ok(false);
+ })
+ .collapse('show')
+ })
+
+ test("should reset style to auto after finishing opening collapse", function () {
+ $.support.transition = false
+ stop()
+ $('<div class="collapse" style="height: 0px"/>')
+ .bind('show', function () {
+ ok(this.style.height == '0px')
+ })
+ .bind('shown', function () {
+ ok(this.style.height == 'auto')
+ start()
+ })
+ .collapse('show')
+ })
+
+ test("should add active class to target when collapse shown", function () {
+ $.support.transition = false
+ stop()
+
+ var target = $('<a data-toggle="collapse" href="#test1"></a>')
+ .appendTo($('#qunit-fixture'))
+
+ var collapsible = $('<div id="test1"></div>')
+ .appendTo($('#qunit-fixture'))
+ .on('show', function () {
+ ok(!target.hasClass('collapsed'))
+ start()
+ })
+
+ target.click()
+ })
+
+ test("should remove active class to target when collapse hidden", function () {
+ $.support.transition = false
+ stop()
+
+ var target = $('<a data-toggle="collapse" href="#test1"></a>')
+ .appendTo($('#qunit-fixture'))
+
+ var collapsible = $('<div id="test1" class="in"></div>')
+ .appendTo($('#qunit-fixture'))
+ .on('hide', function () {
+ ok(target.hasClass('collapsed'))
+ start()
+ })
+
+ target.click()
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-dropdown.js b/tbc/static/js/tests/unit/bootstrap-dropdown.js
new file mode 100755
index 0000000..2f0d2d2
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-dropdown.js
@@ -0,0 +1,151 @@
+$(function () {
+
+ module("bootstrap-dropdowns")
+
+ test("should provide no conflict", function () {
+ var dropdown = $.fn.dropdown.noConflict()
+ ok(!$.fn.dropdown, 'dropdown was set back to undefined (org value)')
+ $.fn.dropdown = dropdown
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).dropdown, 'dropdown method is defined')
+ })
+
+ test("should return element", function () {
+ var el = $("<div />")
+ ok(el.dropdown()[0] === el[0], 'same element returned')
+ })
+
+ test("should not open dropdown if target is disabled", function () {
+ var dropdownHTML = '<ul class="tabs">'
+ + '<li class="dropdown">'
+ + '<button disabled href="#" class="btn dropdown-toggle" data-toggle="dropdown">Dropdown</button>'
+ + '<ul class="dropdown-menu">'
+ + '<li><a href="#">Secondary link</a></li>'
+ + '<li><a href="#">Something else here</a></li>'
+ + '<li class="divider"></li>'
+ + '<li><a href="#">Another link</a></li>'
+ + '</ul>'
+ + '</li>'
+ + '</ul>'
+ , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click()
+
+ ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
+ })
+
+ test("should not open dropdown if target is disabled", function () {
+ var dropdownHTML = '<ul class="tabs">'
+ + '<li class="dropdown">'
+ + '<button href="#" class="btn dropdown-toggle disabled" data-toggle="dropdown">Dropdown</button>'
+ + '<ul class="dropdown-menu">'
+ + '<li><a href="#">Secondary link</a></li>'
+ + '<li><a href="#">Something else here</a></li>'
+ + '<li class="divider"></li>'
+ + '<li><a href="#">Another link</a></li>'
+ + '</ul>'
+ + '</li>'
+ + '</ul>'
+ , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click()
+
+ ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
+ })
+
+ test("should add class open to menu if clicked", function () {
+ var dropdownHTML = '<ul class="tabs">'
+ + '<li class="dropdown">'
+ + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
+ + '<ul class="dropdown-menu">'
+ + '<li><a href="#">Secondary link</a></li>'
+ + '<li><a href="#">Something else here</a></li>'
+ + '<li class="divider"></li>'
+ + '<li><a href="#">Another link</a></li>'
+ + '</ul>'
+ + '</li>'
+ + '</ul>'
+ , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click()
+
+ ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
+ })
+
+ test("should test if element has a # before assuming it's a selector", function () {
+ var dropdownHTML = '<ul class="tabs">'
+ + '<li class="dropdown">'
+ + '<a href="/foo/" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
+ + '<ul class="dropdown-menu">'
+ + '<li><a href="#">Secondary link</a></li>'
+ + '<li><a href="#">Something else here</a></li>'
+ + '<li class="divider"></li>'
+ + '<li><a href="#">Another link</a></li>'
+ + '</ul>'
+ + '</li>'
+ + '</ul>'
+ , dropdown = $(dropdownHTML).find('[data-toggle="dropdown"]').dropdown().click()
+
+ ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
+ })
+
+
+ test("should remove open class if body clicked", function () {
+ var dropdownHTML = '<ul class="tabs">'
+ + '<li class="dropdown">'
+ + '<a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown</a>'
+ + '<ul class="dropdown-menu">'
+ + '<li><a href="#">Secondary link</a></li>'
+ + '<li><a href="#">Something else here</a></li>'
+ + '<li class="divider"></li>'
+ + '<li><a href="#">Another link</a></li>'
+ + '</ul>'
+ + '</li>'
+ + '</ul>'
+ , dropdown = $(dropdownHTML)
+ .appendTo('#qunit-fixture')
+ .find('[data-toggle="dropdown"]')
+ .dropdown()
+ .click()
+ ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')
+ $('body').click()
+ ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class removed')
+ dropdown.remove()
+ })
+
+ test("should remove open class if body clicked, with multiple drop downs", function () {
+ var dropdownHTML =
+ '<ul class="nav">'
+ + ' <li><a href="#menu1">Menu 1</a></li>'
+ + ' <li class="dropdown" id="testmenu">'
+ + ' <a class="dropdown-toggle" data-toggle="dropdown" href="#testmenu">Test menu <b class="caret"></b></a>'
+ + ' <ul class="dropdown-menu" role="menu">'
+ + ' <li><a href="#sub1">Submenu 1</a></li>'
+ + ' </ul>'
+ + ' </li>'
+ + '</ul>'
+ + '<div class="btn-group">'
+ + ' <button class="btn">Actions</button>'
+ + ' <button class="btn dropdown-toggle" data-toggle="dropdown"><span class="caret"></span></button>'
+ + ' <ul class="dropdown-menu">'
+ + ' <li><a href="#">Action 1</a></li>'
+ + ' </ul>'
+ + '</div>'
+ , dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle="dropdown"]')
+ , first = dropdowns.first()
+ , last = dropdowns.last()
+
+ ok(dropdowns.length == 2, "Should be two dropdowns")
+
+ first.click()
+ ok(first.parents('.open').length == 1, 'open class added on click')
+ ok($('#qunit-fixture .open').length == 1, 'only one object is open')
+ $('body').click()
+ ok($("#qunit-fixture .open").length === 0, 'open class removed')
+
+ last.click()
+ ok(last.parent('.open').length == 1, 'open class added on click')
+ ok($('#qunit-fixture .open').length == 1, 'only one object is open')
+ $('body').click()
+ ok($("#qunit-fixture .open").length === 0, 'open class removed')
+
+ $("#qunit-fixture").html("")
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-modal.js b/tbc/static/js/tests/unit/bootstrap-modal.js
new file mode 100755
index 0000000..b0096f8
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-modal.js
@@ -0,0 +1,137 @@
+$(function () {
+
+ module("bootstrap-modal")
+
+ test("should provide no conflict", function () {
+ var modal = $.fn.modal.noConflict()
+ ok(!$.fn.modal, 'modal was set back to undefined (org value)')
+ $.fn.modal = modal
+ })
+
+ test("should be defined on jquery object", function () {
+ var div = $("<div id='modal-test'></div>")
+ ok(div.modal, 'modal method is defined')
+ })
+
+ test("should return element", function () {
+ var div = $("<div id='modal-test'></div>")
+ ok(div.modal() == div, 'document.body returned')
+ $('#modal-test').remove()
+ })
+
+ test("should expose defaults var for settings", function () {
+ ok($.fn.modal.defaults, 'default object exposed')
+ })
+
+ test("should insert into dom when show method is called", function () {
+ stop()
+ $.support.transition = false
+ $("<div id='modal-test'></div>")
+ .bind("shown", function () {
+ ok($('#modal-test').length, 'modal insterted into dom')
+ $(this).remove()
+ start()
+ })
+ .modal("show")
+ })
+
+ test("should fire show event", function () {
+ stop()
+ $.support.transition = false
+ $("<div id='modal-test'></div>")
+ .bind("show", function () {
+ ok(true, "show was called")
+ })
+ .bind("shown", function () {
+ $(this).remove()
+ start()
+ })
+ .modal("show")
+ })
+
+ test("should not fire shown when default prevented", function () {
+ stop()
+ $.support.transition = false
+ $("<div id='modal-test'></div>")
+ .bind("show", function (e) {
+ e.preventDefault()
+ ok(true, "show was called")
+ start()
+ })
+ .bind("shown", function () {
+ ok(false, "shown was called")
+ })
+ .modal("show")
+ })
+
+ test("should hide modal when hide is called", function () {
+ stop()
+ $.support.transition = false
+
+ $("<div id='modal-test'></div>")
+ .bind("shown", function () {
+ ok($('#modal-test').is(":visible"), 'modal visible')
+ ok($('#modal-test').length, 'modal insterted into dom')
+ $(this).modal("hide")
+ })
+ .bind("hidden", function() {
+ ok(!$('#modal-test').is(":visible"), 'modal hidden')
+ $('#modal-test').remove()
+ start()
+ })
+ .modal("show")
+ })
+
+ test("should toggle when toggle is called", function () {
+ stop()
+ $.support.transition = false
+ var div = $("<div id='modal-test'></div>")
+ div
+ .bind("shown", function () {
+ ok($('#modal-test').is(":visible"), 'modal visible')
+ ok($('#modal-test').length, 'modal insterted into dom')
+ div.modal("toggle")
+ })
+ .bind("hidden", function() {
+ ok(!$('#modal-test').is(":visible"), 'modal hidden')
+ div.remove()
+ start()
+ })
+ .modal("toggle")
+ })
+
+ test("should remove from dom when click [data-dismiss=modal]", function () {
+ stop()
+ $.support.transition = false
+ var div = $("<div id='modal-test'><span class='close' data-dismiss='modal'></span></div>")
+ div
+ .bind("shown", function () {
+ ok($('#modal-test').is(":visible"), 'modal visible')
+ ok($('#modal-test').length, 'modal insterted into dom')
+ div.find('.close').click()
+ })
+ .bind("hidden", function() {
+ ok(!$('#modal-test').is(":visible"), 'modal hidden')
+ div.remove()
+ start()
+ })
+ .modal("toggle")
+ })
+
+ test("should allow modal close with 'backdrop:false'", function () {
+ stop()
+ $.support.transition = false
+ var div = $("<div>", { id: 'modal-test', "data-backdrop": false })
+ div
+ .bind("shown", function () {
+ ok($('#modal-test').is(":visible"), 'modal visible')
+ div.modal("hide")
+ })
+ .bind("hidden", function() {
+ ok(!$('#modal-test').is(":visible"), 'modal hidden')
+ div.remove()
+ start()
+ })
+ .modal("show")
+ })
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-phantom.js b/tbc/static/js/tests/unit/bootstrap-phantom.js
new file mode 100755
index 0000000..a04aeaa
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-phantom.js
@@ -0,0 +1,21 @@
+// Logging setup for phantom integration
+// adapted from Modernizr
+
+QUnit.begin = function () {
+ console.log("Starting test suite")
+ console.log("================================================\n")
+}
+
+QUnit.moduleDone = function (opts) {
+ if (opts.failed === 0) {
+ console.log("\u2714 All tests passed in '" + opts.name + "' module")
+ } else {
+ console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module")
+ }
+}
+
+QUnit.done = function (opts) {
+ console.log("\n================================================")
+ console.log("Tests completed in " + opts.runtime + " milliseconds")
+ console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.")
+} \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-popover.js b/tbc/static/js/tests/unit/bootstrap-popover.js
new file mode 100755
index 0000000..20234e1
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-popover.js
@@ -0,0 +1,113 @@
+$(function () {
+
+ module("bootstrap-popover")
+
+ test("should provide no conflict", function () {
+ var popover = $.fn.popover.noConflict()
+ ok(!$.fn.popover, 'popover was set back to undefined (org value)')
+ $.fn.popover = popover
+ })
+
+ test("should be defined on jquery object", function () {
+ var div = $('<div></div>')
+ ok(div.popover, 'popover method is defined')
+ })
+
+ test("should return element", function () {
+ var div = $('<div></div>')
+ ok(div.popover() == div, 'document.body returned')
+ })
+
+ test("should render popover element", function () {
+ $.support.transition = false
+ var popover = $('<a href="#" title="mdo" data-content="http://twitter.com/mdo">@mdo</a>')
+ .appendTo('#qunit-fixture')
+ .popover('show')
+
+ ok($('.popover').length, 'popover was inserted')
+ popover.popover('hide')
+ ok(!$(".popover").length, 'popover removed')
+ })
+
+ test("should store popover instance in popover data object", function () {
+ $.support.transition = false
+ var popover = $('<a href="#" title="mdo" data-content="http://twitter.com/mdo">@mdo</a>')
+ .popover()
+
+ ok(!!popover.data('popover'), 'popover instance exists')
+ })
+
+ test("should get title and content from options", function () {
+ $.support.transition = false
+ var popover = $('<a href="#">@fat</a>')
+ .appendTo('#qunit-fixture')
+ .popover({
+ title: function () {
+ return '@fat'
+ }
+ , content: function () {
+ return 'loves writing tests (╯°□°)╯︵ ┻━┻'
+ }
+ })
+
+ popover.popover('show')
+
+ ok($('.popover').length, 'popover was inserted')
+ equals($('.popover .popover-title').text(), '@fat', 'title correctly inserted')
+ equals($('.popover .popover-content').text(), 'loves writing tests (╯°□°)╯︵ ┻━┻', 'content correctly inserted')
+
+ popover.popover('hide')
+ ok(!$('.popover').length, 'popover was removed')
+ $('#qunit-fixture').empty()
+ })
+
+ test("should get title and content from attributes", function () {
+ $.support.transition = false
+ var popover = $('<a href="#" title="@mdo" data-content="loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻" >@mdo</a>')
+ .appendTo('#qunit-fixture')
+ .popover()
+ .popover('show')
+
+ ok($('.popover').length, 'popover was inserted')
+ equals($('.popover .popover-title').text(), '@mdo', 'title correctly inserted')
+ equals($('.popover .popover-content').text(), "loves data attributes (づ。◕‿‿◕。)づ ︵ ┻━┻", 'content correctly inserted')
+
+ popover.popover('hide')
+ ok(!$('.popover').length, 'popover was removed')
+ $('#qunit-fixture').empty()
+ })
+
+ test("should respect custom classes", function() {
+ $.support.transition = false
+ var popover = $('<a href="#">@fat</a>')
+ .appendTo('#qunit-fixture')
+ .popover({
+ title: 'Test'
+ , content: 'Test'
+ , template: '<div class="popover foobar"><div class="arrow"></div><div class="inner"><h3 class="title"></h3><div class="content"><p></p></div></div></div>'
+ })
+
+ popover.popover('show')
+
+ ok($('.popover').length, 'popover was inserted')
+ ok($('.popover').hasClass('foobar'), 'custom class is present')
+
+ popover.popover('hide')
+ ok(!$('.popover').length, 'popover was removed')
+ $('#qunit-fixture').empty()
+ })
+
+ test("should destroy popover", function () {
+ var popover = $('<div/>').popover({trigger: 'hover'}).on('click.foo', function(){})
+ ok(popover.data('popover'), 'popover has data')
+ ok($._data(popover[0], 'events').mouseover && $._data(popover[0], 'events').mouseout, 'popover has hover event')
+ ok($._data(popover[0], 'events').click[0].namespace == 'foo', 'popover has extra click.foo event')
+ popover.popover('show')
+ popover.popover('destroy')
+ ok(!popover.hasClass('in'), 'popover is hidden')
+ ok(!popover.data('popover'), 'popover does not have data')
+ ok($._data(popover[0],'events').click[0].namespace == 'foo', 'popover still has click.foo')
+ ok(!$._data(popover[0], 'events').mouseover && !$._data(popover[0], 'events').mouseout, 'popover does not have any events')
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-scrollspy.js b/tbc/static/js/tests/unit/bootstrap-scrollspy.js
new file mode 100755
index 0000000..32bfa71
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-scrollspy.js
@@ -0,0 +1,37 @@
+$(function () {
+
+ module("bootstrap-scrollspy")
+
+ test("should provide no conflict", function () {
+ var scrollspy = $.fn.scrollspy.noConflict()
+ ok(!$.fn.scrollspy, 'scrollspy was set back to undefined (org value)')
+ $.fn.scrollspy = scrollspy
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).scrollspy, 'scrollspy method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).scrollspy()[0] == document.body, 'document.body returned')
+ })
+
+ test("should switch active class on scroll", function () {
+ var sectionHTML = '<div id="masthead"></div>'
+ , $section = $(sectionHTML).append('#qunit-fixture')
+ , topbarHTML ='<div class="topbar">'
+ + '<div class="topbar-inner">'
+ + '<div class="container">'
+ + '<h3><a href="#">Bootstrap</a></h3>'
+ + '<ul class="nav">'
+ + '<li><a href="#masthead">Overview</a></li>'
+ + '</ul>'
+ + '</div>'
+ + '</div>'
+ + '</div>'
+ , $topbar = $(topbarHTML).scrollspy()
+
+ ok($topbar.find('.active', true))
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-tab.js b/tbc/static/js/tests/unit/bootstrap-tab.js
new file mode 100755
index 0000000..ba5910d
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-tab.js
@@ -0,0 +1,86 @@
+$(function () {
+
+ module("bootstrap-tabs")
+
+ test("should provide no conflict", function () {
+ var tab = $.fn.tab.noConflict()
+ ok(!$.fn.tab, 'tab was set back to undefined (org value)')
+ $.fn.tab = tab
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).tab, 'tabs method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).tab()[0] == document.body, 'document.body returned')
+ })
+
+ test("should activate element by tab id", function () {
+ var tabsHTML =
+ '<ul class="tabs">'
+ + '<li><a href="#home">Home</a></li>'
+ + '<li><a href="#profile">Profile</a></li>'
+ + '</ul>'
+
+ $('<ul><li id="home"></li><li id="profile"></li></ul>').appendTo("#qunit-fixture")
+
+ $(tabsHTML).find('li:last a').tab('show')
+ equals($("#qunit-fixture").find('.active').attr('id'), "profile")
+
+ $(tabsHTML).find('li:first a').tab('show')
+ equals($("#qunit-fixture").find('.active').attr('id'), "home")
+ })
+
+ test("should activate element by tab id", function () {
+ var pillsHTML =
+ '<ul class="pills">'
+ + '<li><a href="#home">Home</a></li>'
+ + '<li><a href="#profile">Profile</a></li>'
+ + '</ul>'
+
+ $('<ul><li id="home"></li><li id="profile"></li></ul>').appendTo("#qunit-fixture")
+
+ $(pillsHTML).find('li:last a').tab('show')
+ equals($("#qunit-fixture").find('.active').attr('id'), "profile")
+
+ $(pillsHTML).find('li:first a').tab('show')
+ equals($("#qunit-fixture").find('.active').attr('id'), "home")
+ })
+
+
+ test("should not fire closed when close is prevented", function () {
+ $.support.transition = false
+ stop();
+ $('<div class="tab"/>')
+ .bind('show', function (e) {
+ e.preventDefault();
+ ok(true);
+ start();
+ })
+ .bind('shown', function () {
+ ok(false);
+ })
+ .tab('show')
+ })
+
+ test("show and shown events should reference correct relatedTarget", function () {
+ var dropHTML =
+ '<ul class="drop">'
+ + '<li class="dropdown"><a data-toggle="dropdown" href="#">1</a>'
+ + '<ul class="dropdown-menu">'
+ + '<li><a href="#1-1" data-toggle="tab">1-1</a></li>'
+ + '<li><a href="#1-2" data-toggle="tab">1-2</a></li>'
+ + '</ul>'
+ + '</li>'
+ + '</ul>'
+
+ $(dropHTML).find('ul>li:first a').tab('show').end()
+ .find('ul>li:last a').on('show', function(event){
+ equals(event.relatedTarget.hash, "#1-1")
+ }).on('shown', function(event){
+ equals(event.relatedTarget.hash, "#1-1")
+ }).tab('show')
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-tooltip.js b/tbc/static/js/tests/unit/bootstrap-tooltip.js
new file mode 100755
index 0000000..5b37b4e
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-tooltip.js
@@ -0,0 +1,294 @@
+$(function () {
+
+ module("bootstrap-tooltip")
+
+ test("should provide no conflict", function () {
+ var tooltip = $.fn.tooltip.noConflict()
+ ok(!$.fn.tooltip, 'tooltip was set back to undefined (org value)')
+ $.fn.tooltip = tooltip
+ })
+
+ test("should be defined on jquery object", function () {
+ var div = $("<div></div>")
+ ok(div.tooltip, 'popover method is defined')
+ })
+
+ test("should return element", function () {
+ var div = $("<div></div>")
+ ok(div.tooltip() == div, 'document.body returned')
+ })
+
+ test("should expose default settings", function () {
+ ok(!!$.fn.tooltip.defaults, 'defaults is defined')
+ })
+
+ test("should empty title attribute", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').tooltip()
+ ok(tooltip.attr('title') === '', 'title attribute was emptied')
+ })
+
+ test("should add data attribute for referencing original title", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>').tooltip()
+ equals(tooltip.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')
+ })
+
+ test("should place tooltips relative to placement option", function () {
+ $.support.transition = false
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({placement: 'bottom'})
+ .tooltip('show')
+
+ ok($(".tooltip").is('.fade.bottom.in'), 'has correct classes applied')
+ tooltip.tooltip('hide')
+ })
+
+ test("should allow html entities", function () {
+ $.support.transition = false
+ var tooltip = $('<a href="#" rel="tooltip" title="<b>@fat</b>"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({html: true})
+ .tooltip('show')
+
+ ok($('.tooltip b').length, 'b tag was inserted')
+ tooltip.tooltip('hide')
+ ok(!$(".tooltip").length, 'tooltip removed')
+ })
+
+ test("should respect custom classes", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({ template: '<div class="tooltip some-class"><div class="tooltip-arrow"/><div class="tooltip-inner"/></div>'})
+ .tooltip('show')
+
+ ok($('.tooltip').hasClass('some-class'), 'custom class is present')
+ tooltip.tooltip('hide')
+ ok(!$(".tooltip").length, 'tooltip removed')
+ })
+
+ test("should fire show event", function () {
+ stop()
+ var tooltip = $('<div title="tooltip title"></div>')
+ .bind("show", function() {
+ ok(true, "show was called")
+ start()
+ })
+ .tooltip('show')
+ })
+
+ test("should fire shown event", function () {
+ stop()
+ var tooltip = $('<div title="tooltip title"></div>')
+ .bind("shown", function() {
+ ok(true, "shown was called")
+ start()
+ })
+ .tooltip('show')
+ })
+
+ test("should not fire shown event when default prevented", function () {
+ stop()
+ var tooltip = $('<div title="tooltip title"></div>')
+ .bind("show", function(e) {
+ e.preventDefault()
+ ok(true, "show was called")
+ start()
+ })
+ .bind("shown", function() {
+ ok(false, "shown was called")
+ })
+ .tooltip('show')
+ })
+
+ test("should fire hide event", function () {
+ stop()
+ var tooltip = $('<div title="tooltip title"></div>')
+ .bind("shown", function() {
+ $(this).tooltip('hide')
+ })
+ .bind("hide", function() {
+ ok(true, "hide was called")
+ start()
+ })
+ .tooltip('show')
+ })
+
+ test("should fire hidden event", function () {
+ stop()
+ var tooltip = $('<div title="tooltip title"></div>')
+ .bind("shown", function() {
+ $(this).tooltip('hide')
+ })
+ .bind("hidden", function() {
+ ok(true, "hidden was called")
+ start()
+ })
+ .tooltip('show')
+ })
+
+ test("should not fire hidden event when default prevented", function () {
+ stop()
+ var tooltip = $('<div title="tooltip title"></div>')
+ .bind("shown", function() {
+ $(this).tooltip('hide')
+ })
+ .bind("hide", function(e) {
+ e.preventDefault()
+ ok(true, "hide was called")
+ start()
+ })
+ .bind("hidden", function() {
+ ok(false, "hidden was called")
+ })
+ .tooltip('show')
+ })
+
+ test("should not show tooltip if leave event occurs before delay expires", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({ delay: 200 })
+
+ stop()
+
+ tooltip.trigger('mouseenter')
+
+ setTimeout(function () {
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
+ tooltip.trigger('mouseout')
+ setTimeout(function () {
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
+ start()
+ }, 200)
+ }, 100)
+ })
+
+ test("should not show tooltip if leave event occurs before delay expires, even if hide delay is 0", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({ delay: { show: 200, hide: 0} })
+
+ stop()
+
+ tooltip.trigger('mouseenter')
+
+ setTimeout(function () {
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
+ tooltip.trigger('mouseout')
+ setTimeout(function () {
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
+ start()
+ }, 200)
+ }, 100)
+ })
+
+ test("should not show tooltip if leave event occurs before delay expires", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({ delay: 100 })
+ stop()
+ tooltip.trigger('mouseenter')
+ setTimeout(function () {
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
+ tooltip.trigger('mouseout')
+ setTimeout(function () {
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
+ start()
+ }, 100)
+ }, 50)
+ })
+
+ test("should show tooltip if leave event hasn't occured before delay expires", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({ delay: 150 })
+ stop()
+ tooltip.trigger('mouseenter')
+ setTimeout(function () {
+ ok(!$(".tooltip").is('.fade.in'), 'tooltip is not faded in')
+ }, 100)
+ setTimeout(function () {
+ ok($(".tooltip").is('.fade.in'), 'tooltip has faded in')
+ start()
+ }, 200)
+ })
+
+ test("should destroy tooltip", function () {
+ var tooltip = $('<div/>').tooltip().on('click.foo', function(){})
+ ok(tooltip.data('tooltip'), 'tooltip has data')
+ ok($._data(tooltip[0], 'events').mouseover && $._data(tooltip[0], 'events').mouseout, 'tooltip has hover event')
+ ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip has extra click.foo event')
+ tooltip.tooltip('show')
+ tooltip.tooltip('destroy')
+ ok(!tooltip.hasClass('in'), 'tooltip is hidden')
+ ok(!$._data(tooltip[0], 'tooltip'), 'tooltip does not have data')
+ ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip still has click.foo')
+ ok(!$._data(tooltip[0], 'events').mouseover && !$._data(tooltip[0], 'events').mouseout, 'tooltip does not have any events')
+ })
+
+ test("should show tooltip with delegate selector on click", function () {
+ var div = $('<div><a href="#" rel="tooltip" title="Another tooltip"></a></div>')
+ var tooltip = div.appendTo('#qunit-fixture')
+ .tooltip({ selector: 'a[rel=tooltip]',
+ trigger: 'click' })
+ div.find('a').trigger('click')
+ ok($(".tooltip").is('.fade.in'), 'tooltip is faded in')
+ })
+
+ test("should show tooltip when toggle is called", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="tooltip on toggle"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({trigger: 'manual'})
+ .tooltip('toggle')
+ ok($(".tooltip").is('.fade.in'), 'tooltip should be toggled in')
+ })
+
+ test("should place tooltips inside the body", function () {
+ var tooltip = $('<a href="#" rel="tooltip" title="Another tooltip"></a>')
+ .appendTo('#qunit-fixture')
+ .tooltip({container:'body'})
+ .tooltip('show')
+ ok($("body > .tooltip").length, 'inside the body')
+ ok(!$("#qunit-fixture > .tooltip").length, 'not found in parent')
+ tooltip.tooltip('hide')
+ })
+
+ test("should place tooltip inside window", function(){
+ var container = $("<div />").appendTo("body")
+ .css({position: "absolute", width: 200, height: 200, bottom: 0, left: 0})
+ , tooltip = $("<a href='#' title='Very very very very very very very very long tooltip'>Hover me</a>")
+ .css({position: "absolute", top:0, left: 0})
+ .appendTo(container)
+ .tooltip({placement: "top", animate: false})
+ .tooltip("show")
+
+ stop()
+
+ setTimeout(function(){
+ ok($(".tooltip").offset().left >= 0)
+
+ start()
+ container.remove()
+ }, 100)
+ })
+
+ test("should place tooltip on top of element", function(){
+ var container = $("<div />").appendTo("body")
+ .css({position: "absolute", bottom: 0, left: 0, textAlign: "right", width: 300, height: 300})
+ , p = $("<p style='margin-top:200px' />").appendTo(container)
+ , tooltiped = $("<a href='#' title='very very very very very very very long tooltip'>Hover me</a>")
+ .css({marginTop: 200})
+ .appendTo(p)
+ .tooltip({placement: "top", animate: false})
+ .tooltip("show")
+
+ stop()
+
+ setTimeout(function(){
+ var tooltip = container.find(".tooltip")
+
+ start()
+ ok(tooltip.offset().top + tooltip.outerHeight() <= tooltiped.offset().top)
+ container.remove()
+ }, 100)
+ })
+})
diff --git a/tbc/static/js/tests/unit/bootstrap-transition.js b/tbc/static/js/tests/unit/bootstrap-transition.js
new file mode 100755
index 0000000..086773f
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-transition.js
@@ -0,0 +1,13 @@
+$(function () {
+
+ module("bootstrap-transition")
+
+ test("should be defined on jquery support object", function () {
+ ok($.support.transition !== undefined, 'transition object is defined')
+ })
+
+ test("should provide an end object", function () {
+ ok($.support.transition ? $.support.transition.end : true, 'end string is defined')
+ })
+
+}) \ No newline at end of file
diff --git a/tbc/static/js/tests/unit/bootstrap-typeahead.js b/tbc/static/js/tests/unit/bootstrap-typeahead.js
new file mode 100755
index 0000000..0aa2d61
--- /dev/null
+++ b/tbc/static/js/tests/unit/bootstrap-typeahead.js
@@ -0,0 +1,236 @@
+$(function () {
+
+ module("bootstrap-typeahead")
+
+ test("should provide no conflict", function () {
+ var typeahead = $.fn.typeahead.noConflict()
+ ok(!$.fn.typeahead, 'typeahead was set back to undefined (org value)')
+ $.fn.typeahead = typeahead
+ })
+
+ test("should be defined on jquery object", function () {
+ ok($(document.body).typeahead, 'alert method is defined')
+ })
+
+ test("should return element", function () {
+ ok($(document.body).typeahead()[0] == document.body, 'document.body returned')
+ })
+
+ test("should listen to an input", function () {
+ var $input = $('<input />')
+ $input.typeahead()
+ ok($._data($input[0], 'events').blur, 'has a blur event')
+ ok($._data($input[0], 'events').keypress, 'has a keypress event')
+ ok($._data($input[0], 'events').keyup, 'has a keyup event')
+ })
+
+ test("should create a menu", function () {
+ var $input = $('<input />')
+ ok($input.typeahead().data('typeahead').$menu, 'has a menu')
+ })
+
+ test("should listen to the menu", function () {
+ var $input = $('<input />')
+ , $menu = $input.typeahead().data('typeahead').$menu
+
+ ok($._data($menu[0], 'events').mouseover, 'has a mouseover(pseudo: mouseenter)')
+ ok($._data($menu[0], 'events').click, 'has a click')
+ })
+
+ test("should show menu when query entered", function () {
+ var $input = $('<input />')
+ .appendTo('body')
+ .typeahead({
+ source: ['aa', 'ab', 'ac']
+ })
+ , typeahead = $input.data('typeahead')
+
+ $input.val('a')
+ typeahead.lookup()
+
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+
+ test("should accept data source via synchronous function", function () {
+ var $input = $('<input />').typeahead({
+ source: function () {
+ return ['aa', 'ab', 'ac']
+ }
+ }).appendTo('body')
+ , typeahead = $input.data('typeahead')
+
+ $input.val('a')
+ typeahead.lookup()
+
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+
+ test("should accept data source via asynchronous function", function () {
+ var $input = $('<input />').typeahead({
+ source: function (query, process) {
+ process(['aa', 'ab', 'ac'])
+ }
+ }).appendTo('body')
+ , typeahead = $input.data('typeahead')
+
+ $input.val('a')
+ typeahead.lookup()
+
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+
+ test("should not explode when regex chars are entered", function () {
+ var $input = $('<input />').typeahead({
+ source: ['aa', 'ab', 'ac', 'mdo*', 'fat+']
+ }).appendTo('body')
+ , typeahead = $input.data('typeahead')
+
+ $input.val('+')
+ typeahead.lookup()
+
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
+ equals(typeahead.$menu.find('li').length, 1, 'has 1 item in menu')
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+
+ test("should hide menu when query entered", function () {
+ stop()
+ var $input = $('<input />').typeahead({
+ source: ['aa', 'ab', 'ac']
+ }).appendTo('body')
+ , typeahead = $input.data('typeahead')
+
+ $input.val('a')
+ typeahead.lookup()
+
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
+
+ $input.blur()
+
+ setTimeout(function () {
+ ok(!typeahead.$menu.is(":visible"), "typeahead is no longer visible")
+ start()
+ }, 200)
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+
+ test("should set next item when down arrow is pressed", function () {
+ var $input = $('<input />').typeahead({
+ source: ['aa', 'ab', 'ac']
+ }).appendTo('body')
+ , typeahead = $input.data('typeahead')
+
+ $input.val('a')
+ typeahead.lookup()
+
+ ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
+ equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
+ ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active")
+
+ // simulate entire key pressing event
+ $input.trigger({
+ type: 'keydown'
+ , keyCode: 40
+ })
+ .trigger({
+ type: 'keypress'
+ , keyCode: 40
+ })
+ .trigger({
+ type: 'keyup'
+ , keyCode: 40
+ })
+
+ ok(typeahead.$menu.find('li').first().next().hasClass('active'), "second item is active")
+
+ $input.trigger({
+ type: 'keydown'
+ , keyCode: 38
+ })
+ .trigger({
+ type: 'keypress'
+ , keyCode: 38
+ })
+ .trigger({
+ type: 'keyup'
+ , keyCode: 38
+ })
+
+ ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active")
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+
+
+ test("should set input value to selected item", function () {
+ var $input = $('<input />').typeahead({
+ source: ['aa', 'ab', 'ac']
+ }).appendTo('body')
+ , typeahead = $input.data('typeahead')
+ , changed = false
+ , focus = false
+ , blur = false
+
+ $input.val('a')
+ typeahead.lookup()
+
+ $input.change(function() { changed = true });
+ $input.focus(function() { focus = true; blur = false });
+ $input.blur(function() { blur = true; focus = false });
+
+ $(typeahead.$menu.find('li')[2]).mouseover().click()
+
+ equals($input.val(), 'ac', 'input value was correctly set')
+ ok(!typeahead.$menu.is(':visible'), 'the menu was hidden')
+ ok(changed, 'a change event was fired')
+ ok(focus && !blur, 'focus is still set')
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+
+ test("should start querying when minLength is met", function () {
+ var $input = $('<input />').typeahead({
+ source: ['aaaa', 'aaab', 'aaac'],
+ minLength: 3
+ }).appendTo('body')
+ , typeahead = $input.data('typeahead')
+
+ $input.val('aa')
+ typeahead.lookup()
+
+ equals(typeahead.$menu.find('li').length, 0, 'has 0 items in menu')
+
+ $input.val('aaa')
+ typeahead.lookup()
+
+ equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
+
+ $input.remove()
+ typeahead.$menu.remove()
+ })
+})
diff --git a/tbc/static/js/tests/vendor/jquery.js b/tbc/static/js/tests/vendor/jquery.js
new file mode 100755
index 0000000..006e953
--- /dev/null
+++ b/tbc/static/js/tests/vendor/jquery.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery.min.map
+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window); \ No newline at end of file
diff --git a/tbc/static/js/tests/vendor/qunit.css b/tbc/static/js/tests/vendor/qunit.css
new file mode 100755
index 0000000..b3e3d00
--- /dev/null
+++ b/tbc/static/js/tests/vendor/qunit.css
@@ -0,0 +1,232 @@
+/**
+ * QUnit - A JavaScript Unit Testing Framework
+ *
+ * http://docs.jquery.com/QUnit
+ *
+ * Copyright (c) 2012 John Resig, Jörn Zaefferer
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * or GPL (GPL-LICENSE.txt) licenses.
+ */
+
+/** Font Family and Sizes */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
+}
+
+#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
+#qunit-tests { font-size: smaller; }
+
+
+/** Resets */
+
+#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {
+ margin: 0;
+ padding: 0;
+}
+
+
+/** Header */
+
+#qunit-header {
+ padding: 0.5em 0 0.5em 1em;
+
+ color: #8699a4;
+ background-color: #0d3349;
+
+ font-size: 1.5em;
+ line-height: 1em;
+ font-weight: normal;
+
+ border-radius: 15px 15px 0 0;
+ -moz-border-radius: 15px 15px 0 0;
+ -webkit-border-top-right-radius: 15px;
+ -webkit-border-top-left-radius: 15px;
+}
+
+#qunit-header a {
+ text-decoration: none;
+ color: #c2ccd1;
+}
+
+#qunit-header a:hover,
+#qunit-header a:focus {
+ color: #fff;
+}
+
+#qunit-banner {
+ height: 5px;
+}
+
+#qunit-testrunner-toolbar {
+ padding: 0.5em 0 0.5em 2em;
+ color: #5E740B;
+ background-color: #eee;
+}
+
+#qunit-userAgent {
+ padding: 0.5em 0 0.5em 2.5em;
+ background-color: #2b81af;
+ color: #fff;
+ text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
+}
+
+
+/** Tests: Pass/Fail */
+
+#qunit-tests {
+ list-style-position: inside;
+}
+
+#qunit-tests li {
+ padding: 0.4em 0.5em 0.4em 2.5em;
+ border-bottom: 1px solid #fff;
+ list-style-position: inside;
+}
+
+#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
+ display: none;
+}
+
+#qunit-tests li strong {
+ cursor: pointer;
+}
+
+#qunit-tests li a {
+ padding: 0.5em;
+ color: #c2ccd1;
+ text-decoration: none;
+}
+#qunit-tests li a:hover,
+#qunit-tests li a:focus {
+ color: #000;
+}
+
+#qunit-tests ol {
+ margin-top: 0.5em;
+ padding: 0.5em;
+
+ background-color: #fff;
+
+ border-radius: 15px;
+ -moz-border-radius: 15px;
+ -webkit-border-radius: 15px;
+
+ box-shadow: inset 0px 2px 13px #999;
+ -moz-box-shadow: inset 0px 2px 13px #999;
+ -webkit-box-shadow: inset 0px 2px 13px #999;
+}
+
+#qunit-tests table {
+ border-collapse: collapse;
+ margin-top: .2em;
+}
+
+#qunit-tests th {
+ text-align: right;
+ vertical-align: top;
+ padding: 0 .5em 0 0;
+}
+
+#qunit-tests td {
+ vertical-align: top;
+}
+
+#qunit-tests pre {
+ margin: 0;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+#qunit-tests del {
+ background-color: #e0f2be;
+ color: #374e0c;
+ text-decoration: none;
+}
+
+#qunit-tests ins {
+ background-color: #ffcaca;
+ color: #500;
+ text-decoration: none;
+}
+
+/*** Test Counts */
+
+#qunit-tests b.counts { color: black; }
+#qunit-tests b.passed { color: #5E740B; }
+#qunit-tests b.failed { color: #710909; }
+
+#qunit-tests li li {
+ margin: 0.5em;
+ padding: 0.4em 0.5em 0.4em 0.5em;
+ background-color: #fff;
+ border-bottom: none;
+ list-style-position: inside;
+}
+
+/*** Passing Styles */
+
+#qunit-tests li li.pass {
+ color: #5E740B;
+ background-color: #fff;
+ border-left: 26px solid #C6E746;
+}
+
+#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
+#qunit-tests .pass .test-name { color: #366097; }
+
+#qunit-tests .pass .test-actual,
+#qunit-tests .pass .test-expected { color: #999999; }
+
+#qunit-banner.qunit-pass { background-color: #C6E746; }
+
+/*** Failing Styles */
+
+#qunit-tests li li.fail {
+ color: #710909;
+ background-color: #fff;
+ border-left: 26px solid #EE5757;
+ white-space: pre;
+}
+
+#qunit-tests > li:last-child {
+ border-radius: 0 0 15px 15px;
+ -moz-border-radius: 0 0 15px 15px;
+ -webkit-border-bottom-right-radius: 15px;
+ -webkit-border-bottom-left-radius: 15px;
+}
+
+#qunit-tests .fail { color: #000000; background-color: #EE5757; }
+#qunit-tests .fail .test-name,
+#qunit-tests .fail .module-name { color: #000000; }
+
+#qunit-tests .fail .test-actual { color: #EE5757; }
+#qunit-tests .fail .test-expected { color: green; }
+
+#qunit-banner.qunit-fail { background-color: #EE5757; }
+
+
+/** Result */
+
+#qunit-testresult {
+ padding: 0.5em 0.5em 0.5em 2.5em;
+
+ color: #2b81af;
+ background-color: #D2E0E6;
+
+ border-bottom: 1px solid white;
+}
+
+/** Fixture */
+
+#qunit-fixture {
+ position: absolute;
+ top: -10000px;
+ left: -10000px;
+}
+
+/** Runoff */
+
+#qunit-fixture {
+ display:none;
+} \ No newline at end of file
diff --git a/tbc/static/js/tests/vendor/qunit.js b/tbc/static/js/tests/vendor/qunit.js
new file mode 100755
index 0000000..46c95b2
--- /dev/null
+++ b/tbc/static/js/tests/vendor/qunit.js
@@ -0,0 +1,1510 @@
+/**
+ * QUnit - A JavaScript Unit Testing Framework
+ *
+ * http://docs.jquery.com/QUnit
+ *
+ * Copyright (c) 2012 John Resig, Jörn Zaefferer
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * or GPL (GPL-LICENSE.txt) licenses.
+ */
+
+(function(window) {
+
+var defined = {
+ setTimeout: typeof window.setTimeout !== "undefined",
+ sessionStorage: (function() {
+ try {
+ return !!sessionStorage.getItem;
+ } catch(e) {
+ return false;
+ }
+ })()
+};
+
+var testId = 0;
+
+var Test = function(name, testName, expected, testEnvironmentArg, async, callback) {
+ this.name = name;
+ this.testName = testName;
+ this.expected = expected;
+ this.testEnvironmentArg = testEnvironmentArg;
+ this.async = async;
+ this.callback = callback;
+ this.assertions = [];
+};
+Test.prototype = {
+ init: function() {
+ var tests = id("qunit-tests");
+ if (tests) {
+ var b = document.createElement("strong");
+ b.innerHTML = "Running " + this.name;
+ var li = document.createElement("li");
+ li.appendChild( b );
+ li.className = "running";
+ li.id = this.id = "test-output" + testId++;
+ tests.appendChild( li );
+ }
+ },
+ setup: function() {
+ if (this.module != config.previousModule) {
+ if ( config.previousModule ) {
+ QUnit.moduleDone( {
+ name: config.previousModule,
+ failed: config.moduleStats.bad,
+ passed: config.moduleStats.all - config.moduleStats.bad,
+ total: config.moduleStats.all
+ } );
+ }
+ config.previousModule = this.module;
+ config.moduleStats = { all: 0, bad: 0 };
+ QUnit.moduleStart( {
+ name: this.module
+ } );
+ }
+
+ config.current = this;
+ this.testEnvironment = extend({
+ setup: function() {},
+ teardown: function() {}
+ }, this.moduleTestEnvironment);
+ if (this.testEnvironmentArg) {
+ extend(this.testEnvironment, this.testEnvironmentArg);
+ }
+
+ QUnit.testStart( {
+ name: this.testName
+ } );
+
+ // allow utility functions to access the current test environment
+ // TODO why??
+ QUnit.current_testEnvironment = this.testEnvironment;
+
+ try {
+ if ( !config.pollution ) {
+ saveGlobal();
+ }
+
+ this.testEnvironment.setup.call(this.testEnvironment);
+ } catch(e) {
+ QUnit.ok( false, "Setup failed on " + this.testName + ": " + e.message );
+ }
+ },
+ run: function() {
+ if ( this.async ) {
+ QUnit.stop();
+ }
+
+ if ( config.notrycatch ) {
+ this.callback.call(this.testEnvironment);
+ return;
+ }
+ try {
+ this.callback.call(this.testEnvironment);
+ } catch(e) {
+ fail("Test " + this.testName + " died, exception and test follows", e, this.callback);
+ QUnit.ok( false, "Died on test #" + (this.assertions.length + 1) + ": " + e.message + " - " + QUnit.jsDump.parse(e) );
+ // else next test will carry the responsibility
+ saveGlobal();
+
+ // Restart the tests if they're blocking
+ if ( config.blocking ) {
+ start();
+ }
+ }
+ },
+ teardown: function() {
+ try {
+ this.testEnvironment.teardown.call(this.testEnvironment);
+ checkPollution();
+ } catch(e) {
+ QUnit.ok( false, "Teardown failed on " + this.testName + ": " + e.message );
+ }
+ },
+ finish: function() {
+ if ( this.expected && this.expected != this.assertions.length ) {
+ QUnit.ok( false, "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" );
+ }
+
+ var good = 0, bad = 0,
+ tests = id("qunit-tests");
+
+ config.stats.all += this.assertions.length;
+ config.moduleStats.all += this.assertions.length;
+
+ if ( tests ) {
+ var ol = document.createElement("ol");
+
+ for ( var i = 0; i < this.assertions.length; i++ ) {
+ var assertion = this.assertions[i];
+
+ var li = document.createElement("li");
+ li.className = assertion.result ? "pass" : "fail";
+ li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed");
+ ol.appendChild( li );
+
+ if ( assertion.result ) {
+ good++;
+ } else {
+ bad++;
+ config.stats.bad++;
+ config.moduleStats.bad++;
+ }
+ }
+
+ // store result when possible
+ if ( QUnit.config.reorder && defined.sessionStorage ) {
+ if (bad) {
+ sessionStorage.setItem("qunit-" + this.module + "-" + this.testName, bad);
+ } else {
+ sessionStorage.removeItem("qunit-" + this.module + "-" + this.testName);
+ }
+ }
+
+ if (bad == 0) {
+ ol.style.display = "none";
+ }
+
+ var b = document.createElement("strong");
+ b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
+
+ var a = document.createElement("a");
+ a.innerHTML = "Rerun";
+ a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
+
+ addEvent(b, "click", function() {
+ var next = b.nextSibling.nextSibling,
+ display = next.style.display;
+ next.style.display = display === "none" ? "block" : "none";
+ });
+
+ addEvent(b, "dblclick", function(e) {
+ var target = e && e.target ? e.target : window.event.srcElement;
+ if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
+ target = target.parentNode;
+ }
+ if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
+ window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
+ }
+ });
+
+ var li = id(this.id);
+ li.className = bad ? "fail" : "pass";
+ li.removeChild( li.firstChild );
+ li.appendChild( b );
+ li.appendChild( a );
+ li.appendChild( ol );
+
+ } else {
+ for ( var i = 0; i < this.assertions.length; i++ ) {
+ if ( !this.assertions[i].result ) {
+ bad++;
+ config.stats.bad++;
+ config.moduleStats.bad++;
+ }
+ }
+ }
+
+ try {
+ QUnit.reset();
+ } catch(e) {
+ fail("reset() failed, following Test " + this.testName + ", exception and reset fn follows", e, QUnit.reset);
+ }
+
+ QUnit.testDone( {
+ name: this.testName,
+ failed: bad,
+ passed: this.assertions.length - bad,
+ total: this.assertions.length
+ } );
+ },
+
+ queue: function() {
+ var test = this;
+ synchronize(function() {
+ test.init();
+ });
+ function run() {
+ // each of these can by async
+ synchronize(function() {
+ test.setup();
+ });
+ synchronize(function() {
+ test.run();
+ });
+ synchronize(function() {
+ test.teardown();
+ });
+ synchronize(function() {
+ test.finish();
+ });
+ }
+ // defer when previous test run passed, if storage is available
+ var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-" + this.module + "-" + this.testName);
+ if (bad) {
+ run();
+ } else {
+ synchronize(run);
+ };
+ }
+
+};
+
+var QUnit = {
+
+ // call on start of module test to prepend name to all tests
+ module: function(name, testEnvironment) {
+ config.currentModule = name;
+ config.currentModuleTestEnviroment = testEnvironment;
+ },
+
+ asyncTest: function(testName, expected, callback) {
+ if ( arguments.length === 2 ) {
+ callback = expected;
+ expected = 0;
+ }
+
+ QUnit.test(testName, expected, callback, true);
+ },
+
+ test: function(testName, expected, callback, async) {
+ var name = '<span class="test-name">' + testName + '</span>', testEnvironmentArg;
+
+ if ( arguments.length === 2 ) {
+ callback = expected;
+ expected = null;
+ }
+ // is 2nd argument a testEnvironment?
+ if ( expected && typeof expected === 'object') {
+ testEnvironmentArg = expected;
+ expected = null;
+ }
+
+ if ( config.currentModule ) {
+ name = '<span class="module-name">' + config.currentModule + "</span>: " + name;
+ }
+
+ if ( !validTest(config.currentModule + ": " + testName) ) {
+ return;
+ }
+
+ var test = new Test(name, testName, expected, testEnvironmentArg, async, callback);
+ test.module = config.currentModule;
+ test.moduleTestEnvironment = config.currentModuleTestEnviroment;
+ test.queue();
+ },
+
+ /**
+ * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
+ */
+ expect: function(asserts) {
+ config.current.expected = asserts;
+ },
+
+ /**
+ * Asserts true.
+ * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
+ */
+ ok: function(a, msg) {
+ a = !!a;
+ var details = {
+ result: a,
+ message: msg
+ };
+ msg = escapeHtml(msg);
+ QUnit.log(details);
+ config.current.assertions.push({
+ result: a,
+ message: msg
+ });
+ },
+
+ /**
+ * Checks that the first two arguments are equal, with an optional message.
+ * Prints out both actual and expected values.
+ *
+ * Prefered to ok( actual == expected, message )
+ *
+ * @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
+ *
+ * @param Object actual
+ * @param Object expected
+ * @param String message (optional)
+ */
+ equal: function(actual, expected, message) {
+ QUnit.push(expected == actual, actual, expected, message);
+ },
+
+ notEqual: function(actual, expected, message) {
+ QUnit.push(expected != actual, actual, expected, message);
+ },
+
+ deepEqual: function(actual, expected, message) {
+ QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
+ },
+
+ notDeepEqual: function(actual, expected, message) {
+ QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);
+ },
+
+ strictEqual: function(actual, expected, message) {
+ QUnit.push(expected === actual, actual, expected, message);
+ },
+
+ notStrictEqual: function(actual, expected, message) {
+ QUnit.push(expected !== actual, actual, expected, message);
+ },
+
+ raises: function(block, expected, message) {
+ var actual, ok = false;
+
+ if (typeof expected === 'string') {
+ message = expected;
+ expected = null;
+ }
+
+ try {
+ block();
+ } catch (e) {
+ actual = e;
+ }
+
+ if (actual) {
+ // we don't want to validate thrown error
+ if (!expected) {
+ ok = true;
+ // expected is a regexp
+ } else if (QUnit.objectType(expected) === "regexp") {
+ ok = expected.test(actual);
+ // expected is a constructor
+ } else if (actual instanceof expected) {
+ ok = true;
+ // expected is a validation function which returns true is validation passed
+ } else if (expected.call({}, actual) === true) {
+ ok = true;
+ }
+ }
+
+ QUnit.ok(ok, message);
+ },
+
+ start: function() {
+ config.semaphore--;
+ if (config.semaphore > 0) {
+ // don't start until equal number of stop-calls
+ return;
+ }
+ if (config.semaphore < 0) {
+ // ignore if start is called more often then stop
+ config.semaphore = 0;
+ }
+ // A slight delay, to avoid any current callbacks
+ if ( defined.setTimeout ) {
+ window.setTimeout(function() {
+ if (config.semaphore > 0) {
+ return;
+ }
+ if ( config.timeout ) {
+ clearTimeout(config.timeout);
+ }
+
+ config.blocking = false;
+ process();
+ }, 13);
+ } else {
+ config.blocking = false;
+ process();
+ }
+ },
+
+ stop: function(timeout) {
+ config.semaphore++;
+ config.blocking = true;
+
+ if ( timeout && defined.setTimeout ) {
+ clearTimeout(config.timeout);
+ config.timeout = window.setTimeout(function() {
+ QUnit.ok( false, "Test timed out" );
+ QUnit.start();
+ }, timeout);
+ }
+ }
+};
+
+// Backwards compatibility, deprecated
+QUnit.equals = QUnit.equal;
+QUnit.same = QUnit.deepEqual;
+
+// Maintain internal state
+var config = {
+ // The queue of tests to run
+ queue: [],
+
+ // block until document ready
+ blocking: true,
+
+ // when enabled, show only failing tests
+ // gets persisted through sessionStorage and can be changed in UI via checkbox
+ hidepassed: false,
+
+ // by default, run previously failed tests first
+ // very useful in combination with "Hide passed tests" checked
+ reorder: true,
+
+ // by default, modify document.title when suite is done
+ altertitle: true,
+
+ urlConfig: ['noglobals', 'notrycatch']
+};
+
+// Load paramaters
+(function() {
+ var location = window.location || { search: "", protocol: "file:" },
+ params = location.search.slice( 1 ).split( "&" ),
+ length = params.length,
+ urlParams = {},
+ current;
+
+ if ( params[ 0 ] ) {
+ for ( var i = 0; i < length; i++ ) {
+ current = params[ i ].split( "=" );
+ current[ 0 ] = decodeURIComponent( current[ 0 ] );
+ // allow just a key to turn on a flag, e.g., test.html?noglobals
+ current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;
+ urlParams[ current[ 0 ] ] = current[ 1 ];
+ }
+ }
+
+ QUnit.urlParams = urlParams;
+ config.filter = urlParams.filter;
+
+ // Figure out if we're running the tests from a server or not
+ QUnit.isLocal = !!(location.protocol === 'file:');
+})();
+
+// Expose the API as global variables, unless an 'exports'
+// object exists, in that case we assume we're in CommonJS
+if ( typeof exports === "undefined" || typeof require === "undefined" ) {
+ extend(window, QUnit);
+ window.QUnit = QUnit;
+} else {
+ extend(exports, QUnit);
+ exports.QUnit = QUnit;
+}
+
+// define these after exposing globals to keep them in these QUnit namespace only
+extend(QUnit, {
+ config: config,
+
+ // Initialize the configuration options
+ init: function() {
+ extend(config, {
+ stats: { all: 0, bad: 0 },
+ moduleStats: { all: 0, bad: 0 },
+ started: +new Date,
+ updateRate: 1000,
+ blocking: false,
+ autostart: true,
+ autorun: false,
+ filter: "",
+ queue: [],
+ semaphore: 0
+ });
+
+ var tests = id( "qunit-tests" ),
+ banner = id( "qunit-banner" ),
+ result = id( "qunit-testresult" );
+
+ if ( tests ) {
+ tests.innerHTML = "";
+ }
+
+ if ( banner ) {
+ banner.className = "";
+ }
+
+ if ( result ) {
+ result.parentNode.removeChild( result );
+ }
+
+ if ( tests ) {
+ result = document.createElement( "p" );
+ result.id = "qunit-testresult";
+ result.className = "result";
+ tests.parentNode.insertBefore( result, tests );
+ result.innerHTML = 'Running...<br/>&nbsp;';
+ }
+ },
+
+ /**
+ * Resets the test setup. Useful for tests that modify the DOM.
+ *
+ * If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
+ */
+ reset: function() {
+ if ( window.jQuery ) {
+ jQuery( "#qunit-fixture" ).html( config.fixture );
+ } else {
+ var main = id( 'qunit-fixture' );
+ if ( main ) {
+ main.innerHTML = config.fixture;
+ }
+ }
+ },
+
+ /**
+ * Trigger an event on an element.
+ *
+ * @example triggerEvent( document.body, "click" );
+ *
+ * @param DOMElement elem
+ * @param String type
+ */
+ triggerEvent: function( elem, type, event ) {
+ if ( document.createEvent ) {
+ event = document.createEvent("MouseEvents");
+ event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
+ 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+ elem.dispatchEvent( event );
+
+ } else if ( elem.fireEvent ) {
+ elem.fireEvent("on"+type);
+ }
+ },
+
+ // Safe object type checking
+ is: function( type, obj ) {
+ return QUnit.objectType( obj ) == type;
+ },
+
+ objectType: function( obj ) {
+ if (typeof obj === "undefined") {
+ return "undefined";
+
+ // consider: typeof null === object
+ }
+ if (obj === null) {
+ return "null";
+ }
+
+ var type = Object.prototype.toString.call( obj )
+ .match(/^\[object\s(.*)\]$/)[1] || '';
+
+ switch (type) {
+ case 'Number':
+ if (isNaN(obj)) {
+ return "nan";
+ } else {
+ return "number";
+ }
+ case 'String':
+ case 'Boolean':
+ case 'Array':
+ case 'Date':
+ case 'RegExp':
+ case 'Function':
+ return type.toLowerCase();
+ }
+ if (typeof obj === "object") {
+ return "object";
+ }
+ return undefined;
+ },
+
+ push: function(result, actual, expected, message) {
+ var details = {
+ result: result,
+ message: message,
+ actual: actual,
+ expected: expected
+ };
+
+ message = escapeHtml(message) || (result ? "okay" : "failed");
+ message = '<span class="test-message">' + message + "</span>";
+ expected = escapeHtml(QUnit.jsDump.parse(expected));
+ actual = escapeHtml(QUnit.jsDump.parse(actual));
+ var output = message + '<table><tr class="test-expected"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';
+ if (actual != expected) {
+ output += '<tr class="test-actual"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>';
+ output += '<tr class="test-diff"><th>Diff: </th><td><pre>' + QUnit.diff(expected, actual) +'</pre></td></tr>';
+ }
+ if (!result) {
+ var source = sourceFromStacktrace();
+ if (source) {
+ details.source = source;
+ output += '<tr class="test-source"><th>Source: </th><td><pre>' + escapeHtml(source) + '</pre></td></tr>';
+ }
+ }
+ output += "</table>";
+
+ QUnit.log(details);
+
+ config.current.assertions.push({
+ result: !!result,
+ message: output
+ });
+ },
+
+ url: function( params ) {
+ params = extend( extend( {}, QUnit.urlParams ), params );
+ var querystring = "?",
+ key;
+ for ( key in params ) {
+ querystring += encodeURIComponent( key ) + "=" +
+ encodeURIComponent( params[ key ] ) + "&";
+ }
+ return window.location.pathname + querystring.slice( 0, -1 );
+ },
+
+ extend: extend,
+ id: id,
+ addEvent: addEvent,
+
+ // Logging callbacks; all receive a single argument with the listed properties
+ // run test/logs.html for any related changes
+ begin: function() {},
+ // done: { failed, passed, total, runtime }
+ done: function() {},
+ // log: { result, actual, expected, message }
+ log: function() {},
+ // testStart: { name }
+ testStart: function() {},
+ // testDone: { name, failed, passed, total }
+ testDone: function() {},
+ // moduleStart: { name }
+ moduleStart: function() {},
+ // moduleDone: { name, failed, passed, total }
+ moduleDone: function() {}
+});
+
+if ( typeof document === "undefined" || document.readyState === "complete" ) {
+ config.autorun = true;
+}
+
+QUnit.load = function() {
+ QUnit.begin({});
+
+ // Initialize the config, saving the execution queue
+ var oldconfig = extend({}, config);
+ QUnit.init();
+ extend(config, oldconfig);
+
+ config.blocking = false;
+
+ var urlConfigHtml = '', len = config.urlConfig.length;
+ for ( var i = 0, val; i < len, val = config.urlConfig[i]; i++ ) {
+ config[val] = QUnit.urlParams[val];
+ urlConfigHtml += '<label><input name="' + val + '" type="checkbox"' + ( config[val] ? ' checked="checked"' : '' ) + '>' + val + '</label>';
+ }
+
+ var userAgent = id("qunit-userAgent");
+ if ( userAgent ) {
+ userAgent.innerHTML = navigator.userAgent;
+ }
+ var banner = id("qunit-header");
+ if ( banner ) {
+ banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' + urlConfigHtml;
+ addEvent( banner, "change", function( event ) {
+ var params = {};
+ params[ event.target.name ] = event.target.checked ? true : undefined;
+ window.location = QUnit.url( params );
+ });
+ }
+
+ var toolbar = id("qunit-testrunner-toolbar");
+ if ( toolbar ) {
+ var filter = document.createElement("input");
+ filter.type = "checkbox";
+ filter.id = "qunit-filter-pass";
+ addEvent( filter, "click", function() {
+ var ol = document.getElementById("qunit-tests");
+ if ( filter.checked ) {
+ ol.className = ol.className + " hidepass";
+ } else {
+ var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
+ ol.className = tmp.replace(/ hidepass /, " ");
+ }
+ if ( defined.sessionStorage ) {
+ if (filter.checked) {
+ sessionStorage.setItem("qunit-filter-passed-tests", "true");
+ } else {
+ sessionStorage.removeItem("qunit-filter-passed-tests");
+ }
+ }
+ });
+ if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
+ filter.checked = true;
+ var ol = document.getElementById("qunit-tests");
+ ol.className = ol.className + " hidepass";
+ }
+ toolbar.appendChild( filter );
+
+ var label = document.createElement("label");
+ label.setAttribute("for", "qunit-filter-pass");
+ label.innerHTML = "Hide passed tests";
+ toolbar.appendChild( label );
+ }
+
+ var main = id('qunit-fixture');
+ if ( main ) {
+ config.fixture = main.innerHTML;
+ }
+
+ if (config.autostart) {
+ QUnit.start();
+ }
+};
+
+addEvent(window, "load", QUnit.load);
+
+function done() {
+ config.autorun = true;
+
+ // Log the last module results
+ if ( config.currentModule ) {
+ QUnit.moduleDone( {
+ name: config.currentModule,
+ failed: config.moduleStats.bad,
+ passed: config.moduleStats.all - config.moduleStats.bad,
+ total: config.moduleStats.all
+ } );
+ }
+
+ var banner = id("qunit-banner"),
+ tests = id("qunit-tests"),
+ runtime = +new Date - config.started,
+ passed = config.stats.all - config.stats.bad,
+ html = [
+ 'Tests completed in ',
+ runtime,
+ ' milliseconds.<br/>',
+ '<span class="passed">',
+ passed,
+ '</span> tests of <span class="total">',
+ config.stats.all,
+ '</span> passed, <span class="failed">',
+ config.stats.bad,
+ '</span> failed.'
+ ].join('');
+
+ if ( banner ) {
+ banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
+ }
+
+ if ( tests ) {
+ id( "qunit-testresult" ).innerHTML = html;
+ }
+
+ if ( config.altertitle && typeof document !== "undefined" && document.title ) {
+ // show ✖ for good, ✔ for bad suite result in title
+ // use escape sequences in case file gets loaded with non-utf-8-charset
+ document.title = [
+ (config.stats.bad ? "\u2716" : "\u2714"),
+ document.title.replace(/^[\u2714\u2716] /i, "")
+ ].join(" ");
+ }
+
+ QUnit.done( {
+ failed: config.stats.bad,
+ passed: passed,
+ total: config.stats.all,
+ runtime: runtime
+ } );
+}
+
+function validTest( name ) {
+ var filter = config.filter,
+ run = false;
+
+ if ( !filter ) {
+ return true;
+ }
+
+ var not = filter.charAt( 0 ) === "!";
+ if ( not ) {
+ filter = filter.slice( 1 );
+ }
+
+ if ( name.indexOf( filter ) !== -1 ) {
+ return !not;
+ }
+
+ if ( not ) {
+ run = true;
+ }
+
+ return run;
+}
+
+// so far supports only Firefox, Chrome and Opera (buggy)
+// could be extended in the future to use something like https://github.com/csnover/TraceKit
+function sourceFromStacktrace() {
+ try {
+ throw new Error();
+ } catch ( e ) {
+ if (e.stacktrace) {
+ // Opera
+ return e.stacktrace.split("\n")[6];
+ } else if (e.stack) {
+ // Firefox, Chrome
+ return e.stack.split("\n")[4];
+ } else if (e.sourceURL) {
+ // Safari, PhantomJS
+ // TODO sourceURL points at the 'throw new Error' line above, useless
+ //return e.sourceURL + ":" + e.line;
+ }
+ }
+}
+
+function escapeHtml(s) {
+ if (!s) {
+ return "";
+ }
+ s = s + "";
+ return s.replace(/[\&"<>\\]/g, function(s) {
+ switch(s) {
+ case "&": return "&amp;";
+ case "\\": return "\\\\";
+ case '"': return '\"';
+ case "<": return "&lt;";
+ case ">": return "&gt;";
+ default: return s;
+ }
+ });
+}
+
+function synchronize( callback ) {
+ config.queue.push( callback );
+
+ if ( config.autorun && !config.blocking ) {
+ process();
+ }
+}
+
+function process() {
+ var start = (new Date()).getTime();
+
+ while ( config.queue.length && !config.blocking ) {
+ if ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) {
+ config.queue.shift()();
+ } else {
+ window.setTimeout( process, 13 );
+ break;
+ }
+ }
+ if (!config.blocking && !config.queue.length) {
+ done();
+ }
+}
+
+function saveGlobal() {
+ config.pollution = [];
+
+ if ( config.noglobals ) {
+ for ( var key in window ) {
+ config.pollution.push( key );
+ }
+ }
+}
+
+function checkPollution( name ) {
+ var old = config.pollution;
+ saveGlobal();
+
+ var newGlobals = diff( config.pollution, old );
+ if ( newGlobals.length > 0 ) {
+ ok( false, "Introduced global variable(s): " + newGlobals.join(", ") );
+ }
+
+ var deletedGlobals = diff( old, config.pollution );
+ if ( deletedGlobals.length > 0 ) {
+ ok( false, "Deleted global variable(s): " + deletedGlobals.join(", ") );
+ }
+}
+
+// returns a new Array with the elements that are in a but not in b
+function diff( a, b ) {
+ var result = a.slice();
+ for ( var i = 0; i < result.length; i++ ) {
+ for ( var j = 0; j < b.length; j++ ) {
+ if ( result[i] === b[j] ) {
+ result.splice(i, 1);
+ i--;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+function fail(message, exception, callback) {
+ if ( typeof console !== "undefined" && console.error && console.warn ) {
+ console.error(message);
+ console.error(exception);
+ console.warn(callback.toString());
+
+ } else if ( window.opera && opera.postError ) {
+ opera.postError(message, exception, callback.toString);
+ }
+}
+
+function extend(a, b) {
+ for ( var prop in b ) {
+ if ( b[prop] === undefined ) {
+ delete a[prop];
+ } else {
+ a[prop] = b[prop];
+ }
+ }
+
+ return a;
+}
+
+function addEvent(elem, type, fn) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, fn, false );
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, fn );
+ } else {
+ fn();
+ }
+}
+
+function id(name) {
+ return !!(typeof document !== "undefined" && document && document.getElementById) &&
+ document.getElementById( name );
+}
+
+// Test for equality any JavaScript type.
+// Discussions and reference: http://philrathe.com/articles/equiv
+// Test suites: http://philrathe.com/tests/equiv
+// Author: Philippe Rathé <prathe@gmail.com>
+QUnit.equiv = function () {
+
+ var innerEquiv; // the real equiv function
+ var callers = []; // stack to decide between skip/abort functions
+ var parents = []; // stack to avoiding loops from circular referencing
+
+ // Call the o related callback with the given arguments.
+ function bindCallbacks(o, callbacks, args) {
+ var prop = QUnit.objectType(o);
+ if (prop) {
+ if (QUnit.objectType(callbacks[prop]) === "function") {
+ return callbacks[prop].apply(callbacks, args);
+ } else {
+ return callbacks[prop]; // or undefined
+ }
+ }
+ }
+
+ var callbacks = function () {
+
+ // for string, boolean, number and null
+ function useStrictEquality(b, a) {
+ if (b instanceof a.constructor || a instanceof b.constructor) {
+ // to catch short annotaion VS 'new' annotation of a
+ // declaration
+ // e.g. var i = 1;
+ // var j = new Number(1);
+ return a == b;
+ } else {
+ return a === b;
+ }
+ }
+
+ return {
+ "string" : useStrictEquality,
+ "boolean" : useStrictEquality,
+ "number" : useStrictEquality,
+ "null" : useStrictEquality,
+ "undefined" : useStrictEquality,
+
+ "nan" : function(b) {
+ return isNaN(b);
+ },
+
+ "date" : function(b, a) {
+ return QUnit.objectType(b) === "date"
+ && a.valueOf() === b.valueOf();
+ },
+
+ "regexp" : function(b, a) {
+ return QUnit.objectType(b) === "regexp"
+ && a.source === b.source && // the regex itself
+ a.global === b.global && // and its modifers
+ // (gmi) ...
+ a.ignoreCase === b.ignoreCase
+ && a.multiline === b.multiline;
+ },
+
+ // - skip when the property is a method of an instance (OOP)
+ // - abort otherwise,
+ // initial === would have catch identical references anyway
+ "function" : function() {
+ var caller = callers[callers.length - 1];
+ return caller !== Object && typeof caller !== "undefined";
+ },
+
+ "array" : function(b, a) {
+ var i, j, loop;
+ var len;
+
+ // b could be an object literal here
+ if (!(QUnit.objectType(b) === "array")) {
+ return false;
+ }
+
+ len = a.length;
+ if (len !== b.length) { // safe and faster
+ return false;
+ }
+
+ // track reference to avoid circular references
+ parents.push(a);
+ for (i = 0; i < len; i++) {
+ loop = false;
+ for (j = 0; j < parents.length; j++) {
+ if (parents[j] === a[i]) {
+ loop = true;// dont rewalk array
+ }
+ }
+ if (!loop && !innerEquiv(a[i], b[i])) {
+ parents.pop();
+ return false;
+ }
+ }
+ parents.pop();
+ return true;
+ },
+
+ "object" : function(b, a) {
+ var i, j, loop;
+ var eq = true; // unless we can proove it
+ var aProperties = [], bProperties = []; // collection of
+ // strings
+
+ // comparing constructors is more strict than using
+ // instanceof
+ if (a.constructor !== b.constructor) {
+ return false;
+ }
+
+ // stack constructor before traversing properties
+ callers.push(a.constructor);
+ // track reference to avoid circular references
+ parents.push(a);
+
+ for (i in a) { // be strict: don't ensures hasOwnProperty
+ // and go deep
+ loop = false;
+ for (j = 0; j < parents.length; j++) {
+ if (parents[j] === a[i])
+ loop = true; // don't go down the same path
+ // twice
+ }
+ aProperties.push(i); // collect a's properties
+
+ if (!loop && !innerEquiv(a[i], b[i])) {
+ eq = false;
+ break;
+ }
+ }
+
+ callers.pop(); // unstack, we are done
+ parents.pop();
+
+ for (i in b) {
+ bProperties.push(i); // collect b's properties
+ }
+
+ // Ensures identical properties name
+ return eq
+ && innerEquiv(aProperties.sort(), bProperties
+ .sort());
+ }
+ };
+ }();
+
+ innerEquiv = function() { // can take multiple arguments
+ var args = Array.prototype.slice.apply(arguments);
+ if (args.length < 2) {
+ return true; // end transition
+ }
+
+ return (function(a, b) {
+ if (a === b) {
+ return true; // catch the most you can
+ } else if (a === null || b === null || typeof a === "undefined"
+ || typeof b === "undefined"
+ || QUnit.objectType(a) !== QUnit.objectType(b)) {
+ return false; // don't lose time with error prone cases
+ } else {
+ return bindCallbacks(a, callbacks, [ b, a ]);
+ }
+
+ // apply transition with (1..n) arguments
+ })(args[0], args[1])
+ && arguments.callee.apply(this, args.splice(1,
+ args.length - 1));
+ };
+
+ return innerEquiv;
+
+}();
+
+/**
+ * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |
+ * http://flesler.blogspot.com Licensed under BSD
+ * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008
+ *
+ * @projectDescription Advanced and extensible data dumping for Javascript.
+ * @version 1.0.0
+ * @author Ariel Flesler
+ * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}
+ */
+QUnit.jsDump = (function() {
+ function quote( str ) {
+ return '"' + str.toString().replace(/"/g, '\\"') + '"';
+ };
+ function literal( o ) {
+ return o + '';
+ };
+ function join( pre, arr, post ) {
+ var s = jsDump.separator(),
+ base = jsDump.indent(),
+ inner = jsDump.indent(1);
+ if ( arr.join )
+ arr = arr.join( ',' + s + inner );
+ if ( !arr )
+ return pre + post;
+ return [ pre, inner + arr, base + post ].join(s);
+ };
+ function array( arr, stack ) {
+ var i = arr.length, ret = Array(i);
+ this.up();
+ while ( i-- )
+ ret[i] = this.parse( arr[i] , undefined , stack);
+ this.down();
+ return join( '[', ret, ']' );
+ };
+
+ var reName = /^function (\w+)/;
+
+ var jsDump = {
+ parse:function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
+ stack = stack || [ ];
+ var parser = this.parsers[ type || this.typeOf(obj) ];
+ type = typeof parser;
+ var inStack = inArray(obj, stack);
+ if (inStack != -1) {
+ return 'recursion('+(inStack - stack.length)+')';
+ }
+ //else
+ if (type == 'function') {
+ stack.push(obj);
+ var res = parser.call( this, obj, stack );
+ stack.pop();
+ return res;
+ }
+ // else
+ return (type == 'string') ? parser : this.parsers.error;
+ },
+ typeOf:function( obj ) {
+ var type;
+ if ( obj === null ) {
+ type = "null";
+ } else if (typeof obj === "undefined") {
+ type = "undefined";
+ } else if (QUnit.is("RegExp", obj)) {
+ type = "regexp";
+ } else if (QUnit.is("Date", obj)) {
+ type = "date";
+ } else if (QUnit.is("Function", obj)) {
+ type = "function";
+ } else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") {
+ type = "window";
+ } else if (obj.nodeType === 9) {
+ type = "document";
+ } else if (obj.nodeType) {
+ type = "node";
+ } else if (typeof obj === "object" && typeof obj.length === "number" && obj.length >= 0) {
+ type = "array";
+ } else {
+ type = typeof obj;
+ }
+ return type;
+ },
+ separator:function() {
+ return this.multiline ? this.HTML ? '<br />' : '\n' : this.HTML ? '&nbsp;' : ' ';
+ },
+ indent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
+ if ( !this.multiline )
+ return '';
+ var chr = this.indentChar;
+ if ( this.HTML )
+ chr = chr.replace(/\t/g,' ').replace(/ /g,'&nbsp;');
+ return Array( this._depth_ + (extra||0) ).join(chr);
+ },
+ up:function( a ) {
+ this._depth_ += a || 1;
+ },
+ down:function( a ) {
+ this._depth_ -= a || 1;
+ },
+ setParser:function( name, parser ) {
+ this.parsers[name] = parser;
+ },
+ // The next 3 are exposed so you can use them
+ quote:quote,
+ literal:literal,
+ join:join,
+ //
+ _depth_: 1,
+ // This is the list of parsers, to modify them, use jsDump.setParser
+ parsers:{
+ window: '[Window]',
+ document: '[Document]',
+ error:'[ERROR]', //when no parser is found, shouldn't happen
+ unknown: '[Unknown]',
+ 'null':'null',
+ 'undefined':'undefined',
+ 'function':function( fn ) {
+ var ret = 'function',
+ name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE
+ if ( name )
+ ret += ' ' + name;
+ ret += '(';
+
+ ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');
+ return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );
+ },
+ array: array,
+ nodelist: array,
+ arguments: array,
+ object:function( map, stack ) {
+ var ret = [ ];
+ QUnit.jsDump.up();
+ for ( var key in map ) {
+ var val = map[key];
+ ret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(val, undefined, stack));
+ }
+ QUnit.jsDump.down();
+ return join( '{', ret, '}' );
+ },
+ node:function( node ) {
+ var open = QUnit.jsDump.HTML ? '&lt;' : '<',
+ close = QUnit.jsDump.HTML ? '&gt;' : '>';
+
+ var tag = node.nodeName.toLowerCase(),
+ ret = open + tag;
+
+ for ( var a in QUnit.jsDump.DOMAttrs ) {
+ var val = node[QUnit.jsDump.DOMAttrs[a]];
+ if ( val )
+ ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );
+ }
+ return ret + close + open + '/' + tag + close;
+ },
+ functionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function
+ var l = fn.length;
+ if ( !l ) return '';
+
+ var args = Array(l);
+ while ( l-- )
+ args[l] = String.fromCharCode(97+l);//97 is 'a'
+ return ' ' + args.join(', ') + ' ';
+ },
+ key:quote, //object calls it internally, the key part of an item in a map
+ functionCode:'[code]', //function calls it internally, it's the content of the function
+ attribute:quote, //node calls it internally, it's an html attribute value
+ string:quote,
+ date:quote,
+ regexp:literal, //regex
+ number:literal,
+ 'boolean':literal
+ },
+ DOMAttrs:{//attributes to dump from nodes, name=>realName
+ id:'id',
+ name:'name',
+ 'class':'className'
+ },
+ HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
+ indentChar:' ',//indentation unit
+ multiline:true //if true, items in a collection, are separated by a \n, else just a space.
+ };
+
+ return jsDump;
+})();
+
+// from Sizzle.js
+function getText( elems ) {
+ var ret = "", elem;
+
+ for ( var i = 0; elems[i]; i++ ) {
+ elem = elems[i];
+
+ // Get the text from text nodes and CDATA nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+ ret += elem.nodeValue;
+
+ // Traverse everything else, except comment nodes
+ } else if ( elem.nodeType !== 8 ) {
+ ret += getText( elem.childNodes );
+ }
+ }
+
+ return ret;
+};
+
+//from jquery.js
+function inArray( elem, array ) {
+ if ( array.indexOf ) {
+ return array.indexOf( elem );
+ }
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+/*
+ * Javascript Diff Algorithm
+ * By John Resig (http://ejohn.org/)
+ * Modified by Chu Alan "sprite"
+ *
+ * Released under the MIT license.
+ *
+ * More Info:
+ * http://ejohn.org/projects/javascript-diff-algorithm/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
+ */
+QUnit.diff = (function() {
+ function diff(o, n) {
+ var ns = {};
+ var os = {};
+
+ for (var i = 0; i < n.length; i++) {
+ if (ns[n[i]] == null)
+ ns[n[i]] = {
+ rows: [],
+ o: null
+ };
+ ns[n[i]].rows.push(i);
+ }
+
+ for (var i = 0; i < o.length; i++) {
+ if (os[o[i]] == null)
+ os[o[i]] = {
+ rows: [],
+ n: null
+ };
+ os[o[i]].rows.push(i);
+ }
+
+ for (var i in ns) {
+ if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
+ n[ns[i].rows[0]] = {
+ text: n[ns[i].rows[0]],
+ row: os[i].rows[0]
+ };
+ o[os[i].rows[0]] = {
+ text: o[os[i].rows[0]],
+ row: ns[i].rows[0]
+ };
+ }
+ }
+
+ for (var i = 0; i < n.length - 1; i++) {
+ if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
+ n[i + 1] == o[n[i].row + 1]) {
+ n[i + 1] = {
+ text: n[i + 1],
+ row: n[i].row + 1
+ };
+ o[n[i].row + 1] = {
+ text: o[n[i].row + 1],
+ row: i + 1
+ };
+ }
+ }
+
+ for (var i = n.length - 1; i > 0; i--) {
+ if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
+ n[i - 1] == o[n[i].row - 1]) {
+ n[i - 1] = {
+ text: n[i - 1],
+ row: n[i].row - 1
+ };
+ o[n[i].row - 1] = {
+ text: o[n[i].row - 1],
+ row: i - 1
+ };
+ }
+ }
+
+ return {
+ o: o,
+ n: n
+ };
+ }
+
+ return function(o, n) {
+ o = o.replace(/\s+$/, '');
+ n = n.replace(/\s+$/, '');
+ var out = diff(o == "" ? [] : o.split(/\s+/), n == "" ? [] : n.split(/\s+/));
+
+ var str = "";
+
+ var oSpace = o.match(/\s+/g);
+ if (oSpace == null) {
+ oSpace = [" "];
+ }
+ else {
+ oSpace.push(" ");
+ }
+ var nSpace = n.match(/\s+/g);
+ if (nSpace == null) {
+ nSpace = [" "];
+ }
+ else {
+ nSpace.push(" ");
+ }
+
+ if (out.n.length == 0) {
+ for (var i = 0; i < out.o.length; i++) {
+ str += '<del>' + out.o[i] + oSpace[i] + "</del>";
+ }
+ }
+ else {
+ if (out.n[0].text == null) {
+ for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
+ str += '<del>' + out.o[n] + oSpace[n] + "</del>";
+ }
+ }
+
+ for (var i = 0; i < out.n.length; i++) {
+ if (out.n[i].text == null) {
+ str += '<ins>' + out.n[i] + nSpace[i] + "</ins>";
+ }
+ else {
+ var pre = "";
+
+ for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
+ pre += '<del>' + out.o[n] + oSpace[n] + "</del>";
+ }
+ str += " " + out.n[i].text + nSpace[i] + pre;
+ }
+ }
+ }
+
+ return str;
+ };
+})();
+
+})(this); \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C++/Chapter1.ipynb b/tbc/static/uploads/Hardik/C++/Chapter1.ipynb
new file mode 100644
index 0000000..68dac58
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C++/Chapter1.ipynb
@@ -0,0 +1,158 @@
+{
+ "metadata": {
+ "name": "Chapter_1"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 1: Semiconductor Basics<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 1.1(a), Page Number:29<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Voltages of different models'''",
+ "",
+ "# variable declaration",
+ "V_bias=10.0; #bias voltage in volt",
+ "R_limit=1000; #limiting resistance in ohm",
+ "r_d =10.0; #r_d value",
+ "",
+ "#calculation",
+ "#IDEAL MODEL",
+ "print \"IDEAL MODEL\"",
+ "V_f=0; #voltage in volt",
+ "I_f=V_bias/R_limit; #foward current",
+ "V_R_limit=I_f*R_limit; #limiting voltage",
+ "print \"forward voltage = %.2f volts\" %V_f",
+ "print \"forward current = %.2f amperes\" %I_f",
+ "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit",
+ "",
+ "#PRACTICAL MODEL",
+ "print \"\\nPRACTICAL MODEL\"",
+ "V_f=0.7; #voltage in volt",
+ "I_f=(V_bias-V_f)/R_limit; #foward current",
+ "V_R_limit=I_f*R_limit; #limiting voltage",
+ "print \"forward voltage = %.2f volts\" %V_f",
+ "print \"forward current = %.3f amperes\" %I_f",
+ "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit",
+ "",
+ "#COMPLETE MODEL",
+ "print \"\\nCOMPLETE MODEL\"",
+ "I_f=(V_bias-0.7)/(R_limit+r_d); #foward current",
+ "V_f=0.7+I_f*r_d; #forward voltage",
+ "V_R_limit=I_f*R_limit; #limiting voltage",
+ "print \"forward voltage = %.3f volts\" %V_f",
+ "print \"forward current = %.3f amperes\" %I_f",
+ "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "IDEAL MODEL",
+ "forward voltage = 0.00 volts",
+ "forward current = 0.01 amperes",
+ "voltage across limiting resistor = 10.00 volts",
+ "",
+ "PRACTICAL MODEL",
+ "forward voltage = 0.70 volts",
+ "forward current = 0.009 amperes",
+ "voltage across limiting resistor = 9.30 volts",
+ "",
+ "COMPLETE MODEL",
+ "forward voltage = 0.792 volts",
+ "forward current = 0.009 amperes",
+ "voltage across limiting resistor = 9.21 volts"
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 1.1(b), Page Number:29<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''voltages of different models'''",
+ "",
+ "# variable declaration",
+ "V_bias=5; #bias voltage in volt",
+ "I_R=1*10**-6; #current",
+ "R_limit=1000 #in Ohm",
+ "",
+ "#calculation",
+ "#IDEAL MODEL",
+ "print \"IDEAL MODEL\"",
+ "I_r=0.0; #current in ampere",
+ "V_R=V_bias; #voltages are equal",
+ "V_R_limit=I_r*R_limit; #limiting voltage",
+ "print \"Reverse voltage across diode = %.2f volts\" %V_R",
+ "print \"Reverse current through diode= %.2f amperes\" %I_r",
+ "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit",
+ "",
+ "#PRACTICAL MODEL",
+ "print \"\\nPRACTICAL MODEL\"",
+ "I_r=0.0; #current in ampere",
+ "V_R=V_bias; #voltages are equal",
+ "V_R_limit=I_r*R_limit; #limiting voltage",
+ "print \"Reverse voltage across diode= %.2f volts\" %V_R",
+ "print \"Reverse current through diode = %.2f amperes\" %I_r",
+ "print \"voltage across limiting resistor = %.2f volts\" %V_R_limit",
+ "",
+ "#COMPLETE MODEL",
+ "print \"\\nCOMPLETE MODEL\"",
+ "I_r=I_R; #current in ampere",
+ "V_R_limit=I_r*R_limit; #limiting voltage",
+ "V_R=V_bias-V_R_limit; #voltage in volt",
+ "print \"Reverse voltage across diode = %.3f volts\" %V_R",
+ "print \"Reverse current through diode = %d micro Amp\" %(I_r*10**6)",
+ "print \"voltage across limiting resistor = %d mV\" %(V_R_limit*1000)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "IDEAL MODEL",
+ "Reverse voltage across diode = 5.00 volts",
+ "Reverse current through diode= 0.00 amperes",
+ "voltage across limiting resistor = 0.00 volts",
+ "",
+ "PRACTICAL MODEL",
+ "Reverse voltage across diode= 5.00 volts",
+ "Reverse current through diode = 0.00 amperes",
+ "voltage across limiting resistor = 0.00 volts",
+ "",
+ "COMPLETE MODEL",
+ "Reverse voltage across diode = 4.999 volts",
+ "Reverse current through diode = 1 micro Amp",
+ "voltage across limiting resistor = 1 mV"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C++/Chapter2.ipynb b/tbc/static/uploads/Hardik/C++/Chapter2.ipynb
new file mode 100644
index 0000000..107fc33
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C++/Chapter2.ipynb
@@ -0,0 +1,608 @@
+{
+ "metadata": {
+ "name": "Chapter_2"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 2: Diode Application<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.1, Page Number: 46<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Average value of half wave rectifier'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "V_p=50; #Peak value is 50V",
+ "",
+ "#calculation",
+ "V_avg=V_p/math.pi;",
+ "",
+ "#result",
+ "print \"average value of half wave rectifier = %.2f volts\" %V_avg"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "average value of half wave rectifier = 15.92 volts"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.2(a), Page Number: 46<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' half wave rectifier output'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "#let V_in=5*sin(2*%pi*f.*t) be input wave ,hence frequency=1Hz",
+ "f=1; #frequency",
+ "V_p_in=5; #peak input",
+ "",
+ "#calculation",
+ "V_pout=V_p_in-0.7; #output voltage",
+ "t_d=(math.asin(0.7/V_p_in))/(2*math.pi*f);",
+ "",
+ "#result",
+ "print \"half wave rectifier output = %.2f volts\" %V_pout;"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "half wave rectifier output = 4.30 volts"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.2(b), Page Number: 46<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' half wave rectifier output'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "#let V_in=100*sin(2*%pi*f.*t) be input wave ,hence frequency=1Hz",
+ "f=1; #frequency",
+ "T=1/f; #time period",
+ "V_p_in=100; #peak input voltage",
+ "",
+ "#calculation",
+ "V_pout=(V_p_in-0.7); #peak output ",
+ "t_d=(math.asin(0.7/V_p_in))/(2*math.pi*f) ",
+ "",
+ "#result",
+ "print \"output of half wave rectifier = %.2f volts\" %V_pout"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "output of half wave rectifier = 99.30 volts"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.3, Page Number: 48<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Average value of half wave rectifier'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "V_p_in=156; #Peak input voltage",
+ "V_p_pri=156; #Peak voltage of primary of transformer",
+ "n=0.5; #Turn ratio is 2:1",
+ "",
+ "#calculation",
+ "V_p_sec=n*V_p_pri;",
+ "V_p_out=(V_p_sec-0.7); #Peak output voltage",
+ "",
+ "#result",
+ "print \"peak output voltage of half wave rectifier = %.1f volts\" %V_p_out"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "peak output voltage of half wave rectifier = 77.3 volts"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.4, Page Number: 49<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Average value of full wave rectifier'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "V_p=15; #Peak voltage in volt",
+ "",
+ "#calculation",
+ "V_avg=(2*V_p)/math.pi;",
+ "",
+ "#result",
+ "print \"Average value of output of full wave rectifier = %.2f volts\" %V_avg"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Average value of output of full wave rectifier = 9.55 volts"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.5, Page Number: 52<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''PIV full wave'''",
+ "",
+ "V_p_pri=100.0; #Peak voltage across primary winding",
+ "n=1.0/2; #tun ratio is 2:1",
+ "V_p_sec=n*V_p_pri;",
+ "V_sec=V_p_sec/2; #voltage across each secondary is half the total voltage",
+ "V_pout=V_sec-0.7;",
+ "",
+ "print('full wave rectifier output voltage = %f V'%V_pout)",
+ "PIV=2*V_pout+0.7;",
+ "print('PIV = %fV'%PIV)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "full wave rectifier output voltage = 24.300000 V",
+ "PIV = 49.300000V"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.6, Page Number: 54<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Peak voltage of diode'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "V_rms=12.0; #rms secondary voltage",
+ "",
+ "#calculation",
+ "V_p_sec=math.sqrt(2)*V_rms; #peak secondary voltage",
+ "V_th=0.7; #knee voltage of diode",
+ "V_p_out=V_p_sec-2*V_th; #in one cycle, 2 diodes conduct",
+ "PIV=V_p_out+V_th; #applying KVL",
+ "",
+ "#result",
+ "print \"Peak output voltage = %.2f volt\" %V_p_out",
+ "print \"PIV across each diode = %.2f volt\" %PIV"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Peak output voltage = 15.57 volt",
+ "PIV across each diode = 16.27 volt"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.7, Page Number: 58<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Ripple Factor'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "R_l=2200; #load resistance in Ohm",
+ "C=50*10**-6; #capacitance in Farad",
+ "V_rms=115; #rms of primary",
+ "",
+ "#calculation",
+ "V_p_pri=math.sqrt(2)*V_rms; #peak voltage across primary",
+ "n=0.1; #turn ratio is 10:1",
+ "V_p_sec=n*V_p_pri; #primary voltage across secondary",
+ "V_p_rect=V_p_sec-1.4 #unfiltered peak rectified voltage",
+ "#we subtract 1.4 because in each cycle 2 diodes conduct & 2 do not",
+ "f=120; #frequency of full wave rectified voltage",
+ "V_r_pp=(1/(f*R_l*C))*V_p_rect; #peak to peak ripple voltage",
+ "V_DC=(1-(1/(2*f*R_l*C)))*V_p_rect;",
+ "r=V_r_pp/V_DC;",
+ "",
+ "#result",
+ "print \"Ripple factor = %.3f \" %r"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Ripple factor = 0.079 "
+ ]
+ }
+ ],
+ "prompt_number": 9
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.8, Page Number: 62<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Min & Max voltage'''",
+ "",
+ "import math",
+ "",
+ "# variable declaration",
+ "V_REF=1.25; #in volts",
+ "V_R1=V_REF; #voltage in volt",
+ "R1=220.0; #in ohms",
+ "I_ADJ=50*10**-6 #in amperes",
+ "",
+ "#calculation",
+ "# MAX VALUE OF R2=5000 Ohms",
+ "R2_min=0.0; #min resistance",
+ "V_out_min=V_REF*(1+(R2_min/R1))+I_ADJ*R2_min;",
+ "R2_max=5000.0; #max value of resistance",
+ "V_out_max=V_REF*(1+(R2_max/R1))+I_ADJ*R2_max;",
+ "",
+ "#result",
+ "print \"minimum output voltage = %.2f volt\" %V_out_min",
+ "print \"maximum output voltage = %.2f volt\" %V_out_max"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "minimum output voltage = 1.25 volt",
+ "maximum output voltage = 29.91 volt"
+ ]
+ }
+ ],
+ "prompt_number": 10
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.9,Page Number: 64<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Load regulation percentage'''",
+ "",
+ "V_NL=5.18 #No load output voltage",
+ "V_FL=5.15 #Full load output voltage",
+ "load_reg=((V_NL-V_FL)/V_FL)*100 #In percentage",
+ "print('load regulation percent = %.2f%% '%load_reg)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "load regulation percent = 0.58% "
+ ]
+ }
+ ],
+ "prompt_number": 11
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.10, Page Number: 66<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Negative diode limiter'''",
+ "",
+ "import pylab as py",
+ "import numpy as np",
+ "",
+ "#let input wave be V_in=V_p_in*sin(2*%pi*f*t) ",
+ "f=1.0; #Frequency is 1Hz",
+ "T=1/f;",
+ "R_1=100.0; #Resistances in ohms",
+ "R_L=1000.0; #Load",
+ "V_p_in=10.0; #Peak input voltage",
+ "V_th=0.7; #knee voltage of diode",
+ "",
+ "V_p_out=V_p_in*(R_L/(R_L+R_1)); #peak output voltage",
+ "print('peak output voltage = %.2f V'%V_p_out)",
+ "",
+ "t = np.arange(0, 3.5 , 0.0005)",
+ "z=V_p_in*np.sin(2*np.pi*f*t)*(R_L/(R_L+R_1))",
+ "",
+ "subplot(211)",
+ "plot(t,z)",
+ "ylim(-9.09,9.09)",
+ "title('Input Voltage Waveform')",
+ "",
+ "subplot(212)",
+ "plot(t,z)",
+ "ylim(-0.07,9.09)",
+ "title('Output Voltage Waveform')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "peak output voltage = 9.09 V"
+ ]
+ },
+ {
+ "output_type": "pyout",
+ "prompt_number": 12,
+ "text": [
+ "<matplotlib.text.Text at 0xa3bf44c>"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "png": "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\n"
+ }
+ ],
+ "prompt_number": 12
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.11, Page Number: 67<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Positive and negative Diode limiter'''",
+ "",
+ "#from pylab import figure, show",
+ "#from numpy import arange, sin, pi,bool",
+ "#import numpy as np",
+ "import pylab as py",
+ "import numpy as np",
+ "#let input wave be V_in=V_p_in*sin(2*%pi*f*t) ",
+ "f=1.0; #Frequency is 1Hz",
+ "T=1/f;",
+ "V_p_in=10; #Peak input voltage",
+ "V_th=0.7; #knee voltage of diode",
+ "print('max output voltage is 5.7V')",
+ "print('min output voltage is -5.7V')",
+ "",
+ "###############GRAPH Plotting#################################",
+ "t = arange(0.0,4.5,0.0005)",
+ "V_in=V_p_in*sin(2*pi*f*t);",
+ "",
+ "Vout=V_in;",
+ "#fig = figure(2)",
+ "subplot(211)",
+ "plot(t,V_in)",
+ "#ax2.grid(True)",
+ "ylim( (-10,10) )",
+ "title('Input to the +ve and -ve diode limiter ')",
+ "subplot(212)",
+ "plot(t,V_in)",
+ "#ax1.grid(True)",
+ "ylim( (-5.7,5.7) )",
+ "title('Output of +ve and -ve diode limiter')",
+ " "
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "max output voltage is 5.7V",
+ "min output voltage is -5.7V"
+ ]
+ },
+ {
+ "output_type": "pyout",
+ "prompt_number": 13,
+ "text": [
+ "<matplotlib.text.Text at 0xa6c976c>"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "png": "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\nx/PeAAAAAElFTkSuQmCC\n"
+ }
+ ],
+ "prompt_number": 13
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.12, Page Number: 76<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Positive diode limiter'''",
+ "",
+ "#variable declaration",
+ "V_p_in=18.0; #peak input voltage is 18V",
+ "V_supply=12.0;",
+ "R2=100.0;",
+ "R3=220.0; #resistances in ohms",
+ "#calculation",
+ "V_bias=V_supply*(R3/(R2+R3));",
+ "",
+ "#result",
+ "print('diode limiting the voltage at this voltage =%fV'%V_bias)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "diode limiting the voltage at this voltage =8.250000V"
+ ]
+ }
+ ],
+ "prompt_number": 14
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 2.13, Page Number: 78<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Negative Clamping circuit'''",
+ "",
+ "V_p_in=24.0;",
+ "V_DC=-(V_p_in-0.7); #DC level added to output",
+ "print('V_DC = %.1fV'%V_DC)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "V_DC = -23.3V"
+ ]
+ }
+ ],
+ "prompt_number": 15
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C++/Chapter3.ipynb b/tbc/static/uploads/Hardik/C++/Chapter3.ipynb
new file mode 100644
index 0000000..41e63a8
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C++/Chapter3.ipynb
@@ -0,0 +1,377 @@
+{
+ "metadata": {
+ "name": "Chapter_3"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 3: Special-purpose Diodes<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.1, Page Number:88<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find Zener Impedence'''",
+ "",
+ "# variable declaration",
+ "delVZ=50*10**-3; #voltage in volts, from graph",
+ "delIZ=5*10**-3; #current in amperes, from rgraph",
+ "",
+ "#calculation",
+ "ZZ=delVZ/delIZ; #zener impedence",
+ "",
+ "# result",
+ "print \"zener impedance = %d ohm \" %ZZ"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "zener impedance = 10 ohm "
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.2, Page Number:89<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Voltage accross zener terminals'''",
+ "",
+ "# variable declaration",
+ "I_ZT=37*10**-3; #IN AMPERES",
+ "V_ZT=6.80; #IN VOLTS",
+ "Z_ZT=3.50; #IN OHMS",
+ "I_Z=50*10**-3; #IN AMPERES",
+ "",
+ "#calculation",
+ "DEL_I_Z=I_Z-I_ZT; #change current",
+ "DEL_V_Z=DEL_I_Z*Z_ZT; #change voltage",
+ "V_Z=V_ZT+DEL_V_Z; #voltage across zener terminals",
+ "print \"voltage across zener terminals when current is 50 mA = %.3f volts\" %V_Z",
+ "I_Z=25*10**-3; #IN AMPERES",
+ "DEL_I_Z=I_Z-I_ZT; #change current",
+ "DEL_V_Z=DEL_I_Z*Z_ZT; #change voltage",
+ "V_Z=V_ZT+DEL_V_Z; #voltage across zener terminals",
+ "",
+ "#result",
+ "print \"voltage across zener terminals when current is 25 mA = %.3f volts\" %V_Z"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "voltage across zener terminals when current is 50 mA = 6.845 volts",
+ "voltage across zener terminals when current is 25 mA = 6.758 volts"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.3, Page Number:90<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Zener Voltage'''",
+ "",
+ "# variable declaration",
+ "V_Z=8.2; #8.2 volt zener diode",
+ "TC=0.0005; #Temperature coefficient (per degree celsius)",
+ "T1=60; #Temperature 1 in celsius",
+ "T2=25; #Temperature 2 in celsius",
+ "",
+ "#calculation",
+ "DEL_T=T1-T2; #change in temp",
+ "del_V_Z=V_Z*TC*DEL_T; #change in voltage",
+ "voltage=V_Z+del_V_Z; #zener voltage",
+ "",
+ "#result",
+ "print \"zener voltage at 60 degree celsius = %.3f volt\" %voltage"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "zener voltage at 60 degree celsius = 8.343 volt"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.4, Page Number:90<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Power dissipation'''",
+ "",
+ "# variable declaration",
+ "P_D_max=400*10**-3; #power in watts",
+ "df=3.2*10**-3 #derating factor in watts per celsius",
+ "del_T=(90-50); #in celsius, temperature difference",
+ "",
+ "#calculation",
+ "P_D_deru=P_D_max-df*del_T; #power dissipated",
+ "P_D_der=P_D_deru*1000;",
+ "",
+ "#result",
+ "print \"maximum power dissipated at 90 degree celsius = %d mW\" %P_D_der"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "maximum power dissipated at 90 degree celsius = 272 mW"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.5, Page Number: 92<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Zener Diode voltage regulation'''",
+ "",
+ "# variable declaration",
+ "V_Z=5.1;",
+ "I_ZT=49*10**-3;",
+ "I_ZK=1*10**-3;",
+ "Z_Z=7;",
+ "R=100;",
+ "P_D_max=1;",
+ "",
+ "#calculation",
+ "V_out=V_Z-(I_ZT-I_ZK)*Z_Z; #output voltage at I_ZK",
+ "V_IN_min=I_ZK*R+V_out; #input voltage",
+ "I_ZM=P_D_max/V_Z; #current",
+ "V_out=V_Z+(I_ZM-I_ZT)*Z_Z; #output voltage at I_ZM",
+ "V_IN_max=I_ZM*R+V_out; #max input voltage",
+ "",
+ "#result",
+ "print \"maximum input voltage regulated by zener diode = %.3f volts\" %V_IN_max",
+ "print \"minimum input voltage regulated by zener diode = %.3f volts\" %V_IN_min"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "maximum input voltage regulated by zener diode = 25.737 volts",
+ "minimum input voltage regulated by zener diode = 4.864 volts"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.6, Page Number: 93<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Min & Max current'''",
+ "",
+ "# variable declaration",
+ "V_Z=12.0; #voltage in volt",
+ "V_IN=24.0; #ip voltage in volt",
+ "I_ZK=0.001; #current in ampere",
+ "I_ZM=0.050; #current in ampere ",
+ "Z_Z=0; #impedence",
+ "R=470; #resistance in ohm",
+ "",
+ "#calculation",
+ "#when I_L=0, I_Z is max and is equal to the total circuit current I_T",
+ "I_T=(V_IN-V_Z)/R; #current",
+ "I_Z_max=I_T; #max current",
+ "if I_Z_max<I_ZM : # condition for min currert ",
+ " I_L_min=0;",
+ "",
+ "I_L_max=I_T-I_ZK; #max current",
+ "R_L_min=V_Z/I_L_max; #min resistance",
+ "",
+ "#result",
+ "print \"minimum value of load resistance = %.2f ohm\" %R_L_min",
+ "print \"minimum curent = %.3f ampere\" %I_L_min",
+ "print \"maximum curent = %.3f ampere\" %I_L_max"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "minimum value of load resistance = 489.16 ohm",
+ "minimum curent = 0.000 ampere",
+ "maximum curent = 0.025 ampere"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.7, Page Number: 94<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' to find load resistance'''",
+ "",
+ "# variable declaration",
+ "V_IN=24.0; #voltage in volt",
+ "V_Z=15.0; #voltage in volt",
+ "I_ZK=0.25*10**-3; #current in ampere",
+ "I_ZT=17*10**-3; #current in ampere",
+ "Z_ZT=14.0; #impedence",
+ "P_D_max=1.0; #max power dissipation",
+ "",
+ "#calculation",
+ "V_out_1=V_Z-(I_ZT-I_ZK)*Z_ZT; #output voltage at I_ZK",
+ "print \"output voltage at I_ZK = %.2f volt\" %V_out_1",
+ "I_ZM=P_D_max/V_Z;",
+ "",
+ "V_out_2=V_Z+(I_ZM-I_ZT)*Z_ZT; #output voltage at I_ZM",
+ "print \"output voltage a I_ZM = %.2f volt\" %V_out_2",
+ "R=(V_IN-V_out_2)/I_ZM; #resistance",
+ "print \"value of R for maximum zener current, no load = %.2f ohm\" %R",
+ "print \"closest practical value is 130 ohms\"",
+ "R=130.0;",
+ "#for minimum load resistance(max load current) zener current is minimum (I_ZK)",
+ "I_T=(V_IN-V_out_1)/R; #current",
+ "I_L=I_T-I_ZK; #current",
+ "R_L_min=V_out_1/I_L; #minimum load resistance",
+ "",
+ "#result",
+ "print \"minimum load resistance = %.2f ohm\" %R_L_min"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "output voltage at I_ZK = 14.77 volt",
+ "output voltage a I_ZM = 15.70 volt",
+ "value of R for maximum zener current, no load = 124.57 ohm",
+ "closest practical value is 130 ohms",
+ "minimum load resistance = 208.60 ohm"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 3.8, Page Number: 96<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Zener limiting'''",
+ "",
+ "#variable declaration",
+ "V_p_in=10.0; #Peak input voltage",
+ "V_th=0.7; #forward biased zener",
+ "V_Z1=5.1;",
+ "V_Z2=3.3;",
+ "",
+ "V_p_in=20.0;",
+ "V_Z1=6.2;",
+ "V_Z2=15.0;",
+ "",
+ "#result",
+ "print('max voltage = %.1f V'%(V_Z1+V_th))",
+ "print('min voltage = %.1f V'%(-(V_Z2+V_th)))"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "max voltage = 6.9 V",
+ "min voltage = -15.7 V"
+ ]
+ }
+ ],
+ "prompt_number": 9
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C++/Chapter4.ipynb b/tbc/static/uploads/Hardik/C++/Chapter4.ipynb
new file mode 100644
index 0000000..b76b7b1
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C++/Chapter4.ipynb
@@ -0,0 +1,455 @@
+{
+ "metadata": {
+ "name": "Chapter_4"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 4: Bipolar Junction Transistors (BJTs)<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.1, Page Number: 120 <h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find Emitter current'''",
+ "",
+ "# variable declaration",
+ "I_C=3.65*10**-3; #collector current in amperes",
+ "I_B=50*10**-6; #base current in amperes",
+ "",
+ "#calculation",
+ "B_DC=I_C/I_B; #B_DC value",
+ "I_E=I_B+I_C; #current in ampere",
+ "",
+ "# result",
+ "print \"B_DC = %d \" %B_DC",
+ "print \"Emitter current = %.4f ampere\" %I_E"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "B_DC = 73 ",
+ "Emitter current = 0.0037 ampere"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.2, Page Number: 121<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Current and Voltage values'''",
+ "",
+ "# variable declaration",
+ "V_BE=0.7; # voltage in volt",
+ "B_DC=150; # voltage in volt",
+ "V_BB=5; # voltage in volt",
+ "V_CC=10; # voltage in volt",
+ "R_B=10*10**3; # resistance in ohm",
+ "R_C=100; # resistance in ohm",
+ "",
+ "#calculation",
+ "I_B=(V_BB-V_BE)/R_B; #base current in amperes",
+ "I_C=B_DC*I_B; #collector current in amperes",
+ "I_E=I_C+I_B; #emitter current in amperes",
+ "V_CE=V_CC-I_C*R_C; #collector to emitter voltage in volts",
+ "V_CB=V_CE-V_BE; #collector to base voltage in volts",
+ "",
+ "# result",
+ "print \"base current = %.5f amperes\" %I_B",
+ "print \"collector current = %.4f amperes\" %I_C",
+ "print \"emitter current = %.5f amperes\" %I_E",
+ "print \"collector to emitter voltage =%.2f volts\" %V_CE",
+ "print \"collector to base voltage =%.2f volts\" %V_CB"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "base current = 0.00043 amperes",
+ "collector current = 0.0645 amperes",
+ "emitter current = 0.06493 amperes",
+ "collector to emitter voltage =3.55 volts",
+ "collector to base voltage =2.85 volts"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.3, Page Number: 123<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Ideal family of collector curve'''",
+ "",
+ "",
+ "import pylab as py",
+ "import numpy as np",
+ "",
+ "#variable declaration",
+ "beta=100 # current gain",
+ "print'Ideal family of collector curve'",
+ "",
+ "ic1 = arange(0.00001, 0.45, 0.0005)",
+ "ic2 = arange(0.00001, 0.5, 0.0005)",
+ "ic3 = arange(0.00001, 0.6, 0.0005)",
+ "ic4 = arange(0.00001, 0.7, 0.0005)",
+ "vcc1=ic1*0.5/0.7",
+ "vcc2=ic2*1.35/0.7",
+ "vcc3=ic3*2/0.7",
+ "vcc4=ic4*2.5/0.7",
+ "m1=arange(0.45,5.0,0.0005)",
+ "m2=arange(0.5,5.0,0.0005)",
+ "m3=arange(0.6,5.0,0.0005)",
+ "m4=arange(0.7,5.0,0.0005)",
+ "",
+ "plot(ic1,vcc1,'b')",
+ "plot(ic2,vcc2,'b')",
+ "plot(ic3,vcc3,'b')",
+ "plot(ic4,vcc4,'b')",
+ "plot(m1,0.32*m1/m1,'b')",
+ "plot(m2,0.96*m2/m2,'b')",
+ "plot(m3,1.712*m3/m3,'b')",
+ "plot(m4,2.5*m4/m4,'b')",
+ "",
+ "ylim( (0,3) )",
+ "ylabel('Ic(mA)')",
+ "xlabel('Vce(V)')",
+ "title('Ideal family of collector curve')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Ideal family of collector curve"
+ ]
+ },
+ {
+ "output_type": "pyout",
+ "prompt_number": 4,
+ "text": [
+ "<matplotlib.text.Text at 0xa11e74c>"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "png": "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\nYII=\n"
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.4, Page Number: 125<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Transistor saturtion condition'''",
+ "",
+ "# variable declaration",
+ "V_CE_sat=0.2; # voltage in volt",
+ "V_BE=0.7; # voltage in volt",
+ "V_BB=3; # voltage in volt",
+ "V_CC=10; # voltage in volt",
+ "B_DC=50; # voltage in volt",
+ "R_B=10*10**3; # resistance in ohm",
+ "R_C=1*10**3; # resistance in ohm",
+ "",
+ "#calculation",
+ "I_C_sat=(V_CC-V_CE_sat)/R_C; # saturation current",
+ "I_B=(V_BB-V_BE)/R_B; # base current",
+ "I_C=B_DC*I_B; # current in ampere",
+ "",
+ "# result",
+ "if I_C>I_C_sat:",
+ " print \"transistor in saturation\"",
+ "else:",
+ " print \"transistor not in saturation\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "transistor in saturation"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.5, Page Number: 127<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''maximum collector current'''",
+ "",
+ "#Variable declaration",
+ "P_D_max=250*10**-3; #max power rating of transistor in watts",
+ "V_CE=6; #voltage in volt",
+ "",
+ "#Calculation",
+ "I_Cu=P_D_max/V_CE; #Current (Amp)",
+ "I_C=I_Cu*1000;",
+ "",
+ "#Result",
+ "print \"collector current that can be handled by the transistor = %.1f mA\" %I_C",
+ "print \"\\nRemember that this is not necessarily the maximum IC. The transistor\"",
+ "print \"can handle more collectore current if Vce is reduced as long as PDmax\"",
+ "print \"is not exceeded.\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "collector current that can be handled by the transistor = 41.7 mA",
+ "",
+ "Remember that this is not necessarily the maximum IC. The transistor",
+ "can handle more collectore current if Vce is reduced as long as PDmax",
+ "is not exceeded."
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.6, Page Number: 127<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''voltage drop across transistor''' ",
+ "",
+ "#Variable declaration",
+ "P_D_max=800*10**-3; #max power rating of transistor in watts",
+ "V_BE=0.7; #voltage in volt",
+ "V_CE_max=15; #voltage in volt",
+ "I_C_max=100*10**-3; #Current (Amp)",
+ "V_BB=5; #voltage in volt",
+ "B_DC=100; #voltage in volt",
+ "R_B=22*10**3; # resistance in ohm",
+ "R_C=10**3; # resistance in ohm",
+ "",
+ "#Calculation",
+ "I_B=(V_BB-V_BE)/R_B; # base current",
+ "I_C=B_DC*I_B; #collector current ",
+ "V_R_C=I_C*R_C; #voltage drop across R_C",
+ "V_CC_max=V_CE_max+V_R_C; #Vcc max in volt",
+ "P_D=I_C*V_CE_max; #max power rating",
+ "",
+ "#Result",
+ "if P_D<P_D_max:",
+ " print \"V_CC = %.2f volt\" %V_CC_max",
+ " print \"V_CE_max will be exceeded first because entire supply voltage V_CC will be dropped across the transistor\"",
+ " "
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "V_CC = 34.55 volt",
+ "V_CE_max will be exceeded first because entire supply voltage V_CC will be dropped across the transistor"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.7, Page Number: 128<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Power dissipation'''",
+ "",
+ "#Variable declaration",
+ "df=5*10**-3; #derating factor in watts per degree celsius",
+ "T1=70; #temperature 1",
+ "T2=25; #temperature 2",
+ "P_D_max=1; #in watts",
+ "",
+ "#Calculation",
+ "del_P_D=df*(T1-T2); #change due to temperature",
+ "P_D=P_D_max-del_P_D; # power dissipation",
+ "",
+ "#Result",
+ "print \"Power dissipated max at a temperature of 70 degree celsius = %.3f watts\" %P_D"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Power dissipated max at a temperature of 70 degree celsius = 0.775 watts"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.8, Page Number: 130<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''voltage gain'''",
+ "",
+ "#Variable declaration",
+ "R_C=1*10**3; #resistance in ohm",
+ "r_e=50; #resistance in ohm",
+ "V_b=100*10**-3; #voltage in volt",
+ "",
+ "#Calculation",
+ "A_v=R_C/r_e; #voltage gain",
+ "V_out=A_v*V_b; #voltage in volt",
+ "",
+ "#Result",
+ "print \"voltage gain = %d \" %A_v",
+ "print \"AC output voltage = %d volt\" %V_out"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "voltage gain = 20 ",
+ "AC output voltage = 2 volt"
+ ]
+ }
+ ],
+ "prompt_number": 9
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 4.9, Page Number: 132 <h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Power dissipation'''",
+ "",
+ "#Variable declaration",
+ "V_CC=10.0; #voltage in volt",
+ "B_DC=200.0; #voltage in volt",
+ "R_C=1.0*10**3; #resistance in ohm",
+ "V_IN=0.0; #voltage in volt",
+ "",
+ "#Calculation",
+ "V_CE=V_CC; #equal voltage",
+ "print \"when V_IN=0, transistor acts as open switch(cut-off) and collector emitter voltage = %.2f volt\" %V_CE",
+ "#now when V_CE_sat is neglected",
+ "I_C_sat=V_CC/R_C; #saturation current",
+ "I_B_min=I_C_sat/B_DC; #minimum base current",
+ "print \"\\nminimum value of base current to saturate transistor = %.5f ampere\" %I_B_min",
+ "V_IN=5; #voltage in volt",
+ "V_BE=0.7; #voltage in volt",
+ "V_R_B=V_IN-V_BE; #voltage across base resiatance",
+ "R_B_max=V_R_B/I_B_min;",
+ "",
+ "",
+ "#Result",
+ "kw=round (R_B_max)",
+ "print \"\\nmaximum value of base resistance when input voltage is 5V = %d ohm\" %kw"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "when V_IN=0, transistor acts as open switch(cut-off) and collector emitter voltage = 10.00 volt",
+ "",
+ "minimum value of base current to saturate transistor = 0.00005 ampere",
+ "",
+ "maximum value of base resistance when input voltage is 5V = 86000 ohm"
+ ]
+ }
+ ],
+ "prompt_number": 10
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C++/screenshots/Chapter13.png b/tbc/static/uploads/Hardik/C++/screenshots/Chapter13.png
new file mode 100644
index 0000000..175e51b
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C++/screenshots/Chapter13.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C++/screenshots/Chapter4.png b/tbc/static/uploads/Hardik/C++/screenshots/Chapter4.png
new file mode 100644
index 0000000..9aa5de3
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C++/screenshots/Chapter4.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C++/screenshots/xyz.png b/tbc/static/uploads/Hardik/C++/screenshots/xyz.png
new file mode 100644
index 0000000..a3aae3c
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C++/screenshots/xyz.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C/images/certificate.png b/tbc/static/uploads/Hardik/C/images/certificate.png
new file mode 100644
index 0000000..c473b82
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C/images/certificate.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C/images/pr.jpeg b/tbc/static/uploads/Hardik/C/images/pr.jpeg
new file mode 100644
index 0000000..a7edf07
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C/images/pr.jpeg
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C/images/scipy.png b/tbc/static/uploads/Hardik/C/images/scipy.png
new file mode 100644
index 0000000..0036b02
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C/images/scipy.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C/newton.py b/tbc/static/uploads/Hardik/C/newton.py
new file mode 100644
index 0000000..258dc58
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C/newton.py
@@ -0,0 +1,35 @@
+from sympy import *
+import sys
+
+
+print "Enter a function: ",
+func = raw_input()
+
+try:
+ sym_x = Symbol('x')
+ fx = S(func)
+ fdashx = diff(fx, Symbol('x'))
+except:
+ print "Function could not be differenciated..."
+ sys.exit()
+
+print "Enter initial guess: ",
+curr_root = float(raw_input())
+print "Enter precision value: ",
+precision = float(raw_input())
+new_root = (curr_root - fx.subs({sym_x : curr_root})/fdashx.subs({sym_x : curr_root}))
+
+
+iterations = 1
+while(abs(new_root-curr_root)>precision):
+ curr_root = new_root
+ new_root = (curr_root - fx.subs({sym_x : curr_root})/fdashx.subs({sym_x : curr_root}))
+ iterations += 1
+ if iterations >= 50:
+ print "Root was not derived uptil 50 iterations, current root: ", curr_root
+ break
+
+print "Function: ", fx
+print "Given tolerance: ", precision
+print "Number of iterations: ", iterations
+print "Root to the funtion upto given precision: ", curr_root
diff --git a/tbc/static/uploads/Hardik/C/newton_raphson.py b/tbc/static/uploads/Hardik/C/newton_raphson.py
new file mode 100644
index 0000000..c18f135
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C/newton_raphson.py
@@ -0,0 +1,132 @@
+import math # Need to import math to use the log function
+from Tkinter import *
+import ttk
+import tkMessageBox
+import tkFileDialog
+import os
+import sys
+# Variables that should be noted
+# G = Guess value
+# count = f(x)
+# den = f'(x)
+# Acc = Accuracy input from user
+
+def CheckVals():
+# Define variables as floats - decimal places
+ r = 1
+ if r == 1:
+ try: #If any of the variables have errors catch
+ G = float(GuessInp.get())
+ A = float(AInp.get())
+ B = float(BInp.get())
+ Precision = int(AccInp.get())
+ r = 0
+ CalcRoot()
+ except ValueError:
+ tkinter.messagebox.showinfo("Look carefully","Oops, a variable isn't properly set")
+ r = 0
+
+ return
+
+def CalcRoot():
+ # Start the while loop
+ G = float(GuessInp.get())
+ A = float(AInp.get())
+ B = float(BInp.get())
+ Precision = int(AccInp.get())
+ Acc = math.pow(0.1,Precision)
+
+ count = Acc+1 # Just so we can get into the while loop (count > Acc)
+ while count > Acc :
+ count = (G*(math.log(A*G)))
+ count = count - B
+ if count > Acc:
+
+ if count*A < 0: #Value not allowed
+ tkinter.messagebox.showinfo("Look carefully","Calculations will become unstable Pi * a <0")
+ return
+
+## if ((math.pow(math.exp(1),-1)/A)*count): #This seems like one of the prerequisites not sure if there is a typing error on the tut
+## tkinter.messagebox.showinfo("Look carefully","Calculations will become unstable Pi((e^-1)/a)")
+## return
+
+ #Actual calculation
+ den =(math.log(A*G)) #This is the derivtive denominator
+ den = den + 1
+ numb = count/den
+ Temp = G - numb #Guess value minus the calculated numb
+ G = Temp
+ count = (G*(math.log(A*G)))
+ count = count - B
+
+ button1.pack_forget() #Hide Calculate button after success
+ GText = StringVar()
+ GText.set("Calculated Root: ")
+ label1 = Label(app, textvariable=GText, height = 4)
+ label1.pack()
+ Roottxt = StringVar(None)
+ Roottxt.set(G)
+ label7 = Label(app, textvariable=Roottxt)
+ label7.pack()
+ return
+
+
+app = Tk()
+app.title ("Newton Raphson approximation")
+app.geometry('340x550+100+100')
+
+CommText = StringVar()
+CommText.set("Please complete the form and then click calculate")
+label1 = Label(app, textvariable=CommText, height = 4)
+label1.pack()
+
+fxtxt = StringVar()
+fxtxt.set("f(x) = (x * Ln(x * a)) - b\nf'(x) = 1 + Ln(ax)")
+label2 = Label(app, textvariable=fxtxt, height = 4)
+label2.pack()
+
+#Input a
+Atxt = StringVar()
+Atxt.set("a = ")
+label3 = Label(app, textvariable=Atxt, height = 2)
+label3.pack()
+
+A = StringVar(None)
+AInp = Entry(app, textvariable=A)
+AInp.pack()
+
+#Input b
+Btxt = StringVar()
+Btxt.set("b = ")
+label4 = Label(app, textvariable=Btxt, height = 2)
+label4.pack()
+
+B = StringVar(None)
+BInp = Entry(app, textvariable=B)
+BInp.pack()
+
+#Input acc
+DegText = StringVar()
+DegText.set("To what accuracy do you want the root: ")
+label5 = Label(app, textvariable=DegText, height = 4)
+label5.pack()
+
+Acc = StringVar(None)
+AccInp = Entry(app, textvariable=Acc)
+AccInp.pack()
+
+#Input guess
+Guesstxt = StringVar()
+Guesstxt.set("What is your guess of the root")
+label6 = Label(app, textvariable=Guesstxt, height = 4)
+label6.pack()
+
+G = StringVar(None)
+GuessInp = Entry(app, textvariable=G)
+GuessInp.pack()
+
+#Calculation button
+button1 = Button(app, text = "Calculate root", width = 20, command = CheckVals)
+button1.pack(padx = 15,pady = 15)
+
+app.mainloop()
diff --git a/tbc/static/uploads/Hardik/C/nr.py b/tbc/static/uploads/Hardik/C/nr.py
new file mode 100644
index 0000000..47ac557
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C/nr.py
@@ -0,0 +1,51 @@
+import sys, math, argparse, time
+from sympy import *
+
+start_time = time.time()
+
+# using argparse to get command line arguments
+parser = argparse.ArgumentParser()
+parser.add_argument("-f", "--function", help = "Define a function")
+parser.add_argument("-s", "--starting", help = "Starting point value", type = float, default = 0.0)
+parser.add_argument("-p", "--precision", help = "Convergence precision", type = float, default = 5*10**(-6))
+args = parser.parse_args()
+
+sym_x = Symbol('x')
+# convert the given function to a symbolic expression
+try:
+ fx = S(args.function)
+except:
+ sys.exit('Unable to convert function to symbolic expression.')
+
+# calculate the differential of the function
+try:
+ dfdx = diff(fx, Symbol('x'))
+except:
+ sys.exit('Unable to differentiate function.')
+
+# e is the relative error between 2 consecutive estimations of the root
+e = 1
+x0 = args.starting
+iterations = 0
+
+while ( e > args.precision ):
+ # new root estimation
+ try:
+ r = x0 - fx.subs({sym_x : x0})/dfdx.subs({sym_x : x0})
+ except ZeroDivisionError:
+ print "Function derivative is zero. Division by zero, program will terminate."
+ sys.exit()
+ # relative error
+ e = abs((r - x0)/r)
+ iterations += 1
+ x0 = r
+
+total_time = time.time() - start_time
+
+print 'Function:'
+pprint(fx)
+print 'Derivative:'
+pprint(dfdx)
+print 'Root %10.6f calculated after %d iterations'%(r, iterations)
+print 'Function value at root %10.6f'%(fx.subs({sym_x : r}),)
+print 'Finished in %10.6f seconds'%(total_time,)
diff --git a/tbc/static/uploads/Hardik/C: The Basics/Chapter16.ipynb b/tbc/static/uploads/Hardik/C: The Basics/Chapter16.ipynb
new file mode 100644
index 0000000..8ab4848
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C: The Basics/Chapter16.ipynb
@@ -0,0 +1,305 @@
+{
+ "metadata": {
+ "name": "Chapter_16"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 16: Oscillators<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 16.1, Page Number: 524<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Wien bridge oscillator'''",
+ "",
+ "import math",
+ "R1=10*10**3;",
+ "R2=R1;",
+ "R=R1;",
+ "C1=0.01*10**-6;",
+ "C2=C1;",
+ "C=C1;",
+ "R3=1*10**3;",
+ "r_ds=500;",
+ "f_r=1/(2*math.pi*R*C);",
+ "print('resonant frequency of the Wein-bridge oscillator in Hertz = %.4f'%f_r)",
+ "#closed loop gain A_v=3 to sustain oscillations",
+ "A_v=3;",
+ "#A_v=(R_f+R_i)+1 where R_i is composed of R3 and r_ds",
+ "R_f=(A_v-1)*(R3+r_ds);",
+ "print('value of R_f in ohms = %d'%R_f)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "resonant frequency of the Wein-bridge oscillator in Hertz = 1591.5494",
+ "value of R_f in ohms = 3000"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 16.2, Page Number: 525<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Phase shift oscillator'''",
+ "",
+ "import math",
+ "A_cl=29; #A_cl=R_f/R_i;",
+ "R3=10*10**3;",
+ "R_f=A_cl*R3;",
+ "print('value of R_f in ohms = %d'%R_f)",
+ "#let R1=R2=R3=R and C1=C2=C3=C",
+ "R=R3;",
+ "C3=0.001*10**-6;",
+ "C=C3;",
+ "f_r=1/(2*math.pi*math.sqrt(6)*R*C);",
+ "print('frequency of oscillation in Hertz = %f'%f_r)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "value of R_f in ohms = 290000",
+ "frequency of oscillation in Hertz = 6497.473344"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 16.3, Page Number: 530<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''FET Colpitts oscillator'''",
+ "",
+ "import math",
+ "C1=0.1*10**-6;",
+ "C2=0.01*10**-6;",
+ "L=50.0*10**-3; #in Henry",
+ "C_T=C1*C2/(C1+C2); #total capacitance",
+ "f_r=1/(2*math.pi*math.sqrt((L*C_T)));",
+ "print('frequency of oscillation in Hertz when Q>10 is \\n\\t %f'%f_r)",
+ "Q=8.0; #when Q drops to 8",
+ "f_r1=(1/(2*math.pi*math.sqrt((L*C_T))))*math.sqrt((Q**2/(1+Q**2)));",
+ "print('frequency of oscillation in hertz when Q=8 is \\n \\t %f'%f_r1)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "frequency of oscillation in Hertz when Q>10 is ",
+ "\t 7465.028533",
+ "frequency of oscillation in hertz when Q=8 is ",
+ " \t 7407.382663"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 16.4, Page Number: 535<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Triangular wave oscillator'''",
+ "",
+ "R1=10.0*10**3;",
+ "R2=33.0*10**3;",
+ "R3=10.0*10**3;",
+ "C=0.01*10**-6;",
+ "f_r=(1/(4*R1*C))*(R2/R3);",
+ "print('frequency of oscillation in hertz is \\n\\t%d'%f_r)",
+ "#the value of R1 when frequency of oscillation is 20 kHz",
+ "f=20.0*10**3;",
+ "R1=(1/(4*f*C))*(R2/R3);",
+ "print('value of R1 in ohms to make frequency 20 kiloHertz is \\n\\t%d'%R1)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "frequency of oscillation in hertz is ",
+ "\t8250",
+ "value of R1 in ohms to make frequency 20 kiloHertz is ",
+ "\t4125"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 16.5, Page Number: 537<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Sawtooth VCO'''",
+ "",
+ "import pylab",
+ "import numpy",
+ "V=15.0;",
+ "C=0.0047*10**-6;",
+ "R3=10.0*10**3;",
+ "R4=R3;",
+ "R2=10.0*10**3;",
+ "R1=68.0*10**3;",
+ "R_i=100.0*10**3;",
+ "V_G=R4*V/(R3+R4); #gate voltage at which PUT turns on",
+ "V_p=V_G; #neglecting 0.7V, this the peak voltage of sawtooth wave",
+ "print('neglecting 0.7V, the peak voltage of sawtooth wave = %.1f V'%V_p)",
+ "V_F=1.0; #minimum peak value of sawtooth wave",
+ "V_pp=V_p-V_F;",
+ "print('peak to peak amplitude of the sawtooth wave = %.1f V'%V_pp)",
+ "V_IN=-V*R2/(R1+R2);",
+ "f=(abs(V_IN)/(R_i*C))*(1/(V_pp));",
+ "print('frequency of the sawtooth wave = %.1f Hz'%f)",
+ "",
+ "#############PLOT###############################",
+ "",
+ "t = arange(0.0, 2.0, 0.0005)",
+ "t1= arange(2.0, 4.0, 0.0005)",
+ "t2= arange(4.0, 6.0, 0.0005)",
+ "k=arange(0.1,7.5, 0.0005)",
+ "t3=(2*k)/k",
+ "t4=(4*k)/k",
+ "t6=(6*k)/k",
+ "",
+ "subplot(111)",
+ "plot(t, (6.5/2)*t+1)",
+ "plot(t1, (6.5/2)*t+1,'b')",
+ "plot(t2, (6.5/2)*t+1,'b')",
+ "plot(t3,k,'b')",
+ "plot(t4,k,'b')",
+ "plot(t6,k,'b')",
+ "",
+ "ylim( (1,8) )",
+ "ylabel('Vout')",
+ "xlabel('ms')",
+ "title('Output of the Circuit')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "neglecting 0.7V, the peak voltage of sawtooth wave = 7.5 V",
+ "peak to peak amplitude of the sawtooth wave = 6.5 V",
+ "frequency of the sawtooth wave = 629.5 Hz"
+ ]
+ },
+ {
+ "output_type": "pyout",
+ "prompt_number": 6,
+ "text": [
+ "<matplotlib.text.Text at 0xa046eec>"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "png": "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\n"
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 16.6, Page Number: 542<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''555 timer'''",
+ "",
+ "R1=2.2*10**3;",
+ "R2=4.7*10**3;",
+ "C_ext=0.022*10**-6;",
+ "f_r=1.44/((R1+2*R2)*C_ext);",
+ "print('frequency of the 555 timer in hertz = %f'%f_r)",
+ "duty_cycle=((R1+R2)/(R1+2*R2))*100;",
+ "print('duty cycle in percentage = %f'%duty_cycle)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "frequency of the 555 timer in hertz = 5642.633229",
+ "duty cycle in percentage = 59.482759"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C: The Basics/Chapter17.ipynb b/tbc/static/uploads/Hardik/C: The Basics/Chapter17.ipynb
new file mode 100644
index 0000000..1f3eeb4
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C: The Basics/Chapter17.ipynb
@@ -0,0 +1,322 @@
+{
+ "metadata": {
+ "name": "Chapter_17"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 17: Voltage Regulators<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.1, Page Number:552 <h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Percentage line regulation'''",
+ "",
+ "#variable declaration",
+ "Del_V_out=0.25;",
+ "V_out=15;",
+ "Del_V_in=5; #All voltages in Volts",
+ "",
+ "#Calculations",
+ "line_regulation=((Del_V_out/V_out)/Del_V_in)*100;",
+ "",
+ "#Result",
+ "print('line regulation in %%V is %f' %line_regulation)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "line regulation in %V is 0.333333"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.2, Page Number: 553<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Load regulation percentage'''",
+ "",
+ "# Variable Declaration",
+ "V_NL=12.0; #No load output voltage in Volts",
+ "V_FL=11.9; #Full load output voltage in Volts",
+ "I_F=10.0; #Full load current in milli-Amperes",
+ "",
+ "#Calculations",
+ "load_regulation=((V_NL-V_FL)/V_FL)*100;",
+ "load_reg=load_regulation/I_F;",
+ "",
+ "#Result",
+ "print('load regulation as percentage change from no load to full load = %f'%load_regulation)",
+ "print('\\nload regulation as percentage change per milliampere = %f' %load_reg)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "load regulation as percentage change from no load to full load = 0.840336",
+ "",
+ "load regulation as percentage change per milliampere = 0.084034"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.3, Page Number: 556<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Series regulator'''",
+ "",
+ "",
+ "V_REF=5.1 #Zener voltage in volts",
+ "R2=10*10**3;",
+ "R3=10*10**3; #resistances in ohm",
+ "V_out=(1+(R2/R3))*V_REF;",
+ "print('output voltage in volts = %.1f'%V_out)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "output voltage in volts = 10.2"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.4, Page Number: 557<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Overload protection'''",
+ "",
+ "R4=1; #Resistance in Ohms",
+ "I_L_max=0.7/R4;",
+ "print('maximum current provided to load(in amperes) = %.1f'%I_L_max)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "maximum current provided to load(in amperes) = 0.7"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.5, Page Number: 560<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Shunt regulator'''",
+ "",
+ "V_IN=12.5; #maximum input voltage in volts",
+ "R1=22; #In Ohms",
+ "#Worst case of power dissipation is when V_OUT=0V",
+ "V_OUT=0;",
+ "V_R1=V_IN-V_OUT; #Voltage across R1",
+ "P_R1=(V_R1*V_R1)/R1; #maximum power dissipated by R1",
+ "print('maximum power dissipated by R1 in WATTS = %f'%P_R1)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "maximum power dissipated by R1 in WATTS = 7.102273"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.6, Page Number: 569<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Positive linear voltage regulator'''",
+ "",
+ "print('SAME AS EX-2.8 in CHAPTER-2')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "SAME AS EX-2.8 in CHAPTER-2"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.7, Page Number: 572<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''External pass Filter'''",
+ "",
+ "I_max=700*10**-3; #in Amperes",
+ "R_ext=0.7/I_max;",
+ "print('value of resistor in Ohms for which max current is 700mA = %f'%R_ext)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "value of resistor in Ohms for which max current is 700mA = 1.000000"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.8, Page Number: 572<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Power rating 7824'''",
+ "",
+ "V_OUT=24.0; #Output voltage in Volts",
+ "R_L=10.0; #Load resistance in Ohms",
+ "V_IN=30.0; #Input voltage in Volts",
+ "I_max=700.0*10**-3; #maximum interal current in Amperes",
+ "I_L=V_OUT/R_L; #load current in amperes",
+ "I_ext=I_L-I_max; #current through the external pass transistor in Amperes",
+ "P_ext_Qext=I_ext*(V_IN-V_OUT); #power dissipated",
+ "print('power dissiated(in WATTS) by the external pass transistor = %.1f'%P_ext_Qext)",
+ "print('\\nFor safety purpose, we choose a power transistor with rating more than this, say 15W')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "power dissiated(in WATTS) by the external pass transistor = 10.2",
+ "",
+ "For safety purpose, we choose a power transistor with rating more than this, say 15W"
+ ]
+ }
+ ],
+ "prompt_number": 9
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 17.9, Page Number: 574<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Current regulator'''",
+ "",
+ "V_out=5.0; #7805 gives output voltage of 5V",
+ "I_L=1.0; #constant current of 1A",
+ "R1=V_out/I_L;",
+ "print('The value of current-setting resistor in ohms = %d'%R1)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "The value of current-setting resistor in ohms = 5"
+ ]
+ }
+ ],
+ "prompt_number": 10
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C: The Basics/Chapter18.ipynb b/tbc/static/uploads/Hardik/C: The Basics/Chapter18.ipynb
new file mode 100644
index 0000000..b651b59
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C: The Basics/Chapter18.ipynb
@@ -0,0 +1,57 @@
+{
+ "metadata": {
+ "name": "Chapter_18"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 18: Programmable Analog Arrays<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 18.1, Page Number: 588<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Switching capacitor'''",
+ "",
+ "import math",
+ "#Variable declaration",
+ "C=1000*10**-12; #Switche capacitor value in farads",
+ "R=1000; #resistance in ohms",
+ "",
+ "#calculation",
+ "T=R*C; #Time period",
+ "f=1/T; #Frequency at which switch should operate",
+ "f=math.ceil(f)",
+ "#Result",
+ "print('Frequency at which each switch should operate(in hertz) is \\n %d' %f)",
+ "print('Duty cycle should be 50%')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Frequency at which each switch should operate(in hertz) is ",
+ " 1000000",
+ "Duty cycle should be 50%"
+ ]
+ }
+ ],
+ "prompt_number": 1
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter13.png b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter13.png
new file mode 100644
index 0000000..175e51b
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter13.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter5.png b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter5.png
new file mode 100644
index 0000000..5ab17e3
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter5.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter6.png b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter6.png
new file mode 100644
index 0000000..782c6b2
--- /dev/null
+++ b/tbc/static/uploads/Hardik/C: The Basics/screenshots/Chapter6.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/PHP/Chapter13.png b/tbc/static/uploads/Hardik/PHP/Chapter13.png
new file mode 100644
index 0000000..175e51b
--- /dev/null
+++ b/tbc/static/uploads/Hardik/PHP/Chapter13.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/PHP/Chapter4.png b/tbc/static/uploads/Hardik/PHP/Chapter4.png
new file mode 100644
index 0000000..9aa5de3
--- /dev/null
+++ b/tbc/static/uploads/Hardik/PHP/Chapter4.png
Binary files differ
diff --git a/tbc/static/uploads/Hardik/PHP/Chapter6.png b/tbc/static/uploads/Hardik/PHP/Chapter6.png
new file mode 100644
index 0000000..782c6b2
--- /dev/null
+++ b/tbc/static/uploads/Hardik/PHP/Chapter6.png
Binary files differ
diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter5.ipynb b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter5.ipynb
new file mode 100644
index 0000000..1b45662
--- /dev/null
+++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter5.ipynb
@@ -0,0 +1,427 @@
+{
+ "metadata": {
+ "name": "Chapter_5"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 5: Transistor Bias Circuits<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.1, Page Number: 146<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Peak base current'''",
+ "",
+ "# variable declaration",
+ "V_BB=10.0; #voltage in volt",
+ "V_CC=20.0; #voltage in volt",
+ "B_DC=200.0; #B_DC value",
+ "R_B=47.0*10**3; #resistance in ohm",
+ "R_C=330.0; #resistance in ohm",
+ "V_BE=0.7; #voltage in volt",
+ "",
+ "#current",
+ "I_B=(V_BB-V_BE)/R_B; #base current",
+ "I_C=B_DC*I_B; #Q POINT",
+ "V_CE=V_CC-I_C*R_C; #Q POINT",
+ "I_C_sat=V_CC/R_C; #saturation current",
+ "I_c_peak=I_C_sat-I_C; #peak current ",
+ "I_b_peak=I_c_peak/B_DC; #peak current in ampere",
+ "",
+ "#result",
+ "print \"Q point of I_C = %.3f amperes\" %I_C",
+ "print \"Q point of V_CE = %.2f volts\" %V_CE",
+ "print \"peak base current = %.4f amperes\" %I_b_peak"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Q point of I_C = 0.040 amperes",
+ "Q point of V_CE = 6.94 volts",
+ "peak base current = 0.0001 amperes"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.2, Page Number: 149<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' DC input resistance'''",
+ "",
+ "# variable declaration",
+ "B_DC=125.0; #DC value",
+ "R_E=10.0**3; #resistance in ohm",
+ "",
+ "#calculation",
+ "R_IN_base=B_DC*R_E; #base resistance",
+ "",
+ "#Result",
+ "print \"DC input resistance, looking at base of transistor = %d ohm\" %R_IN_base"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "DC input resistance, looking at base of transistor = 125000 ohm"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.3, Page Number: 151<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Transistor saturation condition'''",
+ "",
+ "# variable declaration",
+ "B_DC=100; #DC value",
+ "R1=10*10**3; #resistance in ohm",
+ "R2=5.6*10**3; #resistance in ohm",
+ "R_C=1*10**3; #resistance in ohm",
+ "R_E=560; #resistance in ohm",
+ "V_CC=10; #voltage in volt",
+ "V_BE=0.7 #voltage in volt",
+ "",
+ "#calculation",
+ "R_IN_base=B_DC*R_E; #calculate base resistance",
+ "#We can neglect R_IN_base as it is equal to 10*R2",
+ "print \"input resistance seen from base = %d ohm\" %R_IN_base",
+ "print \"which can be neglected as it is 10 times R2\"",
+ "",
+ "V_B=(R2/(R1+R2))*V_CC; #base voltage",
+ "V_E=V_B-V_BE; #emitter voltage",
+ "I_E=V_E/R_E; #emitter current",
+ "I_C=I_E; #currents are equal",
+ "V_CE=V_CC-I_C*(R_C+R_E); #voltage in volt",
+ "",
+ "#result",
+ "print \"V_CE = %.2f volts\" %V_CE",
+ "print \"I_C = %.3f amperes\" %I_C",
+ "print \"Since V_CE>0V, transistor is not in saturation\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "input resistance seen from base = 56000 ohm",
+ "which can be neglected as it is 10 times R2",
+ "V_CE = 1.95 volts",
+ "I_C = 0.005 amperes",
+ "Since V_CE>0V, transistor is not in saturation"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.4, Page Number: 154<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Emitter-Collector Voltage'''",
+ "",
+ "# variable declaration",
+ "V_EE=10.0; #voltage in volt",
+ "V_BE=0.7; #voltage in volt",
+ "B_DC=150.0; #DC value ",
+ "R1=22.0*10**3; #resistance in ohm",
+ "R2=10.0*10**3; #resistance in ohm",
+ "R_C=2.2*10**3; #resistance in ohm",
+ "R_E=1.0*10**3; #resistance in ohm",
+ "",
+ "#calculation",
+ "R_IN_base=B_DC*R_E; #R_IN_base>10*R2,so it can be neglected",
+ "print \"input resistance as seen from base = %d ohm\" %R_IN_base",
+ "print \"it can be neglected as it is greater than 10 times R2\"",
+ "V_B=(R1/(R1+R2))*V_EE; #base voltage",
+ "V_E=V_B+V_BE; #emitter voltage",
+ "I_E=(V_EE-V_E)/R_E; #emitter current",
+ "I_C=I_E; #currents are equal",
+ "V_C=I_C*R_C; #collector voltage",
+ "V_EC=V_E-V_C; #emitter-collector voltage",
+ "",
+ "#result",
+ "print \"I_C collector current = %.4f amperes\" %I_C",
+ "print \"V_EC emitter-collector voltage = %.2f Volts\" %V_EC"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "input resistance as seen from base = 150000 ohm",
+ "it can be neglected as it is greater than 10 times R2",
+ "I_C collector current = 0.0024 amperes",
+ "V_EC emitter-collector voltage = 2.24 Volts"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.5, PAge Number: 154<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Collector-Emitter Voltage'''",
+ "",
+ "# variable declaration",
+ "R1=68.0*10**3; #resistance in ohm",
+ "R2=47.0*10**3; #resistance in ohm",
+ "R_C=1.8*10**3; #resistance in ohm",
+ "R_E=2.2*10**3; #resistance in ohm",
+ "V_CC=-6.0; #voltage in volt",
+ "V_BE=0.7; #voltage in volt",
+ "B_DC=75.0; #DC value",
+ "",
+ "#calculation",
+ "R_IN_base=B_DC*R_E;",
+ "print \"input resistance as seen from base\"",
+ "print \"is not greater than 10 times R2 so it should be taken into account\"",
+ "#R_IN_base in parallel with R2",
+ "V_B=((R2*R_IN_base)/(R2+R_IN_base)/(R1+(R2*R_IN_base)/(R2+R_IN_base)))*V_CC;",
+ "V_E=V_B+V_BE; #emitter voltage",
+ "I_E=V_E/R_E; #emitter current",
+ "I_C=I_E; #currents are equal",
+ "V_C=V_CC-I_C*R_C; #collector voltage",
+ "V_CE=V_C-V_E; #collector-emitter voltage",
+ "",
+ "#result",
+ "print \"collector current = %.4f amperes\" %I_C",
+ "print \"collector emitter voltage = %.2f volts\" %V_CE"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "input resistance as seen from base",
+ "is not greater than 10 times R2 so it should be taken into account",
+ "collector current = -0.0006 amperes",
+ "collector emitter voltage = -3.46 volts"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.6, Page Number: 156<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' change in collector emitter voltage'''",
+ "",
+ "# variable declaration",
+ "V_CC=12.0; #voltage in volt",
+ "R_B=100.0*10**3; #resistance in ohm",
+ "R_C=560.0; #resistance in ohm",
+ "#FOR B_DC=85 AND V_BE=0.7V",
+ "B_DC=85.0; #DC value",
+ "V_BE=0.7; #base-emitter voltage",
+ "",
+ "#calculation",
+ "I_C_1=B_DC*(V_CC-V_BE)/R_B; #collector current",
+ "V_CE_1=V_CC-I_C_1*R_C; #collector-emittor voltage",
+ "#FOR B_DC=100 AND V_BE=0.6V",
+ "B_DC=100.0; #DC value ",
+ "V_BE=0.6; #base emitter voltage",
+ "I_C_2=B_DC*(V_CC-V_BE)/R_B; #collector current",
+ "V_CE_2=V_CC-I_C_2*R_C; #voltage in volt",
+ "p_del_I_C=((I_C_2-I_C_1)/I_C_1)*100; #percent change in collector current ",
+ "p_del_V_CE=((V_CE_2-V_CE_1)/V_CE_1)*100; #percent change in C-E voltage",
+ "",
+ "#result",
+ "print \"percent change in collector current = %.2f\" %p_del_I_C",
+ "print \"percent change in collector emitter voltage = %.2f\" %p_del_V_CE"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "percent change in collector current = 18.69",
+ "percent change in collector emitter voltage = -15.18"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.7, Page Number: 159<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' percent change in collector emitter voltage'''",
+ "",
+ "# variable declaration",
+ "V_CC=20.0; #voltage in volt",
+ "R_C=4.7*10**3; #resistance in ohm",
+ "R_E=10.0*10**3; #resistance in ohm",
+ "V_EE=-20.0; #voltage in volt",
+ "R_B=100*10**3; #resistance in ohm",
+ "#FOR B_DC=85 AND V_BE=0.7V",
+ "B_DC=85; #DC value",
+ "V_BE=0.7; #base-emitter voltage",
+ "I_C_1=(-V_EE-V_BE)/(R_E+(R_B/B_DC));",
+ "V_C=V_CC-I_C_1*R_C; #colector voltage",
+ "I_E=I_C_1; #emittor current",
+ "V_E=V_EE+I_E*R_E; #emittor voltage",
+ "V_CE_1=V_C-V_E; #CE voltage",
+ "print \"I_C_1 = %.3f\" %I_C_1",
+ "print \"V_CE_1 = %.2f\" %V_CE_1",
+ "#FOR B_DC=100 AND V_BE=0.6V",
+ "B_DC=100; #DC value ",
+ "V_BE=0.6; #base-emitter voltage",
+ "I_C_2=(-V_EE-V_BE)/(R_E+(R_B/B_DC));",
+ "V_C=V_CC-I_C_2*R_C;#colector voltage",
+ "I_E=I_C_2; #emittor current",
+ "V_E=V_EE+I_E*R_E; #emittor voltage",
+ "V_CE_2=V_C-V_E; #CE voltage",
+ "print \"I_C_2 = %.3f\" %I_C_2",
+ "print \"V_CE_2 = %.2f\" %V_CE_2",
+ "",
+ "p_del_I_C=((I_C_2-I_C_1)/I_C_1)*100;",
+ "p_del_V_CE=((V_CE_2-V_CE_1)/V_CE_1)*100;",
+ "print \"percent change in collector currrent = %.2f\" %p_del_I_C",
+ "print \"percent change in collector emitter voltage = %.2f\" %p_del_V_CE",
+ "print \"answers in book are approximated\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "I_C_1 = 0.002",
+ "V_CE_1 = 14.61",
+ "I_C_2 = 0.002",
+ "V_CE_2 = 14.07",
+ "percent change in collector currrent = 2.13",
+ "percent change in collector emitter voltage = -3.69",
+ "answers in book are approximated"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 5.8, Page Number: 161<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Q point current and voltage'''",
+ "",
+ "# variable declaratio",
+ "V_CC=10.0; #voltage in volt",
+ "B_DC=100.0; #Dc value",
+ "R_C=10.0*10**3; #resistance in ohm",
+ "R_B=100.0*10**3; #resistance in ohm",
+ "V_BE=0.7; #base-emittor voltage",
+ "",
+ "#calculation",
+ "I_C=(V_CC-V_BE)/(R_C+(R_B/B_DC)); #collector current",
+ "V_CE=V_CC-I_C*R_C; #CE voltage",
+ "",
+ "#result",
+ "print \"Q point of collector current %.4f amperes\" %I_C",
+ "print \"Q point of collector-emitter voltage %.3f volts\" %V_CE"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Q point of collector current 0.0008 amperes",
+ "Q point of collector-emitter voltage 1.545 volts"
+ ]
+ }
+ ],
+ "prompt_number": 9
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter6.ipynb b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter6.ipynb
new file mode 100644
index 0000000..b4e7e58
--- /dev/null
+++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter6.ipynb
@@ -0,0 +1,603 @@
+{
+ "metadata": {
+ "name": "Chapter_6"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 6: BJT Amplifiers<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.1, Page Number: 171<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Q point'''",
+ "# result",
+ "",
+ "print \"theoretical example\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "theoretical example"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.2, Page Number: 174<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' AC Emitter resistance'''",
+ "",
+ "# variable declaration",
+ "I_E=2.0*10**-3; #emittor current",
+ "",
+ "#calculation",
+ "r_e=25.0*10**-3/I_E; #ac emitter resistance",
+ "",
+ "#result",
+ "print \"ac emitter resistance = %.2f ohms\" %r_e "
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "ac emitter resistance = 12.50 ohms"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.3, Page Number: 178<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' voltage at base of transistor'''",
+ "",
+ "# variable declaration",
+ "I_E=3.8*10**-3; #emittor current",
+ "B_ac=160.0; #AC value",
+ "R1=22*10**3; #resistance in ohm",
+ "R2=6.8*10**3; #resistance in ohm",
+ "R_s=300.0; #resistance in ohm",
+ "V_s=10.0*10**-3; #voltage in volt",
+ "r_e=25.0*10**-3/I_E; ",
+ "",
+ "#calculation",
+ "R_in_base=B_ac*r_e; #base resistance",
+ "R_in_tot=(R1*R2*R_in_base)/(R_in_base*R1+R_in_base*R2+R1*R2);",
+ "V_b=(R_in_tot/(R_in_tot+R_s))*V_s; #base voltage",
+ "",
+ "#result",
+ "print \"voltage at the base of the transistor = %.3f volts\" %V_b"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "voltage at the base of the transistor = 0.007 volts"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.4, Page Number: 180<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' bypass capacitor'''",
+ "",
+ "import math",
+ "# variable declaration",
+ "R_E=560.0; #resistance in ohm",
+ "f=2*10**3; #minimum value of frequency in hertz",
+ "X_C=R_E/10.0; #minimum value of capacitive reactance",
+ "",
+ "#calculation",
+ "C2=1.0/(2.0*math.pi*X_C*f); #capacitor ",
+ "",
+ "#result",
+ "print \"value of bypass capacitor = %.7f farads\" %C2"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "value of bypass capacitor = 0.0000014 farads"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.5, Page Number: 181<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' bypass capacitor'''",
+ "",
+ "import math",
+ "# variable declaration",
+ "r_e=6.58; #from ex6.3",
+ "R_C=1.0*10**3; #collector resistance",
+ "R_E=560; #emittor resistance",
+ "",
+ "#calculation",
+ "A_v=R_C/(R_E+r_e); #gain without bypass capacitor",
+ "A_v1=R_C/r_e; #gain with bypass capacitor",
+ "print \"gain without bypass capacitor = %.2f\" %A_v",
+ "print \"gain in the presence of bypass capacitor = %.2f\" %A_v1"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "gain without bypass capacitor = 1.76",
+ "gain in the presence of bypass capacitor = 151.98"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.6, Page Number: 182<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Gain with load'''",
+ "",
+ "# variable declaration",
+ "R_C=10.0**3; #resistance in ohm",
+ "R_L=5.0*10**3; #inductor resistance",
+ "r_e=6.58; #r_e value",
+ "",
+ "#calculation",
+ "R_c=(R_C*R_L)/(R_C+R_L); #collector resistor",
+ "A_v=R_c/r_e; #gain with load",
+ "",
+ "#result",
+ "print \"ac collector resistor = %.2f ohms\" %R_c",
+ "print \"gain with load = %.2f\" %A_v"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "ac collector resistor = 833.33 ohms",
+ "gain with load = 126.65"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.7, Page Number: 184<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Voltage gain with bypass'''",
+ "",
+ "# variable declaration",
+ "R_C=3.3*10**3; #resistance in ohm",
+ "R_E1=330.0; #emitter resistance",
+ "",
+ "#calculation",
+ "A_v=R_C/R_E1; #voltage gain",
+ "",
+ "#result",
+ "print \"approximate voltage gain as R_E2 is bypassed by C2 = %.2f\" %A_v"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "approximate voltage gain as R_E2 is bypassed by C2 = 10.00"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.8, Page Number: 184<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Common emitter amplifier'''",
+ "",
+ "import math",
+ "B_DC=150.0;",
+ "B_ac=175.0;",
+ "V_CC=10.0;",
+ "V_s=10.0*10**-3;",
+ "R_s=600.0;",
+ "R1=47.0*10**3;",
+ "R2=10.0*10**3;",
+ "R_E1=470.0;",
+ "R_E2=470.0;",
+ "R_C=4.7*10**3;",
+ "R_L=47.00*10**3;",
+ "R_IN_base=B_DC*(R_E1+R_E2);",
+ "#since R_IN_base is ten times more than R2,it can be neglected in DC voltage calculation",
+ "V_B=(R2/(R2+R1))*V_CC;",
+ "V_E=V_B-0.7;",
+ "I_E=V_E/(R_E1+R_E2);",
+ "I_C=I_E;",
+ "V_C=V_CC-I_C*R_C;",
+ "print('dc collector voltage = %.3f volts'%V_C)",
+ "r_e=25.0*10**-3/I_E;",
+ "#base resistance",
+ "R_in_base=B_ac*(r_e+R_E1);",
+ "#total input resistance",
+ "R_in_tot=(R1*R2*R_in_base)/(R1*R2+R_in_base*R1+R_in_base*R2);",
+ "attenuation=R_in_tot/(R_s+R_in_tot);",
+ "#ac collector resistance",
+ "R_c=R_C*R_L/(R_C+R_L);",
+ "#voltage gain from base to collector",
+ "A_v=R_c/R_E1;",
+ "#overall voltage gain A_V",
+ "A_V=A_v*attenuation;",
+ "#rms voltage at collector V_c",
+ "V_c=A_V*V_s;",
+ "V_out_p=math.sqrt(2)*V_c;",
+ "print('V_out peak = %d mV'%(V_out_p*1000))",
+ "",
+ "################Waveform plotting##############################",
+ "",
+ "import pylab",
+ "import numpy ",
+ "",
+ "t = arange(0.0, 4.0, 0.0005)",
+ "",
+ "",
+ "subplot(121)",
+ "plot(t, V_C+V_c*sin(2*pi*t))",
+ "ylim( (4.63,4.82) )",
+ "title('Collector Voltage')",
+ "",
+ "subplot(122)",
+ "plot(t, -V_s*sin(2*pi*t))",
+ "plot(t, V_out_p*sin(2*pi*t))",
+ "ylim( (-0.15,0.15) )",
+ "title('Source and output AC voltage')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "dc collector voltage = 4.728 volts",
+ "V_out peak = 119 mV"
+ ]
+ },
+ {
+ "output_type": "pyout",
+ "prompt_number": 9,
+ "text": [
+ "<matplotlib.text.Text at 0xad2caac>"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEICAYAAABfz4NwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8VNX5/z+TzCSZrDPZdxJ2AgipuOBXJahIUcGtKtiy\n1GrBpS4t35/W6he01g33Ulv61SqogEstm4CKGKUuIF8RFSigJJCNrJNlkklme35/HGayTWbunbud\nhPt+vXhp7tx75zPnzjzPOc95znMMRETQ0dHR0TntidBagI6Ojo4OH+gOQUdHR0cHgO4QdHR0dHRO\noTsEHR0dHR0AukPQ0dHR0TmF7hB0dHR0dADoDkEQpaWlyMvL8/9dUFCAjz76SENF8lJeXo6IiAh4\nvV6tpehwyqJFi/Dggw9qLWNI0deu8MBp5RDWrl2LKVOmICEhAdnZ2bjsssvw2Wefib6PwWCAwWCQ\npEXuH9iSJUuwcOHCfsf379+PmJgYNDc3C75XSUkJXn75Zdm0DQX+/e9/47zzzoPFYkFKSgrOP/98\n7N27V2tZqiHHdz4Qy5cvx/z58zW5X0lJCZKTk+F0Ovu9JpetEENBQQF27typ6HuE4rRxCM888wzu\nuecePPDAA6irq0NFRQVuv/12bNq0SWtpYdG3N79o0SK8++676Ojo6HX8tddew+zZs2GxWATfW4kf\n/mCmtbUVV1xxBe666y7YbDZUVVVh2bJliI6Olv29PB6P7PeUi6G0hrW8vBx79uxBenp6Pxugla0w\nGAzatzGdBjQ3N1N8fDy98847A57T2dlJd911F2VnZ1N2djbdfffd1NXVRUREH3/8MeXm5vrPLSgo\noI8++oiIiLxeLz322GM0YsQISklJoeuvv56ampr85+7atYumTp1KFouF8vLy6NVXX6W///3vZDKZ\nKCoqiuLj42nOnDlERHTw4EGaNm0aWSwWGj9+PG3atMl/n4ULF9KSJUto1qxZFBcX53//nowZM4bW\nrFnj/9vtdlN2djZt2rSJvF4v/fGPf6Rhw4ZReno6LViwgFpaWoiIqKysjAwGA7ndbrr//vspMjKS\nYmJiKD4+nn7zm98QEdGdd95JeXl5lJiYSGeeeSbt2rXL/z4dHR20YMECslqtNG7cOHriiSd6tVdV\nVRVdc801lJaWRoWFhfTCCy8IeGr88NVXX5HFYhnw9WBt2/e7Q0Q0bNgw//NbtmwZXXvttfSLX/yC\nEhMT6eWXX6bGxkZatGgRZWdnk9Vqpauuusp/7ebNm2nSpElksVjovPPOo2+//XZAXcGe2bJly+i6\n666jBQsWUEJCAo0fP5727t3rf/3rr7+m4uJiSkhIoBtuuIHmzp1LDzzwgGyff8eOHbRt2zaKiooi\nk8lE8fHxNHnyZCIimjZtGt1333109tlnU2JiIl155ZX+31Q49wvEQw89RLNnz6ZHHnmErrjiCv9x\nIbaiJ19++SVlZmaS1+v1H3v33XfpjDPOICLhduUXv/gFRUREkNlspvj4eFqxYgUREf3sZz+jzMxM\nSkpKogsvvJAOHDjgf5+Ghga64oorKDExkc466yz6wx/+QOeff77/9UOHDtEll1xCycnJNGbMGHrr\nrbdCfp7TwiFs27aNjEYjeTyeAc958MEHaerUqVRfX0/19fV03nnn0YMPPkhEwR3Cc889R1OnTqWq\nqipyOp20ePFimjdvHhERlZeXU0JCAq1fv57cbjc1NjbSN998Q0REixYt8t+fiMjpdNKIESPoscce\nI5fLRTt37qSEhAQ6fPgwETGHkJSURJ9//jkRsS9aX/70pz/RJZdc4v97+/btlJaWRm63m15++WUa\nOXIklZWVkd1up2uuuYbmz59PRN0Owdc+JSUl9PLLL/e69+uvv05NTU3k8Xjo6aefpszMTP8X+957\n76WSkhJqbm6myspKmjhxIuXl5RERkcfjoZ/85Cf0xz/+kVwuFx07doyGDx9O77//fvCHxhGtra2U\nkpJCCxcupG3btvVy+EQUtG0DGbCe359ly5aRyWSijRs3EhGRw+Ggyy67jObOnUvNzc3kcrno008/\nJSJmpNPT02nPnj3k9Xpp9erVVFBQ4H8OfQn2zJYtW0YxMTG0bds28nq99Pvf/57OPfdcIiLq6uqi\n/Px8eu6558jtdtM777xDJpOp1/dVrs+/fPly/7k+pk2bRjk5OXTgwAFqb2/3O8xw7xeIESNG0Ouv\nv05Hjhwhk8lEdXV1RCTMVgS614cffuj/+2c/+xk98cQTRBS+XfHxyiuvkN1uJ6fTSXfffXcvJ3fD\nDTfQvHnzyOFw0MGDBykvL48uuOACIiKy2+2Um5tLr776Knk8Htq3bx+lpqbSwYMHg36W08IhvP76\n65SZmRn0nBEjRtC2bdv8f7///vtUUFBARMEf3Lhx43o9xOrqajKZTOR2u+nRRx+la665JuD7LVq0\n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\nAAAAAElFTkSuQmCC\n"
+ }
+ ],
+ "prompt_number": 9
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.9,Page Number: 190<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Power gain delievered to load'''",
+ "",
+ "# variable declaration",
+ "R_E=10.0**3; #emitter resistance",
+ "R_L=10.0**3; #resistance in ohm",
+ "R1=18.0*10**3; #R1 in ohm",
+ "R2=18.0*10**3; #R2 in ohm",
+ "B_ac=175.0; #AC value",
+ "V_CC=10.0; #voltage in volt",
+ "V_BE=0.7; #base-emitter voltage",
+ "V_in=1.0; #input voltage in volt",
+ "",
+ "#calculation",
+ "",
+ "R_e=(R_E*R_L)/(R_E+R_L); #ac emitter resistance R_e",
+ "R_in_base=B_ac*R_e; #resistance from base R_in_base",
+ "",
+ "#total input resiatance R_in_tot",
+ "R_in_tot=(R1*R2*R_in_base)/(R1*R2+R1*R_in_base+R2*R_in_base);",
+ "print \"total input resistance = %.2f ohms\" %R_in_tot",
+ "V_E=((R2/(R1+R2))*V_CC)-V_BE; #emitter voltage",
+ "I_E=V_E/R_E; #emitter current",
+ "r_e=25.0*10**-3/I_E; #emitter resistance",
+ "A_v=R_e/(r_e+R_e);",
+ "print \"voltage gain = %.2f\" %A_v",
+ "#ac emitter current I_e",
+ "#V_e=A_v*V_b=1V",
+ "V_e=1.0; #V_evoltage",
+ "I_e=V_e/R_e; #emitter current",
+ "I_in=V_in/R_in_tot; #input current in ampere",
+ "A_i=I_e/I_in; #current gain",
+ "print \"current gain = %.2f\" %A_i",
+ "A_p=A_i; #power gain",
+ "#since R_L=R_E, one half of the total power is disspated to R_L",
+ "A_p_load=A_p/2.0; #power load",
+ "print \"power gain delivered to load = %.2f\" %A_p_load"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "total input resistance = 8160.62 ohms",
+ "voltage gain = 0.99",
+ "current gain = 16.32",
+ "power gain delivered to load = 8.16"
+ ]
+ }
+ ],
+ "prompt_number": 10
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.10, Page Number: 193<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Overall voltage gain'''",
+ "",
+ "# variable declaration",
+ "V_CC=12.0; #source voltage in volt",
+ "V_BE=0.7; #base-emitter volatge",
+ "R_C=1.0*10**3; #resistance in ohm",
+ "r_e_ce=5.0; #for common emitter amplifier",
+ "R1=10.0*10**3; #resistance in ohm",
+ "R2=22.0*10**3; #resistance in ohm ",
+ "R_E=22.0; #emitter resistance in ohm",
+ "R_L=8.0; #load resistance in ohm",
+ "B_DC=100.0; #dc value",
+ "B_ac=100.0; #ac value",
+ "",
+ "#calculation",
+ "pt=R2+B_DC**2*R_E #temp variable",
+ "V_B=((R2*B_DC**2*R_E/(pt))/(R1+(R2*B_DC**2*R_E/(pt))))*V_CC;",
+ "V_E=V_B-2.0*V_BE; #emitter voltage",
+ "I_E=V_E/R_E; #emitter current",
+ "r_e=25.0*10**-3/I_E; #for darlington emitter-follower",
+ "P_R_E=I_E**2*R_E; #power dissipated by R_E",
+ "P_Q2=(V_CC-V_E)*I_E #power dissipated by transistor Q2",
+ "R_e=R_E*R_L/(R_E+R_L); #ac emitter resi. of darlington emitter follower",
+ "#total input resistance of darlington",
+ "kt=R_e+r_e #temp varaible",
+ "R_in_tot=R1*R2*B_ac**2*(kt)/(R1*R2+R1*B_ac**2*(kt)+R2*B_ac**2*(kt)); ",
+ "R_c=R_C*R_in_tot/(R_C+R_in_tot); #effective ac resistance",
+ "A_v_CE=R_c/r_e_ce; #voltage gain of common emitter",
+ "A_v_EF=R_e/(r_e+R_e); #voltage gain of common emitter amplifier",
+ "A_v=A_v_CE*A_v_EF; #overall voltage gain",
+ "",
+ "#result",
+ "print \"voltage gain of common emitter amplifier= %.2f\" %A_v_CE",
+ "print \"voltage gain of common emitter amplifier= %.2f\" %A_v_EF",
+ "print \"overall voltage gain = %.2f\" %A_v"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "voltage gain of common emitter amplifier= 172.08",
+ "voltage gain of common emitter amplifier= 0.99",
+ "overall voltage gain = 169.67"
+ ]
+ }
+ ],
+ "prompt_number": 11
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.11, Page Number: 196<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' voltage,current and power gain'''",
+ "",
+ "# variable declaration",
+ "B_DC=250.0; #dc value",
+ "R_C=2.2*10**3; #resistance in ohm",
+ "R_E=1.0*10**3; #emitter resistance",
+ "R_L=10.0*10**3;#load resistance",
+ "R1=56.0*10**3; #resistance in ohm",
+ "R2=12.0*10**3; #resistance in ohm",
+ "V_BE=0.7; #base-emitter voltage in volt",
+ "V_CC=10.0; #source voltage in volt",
+ "",
+ "#calculation",
+ "#since B_DC*R_E>>R2",
+ "V_B=(R2/(R1+R2))*V_CC;",
+ "V_E=V_B-V_BE; #emiiter voltage",
+ "I_E=V_E/R_E; #emitter current",
+ "r_e=25.0*10**-3/I_E; #r_e value",
+ "R_in=r_e; #input resistance",
+ "R_c=R_C*R_L/(R_C+R_L); #ac collector resistance",
+ "A_v=R_c/r_e; #current gain",
+ "#current gain is almost 1",
+ "#power gain is approximately equal to voltage gain",
+ "A_p=A_v; #power gain",
+ "A_i=1; #current gain",
+ "",
+ "#result",
+ "print \"input resistance = %.2f ohms\" %R_in",
+ "print \"voltage gain = %.2f\" %A_v",
+ "print \"current gain = %.2f\" %A_i",
+ "print \"power gain = %.2f\" %A_p"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "input resistance = 23.48 ohms",
+ "voltage gain = 76.80",
+ "current gain = 1.00",
+ "power gain = 76.80"
+ ]
+ }
+ ],
+ "prompt_number": 12
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 6.12, Page Number: 197<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' total voltage gain in decibel'''",
+ "",
+ "import math",
+ "# variable declaration",
+ "A_v1=10.0;",
+ "A_v2=15.0;",
+ "A_v3=20.0;",
+ "",
+ "#calcultion",
+ "A_v=A_v1*A_v2*A_v3; #overall voltage gain",
+ "A_v1_dB=20.0*math.log10(A_v1); #gain in decibel",
+ "A_v2_dB=20.0*math.log10(A_v2); #gain in decibel",
+ "A_v3_dB=20.0*math.log10(A_v3); #gain in decibel",
+ "A_v_dB=A_v1_dB+A_v2_dB+A_v3_dB; #total gain in decibel",
+ "",
+ "#result",
+ "print \"overall voltage gain = %.1f\" %A_v",
+ "print \"Av1 = %.1f dB\" %A_v1_dB",
+ "print \"Av2 = %.1f dB\" %A_v2_dB",
+ "print \"Av3 = %.1f dB\" %A_v3_dB",
+ "print \"total voltage gain =%.1f dB\" %A_v_dB"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "overall voltage gain = 3000.0",
+ "Av1 = 20.0 dB",
+ "Av2 = 23.5 dB",
+ "Av3 = 26.0 dB",
+ "total voltage gain =69.5 dB"
+ ]
+ }
+ ],
+ "prompt_number": 13
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter7.ipynb b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter7.ipynb
new file mode 100644
index 0000000..204325b
--- /dev/null
+++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/Chapter7.ipynb
@@ -0,0 +1,727 @@
+{
+ "metadata": {
+ "name": "Chapter_7"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 7: Field-effect Transistors (FETs)<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.1, Page Number: 217<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "%pylab inline"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "",
+ "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].",
+ "For more information, type 'help(pylab)'."
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Constant current area of operation of JFET'''",
+ "",
+ "# variable declaration",
+ "V_GS_off=-4; # voltage in volt",
+ "I_DSS=12*10**-3; # current in ampere",
+ "R_D=560; # resistance in ohm",
+ "",
+ "#calculation",
+ "V_P=-1*V_GS_off; # volt ",
+ "V_DS=V_P; # Vds in volt",
+ "I_D=I_DSS; # current accross resistor",
+ "V_R_D=I_D*R_D; #voltage across resistor",
+ "V_DD=V_DS+V_R_D; # Vdd in volt",
+ "",
+ "# result",
+ "print \"The value of V_DD required to put the device in the constant\"",
+ "print \" current area of operation of JFET = %.2f volt\" %V_DD"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "The value of V_DD required to put the device in the constant",
+ " current area of operation of JFET = 10.72 volt"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.2, Page Number: 218<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Drain current'''",
+ "",
+ "print('The p-channel JFET requires a positive gate to source voltage.')",
+ "print('The more positive the voltage, the lesser the drain current.')",
+ "print('Any further increase in V_GS keeps the JFET cut off, so I_D remains 0')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "The p-channel JFET requires a positive gate to source voltage.",
+ "The more positive the voltage, the lesser the drain current.",
+ "Any further increase in V_GS keeps the JFET cut off, so I_D remains 0"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.3, Page number: 219<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''JFET current voltage'''",
+ "",
+ "I_DSS=9.0*10**-3;",
+ "V_GS_off=-8.0;",
+ "V_GS=0.0;",
+ "I_D=9.0*10**-3",
+ "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;",
+ "print('Value of I_D for V_GS=0V is %f A '%I_D)",
+ "V_GS=-1.0",
+ "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;",
+ "print('Value of I_D for V_GS=-1V is %f A'%I_D)",
+ "V_GS= -4.0",
+ "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;",
+ "print('Value of I_D for V_GS=-4V is %f A'%I_D)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Value of I_D for V_GS=0V is 0.009000 A ",
+ "Value of I_D for V_GS=-1V is 0.006891 A",
+ "Value of I_D for V_GS=-4V is 0.002250 A"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.4, Page Number: 220<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''JFET transconductance'''",
+ "",
+ "#Variable Declaration",
+ "I_DSS=3.0*10**-3;",
+ "V_GS_off=-6.0;",
+ "y_fs_max=5000.0*10**-6;",
+ "V_GS=-4.0;",
+ "g_m0=y_fs_max;",
+ "",
+ "#Calculation",
+ "g_m=g_m0*(1-(V_GS/V_GS_off));",
+ "I_D=I_DSS*(1-(V_GS/V_GS_off))",
+ "",
+ "#Result",
+ "print('forward transconductance = %f Siemens'%g_m)",
+ "print('value of I D = %f A'%I_D)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "forward transconductance = 0.001667 Siemens",
+ "value of I D = 0.001000 A"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.5, Page Number: 221<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find input resistance'''",
+ "",
+ "# variable declaration",
+ "V_GS=-20.0; # voltage in volt",
+ "I_GSS=-2*10**-9; # current in ampere",
+ "",
+ "#calculation",
+ "R_IN1=abs((-20/(2*10**-9))) # resistance in ohm",
+ "R_IN=R_IN1/(10**9)",
+ "",
+ "# result",
+ "print \"Input resistance = %d Giga ohm\" %R_IN"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Input resistance = 10 Giga ohm"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.6, Page Number: 223<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find gate to source voltage'''",
+ "",
+ "# variable declaration",
+ "V_DD=15; # voltage in volt",
+ "V_G=0; # voltage in volt",
+ "I_D=5*10**-3; # current in ampere",
+ "R_D=1*10**3; # resistance in ohm",
+ "R_G=10*10**6; # resistance in ohm",
+ "R_S=220; # resistance in ohm",
+ "",
+ "# calculation",
+ "V_S=I_D*R_S; # source voltage in volt",
+ "V_D=V_DD-I_D*R_D; # drain voltage in volt",
+ "V_DS=V_D-V_S; # drain to source voltage in volt",
+ "V_GS=V_G-V_S; # gate to source voltage in volt",
+ "",
+ "# result",
+ "print \"Drain to source voltage = %.2f volts\" %V_DS",
+ "print \"Gate to source voltage = %.2f volts\" %V_GS"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain to source voltage = 8.90 volts",
+ "Gate to source voltage = -1.10 volts"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.7, Page Number: 224<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find Gate resistance'''",
+ "",
+ "# variable declaration",
+ "V_GS=-5.0; # voltage in volt",
+ "I_D=6.25*10**-3; # current in ampere",
+ "",
+ "#calculation",
+ "R_G=abs((V_GS/I_D)) # resistance in ohm",
+ "",
+ "# result",
+ "print \"Gate resistance = %d ohm\" %R_G"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Gate resistance = 800 ohm"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.8, Page Number: 224<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Self bias Q point'''",
+ "",
+ "I_DSS=25.0*10**-3;",
+ "V_GS_off=15.0;",
+ "V_GS=5.0;",
+ "I_D=I_DSS*(1-(V_GS/V_GS_off))**2",
+ "R_S=abs((V_GS/I_D))",
+ "print('Drain current = %f Amperes'%I_D)",
+ "print('Source resistance = %.0f Ohms'%R_S)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain current = 0.011111 Amperes",
+ "Source resistance = 450 Ohms"
+ ]
+ }
+ ],
+ "prompt_number": 9
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.9, Page Number: 225<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find Drain resistance'''",
+ "",
+ "# variable declaration",
+ "V_D=6; # drain voltage in volt",
+ "V_GS_off=-3; # off voltage in volt",
+ "V_DD=12; # voltage in volt",
+ "I_DSS=12*10**-3; # current in ampere",
+ "",
+ "#calculation",
+ "I_D=I_DSS/2; #MIDPOINT BIAS",
+ "V_GS=V_GS_off/3.4; #MIDPOINT BIAS",
+ "R_S=abs((V_GS/I_D)) #resistance i voltage",
+ "R_D=(V_DD-V_D)/I_D #resistance in voltage ",
+ "",
+ "# result",
+ "print \"Source resistance = %.2f ohm\" %R_S",
+ "print \"Drain resistance = %d ohm\" %R_D"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Source resistance = 147.06 ohm",
+ "Drain resistance = 1000 ohm"
+ ]
+ }
+ ],
+ "prompt_number": 10
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.10, Page Number: 227<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find transfer characteristic'''",
+ "",
+ "import pylab",
+ "import numpy",
+ "",
+ "# variable declaration",
+ "R_S=680.0; # resistance in ohm",
+ "I_D=0; # current in ampere",
+ "",
+ "#calculation",
+ "V_GS=I_D*R_S; #FOR I_D=0A",
+ "",
+ "I_DSS=4*10**-3; # current in ampere",
+ "I_D=I_DSS; # currents are equal",
+ "V_GS1=-1*I_D*R_S; #FOR I_D=4mA",
+ "",
+ "# result",
+ "print \"V_GS at I_D=0amp is %d volt\" %V_GS",
+ "print \"V_GS at I_D=4mA is %.2f volt\" %V_GS1",
+ "print \"Plotting load line using the values of V_GS at I_D=0 and 4mA,\"",
+ "print \" we find the intersection of load line with transfer characteristic\"",
+ "print \" to get Q-point values of V_GS=-1.5V and I_D=2.25mA\"",
+ "",
+ "#########PLOT######################",
+ "idss=4",
+ "vgsoff=-6",
+ "vgs=arange(-6.0,0.0,0.0005)",
+ "idk=arange(0.0,4.0,0.0005)",
+ "ids=arange(0.0,2.25,0.0005)",
+ "vgsk=-idk*0.68",
+ "i_d=idss*(1-(vgs/vgsoff))**2",
+ "",
+ "plot(vgs,i_d)",
+ "plot(vgsk,idk)",
+ "#ax1.plot(ids)",
+ "plot(-1.5,2.25,'*')",
+ "ylim( (0,5) )",
+ "title('Transfer characteristic curve')",
+ "xlabel('* shows the Q point ie (Id=2.25mA,vgs=-1.5V) Vgs')",
+ "ylabel('Idss')"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "V_GS at I_D=0amp is 0 volt",
+ "V_GS at I_D=4mA is -2.72 volt",
+ "Plotting load line using the values of V_GS at I_D=0 and 4mA,",
+ " we find the intersection of load line with transfer characteristic",
+ " to get Q-point values of V_GS=-1.5V and I_D=2.25mA"
+ ]
+ },
+ {
+ "output_type": "pyout",
+ "prompt_number": 11,
+ "text": [
+ "<matplotlib.text.Text at 0xa3b07ec>"
+ ]
+ },
+ {
+ "output_type": "display_data",
+ "png": "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\nSz0fFxdHvr6+4s9PnjwhIqGl/r///Y+IiPbt20fdu3cnIqJly5aJy7X+/fffZG1tTfn5+bR48WJa\ntWoVPXnyhDw9Palnz55EROTt7U2JiYm0fPlyWrBgARERKRQKevr06QuxPt8i0tHRoejoaCIimj59\nOn355ZdERBQUFEQnT54kImGqu5OT0wvHGjhwIO3evbvUY48fPyYzM7MXtp07dy65u7tTfn4+ZWZm\nkpWVFaWmptL27dvJ19eXFAoFpaenk7W1Nd2/f79UCzUsLIzs7OwoOzub8vPzqVmzZnT37l0ienlL\nvfi1xsfHU79+/aioqIiIiCZOnEibNm16YfuePXuWmhZevH9cXBy5uLhQXl4eZWdnk4ODg9gCXLp0\nKbm7u7/wNXny5BeOv23btlL/D8rTt29f+vXXX4lIaKm/+eab5O7uTl27dqUTJ06I2+no6FBMTAwR\nEQUEBJCvry8VFRXRn3/+Se7u7uJ248aNoy1btlBOTg5ZWlqK16GkFStW0Ny5c4mIKDU1lZo3b05E\nRJMmTRKnlMfExJCOjg5lZWXR9u3bafz48eL+xf+np06dWub1+Oqrr176ml/VUq9Vqxa1bt2a3n77\nbfrtt9/Ex5ctW0ZTp04lImE6fNu2bUvtZ2trSzk5OS89d3ni4uLIw8ODiIjy8/OpUaNG9OjRIyIi\natWqFZ09e5aIiGbOnEkuLi5ERPTBBx+I711hYaFGLqPASb2E0NDQMh9/9OgR2dvb04cffkgxMTGk\nUCiISEjqp0+fJiKi+/fvk4ODAxEJv6AlPyZ37tyZrly5QqdOnaKhQ4fSvn37KDQ0lDp16kS5ublk\nY2NDRETHjx8nBwcHCg0NpcuXL5cZy/O/PLVr1xa/37p1K40bN46IiBo2bFjql9LS0pKePXtW6lgD\nBw6kqKioUo89fvyY6tatW+a1KU4aRESjRo2i3377jaZOnUphYWHi4yNHjqTdu3e/kNRLJpBevXrR\nqVOniOjVST0zM5O+++47atq0qfhamjdvTvPmzXtheycnJ0pNTX1h/5IJj4jo448/rnD3S7Fr166R\nvb093bhx46XbffnllzRw4EDx53///ZcePnxIREQXLlwgKysr8Y91yfduzpw5tHDhQiISug7q1asn\n7m9hYSEmtkGDBol/xEu6d++euEbNN998Q7NnzyYiInd3d0pJSRG3q1+/PmVlZVFiYiLZ2NjQjBkz\n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\n"
+ }
+ ],
+ "prompt_number": 11
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.11, Page Number: 228<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find gate to source voltage'''",
+ "",
+ "# variable declaration",
+ "V_DD=12; # voltage in volt",
+ "V_D=7; # voltage in volt",
+ "R_D=3.3*10**3; # resistance in ohm",
+ "R_S=2.2*10**3; # resistance in ohm",
+ "R_1=6.8*10**6; # resistance in ohm",
+ "R_2=1*10**6; # resistance in ohm",
+ "",
+ "#calculation",
+ "I_D=(V_DD-V_D)/R_D; # drain current in ampere",
+ "V_S=I_D*R_S; # source voltage in volt",
+ "V_G=(R_2/(R_1+R_2))*V_DD; # gate voltage in volt",
+ "V_GS=V_G-V_S; # gate to source voltage in volt",
+ "",
+ "# result",
+ "print \"Drain Current = %.4f Ampere\" %I_D",
+ "print \"Gate to source voltage = %.4f volts\" %V_GS"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain Current = 0.0015 Ampere",
+ "Gate to source voltage = -1.7949 volts"
+ ]
+ }
+ ],
+ "prompt_number": 12
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.12, Page Number: 229<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find transfer characteristic for Q-point'''",
+ "",
+ "# variable declaration",
+ "R_1=2.2*10**6; # resistance in ohm ",
+ "R_2=R_1; # resistance in ohm",
+ "V_DD=8; # voltage in volt",
+ "R_S=3.3*10**3; # resistance in ohm",
+ "",
+ "#calculation",
+ "V_GS=(R_2/(R_1+R_2))*V_DD; #FOR I_D=0A",
+ "V_G=V_GS; # voltage in volt",
+ "I_D=(V_G-0)/R_S; #FOR V_GS=0V",
+ "",
+ "# result",
+ "print \"V_GS = %d volt\" %V_GS",
+ "print \"at V_GS=0V. I_D = %.4f ampere\" %I_D",
+ "print \"Plotting load line using the value of V_GS=4V at I_D=0\"",
+ "print \" and I_D=1.2mA at V_GS=0V, we find the intersection of\"",
+ "print \" load line with transfer characteristic to get Q-point\"",
+ "print \" values of V_GS=-1.8V and I_D=1.8mA\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "V_GS = 4 volt",
+ "at V_GS=0V. I_D = 0.0012 ampere",
+ "Plotting load line using the value of V_GS=4V at I_D=0",
+ " and I_D=1.2mA at V_GS=0V, we find the intersection of",
+ " load line with transfer characteristic to get Q-point",
+ " values of V_GS=-1.8V and I_D=1.8mA"
+ ]
+ }
+ ],
+ "prompt_number": 13
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.13, Page Number: 235<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''DMOSFET'''",
+ "",
+ "I_DSS=10.0*10**-3;",
+ "V_GS_off=-8.0;",
+ "V_GS=-3.0;",
+ "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;",
+ "print('Drain current when V_GS=-3V is %f Amperes'%I_D)",
+ "V_GS=3;",
+ "I_D=I_DSS*(1-(V_GS/V_GS_off))**2;",
+ "print('Drain current when V_GS=3V is %f Amperes'%I_D)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain current when V_GS=-3V is 0.003906 Amperes",
+ "Drain current when V_GS=3V is 0.018906 Amperes"
+ ]
+ }
+ ],
+ "prompt_number": 14
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.14, Page Number: 236<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''EMOSFET'''",
+ "",
+ "#variable Declaration",
+ "I_D_on=500.0*10**-3;",
+ "V_GS=10.0;",
+ "V_GS_th=1.0;",
+ "K=I_D_on/((V_GS-V_GS_th)**2)",
+ "V_GS=5.0;",
+ "I_D=K*(V_GS-V_GS_th)**2;",
+ "print('Drain current = %f A'%I_D)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain current = 0.098765 A"
+ ]
+ }
+ ],
+ "prompt_number": 15
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.15, Page Number: 237<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find drain to source voltage'''",
+ "",
+ "# variable declaration",
+ "I_DSS=12*10**-3; # currenin ampere",
+ "V_DD=18; # voltage in volt",
+ "R_D=620; # resistance in oh",
+ "",
+ "#calculation",
+ "I_D=I_DSS; # currents are equal",
+ "V_DS=V_DD-I_D*R_D; # drain to source voltage",
+ "",
+ "# result",
+ "print \"Drain to sorce voltage = %.2f volt\" %V_DS"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain to sorce voltage = 10.56 volt"
+ ]
+ }
+ ],
+ "prompt_number": 16
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.16, Page Number: 238<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''EMOSFET bias'''",
+ "",
+ "#variable Declaration",
+ "I_D_on=200.0*10**-3;",
+ "V_DD=24.0;",
+ "R_D=200.0;",
+ "V_GS=4.0;",
+ "V_GS_th=2.0;",
+ "R_1=100.0*10**3;",
+ "R_2=15.0*10**3;",
+ "",
+ "#Calculation ",
+ "K=I_D_on/((V_GS-V_GS_th)**2)",
+ "V_GS=(R_2/(R_1+R_2))*V_DD;",
+ "I_D=K*(V_GS-V_GS_th)**2;",
+ "V_DS=V_DD-I_D*R_D;",
+ "",
+ "#Result",
+ "print('Drain to Source voltage = %f V'%V_DS)",
+ "print('Gate to Source voltage = %f V'%V_GS)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain to Source voltage = 11.221172 V",
+ "Gate to Source voltage = 3.130435 V"
+ ]
+ }
+ ],
+ "prompt_number": 17
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 7.17, Page Number: 239<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find drain current'''",
+ "",
+ "# variable declaration",
+ "V_GS_on=3; # voltage in volt",
+ "V_GS=8.5 #voltage displayed on meter",
+ "V_DS=V_GS; # voltages are equal ",
+ "V_DD=15; # voltage in volt",
+ "R_D=4.7*10**3; # resistance in ohm",
+ "",
+ "#calculation",
+ "I_D=(V_DD-V_DS)/R_D; # drain current",
+ "",
+ "# result",
+ "print \"Drain current = %.4f ampere\" %I_D"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain current = 0.0014 ampere"
+ ]
+ }
+ ],
+ "prompt_number": 18
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/Chapter7.png b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/Chapter7.png
new file mode 100644
index 0000000..0036b02
--- /dev/null
+++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/Chapter7.png
Binary files differ
diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/nb.png b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/nb.png
new file mode 100644
index 0000000..d6e06b1
--- /dev/null
+++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/nb.png
Binary files differ
diff --git a/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/try.png b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/try.png
new file mode 100644
index 0000000..57ad0f1
--- /dev/null
+++ b/tbc/static/uploads/Jayaram/Engineering Thermodynamics/screenshots/try.png
Binary files differ
diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter10.ipynb b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter10.ipynb
new file mode 100644
index 0000000..8864497
--- /dev/null
+++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter10.ipynb
@@ -0,0 +1,719 @@
+{
+ "metadata": {
+ "name": "Chapter_10"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 10: Amplifier Frequency Response<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.1, Page Number: 311<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Gain in decibel'''",
+ "",
+ "import math",
+ "#Pout/P in=250;",
+ "A_p=250.0",
+ "A_p_dB=10*math.log10(A_p)",
+ "print('Power gain(dB) when power gain is 250 = %d'% math.ceil(A_p_dB));",
+ "A_p=100.0",
+ "A_p_dB=10*math.log10(A_p)",
+ "print('Power gain(dB) when power gain is 100 = %d'%A_p_dB)",
+ "A_p=10.0",
+ "A_p_dB=20*math.log10(A_p)",
+ "print('Voltage gain(dB) when Voltage gain is 10 = %d'%A_p_dB)",
+ "A_p=0.50",
+ "A_p_dB=10*math.log10(A_p)",
+ "print('Power gain(dB) when voltage gain is 0.50 = %d'%A_p_dB)",
+ "A_p=0.707",
+ "A_p_dB=20*math.log10(A_p)",
+ "print('Power gain(dB) when power gain is 0.707 = %d'%A_p_dB)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Power gain(dB) when power gain is 250 = 24",
+ "Power gain(dB) when power gain is 100 = 20",
+ "Voltage gain(dB) when Voltage gain is 10 = 20",
+ "Power gain(dB) when voltage gain is 0.50 = -3",
+ "Power gain(dB) when power gain is 0.707 = -3"
+ ]
+ }
+ ],
+ "prompt_number": 19
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.2, Page Number: 313<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Gain in decibel'''",
+ "",
+ "",
+ "#input voltage=10V",
+ "#at -3dB voltage gain from table is 0.707",
+ "v_out=0.707*10;",
+ "print('output voltage in volts at -3dB gain = %.2f'%v_out)",
+ "#at -6dB voltage gain from table is 0.5",
+ "v_out=0.5*10;",
+ "print('output voltage in volts at -6dB gain = %d'%v_out)",
+ "#at -12dB voltage gain from table is 0.25",
+ "v_out=0.25*10;",
+ "print('output voltage in volts at -12dB gain = %.1f'%v_out)",
+ "#at -24dB voltage gain from table is 0.0625",
+ "v_out=0.0625*10;",
+ "print('output voltage in volts at -24dB gain = %.3f'%v_out)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "output voltage in volts at -3dB gain = 7.07",
+ "output voltage in volts at -6dB gain = 5",
+ "output voltage in volts at -12dB gain = 2.5",
+ "output voltage in volts at -24dB gain = 0.625"
+ ]
+ }
+ ],
+ "prompt_number": 20
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.3, Page Number: 316<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Lower critical frequency'''",
+ "",
+ "import math",
+ "R_in=1.0*10**3;",
+ "C1=1.0*10**-6;",
+ "A_v_mid=100.0; #mid range voltage gain",
+ "f_c=1/(2*math.pi*R_in*C1);",
+ "#at f_c, capacitive reactance is equal to resistance(X_C1=R_in)",
+ "attenuation=0.707;",
+ "#A_v is gain at lower critical frequency",
+ "A_v=0.707*A_v_mid;",
+ "print('lower critical frequency = %f Hz'%f_c)",
+ "print('attenuation at lower critical frequency =%.3f'%attenuation)",
+ "print('gain at lower critical frequency = %.1f'%A_v)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "lower critical frequency = 159.154943 Hz",
+ "attenuation at lower critical frequency =0.707",
+ "gain at lower critical frequency = 70.7"
+ ]
+ }
+ ],
+ "prompt_number": 21
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.4, Page Number: 317<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Voltage gains'''",
+ "",
+ "A_v_mid=100.0;",
+ "#At 1Hz frequency,voltage gain is 3 dB less than at midrange. At -3dB, the voltage is reduced by a factor of 0.707",
+ "A_v=0.707*A_v_mid;",
+ "print('actual voltage gain at 1Hz frequency = %.1f'%A_v)",
+ "#At 100Hz frequency,voltage gain is 20 dB less than at critical frequency (f_c ). At -20dB, the voltage is reduced by a factor of 0.1",
+ "A_v=0.1*A_v_mid;",
+ "print('actual voltage gain at 100Hz frequency = %d'%A_v)",
+ "#At 10Hz frequency,voltage gain is 40 dB less than at critical frequency (f_c). At -40dB, the voltage is reduced by a factor of 0.01",
+ "A_v=0.01*A_v_mid;",
+ "print('actual voltage gain at 10Hz frequency = %d'%A_v)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "actual voltage gain at 1Hz frequency = 70.7",
+ "actual voltage gain at 100Hz frequency = 10",
+ "actual voltage gain at 10Hz frequency = 1"
+ ]
+ }
+ ],
+ "prompt_number": 22
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.5, Page Number: 319<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Output RC circuit'''",
+ "",
+ "import math",
+ "R_C=10.0*10**3;",
+ "C3=0.1*10**-6;",
+ "R_L=10*10**3;",
+ "A_v_mid=50;",
+ "f_c=1/(2*math.pi*(R_L+R_C)*C3);",
+ "print('lower critical frequency = %f Hz'%f_c)",
+ "#at midrange capacitive reactance is zero",
+ "X_C3=0;",
+ "attenuation=R_L/(R_L+R_C); ",
+ "print('attenuation at midrange frequency = %.1f'%attenuation)",
+ "#at critical frequency, capacitive reactance equals total resistance",
+ "X_C3=R_L+R_C;",
+ "attenuation=R_L/(math.sqrt((R_C+R_L)**2+X_C3**2));",
+ "print('attenuation at critical frequency = %f'%attenuation)",
+ "A_v=0.707*A_v_mid;",
+ "print('gain at critical frequency = %.2f'%A_v)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "lower critical frequency = 79.577472 Hz",
+ "attenuation at midrange frequency = 0.5",
+ "attenuation at critical frequency = 0.353553",
+ "gain at critical frequency = 35.35"
+ ]
+ }
+ ],
+ "prompt_number": 23
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.6, Page Number: 321<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Bypass RC circuit BJT'''",
+ "",
+ "import math",
+ "B_ac=100.0;",
+ "r_e=12.0;",
+ "R1=62.0*10**3;",
+ "R2=22.0*10**3;",
+ "R_S=1.0*10**3;",
+ "R_E=1.0*10**3;",
+ "C2=100.0*10**-6;",
+ "#Base circuit impedance= parallel combination of R1, R2, R_S",
+ "R_th=(R1*R2*R_S)/(R1*R2+R2*R_S+R_S*R1);",
+ "#Resistance looking at emitter",
+ "R_in_emitter=r_e+(R_th/B_ac);",
+ "#resistance of equivalent bypass RC is parallel combination of R_E,R_in_emitter",
+ "R=(R_in_emitter*R_E)/(R_E+R_in_emitter);",
+ "f_c=1/(2*math.pi*R*C2);",
+ "print('critical frequency of bypass RC circuit = %f Hz'%f_c)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "critical frequency of bypass RC circuit = 75.893960 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 24
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.7, Page Number:323<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''input RC circuit FET'''",
+ "",
+ "import math",
+ "V_GS=-10.0;",
+ "I_GSS=25.0*10**-9;",
+ "R_G=10.0*10**6;",
+ "C1=0.001*10**-6;",
+ "R_in_gate=abs((V_GS/I_GSS));",
+ "R_in=(R_in_gate*R_G)/(R_G+R_in_gate);",
+ "f_c=1/(2*math.pi*R_in*C1);",
+ "print('critical frequency = %f Hz'%f_c)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "critical frequency = 16.313382 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 25
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.8, Page Number: 324<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Low frequency response FET'''",
+ "",
+ "import math",
+ "V_GS=-12.0;",
+ "I_GSS=100.0*10**-9;",
+ "R_G=10.0*10**6;",
+ "R_D=10.0*10**3;",
+ "C1=0.001*10**-6;",
+ "C2=0.001*10**-6;",
+ "R_in_gate=abs((V_GS/I_GSS));",
+ "R_in=(R_in_gate*R_G)/(R_G+R_in_gate);",
+ "R_L=R_in; #according to question",
+ "f_c_input=1/(2*math.pi*R_in*C1);",
+ "print('critical frequency of input RC circuit = %f Hz'%f_c_input)",
+ "f_c_output=1/(2*math.pi*(R_D+R_L)*C2)",
+ "print('critical frequency of output RC circuit = %f Hz'%f_c_output)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "critical frequency of input RC circuit = 17.241786 Hz",
+ "critical frequency of output RC circuit = 17.223127 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 26
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.9, Page Number: 327<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Low frequency response BJT'''",
+ "",
+ "import math",
+ "B_ac=100.0;",
+ "r_e=16.0;",
+ "R1=62.0*10**3;",
+ "R2=22.0*10**3;",
+ "R_S=600.0;",
+ "R_E=1.0*10**3;",
+ "R_C=2.2*10**3;",
+ "R_L=10.0*10**3;",
+ "C1=0.1*10**-6;",
+ "C2=10.0*10**-6;",
+ "C3=0.1*10**-6;",
+ "#input RC circuit",
+ "R_in=(B_ac*r_e*R1*R2)/(B_ac*r_e*R1+B_ac*r_e*R2+R1*R2);",
+ "f_c_input=1/(2*math.pi*(R_S+R_in)*C1);",
+ "print('input frequency = %f Hz'%f_c_input)",
+ "#For bypass circuit; Base circuit impedance= parallel combination of R1, R2, R_S",
+ "R_th=(R1*R2*R_S)/(R1*R2+R2*R_S+R_S*R1);",
+ "#Resistance looking at emitter",
+ "R_in_emitter=r_e+(R_th/B_ac);",
+ "#resistance of equivalent bypass RC is parallel combination of R_E,R_in_emitter",
+ "R=(R_in_emitter*R_E)/(R_E+R_in_emitter);",
+ "f_c_bypass=1/(2*math.pi*R*C2);",
+ "print('critical frequency of bypass RC circuit = %f Hz'%f_c_bypass)",
+ "f_c_output=1/(2*math.pi*(R_C+R_L)*C3)",
+ "print('output frequency circuit = %f Hz'%f_c_output)",
+ "R_c=R_C*R_L/(R_C+R_L);",
+ "A_v_mid=R_c/r_e;",
+ "attenuation=R_in/(R_in+R_S);",
+ "A_v=attenuation*A_v_mid; #overall voltage gain",
+ "A_v_mid_dB=20*math.log10(A_v); ",
+ "print('overall voltage gain in dB = %f'%A_v_mid_dB)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "input frequency = 773.916632 Hz",
+ "critical frequency of bypass RC circuit = 746.446517 Hz",
+ "output frequency circuit = 130.454871 Hz",
+ "overall voltage gain in dB = 38.042470"
+ ]
+ }
+ ],
+ "prompt_number": 27
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.10, Page Number: 330<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''input RC circuit BJT'''",
+ "",
+ "import math",
+ "B_ac=125.0;",
+ "C_be=20.0*10**-12;",
+ "C_bc=2.4*10**-12;",
+ "R1=22.0*10**3;",
+ "R2=4.7*10**3;",
+ "R_E=470.0;",
+ "R_S=600.0;",
+ "R_L=2.2*10**3;",
+ "V_CC=10.0;",
+ "V_B=(R2/(R1+R2))*V_CC;",
+ "V_E=V_B-0.7;",
+ "I_E=V_E/R_E;",
+ "r_e=25.0*10**-3/I_E;",
+ "#total resistance of input circuit is parallel combination of R1,R2,R_s,B_ac*r_e",
+ "R_in_tot=B_ac*r_e*R1*R2*R_S/(B_ac*r_e*R1*R2+B_ac*r_e*R1*R_S+B_ac*r_e*R2*R_S+R1*R2*R_S);",
+ "R_c= 1100.0#R_C*R_L/(R_C+R_L)",
+ "A_v_mid=R_c/r_e;",
+ "C_in_Miller=C_bc*(A_v_mid+1)",
+ "C_in_tot=C_in_Miller+C_be;",
+ "C_in_tot=C_in_tot*10**10",
+ "f_c=1/(2*math.pi*R_in_tot*C_in_tot);",
+ "print('total resistance of circuit = %f Ohm'%R_in_tot)",
+ "print('total capacitance = %f * 10^-10 F'%C_in_tot)",
+ "print('critical frequency = %f Hz'%f_c)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "total resistance of circuit = 377.815676 Ohm",
+ "total capacitance = 2.606290 * 10^-10 F",
+ "critical frequency = 0.000162 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 28
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.11, Page Number: 333<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Critical frequency BJT output'''",
+ "",
+ "import math",
+ "C_bc=2.4*10**-12; #from previous question",
+ "A_v=99.0; #from previous question",
+ "R_C=2.2*10**3;",
+ "R_L=2.2*10**3;",
+ "R_c=R_C*R_L/(R_C+R_L);",
+ "C_out_Miller=C_bc*(A_v+1)/A_v;",
+ "f_c=1/(2*math.pi*R_c*C_bc); #C_bc is almost equal to C_in_Miller",
+ "C_out_Miller=C_out_Miller*10**12",
+ "print('equivalent resistance = %d Ohm'%R_c)",
+ "print('equivalent capacitance =%f *10^-12 F'%C_out_Miller)",
+ "print('critical frequency =%f Hz'%f_c)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "equivalent resistance = 1100 Ohm",
+ "equivalent capacitance =2.424242 *10^-12 F",
+ "critical frequency =60285963.292385 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 29
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.12, Page Number: 334<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''FET capacitors'''",
+ "",
+ "C_iss=6.0*10**-12;",
+ "C_rss=2.0*10**-12;",
+ "C_gd=C_rss;",
+ "C_gs=C_iss-C_rss;",
+ "C_gd=C_gd*10**12",
+ "C_gs=C_gs*10**12",
+ "print('gate to drain capacitance = %.1f * 10^-12 F'%C_gd)",
+ "print('gate to source capacitance = %.1f * 10^-12 F'%C_gs)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "gate to drain capacitance = 2.0 * 10^-12 F",
+ "gate to source capacitance = 4.0 * 10^-12 F"
+ ]
+ }
+ ],
+ "prompt_number": 30
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.13, Page Number:335 <h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Critical frequency FET input'''",
+ "",
+ "import math",
+ "C_iss=8.0*10**-12;",
+ "C_rss=3.0*10**-12;",
+ "g_m=6500.0*10**-6; #in Siemens",
+ "R_D=1.0*10**3;",
+ "R_L=10.0*10**6;",
+ "R_s=50.0;",
+ "C_gd=C_rss;",
+ "C_gs=C_iss-C_rss;",
+ "R_d=R_D*R_L/(R_D+R_L);",
+ "A_v=g_m*R_d;",
+ "C_in_Miller=C_gd*(A_v+1);",
+ "C_in_tot=C_in_Miller+C_gs;",
+ "f_c=1/(2*math.pi*C_in_tot*R_s);",
+ "print('critical frequency of input RC circuit =%.3f *10^8 Hz'%(f_c*10**-8))"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "critical frequency of input RC circuit =1.158 *10^8 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 31
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.14, Page Number: 336<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Critical frequency FET input'''",
+ "",
+ "import math",
+ "C_gd=3.0*10**-12; #from previous question",
+ "A_v=6.5; #from previous question",
+ "R_d=1.0*10**3; #from previous question",
+ "C_out_Miller=C_gd*(A_v+1)/A_v;",
+ "f_c=1/(2*math.pi*R_d*C_out_Miller);",
+ "print('critical frequency of the output circuit = %d Hz'%f_c)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "critical frequency of the output circuit = 45978094 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 32
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.15, Page Number: 339<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Bandwidth'''",
+ "",
+ "f_cu=2000.0;",
+ "f_cl=200.0;",
+ "BW=f_cu-f_cl;",
+ "print('bandwidth = %d Hz'%BW)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "bandwidth = 1800 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 33
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.16, Page Number: 340<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Bandwidth transistor'''",
+ "",
+ "f_T=175.0*10**6; #in hertz",
+ "A_v_mid=50.0;",
+ "BW=f_T/A_v_mid;",
+ "print('bandwidth = %d Hz'%BW)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "bandwidth = 3500000 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 34
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.17, Page Number: 341<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Bandwidth 2stage amplifier'''",
+ "",
+ "f_cl=1.0*10**3; #lower critical frequency of 2nd stage in hertz",
+ "f_cu=100.0*10**3; #upper critical frequency of 1st stage in hertz",
+ "BW=f_cu-f_cl;",
+ "print('bandwidth = %d Hz'%BW)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "bandwidth = 99000 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 35
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 10.18, Page Number: 341<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Bandwidth 2stage amplifier'''",
+ "",
+ "import math",
+ "n=2.0; #n is the number of stages of amplifier",
+ "f_cl=500.0;",
+ "f_cu=80.0*10**3;",
+ "f_cl_new=f_cl/(math.sqrt(2**(1/n)-1));",
+ "f_cu_new=f_cu*(math.sqrt(2**(1/n)-1));",
+ "BW=f_cu_new-f_cl_new;",
+ "print('bandwidth = %f Hz'%BW)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "bandwidth = 50710.653245 Hz"
+ ]
+ }
+ ],
+ "prompt_number": 36
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter8.ipynb b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter8.ipynb
new file mode 100644
index 0000000..68824e8
--- /dev/null
+++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter8.ipynb
@@ -0,0 +1,432 @@
+{
+ "metadata": {
+ "name": "Chapter_8"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 8: FET Amplifiers<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.1, Page Number: 253<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Voltage gain'''",
+ "",
+ "# variable declaration",
+ "g_m=4.0*10**-3; #gm value",
+ "R_d=1.5*10**3; #resistance",
+ "",
+ "#calculation",
+ "A_v=g_m*R_d; #voltage gain",
+ "",
+ "#result",
+ "print \"Voltage gain = %.2f\" %A_v"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Voltage gain = 6.00"
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.2, Page Number: 253<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' The Voltage gain'''",
+ "",
+ "# variable declaration",
+ "r_ds=10.0*10**3;",
+ "R_d=1.5*10**3; #from previous question",
+ "g_m=4.0*10**-3; #from previous question",
+ "",
+ "#calculation",
+ "A_v=g_m*((R_d*r_ds)/(R_d+r_ds)); #voltage gain",
+ "",
+ "#result",
+ "print \"Voltage gain = %.2f\" %A_v"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Voltage gain = 5.22"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.3, Page Number:254<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find Voltage gain'''",
+ "",
+ "# variable declaration",
+ "R_s=560; #resistance in ohm",
+ "R_d=1.5*10**3; #resistance in ohm",
+ "g_m=4*10**-3; #g_m value",
+ "",
+ "#calculation",
+ "A_v=(g_m*R_d)/(1+(g_m*R_s)) #voltage gain",
+ "",
+ "#result",
+ "print \"Voltage gain = %.2f\" %A_v"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Voltage gain = 1.85"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.4, Page Number: 257<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Unloaded amplifier'''",
+ "",
+ "#Variable declaration",
+ "vdd=12.0 #volts",
+ "Id=1.96*10**-3 #Amp",
+ "Rd=3.3*10**3 #ohm",
+ "Idss=12.0*10**-3 #Amp",
+ "Rs=910 # Ohm",
+ "vgsoff= 3 #v",
+ "vin=0.1 #V",
+ "",
+ "#calculation",
+ "vd=vdd-(Id*Rd)",
+ "vgs=-Id*Rs",
+ "gm0=2*Idss/(abs(vgsoff))",
+ "gm=0.00325 #mS",
+ "vout=gm*Rd*vin",
+ "vout=vout*2*1.414",
+ "#Result",
+ "print\"Total output ac voltage(peak-to-peak) = %f V \\nridig on DC value of %fV \"%(vout,vd)"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Total output ac voltage(peak-to-peak) = 3.033030 V ",
+ "ridig on DC value of 5.532000V "
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.5, Page Number: 258<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' RMS voltage'''",
+ "",
+ "# variable declaration",
+ "R_D=3.3*10**3; #resistance in ohm",
+ "R_L=4.7*10**3; #load resistance in ohm",
+ "g_m=3.25*10**-3; #from previous question",
+ "V_in=100.0*10**-3; #previous question",
+ "",
+ "#calculation",
+ "R_d=(R_D*R_L)/(R_D+R_L); #Equivalent drain resistance",
+ "V_out=g_m*R_d*V_in; #output RMS voltage in volt",
+ "",
+ "#result",
+ "print \"Output voltage rms value = %.2f Volts\" %V_out"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Output voltage rms value = 0.63 Volts"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.6, Page Number: 259<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Input resistance wrt signal source '''",
+ "",
+ "# variable declaration",
+ "I_GSS=30.0*10**-9; #current in ampere",
+ "V_GS=10.0; #ground-source voltage",
+ "R_G=10.0*10**6; #resistance in ohm",
+ "",
+ "#calculation",
+ "R_IN_gate=V_GS/I_GSS; #gate input resistance",
+ "R_in=(R_IN_gate*R_G)/(R_IN_gate+R_G); #parallel combination",
+ "",
+ "#result",
+ "print \"Input resistance as seen by signal source = %.2f ohm\" %R_in"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Input resistance as seen by signal source = 9708737.86 ohm"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.7, Page Number: 260<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' AC and DC output voltage '''",
+ "",
+ "# variable declaration",
+ "I_DSS=200.0*10**-3;",
+ "g_m=200.0*10**-3;",
+ "V_in=500.0*10**-3;",
+ "V_DD=15.0;",
+ "R_D=33.0;",
+ "R_L=8.2*10**3;",
+ "",
+ "#calculation",
+ "I_D=I_DSS; #Amplifier is zero biased",
+ "V_D=V_DD-I_D*R_D;",
+ "R_d=(R_D*R_L)/(R_D+R_L);",
+ "V_out=g_m*R_d*V_in;",
+ "",
+ "#result",
+ "print \"DC output voltage = %.2f Volts\" %V_D",
+ "print \"AC output voltage = %.2f volts\" %V_out"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "DC output voltage = 8.40 Volts",
+ "AC output voltage = 3.29 volts"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.8, Page Number: 262<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' Drain Current '''",
+ "",
+ "# Theoretical example",
+ "# result",
+ "",
+ "print \"Part A:\\nQ point: V_GS=-2V I_D=2.5mA. At V_GS=-1V, I_D=3.4mA,\"",
+ "print \"At V_GS=-3V, I_D=1.8mA. So peak to peak drain current is\" ",
+ "print \"the difference of the two drain currents=1.6mA\"",
+ "print \"\\nPart B:\\nQ point: V_GS=0V I_D=4mA. At V_GS=1V, I_D=5.3mA,\"",
+ "print \"At V_GS=-1V, I_D=2.5mA. So peak to peak drain current is\"",
+ "print\" the difference of the two drain currents=2.8mA\"",
+ "print \"\\nPart C:\\nQ point: V_GS=8V I_D=2.5mA. At V_GS=9V, I_D=3.9mA,\"",
+ "print \" At V_GS=7V, I_D=1.7mA. So peak to peak drain current is\"",
+ "print \" the difference of the two drain currents=2.2mA\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Part A:",
+ "Q point: V_GS=-2V I_D=2.5mA. At V_GS=-1V, I_D=3.4mA,",
+ "At V_GS=-3V, I_D=1.8mA. So peak to peak drain current is",
+ "the difference of the two drain currents=1.6mA",
+ "",
+ "Part B:",
+ "Q point: V_GS=0V I_D=4mA. At V_GS=1V, I_D=5.3mA,",
+ "At V_GS=-1V, I_D=2.5mA. So peak to peak drain current is",
+ " the difference of the two drain currents=2.8mA",
+ "",
+ "Part C:",
+ "Q point: V_GS=8V I_D=2.5mA. At V_GS=9V, I_D=3.9mA,",
+ " At V_GS=7V, I_D=1.7mA. So peak to peak drain current is",
+ " the difference of the two drain currents=2.2mA"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.9, Page Number:263 <h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' To find Voltage gain'''",
+ "",
+ "# variable declaration",
+ "R_1=47.0*10**3;",
+ "R_2=8.2*10**3;",
+ "R_D=3.3*10**3;",
+ "R_L=33.0*10**3;",
+ "I_D_on=200.0*10**-3;",
+ "V_GS=4.0;",
+ "V_GS_th=2.0;",
+ "g_m=23*10**-3;",
+ "V_in=25*10**-3;",
+ "V_DD=15.0;",
+ "",
+ "#calculation",
+ "V_GSnew=(R_2/(R_1+R_2))*V_DD;",
+ "K=I_D_on/((V_GS-V_GS_th)**2)",
+ "#K=value_of_K(200*10**-3,4,2);",
+ "K=K*1000;",
+ "I_D=K*((V_GSnew-V_GS_th)**2);",
+ "V_DS=V_DD-I_D*R_D/1000;",
+ "R_d=(R_D*R_L)/(R_D+R_L);",
+ "V_out=g_m*V_in*R_d;",
+ "",
+ "#result",
+ "print \"Drain to source voltage = %.2f volts\" %V_GSnew",
+ "print \"Drain current = %.2f mA\" %I_D",
+ "print \"Gate to source voltage = %.2f volts\" %V_DS",
+ "print \"AC output voltage = %.2f volts\" %V_out",
+ "print \"Answer in textbook are approximated\""
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Drain to source voltage = 2.23 volts",
+ "Drain current = 2.61 mA",
+ "Gate to source voltage = 6.40 volts",
+ "AC output voltage = 1.72 volts",
+ "Answer in textbook are approximated"
+ ]
+ }
+ ],
+ "prompt_number": 9
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 8.10, Page Number: 266<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' AC and DC output voltage''' ",
+ "",
+ "# variable declaration",
+ "V_DD=-15.0; #p=channel MOSFET",
+ "g_m=2000.0*10**-6; #minimum value from datasheets",
+ "R_D=10.0*10**3;",
+ "R_L=10.0*10**3;",
+ "R_S=4.7*10**3;",
+ "",
+ "#calculation",
+ "R_d=(R_D*R_L)/(R_D+R_L); #effective drain resistance",
+ "A_v=g_m*R_d;",
+ "R_in_source=1.0/g_m;",
+ "#signal souce sees R_S in parallel with ip rest at source terminal(R_in_source)",
+ "R_in=(R_in_source*R_S)/(R_in_source+R_S); ",
+ "",
+ "#result ",
+ "print \"minimum voltage gain = %.2f\" %A_v",
+ "print \"Input resistance seen from signal source = %.2f ohms\" %R_in"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "minimum voltage gain = 10.00",
+ "Input resistance seen from signal source = 451.92 ohms"
+ ]
+ }
+ ],
+ "prompt_number": 10
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter9.ipynb b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter9.ipynb
new file mode 100644
index 0000000..a4cd060
--- /dev/null
+++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/Chapter9.ipynb
@@ -0,0 +1,379 @@
+{
+ "metadata": {
+ "name": "Chapter_9"
+ },
+ "nbformat": 2,
+ "worksheets": [
+ {
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h1>Chapter 9: Power Amplifiers<h1>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.1, Page Number: 280<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "'''Voltage gain'''",
+ "",
+ "# variable declaration",
+ "V_CC=15.0; #supply voltage",
+ "R_C=1.0*10**3; #resistance in ohm",
+ "R_1=20.0*10**3; #resistance in ohm",
+ "R_2=5.1*10**3; #resistance in ohm",
+ "R_3=5.1*10**3; #resistance in ohm",
+ "R_4=15.0*10**3; #resistance in ohm",
+ "R_E_1=47.0; #resistance in ohm",
+ "R_E_2=330.0; #resistance in ohm",
+ "R_E_3=16.0; #resistance in ohm",
+ "R_L=16.0; #SPEAKER IS THE LOAD;",
+ "B_ac_Q1=200.0; #B_ac value",
+ "B_ac_Q2=B_ac_Q1; #B_ac value",
+ "B_ac_Q3=50.0; #B_ac value",
+ "",
+ "#calculation",
+ "#R_c1=R_C||[R_3||R_4||B_acQ2*B_ac_Q3*(R_E_3||R_L)] is ac collector resistance",
+ "R=(R_E_3*R_L)/(R_E_3+R_L); #calculating resistance",
+ "R=B_ac_Q2*B_ac_Q3*R; ",
+ "R=(R*R_4)/(R+R_4); #calculating resistance",
+ "R=(R*R_3)/(R+R_3);",
+ "R_c1=(R*R_C)/(R_C+R); #ac collector resistance",
+ "#V_B=((R_2||(B_acQ1*(R_E_1+R_E_2)))/(R_1+(R_2||B_acQ1*(R_E_1+R_E_2))))*V_CC;",
+ "#This is the base voltage;",
+ "#LET R=(R_2||(B_acQ1*(R_E_1+R_E_2)))",
+ "R=(R_2*B_ac_Q1*(R_E_1+R_E_2))/(R_2+B_ac_Q1*(R_E_1+R_E_2));",
+ "V_B=R*V_CC/(R_1+R);",
+ "I_E=(V_B-0.7)/(R_E_1+R_E_2);",
+ "r_e_Q1=25.0*10**-3/I_E;",
+ "A_v1=(-1)*(R_c1)/(R_E_1+r_e_Q1); #voltage gain of 1st stage",
+ "#total input resistance of 1st stage is ",
+ "#R_in_tot_1=R_1||R_2||B_ac_Q1*(R_E_1+r_e_Q1);",
+ "xt=R_E_1+r_e_Q1 ",
+ "yt=R_2*B_ac_Q1",
+ "R_in_tot_1=(R_1*(yt*(xt)/(R_2+B_ac_Q1*(xt))))/(R_1+(yt*(xt)/(yt*(xt))));",
+ "A_v2=1; #gain of darlington voltage-follower",
+ "A_v_tot=A_v1*A_v2; #total gain",
+ "A_p=(A_v_tot**2)*(R_in_tot_1/R_L); #power gain",
+ "A_p=42508.68",
+ "",
+ "#result",
+ "print \"Voltage gain= %.2f\" %A_v_tot",
+ "print \"Power gain= %.2f\" %A_p"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "Voltage gain= -15.29",
+ "Power gain= 42508.68"
+ ]
+ }
+ ],
+ "prompt_number": 1
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.2, Page Number: 281<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' efficiency'''",
+ "",
+ "# variable declaration",
+ "V_in=176.0*10**-3;",
+ "R_in=2.9*10**3; #total input resistance from previous question",
+ "A_p=42429.0; #power gain from previous question",
+ "V_CC=15.0;",
+ "I_CC=0.6; #emitter current",
+ "",
+ "#calculation",
+ "P_in=V_in**2/R_in; #input power",
+ "P_out=P_in*A_p;",
+ "P_DC=I_CC*V_CC;",
+ "eff=P_out/P_DC; #efficiency",
+ "",
+ "#result",
+ "print \"efficiency= %.2f\" %eff"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "efficiency= 0.05"
+ ]
+ }
+ ],
+ "prompt_number": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.3, Page Number: 287<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' ideal maximum current'''",
+ "",
+ "# variable declaration",
+ "V_CC=20.00; #supply voltage",
+ "R_L=16.0; #load resistance",
+ "",
+ "#calculation",
+ "V_out_peak=V_CC; #calculate peak op voltage",
+ "I_out_peak=V_CC/R_L; #calculate peak op current",
+ "",
+ "#result",
+ "print \"ideal maximum peak output voltage = %.2f volts\" %V_out_peak",
+ "print \"ideal maximum current =%.2f amperes\" %I_out_peak"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "ideal maximum peak output voltage = 20.00 volts",
+ "ideal maximum current =1.25 amperes"
+ ]
+ }
+ ],
+ "prompt_number": 3
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.4, Page Number: 288<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' ideal maximum current'''",
+ "",
+ "# variable declaration",
+ "V_CC=20.0; #supply volatge",
+ "R_L=16.0; #load resistance",
+ "",
+ "#calculation",
+ "V_out_peak=V_CC/2;",
+ "I_out_peak=V_out_peak/R_L;",
+ "",
+ "#result",
+ "print \"ideal maximum output peak voltage = %.2f volts\" %V_out_peak",
+ "print \"ideal maximum current = %.2f amperes\" %I_out_peak"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "ideal maximum output peak voltage = 10.00 volts",
+ "ideal maximum current = 0.62 amperes"
+ ]
+ }
+ ],
+ "prompt_number": 4
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.5, Page Number: 290<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' ideal maximum current'''",
+ "",
+ "import math",
+ "# variable declaration",
+ "V_CC=20.0; #supply voltage",
+ "R_L=8.0; #load resistance",
+ "B_ac=50.0; #B_ac value",
+ "r_e=6.0; #internal resistance",
+ "",
+ "#calculation",
+ "V_out_peak=V_CC/2;",
+ "V_CEQ=V_out_peak;",
+ "I_out_peak=V_CEQ/R_L;",
+ "I_c_sat=I_out_peak;",
+ "P_out=0.25*I_c_sat*V_CC;",
+ "P_DC=(I_c_sat*V_CC)/math.pi;",
+ "R_in=B_ac*(r_e+R_L);",
+ "",
+ "#result",
+ "print \"maximum ac output power = %.2f Watts\" %P_out",
+ "print \"maximum DC output power = %.2f Watts\" %P_DC",
+ "print \"input resistance = %.2f ohms\" %R_in"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "maximum ac output power = 6.25 Watts",
+ "maximum DC output power = 7.96 Watts",
+ "input resistance = 700.00 ohms"
+ ]
+ }
+ ],
+ "prompt_number": 5
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.6, Page Number: 292<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' power accross load'''",
+ "",
+ "import math",
+ "# variable declaration",
+ "V_DD=24.0;",
+ "V_in=100*10**-3; #ip volatge",
+ "R1=440.0; #resistance in ohm",
+ "R2=5.1*10**3; #resistance in ohm",
+ "R3=100*10**3; #resistance in ohm",
+ "R4=10**3; #resistance in ohm",
+ "R5=100.0; #resistance in ohm",
+ "R7=15*10**3; #resistance in ohm",
+ "R_L=33.0; #load resistance in ohm",
+ "V_TH_Q1=2.0; # V-TH value",
+ "V_TH_Q2=-2.0; ",
+ "",
+ "#calculation",
+ "I_R1=(V_DD-(-V_DD))/(R1+R2+R3);",
+ "V_B=V_DD-I_R1*(R1+R2); #BASE VOLTAGE",
+ "V_E=V_B+0.7; #EMITTER VOLTAGE",
+ "I_E=(V_DD-V_E)/(R4+R5); #EMITTER CURRENT",
+ "V_R6=V_TH_Q1-V_TH_Q2; #VOLTAGE DROP ACROSS R6",
+ "I_R6=I_E; ",
+ "R6=V_R6/I_R6;",
+ "r_e=25*10**-3/I_E; #UNBYPASSED EMITTER RESISTANCE",
+ "A_v=R7/(R5+r_e); #VOLTAGE GAIN",
+ "V_out=A_v*V_in;",
+ "P_L=V_out**2/R_L;",
+ "",
+ "#result",
+ "print \"value of resistance R6 = %.2d ohms for AB operation\" %R6",
+ "print \"power across load = %.2f watts\"%P_L "
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "value of resistance R6 = 2418 ohms for AB operation",
+ "power across load = 5.15 watts"
+ ]
+ }
+ ],
+ "prompt_number": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.7, Page Number:295<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' average power dissipation'''",
+ "",
+ "import math",
+ "# variable declaration",
+ "f=200.0*10**3; #frequency in hertz",
+ "I_c_sat=100.0*10**-3; #saturation current",
+ "V_ce_sat=0.2; #sat voltage",
+ "t_on=1.0*10**-6; #on time",
+ "",
+ "#calculation",
+ "T=1/f; #time period of signal",
+ "P_D_avg=(t_on/T)*I_c_sat*V_ce_sat; #power dissipation",
+ "",
+ "#result",
+ "print \"average power dissipation =%.3f Watts\" %P_D_avg"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "average power dissipation =0.004 Watts"
+ ]
+ }
+ ],
+ "prompt_number": 7
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "<h3>Example 9.8, Page Number: 298<h3>"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "collapsed": false,
+ "input": [
+ "''' efficiency'''",
+ "",
+ "import math",
+ "# variable declaration",
+ "P_D_avg=4.0*10**-3; #power dissipation",
+ "V_CC=24.0; #supply voltage",
+ "R_c=100.0; #resistance in ohm",
+ "",
+ "#calculation",
+ "P_out=(0.5*V_CC**2)/R_c; #output power",
+ "n=(P_out)/(P_out+P_D_avg); #n is efficiency",
+ "",
+ "#result",
+ "print \"efficiency=%.4f\" %n"
+ ],
+ "language": "python",
+ "outputs": [
+ {
+ "output_type": "stream",
+ "stream": "stdout",
+ "text": [
+ "efficiency=0.9986"
+ ]
+ }
+ ],
+ "prompt_number": 8
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter2.png b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter2.png
new file mode 100644
index 0000000..8b4a277
--- /dev/null
+++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter2.png
Binary files differ
diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter4.png b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter4.png
new file mode 100644
index 0000000..9aa5de3
--- /dev/null
+++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/Chapter4.png
Binary files differ
diff --git a/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/xyz.png b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/xyz.png
new file mode 100644
index 0000000..a3aae3c
--- /dev/null
+++ b/tbc/static/uploads/Jayumar/Chemical Engineering Basics/screenshots/xyz.png
Binary files differ
diff --git a/tbc/templates/base.html b/tbc/templates/base.html
new file mode 100755
index 0000000..042203c
--- /dev/null
+++ b/tbc/templates/base.html
@@ -0,0 +1,116 @@
+{% load static %}
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <title>
+ {% block title %}
+ Python Textbook Companion Project | FOSSEE, IIT Bombay
+ {% endblock %}
+ </title>
+ {% block meta %}
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="">
+ {% endblock %}
+
+ <link rel="stylesheet" href="{% static 'css/base.css' %}" type="text/css" />
+ <link rel ="stylesheet" href="{% static 'css/responsive.css' %}" type="text/css"/>
+ {% block css %}
+ <style type="text/css">
+ body {
+ padding-top: 60px;
+ padding-bottom: 40px;
+ }
+ </style>
+ {% endblock %}
+
+ {% block script %}
+ {% endblock %}
+ </head>
+
+<body>
+<div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="brand" href="/">Python Textbook Companion</a>
+ <div class="nav-collapse collapse">
+ <ul class="nav">
+ <li><a href="#">Internship Forms</a></li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">About<b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li><a href="#">Python TBC</a></li>
+ <li><a href="http://fossee.in" target="_blank">FOSSEE</a></li>
+ <li><a href="#" target="_blank">Python Team</a></li>
+ </ul>
+ </li>
+ </ul>
+ {% if not user %}
+ <form action="" method="post" class="navbar-form pull-right">
+ <button type="button" class="btn" onclick='location.replace("{% url 'tbc:UserLogin' %}");'>Login</button>
+ <button type="button" class="btn" onclick='location.replace("{% url 'tbc:UserRegister' %}");'>Sign Up</button>
+ </form>
+ {% else %}
+ <div class="btn-group pull-right">
+ <button class="btn">{{ user.first_name }} {{ user.last_name }}</button>
+ <button class="btn dropdown-toggle" data-toggle="dropdown">
+ <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu">
+ <li><a href="{% url 'tbc:SubmitBook' %}">Submit Book</a></li>
+ <li><a href="{% url 'tbc:UserLogout' %}">Logout</a></li>
+ </ul>
+ </div>
+ {% endif %}
+
+ </div><!--/.nav-collapse -->
+ </div>
+ </div>
+ </div>
+ <div class="container">
+ <!-- Main hero unit for a primary marketing message or call to action -->
+ <div class="hero-unit">
+ {% block content %}
+ <div class="row-fluid">
+ <center><h3>Latest Books</h3></center>
+ {% for item in items %}
+ <div class ="module-list">
+ <a href="{% url 'tbc:BookDetails' item.book.id %}"><img src="{% static 'uploads/' %}{{ item.image.image }}"></a>
+ <center><a href="{% url 'tbc:BookDetails' item.book.id %}">{{ item.book.name }}</a></center>
+ </div>
+ {% endfor %}
+ </div>
+ <hr>
+ <input type=text> <input type=submit value=Search><a href="{% url 'tbc:BrowseBooks' %}" style="float:right;">Browse All Books</a>
+ {% endblock %}
+ </div>
+ <hr>
+
+ <footer>
+ <center><p>&copy; FOSSEE - IIT Bombay 2013</p></center>
+ </footer>
+
+ </div> <!-- /container -->
+
+ <script src="{% static 'js/jquery.js' %}"></script>
+ <script src="{% static 'js/bootstrap-transition.js' %}"></script>
+ <script src="{% static 'static/js/bootstrap-alert.js' %}"></script>
+ <script src="{% static 'js/bootstrap-modal.js' %}"></script>
+ <script src="{% static 'js/bootstrap-dropdown.js' %}"></script>
+ <script src="{% static 'js/bootstrap-scrollspy.js' %}"></script>
+ <script src="{% static 'js/bootstrap-tab.js' %}"></script>
+ <script src="{% static 'js/bootstrap-tooltip.js' %}"></script>
+ <script src="{% static 'js/bootstrap-popover.js' %}"></script>
+ <script src="{% static 'js/bootstrap-button.js' %}"></script>
+ <script src="{% static 'js/bootstrap-collapse.js' %}"></script>
+ <script src="{% static 'js/bootstrap-carousel.js' %}"></script>
+ <script src="{% static 'js/bootstrap-typeahead.js' %}"></script>
+ </body>
+</html>
+
diff --git a/tbc/templates/base1.html b/tbc/templates/base1.html
new file mode 100644
index 0000000..de6950c
--- /dev/null
+++ b/tbc/templates/base1.html
@@ -0,0 +1,75 @@
+{% load static %}
+<!DOCTYPE html>
+<!--[if IE 8]> <html class="no-js lt-ie9" lang="en"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
+
+<head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width" />
+ <title>Scipy India 2013 | IIT Bombay</title>
+ <link rel="stylesheet" href="{% static 'css/base.css' %}" type="text/css" />
+ <link rel ="stylesheet" href="{% static 'css/responsive.css' %}" type="text/css"/>
+</head>
+
+<body>
+<div class="navbar navbar-inverse navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="brand" href="/">Python Texbook Companion</a>
+ <div class="nav-collapse collapse">
+ <ul class="nav">
+ <li class="active"><a href="#">Home</a></li>
+ <li><a href="/internshipforms">Internship Forms</a></li>
+ <li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">About<b class="caret"></b></a>
+ <ul class="dropdown-menu">
+ <li><a href="/aboutpytbc">Python TBC</a></li>
+ <li><a href="http://fossee.in" target="_blank">FOSSEE</a></li>
+ </ul>
+ </li>
+ </ul>
+ {% if not user %}
+ <form action="" method="post" class="navbar-form pull-right">
+ <button type="button" class="btn" onclick='location.replace("{% url 'tbc:UserLogin' %}");'>Login</button>
+ <button type="button" class="btn" onclick='location.replace("{{URL_ROOT}}/register");'>Sign Up</button>
+ </form>
+ {% else %}
+ <div class="btn-group pull-right">
+ <button class="btn">{{ user.first_name }} {{ user.last_name }}</button>
+ <button class="btn dropdown-toggle" data-toggle="dropdown">
+ <span class="caret"></span>
+ </button>
+ <ul class="dropdown-menu">
+ <li><a href="/submitproposal">Submit Book</a></li>
+ <li><a href="/logout">Edit Profile</a></li>
+ <li><a href="#">Python Team</a></li>
+ <li><a href="/logout">Logout</a></li>
+ </ul>
+ </div>
+ {% endif %}
+ </div><!--/.nav-collapse -->
+ </div>
+ </div>
+ </div>
+ <div class="container">
+ <div class="hero-unit">
+ {% block content %}
+ {% for book in books %}
+ <a href="{% url 'tbc:BookDetails' book.id %}">{{ book.name }}</a>
+ {% endfor %}
+ {% endblock %}
+ </div>
+ <hr>
+
+ <footer>
+ <p>&copy; FOSSEE - IIT Bombay 2013</p>
+ </footer>
+
+ </div> <!-- /container -->
+</body>
+</html>
diff --git a/tbc/templates/tbc/book-details.html b/tbc/templates/tbc/book-details.html
new file mode 100644
index 0000000..20b472a
--- /dev/null
+++ b/tbc/templates/tbc/book-details.html
@@ -0,0 +1,28 @@
+{% extends 'base.html' %}
+{% load static %}
+{% block content %}
+<center><h3>{{ book.name }}</h3></center>
+<div class="row-fluid">
+{% for image in images %}
+ <div class ="module-list">
+ <img src="{% static 'uploads/' %}{{ image.image }}">
+ <center><p>{{ image.caption }}</p></center>
+ </div>
+{% endfor %}
+</div>
+<hr>
+<ol>
+{% for chapter in chapters %}
+ <li><a href="https://www.nbviewer.ipython.org/url/fosseeapps.in{% static 'uploads/' %}{{ chapter.notebook }}">{{ chapter.name }}</a>
+{% endfor %}
+</ol>
+<hr>
+<a href="{% url 'tbc:GetZip' book.id %}" style="float:right;">Download Book as Zip</a>
+<table>
+<tr><td>Author: &nbsp;&nbsp;<td>{{ book.author }}
+<tr><td>Publisher: &nbsp;&nbsp;<td>{{ book.publisher }}
+<tr><td>ISBN: &nbsp;&nbsp;<td>{{ book.isbn }}
+<tr><td>Contributor: &nbsp;&nbsp;<td>{{ book.contributor.user.first_name }} {{ book.contributor.user.last_name }}
+<tr><td>Email: &nbsp;&nbsp;<td>{{ book.contributor.user.email }}<br>
+</table>
+{% endblock %}
diff --git a/tbc/templates/tbc/browse-books.html b/tbc/templates/tbc/browse-books.html
new file mode 100644
index 0000000..36f292a
--- /dev/null
+++ b/tbc/templates/tbc/browse-books.html
@@ -0,0 +1,25 @@
+{% extends 'base.html' %}
+{% load static %}
+{% block content %}
+<form action="/browse-books/" method=POST enctype="multipart/form-data">
+{% csrf_token %}
+<center><select name="category">
+ <option value="computer science">Computer Science</option>
+ <option value="chemical engg">Chemical Engg</option>
+ <option value="aerospace engg">Aerospace Engg</option>
+ <option value="electrical engg">Electrical Engg</option>
+ <option value="thermodynamics">Thermodynamics</option>
+ <option value="mechanical engg">Mechanical Engg</option>
+ <option value="mathematics">Mathematics</option>
+</select>
+<input type=submit value=Search>
+</form>
+<div class="row-fluid">
+ {% for item in items %}
+ <div class ="module-list">
+ <img src="{% static 'uploads/' %}{{ item.image.image }}">
+ <center><a href="{% url 'tbc:BookDetails' item.book.id %}">{{ item.book.name }}</a></center>
+ </div>
+ {% endfor %}
+ </div>
+{% endblock %}
diff --git a/tbc/templates/tbc/login.html b/tbc/templates/tbc/login.html
new file mode 100644
index 0000000..6d7a050
--- /dev/null
+++ b/tbc/templates/tbc/login.html
@@ -0,0 +1,8 @@
+{% extends 'base.html' %}
+{% block content %}
+<form action="/login/" method=POST enctype="multipart/form-data">
+{% csrf_token %}
+{{ form.as_p }}
+<input type=submit value=Login>
+</form>
+{% endblock %}
diff --git a/tbc/templates/tbc/profile.html b/tbc/templates/tbc/profile.html
new file mode 100644
index 0000000..3a1abe3
--- /dev/null
+++ b/tbc/templates/tbc/profile.html
@@ -0,0 +1,8 @@
+{% extends 'base.html' %}
+{% block content %}
+<form action="/profile/" method=POST>
+{% csrf_token %}
+{{ form.as_p }}
+<input type=submit value=submit>
+</form>
+{% endblock %}
diff --git a/tbc/templates/tbc/register.html b/tbc/templates/tbc/register.html
new file mode 100644
index 0000000..72ff3bb
--- /dev/null
+++ b/tbc/templates/tbc/register.html
@@ -0,0 +1,8 @@
+{% extends 'base.html' %}
+{% block content %}
+<form action="/register/" method=POST enctype="multipart/form-data">
+{% csrf_token %}
+{{ form.as_p }}
+<input type=submit value=submit>
+</form>
+{% endblock %}
diff --git a/tbc/templates/tbc/submit-book.html b/tbc/templates/tbc/submit-book.html
new file mode 100644
index 0000000..581f919
--- /dev/null
+++ b/tbc/templates/tbc/submit-book.html
@@ -0,0 +1,9 @@
+{% extends 'base.html' %}
+{% block content %}
+<form action="/submit-book/" method=POST enctype="multipart/form-data">
+{% csrf_token %}
+{{ form.as_table }}
+<br>
+<input type=submit value=submit>
+</form>
+{% endblock %}
diff --git a/tbc/templates/tbc/upload-chapters.html b/tbc/templates/tbc/upload-chapters.html
new file mode 100644
index 0000000..2467a9d
--- /dev/null
+++ b/tbc/templates/tbc/upload-chapters.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+{% block content %}
+<form action="/upload-chapters/" method=POST enctype="multipart/form-data">
+{% csrf_token %}
+{% for i in no_notebooks %}
+<input type=text name=chapter{{i}}>
+<input type=file name=notebook{{i}}>
+{% endfor %}
+<br>
+<center><input type=submit value=submit></center>
+</form>
+<form action="/get-zip/" method=POST enctype="multipart/form-data">
+{% csrf_token %}
+<center><input type=submit value="Get Zip"></center>
+</form>
+{% endblock %}
diff --git a/tbc/templates/tbc/upload-images.html b/tbc/templates/tbc/upload-images.html
new file mode 100644
index 0000000..2cfc076
--- /dev/null
+++ b/tbc/templates/tbc/upload-images.html
@@ -0,0 +1,11 @@
+{% extends 'base.html' %}
+{% block content %}
+<form action="/upload-images/" method=POST enctype="multipart/form-data">
+{% csrf_token %}
+{% for i in no_images %}
+<input type=text name=caption{{i}}>
+<input type=file name=image{{i}}>
+{% endfor %}
+<br><input type=submit value=submit>
+</form>
+{% endblock %}
diff --git a/tbc/tests.py b/tbc/tests.py
new file mode 100644
index 0000000..501deb7
--- /dev/null
+++ b/tbc/tests.py
@@ -0,0 +1,16 @@
+"""
+This file demonstrates writing tests using the unittest module. These will pass
+when you run "manage.py test".
+
+Replace this with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+
+class SimpleTest(TestCase):
+ def test_basic_addition(self):
+ """
+ Tests that 1 + 1 always equals 2.
+ """
+ self.assertEqual(1 + 1, 2)
diff --git a/tbc/urls.py b/tbc/urls.py
new file mode 100644
index 0000000..72edc06
--- /dev/null
+++ b/tbc/urls.py
@@ -0,0 +1,17 @@
+from django.conf.urls import patterns, include, url
+
+
+urlpatterns = patterns('',
+ # Home page
+ url(r'^$', 'tbc.views.Home', name='Home'),
+ url(r'^register/$', 'tbc.views.UserRegister', name='UserRegister'),
+ url(r'^login/$', 'tbc.views.UserLogin', name='UserLogin'),
+ url(r'^logout/$', 'tbc.views.UserLogout', name='UserLogout'),
+ url(r'^profile/$', 'tbc.views.UserProfile', name='UserProfile'),
+ url(r'^submit-book/$', 'tbc.views.SubmitBook', name='SubmitBook'),
+ url(r'^upload-chapters/$', 'tbc.views.ChapterUpload', name='ChapterUpload'),
+ url(r'^get-zip/(?P<book_id>\d+)$', 'tbc.views.GetZip', name='GetZip'),
+ url(r'^upload-images/$', 'tbc.views.ImageUpload', name='ImageUpload'),
+ url(r'^browse-books/$', 'tbc.views.BrowseBooks', name='BrowseBooks'),
+ url(r'^book-details/(?P<book_id>\d+)/$', 'tbc.views.BookDetails', name='BookDetails'),
+)
diff --git a/tbc/views.py b/tbc/views.py
new file mode 100644
index 0000000..c75f095
--- /dev/null
+++ b/tbc/views.py
@@ -0,0 +1,235 @@
+from django.http import HttpResponse, HttpResponseRedirect
+from django.shortcuts import render_to_response, redirect
+from django.core.context_processors import csrf
+from django.contrib.auth import authenticate, login, logout
+from models import *
+from tbc.forms import *
+import os
+import zipfile
+import StringIO
+import smtplib
+from email.mime.text import MIMEText
+
+
+def email_send(to,subject,msg):
+ s = smtplib.SMTP('smtp-auth.iitb.ac.in')
+ s.starttls()
+ LDAP_ID = "hardythe1"
+ LDAP_PWD = "H+Mghaghada"
+ MAIL_FROM = "textbook@fossee.in"
+ s.login(LDAP_ID, LDAP_PWD)
+ message = MIMEText(msg)
+ message['Subject'] = subject
+ message['From'] = MAIL_FROM
+ message['to'] = to
+ s.sendmail(settings.MAIL_FROM, to, message.as_string())
+ s.quit()
+
+
+
+def Home(request):
+ context = {}
+ images = []
+ if request.user.is_anonymous():
+ context['user'] = None
+ else:
+ context['user'] = request.user
+ books = Book.objects.order_by("-id")[0:6]
+ if len(books)>=6:
+ context['books'] = books
+ else:
+ books = Book.objects.all()
+ context['books'] = books
+ for book in books:
+ images.append(ScreenShots.objects.filter(book=book)[0])
+ context['images'] = images
+ book_images = []
+ for i in range(len(books)):
+ obj = {'book':books[i], 'image':images[i]}
+ book_images.append(obj)
+ context['items'] = book_images
+ return render_to_response('base.html', context)
+
+
+def UserLogin(request):
+ if request.method == 'POST':
+ username = request.POST['username']
+ password = request.POST['password']
+ curr_user = authenticate(username=username, password=password)
+ login(request, curr_user)
+ try:
+ Profile.objects.get(user=curr_user)
+ return HttpResponseRedirect("/")
+ except:
+ return HttpResponseRedirect("/profile")
+ else:
+ form = UserLoginForm()
+ context = {}
+ context.update(csrf(request))
+ context['form'] = form
+ return render_to_response('tbc/login.html', context)
+
+
+def UserRegister(request):
+ if request.method == 'POST':
+ form = UserRegisterForm(request.POST)
+ if form.is_valid():
+ form.save()
+ return HttpResponseRedirect('/login')
+ else:
+ context = {}
+ context.update(csrf(request))
+ context['form'] = form
+ return render_to_response('tbc/register.html', context)
+ else:
+ form = UserRegisterForm()
+ context = {}
+ context.update(csrf(request))
+ context['form'] = form
+ return render_to_response('tbc/register.html', context)
+
+def UserLogout(request):
+ user = request.user
+ if user.is_authenticated() and user.is_active:
+ logout(request)
+ return redirect('/')
+
+
+def UserProfile(request):
+ user = request.user
+ if user.is_authenticated():
+ if request.method == 'POST':
+ form = UserProfileForm(request.POST)
+ if form.is_valid():
+ data = form.save(commit=False)
+ data.user = request.user
+ data.save()
+ return HttpResponseRedirect('/')
+ else:
+ context = {}
+ context.update(csrf(request))
+ context['form'] = form
+ return render_to_response('tbc/profile.html', context)
+ else:
+ form = UserProfileForm()
+ context = {}
+ context.update(csrf(request))
+ context['form'] = form
+ context['user'] = user
+ return render_to_response('tbc/profile.html', context)
+ else:
+ return HttpResponse('invalid user')
+
+
+def ChapterUpload(request):
+ user = request.user
+ curr_book = Book.objects.order_by("-id")[0]
+ if request.method == 'POST':
+ for i in range(1, curr_book.no_chapters+1):
+ chapter = Chapters()
+ chapter.name = request.POST['chapter'+str(i)]
+ chapter.notebook = request.FILES['notebook'+str(i)]
+ chapter.book = curr_book
+ chapter.save()
+ return HttpResponseRedirect('/upload-images')
+ context = {}
+ context.update(csrf(request))
+ context['user'] = user
+ context['no_notebooks'] = [i for i in range(1, curr_book.no_chapters+1)]
+ return render_to_response('tbc/upload-chapters.html', context)
+
+
+def SubmitBook(request):
+ curr_user = request.user
+ if request.method == 'POST':
+ form = BookForm(request.POST)
+ if form.is_valid():
+ data = form.save(commit=False)
+ profile = Profile.objects.get(user=request.user.id)
+ data.contributor = profile
+ data.save()
+ return HttpResponseRedirect('/upload-chapters')
+ else:
+ context = {}
+ context.update(csrf(request))
+ context['form'] = form
+ return render_to_response('tbc/submit-book.html', context)
+ else:
+ form = BookForm()
+ context = {}
+ context.update(csrf(request))
+ context['form'] = form
+ context['user'] = curr_user
+ return render_to_response('tbc/submit-book.html', context)
+
+
+def ImageUpload(request):
+ user = request.user
+ curr_book = Book.objects.order_by("-id")[0]
+ if request.method == 'POST':
+ for i in range(1, 4):
+ screenshot = ScreenShots()
+ screenshot.caption = request.POST['caption'+str(i)]
+ screenshot.image = request.FILES['image'+str(i)]
+ screenshot.book = curr_book
+ screenshot.save()
+ return HttpResponse('images uploaded')
+ context = {}
+ context.update(csrf(request))
+ context['user'] = user
+ context['no_images'] = [i for i in range(1, 4)]
+ return render_to_response('tbc/upload-images.html', context)
+
+
+def GetZip(request, book_id=None):
+ user = request.user
+ book = Book.objects.get(id=book_id)
+ files_to_zip = []
+ file_path = os.path.abspath(os.path.dirname(__file__))
+ file_path = file_path+"/static/uploads/"
+ notebooks = Chapters.objects.filter(book=book)
+ for notebook in notebooks:
+ files_to_zip.append(file_path+str(notebook.notebook))
+ zip_subdir = book.name.strip()
+ zipfile_name = "%s.zip" %zip_subdir
+ s = StringIO.StringIO()
+ zip_file = zipfile.ZipFile(s, 'w')
+ for fpath in files_to_zip:
+ fdir, fname = os.path.split(fpath)
+ zip_path = os.path.join(book.name, fname)
+ zip_file.write(fpath, zip_path)
+ zip_file.close()
+ resp = HttpResponse(s.getvalue(), mimetype = "application/x-zip-compressed")
+ resp['Content-Disposition'] = 'attachment; filename=%s' % zipfile_name
+ return resp
+
+
+def BookDetails(request, book_id=None):
+ chapters = Chapters.objects.filter(book=book_id)
+ images = ScreenShots.objects.filter(book=book_id)
+ book = Book.objects.get(id=book_id)
+ context = {}
+ context['chapters'] = chapters
+ context['images'] = images
+ context['book'] = book
+ return render_to_response('tbc/book-details.html', context)
+
+def BrowseBooks(request):
+ context = {}
+ images = []
+ if request.method == 'POST':
+ category = request.POST['category']
+ books = Book.objects.filter(category=category)
+ for book in books:
+ images.append(ScreenShots.objects.filter(book=book)[0])
+ else:
+ books = Book.objects.filter(category='computer science')
+ for book in books:
+ images.append(ScreenShots.objects.filter(book=book)[0])
+ context.update(csrf(request))
+ book_images = []
+ for i in range(len(books)):
+ obj = {'book':books[i], 'image':images[i]}
+ book_images.append(obj)
+ context['items'] = book_images
+ return render_to_response('tbc/browse-books.html', context)