diff --git a/rootfs/.coveragerc b/rootfs/.coveragerc index 159091a69..dbc826603 100644 --- a/rootfs/.coveragerc +++ b/rootfs/.coveragerc @@ -6,9 +6,6 @@ omit = api/__init__.py api/docker.py scheduler/* - web/__init__.py - web/models.py - web/templatetags/__init__.py # osx library files when not running in virtualenv /Library/* /System/* @@ -26,5 +23,4 @@ exclude_lines = if __name__ == .__main__.: [html] -extra_css = web/static/css/main.css title = Deis Coverage Report diff --git a/rootfs/Dockerfile b/rootfs/Dockerfile index 8eabfd418..d48187abf 100644 --- a/rootfs/Dockerfile +++ b/rootfs/Dockerfile @@ -3,31 +3,16 @@ FROM alpine:3.2 # install common packages RUN apk add --update-cache curl bash openssl sudo && rm -rf /var/cache/apk/* -# install etcdctl and confd -RUN apk add --update-cache curl tar \ - && curl -sSL https://github.com/coreos/etcd/releases/download/v2.2.1/etcd-v2.2.1-linux-amd64.tar.gz \ - | tar -vxz -C /usr/local/bin --strip=1 etcd-v2.2.1-linux-amd64/etcdctl \ - && chown root:root /usr/local/bin/etcdctl \ - && curl -sSL -o /usr/local/bin/confd https://github.com/kelseyhightower/confd/releases/download/v0.10.0/confd-0.10.0-linux-amd64 \ - && chmod +x /usr/local/bin/confd \ - && apk del --purge curl tar \ - && rm -rf /var/cache/apk/* - # define execution environment -CMD ["/app/bin/boot"] +CMD ["/bin/boot"] EXPOSE 8000 -# define work environment -WORKDIR /app - -ADD build.sh /app/tmp/build.sh +COPY . / -ADD requirements.txt /app/requirements.txt - -RUN DOCKER_BUILD=true /app/tmp/build.sh && rm -rf /app/* +WORKDIR /app -ADD . /app +RUN build -RUN ./manage.py collectstatic --settings=deis.settings --noinput # create static resources +RUN python manage.py collectstatic --settings=deis.settings --noinput ENV DEIS_RELEASE 1.13.0-dev diff --git a/rootfs/api/__init__.py b/rootfs/app/api/__init__.py similarity index 100% rename from rootfs/api/__init__.py rename to rootfs/app/api/__init__.py diff --git a/rootfs/api/admin.py b/rootfs/app/api/admin.py similarity index 100% rename from rootfs/api/admin.py rename to rootfs/app/api/admin.py diff --git a/rootfs/api/authentication.py b/rootfs/app/api/authentication.py similarity index 100% rename from rootfs/api/authentication.py rename to rootfs/app/api/authentication.py diff --git a/rootfs/api/exceptions.py b/rootfs/app/api/exceptions.py similarity index 100% rename from rootfs/api/exceptions.py rename to rootfs/app/api/exceptions.py diff --git a/rootfs/api/fields.py b/rootfs/app/api/fields.py similarity index 100% rename from rootfs/api/fields.py rename to rootfs/app/api/fields.py diff --git a/rootfs/api/fixtures/dev.json b/rootfs/app/api/fixtures/dev.json similarity index 100% rename from rootfs/api/fixtures/dev.json rename to rootfs/app/api/fixtures/dev.json diff --git a/rootfs/api/fixtures/test_auth.json b/rootfs/app/api/fixtures/test_auth.json similarity index 100% rename from rootfs/api/fixtures/test_auth.json rename to rootfs/app/api/fixtures/test_auth.json diff --git a/rootfs/api/fixtures/test_sharing.json b/rootfs/app/api/fixtures/test_sharing.json similarity index 100% rename from rootfs/api/fixtures/test_sharing.json rename to rootfs/app/api/fixtures/test_sharing.json diff --git a/rootfs/api/fixtures/tests.json b/rootfs/app/api/fixtures/tests.json similarity index 100% rename from rootfs/api/fixtures/tests.json rename to rootfs/app/api/fixtures/tests.json diff --git a/rootfs/api/management/__init__.py b/rootfs/app/api/management/__init__.py similarity index 100% rename from rootfs/api/management/__init__.py rename to rootfs/app/api/management/__init__.py diff --git a/rootfs/api/management/commands/__init__.py b/rootfs/app/api/management/commands/__init__.py similarity index 100% rename from rootfs/api/management/commands/__init__.py rename to rootfs/app/api/management/commands/__init__.py diff --git a/rootfs/api/management/commands/load_db_state_to_etcd.py b/rootfs/app/api/management/commands/load_db_state_to_etcd.py similarity index 100% rename from rootfs/api/management/commands/load_db_state_to_etcd.py rename to rootfs/app/api/management/commands/load_db_state_to_etcd.py diff --git a/rootfs/api/middleware.py b/rootfs/app/api/middleware.py similarity index 100% rename from rootfs/api/middleware.py rename to rootfs/app/api/middleware.py diff --git a/rootfs/api/models.py b/rootfs/app/api/models.py similarity index 100% rename from rootfs/api/models.py rename to rootfs/app/api/models.py diff --git a/rootfs/api/permissions.py b/rootfs/app/api/permissions.py similarity index 100% rename from rootfs/api/permissions.py rename to rootfs/app/api/permissions.py diff --git a/rootfs/api/routers.py b/rootfs/app/api/routers.py similarity index 100% rename from rootfs/api/routers.py rename to rootfs/app/api/routers.py diff --git a/rootfs/api/serializers.py b/rootfs/app/api/serializers.py similarity index 100% rename from rootfs/api/serializers.py rename to rootfs/app/api/serializers.py diff --git a/rootfs/api/south_migrations/0001_initial.py b/rootfs/app/api/south_migrations/0001_initial.py similarity index 100% rename from rootfs/api/south_migrations/0001_initial.py rename to rootfs/app/api/south_migrations/0001_initial.py diff --git a/rootfs/api/south_migrations/0002_drop_djcelery.py b/rootfs/app/api/south_migrations/0002_drop_djcelery.py similarity index 100% rename from rootfs/api/south_migrations/0002_drop_djcelery.py rename to rootfs/app/api/south_migrations/0002_drop_djcelery.py diff --git a/rootfs/api/south_migrations/0003_drop_socialaccount.py b/rootfs/app/api/south_migrations/0003_drop_socialaccount.py similarity index 100% rename from rootfs/api/south_migrations/0003_drop_socialaccount.py rename to rootfs/app/api/south_migrations/0003_drop_socialaccount.py diff --git a/rootfs/api/south_migrations/0004_add_custom_perms.py b/rootfs/app/api/south_migrations/0004_add_custom_perms.py similarity index 100% rename from rootfs/api/south_migrations/0004_add_custom_perms.py rename to rootfs/app/api/south_migrations/0004_add_custom_perms.py diff --git a/rootfs/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py b/rootfs/app/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py similarity index 100% rename from rootfs/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py rename to rootfs/app/api/south_migrations/0005_auto__add_push__add_unique_push_app_uuid.py diff --git a/rootfs/api/south_migrations/0006_auto__add_field_release_summary.py b/rootfs/app/api/south_migrations/0006_auto__add_field_release_summary.py similarity index 100% rename from rootfs/api/south_migrations/0006_auto__add_field_release_summary.py rename to rootfs/app/api/south_migrations/0006_auto__add_field_release_summary.py diff --git a/rootfs/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py b/rootfs/app/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py similarity index 100% rename from rootfs/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py rename to rootfs/app/api/south_migrations/0007_auto__del_flavor__del_unique_flavor_owner_id__del_layer__del_unique_la.py diff --git a/rootfs/api/south_migrations/0008_auto__add_field_release_image.py b/rootfs/app/api/south_migrations/0008_auto__add_field_release_image.py similarity index 100% rename from rootfs/api/south_migrations/0008_auto__add_field_release_image.py rename to rootfs/app/api/south_migrations/0008_auto__add_field_release_image.py diff --git a/rootfs/api/south_migrations/0009_auto__chg_field_container_state.py b/rootfs/app/api/south_migrations/0009_auto__chg_field_container_state.py similarity index 100% rename from rootfs/api/south_migrations/0009_auto__chg_field_container_state.py rename to rootfs/app/api/south_migrations/0009_auto__chg_field_container_state.py diff --git a/rootfs/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py b/rootfs/app/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py similarity index 100% rename from rootfs/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py rename to rootfs/app/api/south_migrations/0010_auto__add_field_build_sha__add_field_build_procfile__add_field_build_d.py diff --git a/rootfs/api/south_migrations/0011_auto__add_domain.py b/rootfs/app/api/south_migrations/0011_auto__add_domain.py similarity index 100% rename from rootfs/api/south_migrations/0011_auto__add_domain.py rename to rootfs/app/api/south_migrations/0011_auto__add_domain.py diff --git a/rootfs/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py b/rootfs/app/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py similarity index 100% rename from rootfs/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py rename to rootfs/app/api/south_migrations/0012_auto__add_limit__add_unique_limit_app_uuid__add_field_config_limit.py diff --git a/rootfs/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py b/rootfs/app/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py similarity index 100% rename from rootfs/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py rename to rootfs/app/api/south_migrations/0013_auto__del_limit__del_unique_limit_app_uuid__del_field_config_limit__ad.py diff --git a/rootfs/api/south_migrations/0014_auto__add_field_config_tags.py b/rootfs/app/api/south_migrations/0014_auto__add_field_config_tags.py similarity index 100% rename from rootfs/api/south_migrations/0014_auto__add_field_config_tags.py rename to rootfs/app/api/south_migrations/0014_auto__add_field_config_tags.py diff --git a/rootfs/api/south_migrations/0015_migration_config_defaults.py b/rootfs/app/api/south_migrations/0015_migration_config_defaults.py similarity index 100% rename from rootfs/api/south_migrations/0015_migration_config_defaults.py rename to rootfs/app/api/south_migrations/0015_migration_config_defaults.py diff --git a/rootfs/api/south_migrations/0016_drop_allauth.py b/rootfs/app/api/south_migrations/0016_drop_allauth.py similarity index 100% rename from rootfs/api/south_migrations/0016_drop_allauth.py rename to rootfs/app/api/south_migrations/0016_drop_allauth.py diff --git a/rootfs/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py b/rootfs/app/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py similarity index 100% rename from rootfs/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py rename to rootfs/app/api/south_migrations/0017_auto__del_cluster__del_field_app_cluster.py diff --git a/rootfs/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py b/rootfs/app/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py similarity index 100% rename from rootfs/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py rename to rootfs/app/api/south_migrations/0018_drop_field_release_image__chg_field_release_build.py diff --git a/rootfs/api/south_migrations/0019_fix_dockerfile_empty_value.py b/rootfs/app/api/south_migrations/0019_fix_dockerfile_empty_value.py similarity index 100% rename from rootfs/api/south_migrations/0019_fix_dockerfile_empty_value.py rename to rootfs/app/api/south_migrations/0019_fix_dockerfile_empty_value.py diff --git a/rootfs/api/south_migrations/0020_auto__del_field_container_state.py b/rootfs/app/api/south_migrations/0020_auto__del_field_container_state.py similarity index 100% rename from rootfs/api/south_migrations/0020_auto__del_field_container_state.py rename to rootfs/app/api/south_migrations/0020_auto__del_field_container_state.py diff --git a/rootfs/api/south_migrations/0021_auto__add_certificate.py b/rootfs/app/api/south_migrations/0021_auto__add_certificate.py similarity index 100% rename from rootfs/api/south_migrations/0021_auto__add_certificate.py rename to rootfs/app/api/south_migrations/0021_auto__add_certificate.py diff --git a/rootfs/api/south_migrations/0022_auto__add_field_key_fingerprint.py b/rootfs/app/api/south_migrations/0022_auto__add_field_key_fingerprint.py similarity index 100% rename from rootfs/api/south_migrations/0022_auto__add_field_key_fingerprint.py rename to rootfs/app/api/south_migrations/0022_auto__add_field_key_fingerprint.py diff --git a/rootfs/api/south_migrations/0023_key_fingerprints.py b/rootfs/app/api/south_migrations/0023_key_fingerprints.py similarity index 100% rename from rootfs/api/south_migrations/0023_key_fingerprints.py rename to rootfs/app/api/south_migrations/0023_key_fingerprints.py diff --git a/rootfs/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py b/rootfs/app/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py similarity index 100% rename from rootfs/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py rename to rootfs/app/api/south_migrations/0024_auto__chg_field_key_fingerprint__del_unique_key_owner_id__add_unique_k.py diff --git a/rootfs/api/south_migrations/__init__.py b/rootfs/app/api/south_migrations/__init__.py similarity index 100% rename from rootfs/api/south_migrations/__init__.py rename to rootfs/app/api/south_migrations/__init__.py diff --git a/rootfs/api/static/500.html b/rootfs/app/api/static/500.html similarity index 100% rename from rootfs/api/static/500.html rename to rootfs/app/api/static/500.html diff --git a/rootfs/api/tests/__init__.py b/rootfs/app/api/tests/__init__.py similarity index 100% rename from rootfs/api/tests/__init__.py rename to rootfs/app/api/tests/__init__.py diff --git a/rootfs/api/tests/test_api_middleware.py b/rootfs/app/api/tests/test_api_middleware.py similarity index 100% rename from rootfs/api/tests/test_api_middleware.py rename to rootfs/app/api/tests/test_api_middleware.py diff --git a/rootfs/api/tests/test_app.py b/rootfs/app/api/tests/test_app.py similarity index 100% rename from rootfs/api/tests/test_app.py rename to rootfs/app/api/tests/test_app.py diff --git a/rootfs/api/tests/test_auth.py b/rootfs/app/api/tests/test_auth.py similarity index 100% rename from rootfs/api/tests/test_auth.py rename to rootfs/app/api/tests/test_auth.py diff --git a/rootfs/api/tests/test_build.py b/rootfs/app/api/tests/test_build.py similarity index 100% rename from rootfs/api/tests/test_build.py rename to rootfs/app/api/tests/test_build.py diff --git a/rootfs/api/tests/test_certificate.py b/rootfs/app/api/tests/test_certificate.py similarity index 100% rename from rootfs/api/tests/test_certificate.py rename to rootfs/app/api/tests/test_certificate.py diff --git a/rootfs/api/tests/test_config.py b/rootfs/app/api/tests/test_config.py similarity index 100% rename from rootfs/api/tests/test_config.py rename to rootfs/app/api/tests/test_config.py diff --git a/rootfs/api/tests/test_container.py b/rootfs/app/api/tests/test_container.py similarity index 100% rename from rootfs/api/tests/test_container.py rename to rootfs/app/api/tests/test_container.py diff --git a/rootfs/api/tests/test_domain.py b/rootfs/app/api/tests/test_domain.py similarity index 100% rename from rootfs/api/tests/test_domain.py rename to rootfs/app/api/tests/test_domain.py diff --git a/rootfs/api/tests/test_hooks.py b/rootfs/app/api/tests/test_hooks.py similarity index 100% rename from rootfs/api/tests/test_hooks.py rename to rootfs/app/api/tests/test_hooks.py diff --git a/rootfs/api/tests/test_key.py b/rootfs/app/api/tests/test_key.py similarity index 100% rename from rootfs/api/tests/test_key.py rename to rootfs/app/api/tests/test_key.py diff --git a/rootfs/api/tests/test_limits.py b/rootfs/app/api/tests/test_limits.py similarity index 100% rename from rootfs/api/tests/test_limits.py rename to rootfs/app/api/tests/test_limits.py diff --git a/rootfs/api/tests/test_perm.py b/rootfs/app/api/tests/test_perm.py similarity index 100% rename from rootfs/api/tests/test_perm.py rename to rootfs/app/api/tests/test_perm.py diff --git a/rootfs/api/tests/test_release.py b/rootfs/app/api/tests/test_release.py similarity index 100% rename from rootfs/api/tests/test_release.py rename to rootfs/app/api/tests/test_release.py diff --git a/rootfs/api/tests/test_scheduler.py b/rootfs/app/api/tests/test_scheduler.py similarity index 100% rename from rootfs/api/tests/test_scheduler.py rename to rootfs/app/api/tests/test_scheduler.py diff --git a/rootfs/api/tests/test_users.py b/rootfs/app/api/tests/test_users.py similarity index 100% rename from rootfs/api/tests/test_users.py rename to rootfs/app/api/tests/test_users.py diff --git a/rootfs/api/urls.py b/rootfs/app/api/urls.py similarity index 100% rename from rootfs/api/urls.py rename to rootfs/app/api/urls.py diff --git a/rootfs/api/utils.py b/rootfs/app/api/utils.py similarity index 100% rename from rootfs/api/utils.py rename to rootfs/app/api/utils.py diff --git a/rootfs/api/views.py b/rootfs/app/api/views.py similarity index 100% rename from rootfs/api/views.py rename to rootfs/app/api/views.py diff --git a/rootfs/api/viewsets.py b/rootfs/app/api/viewsets.py similarity index 100% rename from rootfs/api/viewsets.py rename to rootfs/app/api/viewsets.py diff --git a/rootfs/deis/__init__.py b/rootfs/app/deis/__init__.py similarity index 100% rename from rootfs/deis/__init__.py rename to rootfs/app/deis/__init__.py diff --git a/rootfs/deis/context_processors.py b/rootfs/app/deis/context_processors.py similarity index 100% rename from rootfs/deis/context_processors.py rename to rootfs/app/deis/context_processors.py diff --git a/rootfs/templates/gconf.py b/rootfs/app/deis/gconf.py similarity index 62% rename from rootfs/templates/gconf.py rename to rootfs/app/deis/gconf.py index 4724b87d3..3a5310130 100644 --- a/rootfs/templates/gconf.py +++ b/rootfs/app/deis/gconf.py @@ -1,14 +1,5 @@ bind = '0.0.0.0' -try: - workers = int({{ if exists "/deis/controller/workers" }}{{ getv "/deis/controller/workers" }}{{ else }}"not set"{{end}}) - if workers < 1: - raise ValueError() -except (NameError, ValueError): - import multiprocessing - try: - workers = multiprocessing.cpu_count() * 2 + 1 - except NotImplementedError: - workers = 8 +workers = 8 timeout = 1200 pidfile = '/tmp/gunicorn.pid' loglevel = 'info' diff --git a/rootfs/deis/middleware.py b/rootfs/app/deis/middleware.py similarity index 100% rename from rootfs/deis/middleware.py rename to rootfs/app/deis/middleware.py diff --git a/rootfs/deis/settings.py b/rootfs/app/deis/settings.py similarity index 70% rename from rootfs/deis/settings.py rename to rootfs/app/deis/settings.py index 5d0452b45..18739f172 100644 --- a/rootfs/deis/settings.py +++ b/rootfs/app/deis/settings.py @@ -9,9 +9,6 @@ import string import sys import tempfile -import ldap - -from django_auth_ldap.config import LDAPSearch, GroupOfNamesType PROJECT_ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), '..')) @@ -87,9 +84,6 @@ 'django.contrib.staticfiles.finders.AppDirectoriesFinder', ) -# Make this unique, and don't share it with anybody. -SECRET_KEY = None # @UnusedVariable - # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( 'django.template.loaders.filesystem.Loader', @@ -125,14 +119,6 @@ # Python dotted path to the WSGI application used by Django's runserver. WSGI_APPLICATION = 'deis.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. - PROJECT_ROOT + '/web/templates', -) - INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', @@ -143,7 +129,6 @@ 'django.contrib.sites', 'django.contrib.staticfiles', # Third-party apps - 'django_auth_ldap', 'guardian', 'json_field', 'gunicorn', @@ -154,11 +139,9 @@ # Deis apps 'api', 'registry', - 'web', ) AUTHENTICATION_BACKENDS = ( - "django_auth_ldap.backend.LDAPBackend", "django.contrib.auth.backends.ModelBackend", "guardian.backends.ObjectPermissionBackend", ) @@ -298,40 +281,40 @@ # names which apps cannot reserve for routing DEIS_RESERVED_NAMES = ['deis'] -# default scheduler settings -SCHEDULER_MODULE = 'scheduler.mock' -SCHEDULER_TARGET = '' # path to scheduler endpoint (e.g. /var/run/fleet.sock) -SCHEDULER_AUTH = '' -SCHEDULER_OPTIONS = {} +SCHEDULER_MODULE = 'scheduler.k8s' +SCHEDULER_HOST = os.environ.get('KUBERNETES_SERVICE_HOST', 'localhost') +SCHEDULER_PORT = os.environ.get('KUBERNETES_SERVICE_PORT', 443) +SCHEDULER_URL = "{}:{}".format(SCHEDULER_HOST, SCHEDULER_PORT) # security keys and auth tokens -SSH_PRIVATE_KEY = '' # used for SSH connections to facilitate "deis run" SECRET_KEY = os.environ.get('DEIS_SECRET_KEY', 'CHANGEME_sapm$s%upvsw5l_zuy_&29rkywd^78ff(qi') BUILDER_KEY = os.environ.get('DEIS_BUILDER_KEY', 'CHANGEME_sapm$s%upvsw5l_zuy_&29rkywd^78ff(qi') +# docker client settings +DOCKER_URL = os.environ.get('DOCKER_SERVICE_HOST', 'unix://var/run/docker.sock') + # registry settings -REGISTRY_URL = 'http://localhost:5000' -REGISTRY_HOST = 'localhost' -REGISTRY_PORT = 5000 +REGISTRY_HOST = os.environ.get('REGISTRY_SERVICE_HOST', 'localhost') +REGISTRY_PORT = os.environ.get('REGISTRY_SERVICE_PORT', 5000) # logger settings -LOGGER_HOST = 'localhost' -LOGGER_PORT = 8088 +LOGGER_HOST = os.environ.get('LOGGER_SERVICE_HOST', 'localhost') +LOGGER_PORT = os.environ.get('LOGGER_SERVICE_PORT', 8088) # check if we can register users with `deis register` REGISTRATION_ENABLED = True -# check if we should enable the web UI module -WEB_ENABLED = False +# if True, enable the /admin web views +ADMIN_ENABLED = False -# default to sqlite3, but allow postgresql config through envvars DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.' + os.environ.get('DATABASE_ENGINE', 'postgresql_psycopg2'), + 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DATABASE_NAME', 'deis'), - # randomize test database name so we can run multiple unit tests simultaneously - 'TEST_NAME': "unittest-{}".format(''.join( - random.choice(string.ascii_letters + string.digits) for _ in range(8))) + 'USER': os.environ.get('DATABASE_USER', 'deis'), + 'PASSWORD': os.environ.get('DATABASE_PASSWORD', ''), + 'HOST': os.environ.get('DATABASE_SERVICE_HOST', 'localhost'), + 'PORT': os.environ.get('DATABASE_SERVICE_PORT', 5432), } } @@ -340,80 +323,3 @@ # Honor HTTPS from a trusted proxy # see https://docs.djangoproject.com/en/1.6/ref/settings/#secure-proxy-ssl-header SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') - -# Unit Hostname handling. -# Supports: -# default - Docker generated hostname -# application - Hostname based on application unit name (i.e. my-application.v2.web.1) -# server - Hostname based on CoreOS server hostname -UNIT_HOSTNAME = 'default' - -# LDAP DEFAULT SETTINGS (Overrided by confd later) -LDAP_ENDPOINT = "" -BIND_DN = "" -BIND_PASSWORD = "" -USER_BASEDN = "" -USER_FILTER = "" -GROUP_BASEDN = "" -GROUP_FILTER = "" -GROUP_TYPE = "" - -# Create a file named "local_settings.py" to contain sensitive settings data -# such as database configuration, admin email, or passwords and keys. It -# should also be used for any settings which differ between development -# and production. -# The local_settings.py file should *not* be checked in to version control. -try: - from .local_settings import * # noqa -except ImportError: - pass - -# have confd_settings within container execution override all others -# including local_settings (which may end up in the container) -if os.path.exists('/templates/confd_settings.py'): - sys.path.append('/templates') - from confd_settings import * # noqa - -# Disable swap when mem limits are set, unless Docker is too old -DISABLE_SWAP = '--memory-swap=-1' -try: - version = 'unknown' - from registry.dockerclient import DockerClient - version = DockerClient().client.version().get('Version') - if not semver.validate(version) or semver.Version(version) < semver.Version('1.5.0'): - DISABLE_SWAP = '' -except: - print("Not disabling --memory-swap for Docker version {}".format(version)) - -# LDAP Backend Configuration -# Should be always after the confd_settings import. -LDAP_USER_SEARCH = LDAPSearch( - base_dn=USER_BASEDN, - scope=ldap.SCOPE_SUBTREE, - filterstr="(%s=%%(user)s)" % USER_FILTER -) -LDAP_GROUP_SEARCH = LDAPSearch( - base_dn=GROUP_BASEDN, - scope=ldap.SCOPE_SUBTREE, - filterstr="(%s=%s)" % (GROUP_FILTER, GROUP_TYPE) -) -AUTH_LDAP_SERVER_URI = LDAP_ENDPOINT -AUTH_LDAP_BIND_DN = BIND_DN -AUTH_LDAP_BIND_PASSWORD = BIND_PASSWORD -AUTH_LDAP_USER_SEARCH = LDAP_USER_SEARCH -AUTH_LDAP_GROUP_SEARCH = LDAP_GROUP_SEARCH -AUTH_LDAP_GROUP_TYPE = GroupOfNamesType() -AUTH_LDAP_USER_ATTR_MAP = { - "first_name": "givenName", - "last_name": "sn", - "email": "mail", - "username": USER_FILTER, -} -AUTH_LDAP_GLOBAL_OPTIONS = { - ldap.OPT_X_TLS_REQUIRE_CERT: False, - ldap.OPT_REFERRALS: False -} -AUTH_LDAP_ALWAYS_UPDATE_USER = True -AUTH_LDAP_MIRROR_GROUPS = True -AUTH_LDAP_FIND_GROUP_PERMS = True -AUTH_LDAP_CACHE_GROUPS = False diff --git a/rootfs/deis/urls.py b/rootfs/app/deis/urls.py similarity index 88% rename from rootfs/deis/urls.py rename to rootfs/app/deis/urls.py index e7df3d405..57fa16a43 100644 --- a/rootfs/deis/urls.py +++ b/rootfs/app/deis/urls.py @@ -20,9 +20,8 @@ url(r'^v1/', include('api.urls')), ) -if settings.WEB_ENABLED: +if settings.ADMIN_ENABLED: urlpatterns += patterns( '', - url(r'^', include('web.urls')), url(r'^admin/', include(admin.site.urls)), ) diff --git a/rootfs/deis/wsgi.py b/rootfs/app/deis/wsgi.py similarity index 100% rename from rootfs/deis/wsgi.py rename to rootfs/app/deis/wsgi.py diff --git a/rootfs/dev_requirements.txt b/rootfs/app/dev_requirements.txt similarity index 100% rename from rootfs/dev_requirements.txt rename to rootfs/app/dev_requirements.txt diff --git a/rootfs/manage.py b/rootfs/app/manage.py similarity index 100% rename from rootfs/manage.py rename to rootfs/app/manage.py diff --git a/rootfs/registry/__init__.py b/rootfs/app/registry/__init__.py similarity index 100% rename from rootfs/registry/__init__.py rename to rootfs/app/registry/__init__.py diff --git a/rootfs/registry/dockerclient.py b/rootfs/app/registry/dockerclient.py similarity index 98% rename from rootfs/registry/dockerclient.py rename to rootfs/app/registry/dockerclient.py index 0bc2b2d5b..69d3dc453 100644 --- a/rootfs/registry/dockerclient.py +++ b/rootfs/app/registry/dockerclient.py @@ -19,7 +19,7 @@ class DockerClient(object): FLOCKFILE = '/tmp/controller-pull' def __init__(self): - self.client = docker.Client(version='auto') + self.client = docker.Client(base_url=settings.DOCKER_URL, version='auto') self.registry = settings.REGISTRY_HOST + ':' + str(settings.REGISTRY_PORT) def publish_release(self, source, config, target, deis_registry): diff --git a/rootfs/registry/models.py b/rootfs/app/registry/models.py similarity index 100% rename from rootfs/registry/models.py rename to rootfs/app/registry/models.py diff --git a/rootfs/registry/tests.py b/rootfs/app/registry/tests.py similarity index 100% rename from rootfs/registry/tests.py rename to rootfs/app/registry/tests.py diff --git a/rootfs/requirements.txt b/rootfs/app/requirements.txt similarity index 89% rename from rootfs/requirements.txt rename to rootfs/app/requirements.txt index 94048c58a..e518ad59d 100644 --- a/rootfs/requirements.txt +++ b/rootfs/app/requirements.txt @@ -6,7 +6,6 @@ django-cors-headers==1.0.0 django-fsm==2.2.0 django-guardian==1.2.5 django-json-field==0.5.7 -django-auth-ldap==1.2.5 djangorestframework==3.0.5 docker-py==1.5.0 gunicorn==19.3.0 @@ -14,7 +13,6 @@ marathon==0.6.15 paramiko==1.15.2 psycopg2==2.6.1 python-etcd==0.3.2 -python-ldap==2.4.19 PyYAML==3.11 semantic_version==2.4.2 simpleflock==0.0.2 diff --git a/rootfs/scheduler/__init__.py b/rootfs/app/scheduler/__init__.py similarity index 100% rename from rootfs/scheduler/__init__.py rename to rootfs/app/scheduler/__init__.py diff --git a/rootfs/scheduler/chaos.py b/rootfs/app/scheduler/chaos.py similarity index 100% rename from rootfs/scheduler/chaos.py rename to rootfs/app/scheduler/chaos.py diff --git a/rootfs/scheduler/k8s.py b/rootfs/app/scheduler/k8s.py similarity index 94% rename from rootfs/scheduler/k8s.py rename to rootfs/app/scheduler/k8s.py index b0878deb1..68c3ef118 100644 --- a/rootfs/scheduler/k8s.py +++ b/rootfs/app/scheduler/k8s.py @@ -102,14 +102,12 @@ class KubeHTTPClient(AbstractSchedulerClient): def __init__(self, target, auth, options, pkey): super(KubeHTTPClient, self).__init__(target, auth, options, pkey) - self.target = settings.K8S_MASTER - self.port = "8080" - self.registry = settings.REGISTRY_HOST+":"+settings.REGISTRY_PORT + self.registry = settings.REGISTRY_URL self.apiversion = "v1" - self.conn = httplib.HTTPConnection(self.target+":"+self.port) + self.conn = httplib.HTTPConnection(settings.SCHEDULER_URL) def _get_old_rc(self, name, app_type): - con_app = httplib.HTTPConnection(self.target+":"+self.port) + con_app = httplib.HTTPConnection(self.url) con_app.request('GET', '/api/'+self.apiversion + '/namespaces/'+name+'/replicationcontrollers') resp = con_app.getresponse() @@ -136,7 +134,7 @@ def _get_old_rc(self, name, app_type): return 0 def _get_rc_status(self, name, namespace): - conn_rc = httplib.HTTPConnection(self.target+":"+self.port) + conn_rc = httplib.HTTPConnection(self.url) conn_rc.request('GET', '/api/'+self.apiversion+'/' + 'namespaces/'+namespace+'/replicationcontrollers/'+name) resp = conn_rc.getresponse() @@ -145,7 +143,7 @@ def _get_rc_status(self, name, namespace): return status def _get_rc_(self, name, namespace): - conn_rc_resver = httplib.HTTPConnection(self.target+":"+self.port) + conn_rc_resver = httplib.HTTPConnection(self.url) conn_rc_resver.request('GET', '/api/'+self.apiversion+'/' + 'namespaces/'+namespace+'/replicationcontrollers/'+name) resp = conn_rc_resver.getresponse() @@ -183,7 +181,7 @@ def deploy(self, name, image, command, **kwargs): self._delete_rc(old_rc_name, app_name) def _get_events(self, namespace): - con_get = httplib.HTTPConnection(self.target+":"+self.port) + con_get = httplib.HTTPConnection(self.url) con_get.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/events') resp = con_get.getresponse() reason = resp.reason @@ -229,7 +227,7 @@ def _scale_rc(self, rc, namespace): name = rc['metadata']['name'] num = rc["spec"]["replicas"] headers = {'Content-Type': 'application/json'} - conn_scalepod = httplib.HTTPConnection(self.target+":"+self.port) + conn_scalepod = httplib.HTTPConnection(self.url) conn_scalepod.request('PUT', '/api/'+self.apiversion+'/namespaces/'+namespace+'/' + 'replicationcontrollers/'+name, headers=headers, body=json.dumps(rc)) resp = conn_scalepod.getresponse() @@ -322,7 +320,7 @@ def _create_rc(self, name, image, command, **kwargs): cpu = float(cpu)/1024 containers[0]["resources"]["limits"]["cpu"] = cpu headers = {'Content-Type': 'application/json'} - conn_rc = httplib.HTTPConnection(self.target+":"+self.port) + conn_rc = httplib.HTTPConnection(self.url) conn_rc.request('POST', '/api/'+self.apiversion+'/namespaces/'+app_name+'/' + 'replicationcontrollers', headers=headers, body=json.dumps(js_template)) resp = conn_rc.getresponse() @@ -363,7 +361,7 @@ def create(self, name, image, command, **kwargs): raise RuntimeError(err) def _get_service(self, name, namespace): - con_get = httplib.HTTPConnection(self.target+":"+self.port) + con_get = httplib.HTTPConnection(self.url) con_get.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/services/'+name) resp = con_get.getresponse() reason = resp.reason @@ -405,7 +403,7 @@ def _create_service(self, name, app_name, app_type): l["name"] = appname template = string.Template(SERVICE_TEMPLATE).substitute(l) headers = {'Content-Type': 'application/json'} - conn_serv = httplib.HTTPConnection(self.target+":"+self.port) + conn_serv = httplib.HTTPConnection(self.url) conn_serv.request('POST', '/api/'+self.apiversion+'/namespaces/'+app_name+'/services', headers=headers, body=copy.deepcopy(template)) resp = conn_serv.getresponse() @@ -421,7 +419,7 @@ def _create_service(self, name, app_name, app_type): srv['spec']['selector']['type'] = app_type srv['spec']['ports'][0]['targetPort'] = port headers = {'Content-Type': 'application/json'} - conn_scalepod = httplib.HTTPConnection(self.target+":"+self.port) + conn_scalepod = httplib.HTTPConnection(self.url) conn_scalepod.request('PUT', '/api/'+self.apiversion+'/namespaces/'+app_name+'/' + 'services/'+appname, headers=headers, body=json.dumps(srv)) resp = conn_scalepod.getresponse() @@ -448,7 +446,7 @@ def stop(self, name): def _delete_rc(self, name, namespace): headers = {'Content-Type': 'application/json'} - con_dest = httplib.HTTPConnection(self.target+":"+self.port) + con_dest = httplib.HTTPConnection(self.url) con_dest.request('DELETE', '/api/'+self.apiversion+'/namespaces/'+namespace+'/' + 'replicationcontrollers/'+name, headers=headers, body=POD_DELETE) resp = con_dest.getresponse() @@ -469,7 +467,7 @@ def destroy(self, name): name = name.replace("_", "-") headers = {'Content-Type': 'application/json'} - con_dest = httplib.HTTPConnection(self.target+":"+self.port) + con_dest = httplib.HTTPConnection(self.url) con_dest.request('DELETE', '/api/'+self.apiversion+'/namespaces/'+appname+'/' + 'replicationcontrollers/'+name, headers=headers, body=POD_DELETE) resp = con_dest.getresponse() @@ -487,7 +485,7 @@ def destroy(self, name): random.seed(appname) app_id = random.randint(1, 100000) app_name = "app-"+str(app_id) - con_serv = httplib.HTTPConnection(self.target+":"+self.port) + con_serv = httplib.HTTPConnection(self.url) con_serv.request('DELETE', '/api/'+self.apiversion + '/namespaces/'+appname+'/services/'+app_name) resp = con_serv.getresponse() @@ -505,7 +503,7 @@ def destroy(self, name): for pod in parsed_json['items']: if 'generateName' in pod['metadata'] and pod['metadata']['generateName'] == name+'-': self._delete_pod(pod['metadata']['name'], appname) - con_ns = httplib.HTTPConnection(self.target+":"+self.port) + con_ns = httplib.HTTPConnection(self.url) con_ns.request('DELETE', '/api/'+self.apiversion+'/namespaces/'+appname) resp = con_ns.getresponse() reason = resp.reason @@ -518,7 +516,7 @@ def destroy(self, name): raise RuntimeError(errmsg) def _get_pod(self, name, namespace): - conn_pod = httplib.HTTPConnection(self.target+":"+self.port) + conn_pod = httplib.HTTPConnection(self.url) conn_pod.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/pods/'+name) resp = conn_pod.getresponse() status = resp.status @@ -528,7 +526,7 @@ def _get_pod(self, name, namespace): return (status, data, reason) def _get_pods(self, namespace): - con_get = httplib.HTTPConnection(self.target+":"+self.port) + con_get = httplib.HTTPConnection(self.url) con_get.request('GET', '/api/'+self.apiversion+'/namespaces/'+namespace+'/pods') resp = con_get.getresponse() reason = resp.reason @@ -543,7 +541,7 @@ def _get_pods(self, namespace): def _delete_pod(self, name, namespace): headers = {'Content-Type': 'application/json'} - con_dest_pod = httplib.HTTPConnection(self.target+":"+self.port) + con_dest_pod = httplib.HTTPConnection(self.url) con_dest_pod.request('DELETE', '/api/'+self.apiversion+'/namespaces/' + namespace+'/pods/'+name, headers=headers, body=POD_DELETE) resp = con_dest_pod.getresponse() @@ -567,7 +565,7 @@ def _delete_pod(self, name, namespace): raise RuntimeError(errmsg) def _pod_log(self, name, namespace): - conn_log = httplib.HTTPConnection(self.target+":"+self.port) + conn_log = httplib.HTTPConnection(self.url) conn_log.request('GET', '/api/'+self.apiversion+'/namespaces/' + namespace+'/pods/'+name+'/log') resp = conn_log.getresponse() @@ -613,7 +611,7 @@ def run(self, name, image, entrypoint, command): js_template['spec']['containers'][0]['command'] = [entrypoint] js_template['spec']['containers'][0]['args'] = args - con_dest = httplib.HTTPConnection(self.target+":"+self.port) + con_dest = httplib.HTTPConnection(self.url) headers = {'Content-Type': 'application/json'} con_dest.request('POST', '/api/'+self.apiversion+'/namespaces/'+appname+'/pods', headers=headers, body=json.dumps(js_template)) diff --git a/rootfs/scheduler/mock.py b/rootfs/app/scheduler/mock.py similarity index 100% rename from rootfs/scheduler/mock.py rename to rootfs/app/scheduler/mock.py diff --git a/rootfs/scheduler/states.py b/rootfs/app/scheduler/states.py similarity index 100% rename from rootfs/scheduler/states.py rename to rootfs/app/scheduler/states.py diff --git a/rootfs/setup.cfg b/rootfs/app/setup.cfg similarity index 100% rename from rootfs/setup.cfg rename to rootfs/app/setup.cfg diff --git a/rootfs/bin/boot b/rootfs/bin/boot index c23ff6f47..e14a03be6 100755 --- a/rootfs/bin/boot +++ b/rootfs/bin/boot @@ -9,150 +9,17 @@ set -eo pipefail # set debug based on envvar [[ $DEBUG ]] && set -x -# configure etcd -export ETCD_PORT=${DEIS_ETCD_1_SERVICE_PORT_CLIENT:-4001} -export ETCD_HOST=${DEIS_ETCD_1_SERVICE_HOST:-$HOST} -export ETCD="$ETCD_HOST:$ETCD_PORT" -export ETCD_PATH=${ETCD_PATH:-/deis/controller} -export ETCD_TTL=${ETCD_TTL:-20} - -# wait for etcd to be available -until etcdctl --no-sync -C "$ETCD" ls >/dev/null 2>&1; do - echo "waiting for etcd at $ETCD..." - sleep $((ETCD_TTL/2)) # sleep for half the TTL -done - -# wait until etcd has discarded potentially stale values -sleep $((ETCD_TTL+1)) - -function etcd_set_default { - set +e - ERROR="$(etcdctl --no-sync -C "$ETCD" mk "$ETCD_PATH/$1" "$2" 2>&1)" - if [[ $? -ne 0 ]] && echo "$ERROR" | grep -iqve "key already exists"; then - echo "etcd_set_default: an etcd error occurred ($ERROR)" - echo "aborting..." - exit 1 - fi - set -e -} - -function etcd_safe_mkdir { - set +e - ERROR="$(etcdctl --no-sync -C "$ETCD" mkdir "$1" 2>&1)" - - if [[ $? -ne 0 ]] && echo "$ERROR" | grep -iqve "key already exists"; then - echo "etcd_safe_mkdir: an etcd error occurred ($ERROR)" - echo "aborting..." - exit 1 - fi - set -e -} - -etcd_set_default protocol "${DEIS_PROTOCOL:-http}" -etcd_set_default secretKey "${DEIS_SECRET_KEY:-$(openssl rand -base64 64 | tr -d '\n')}" -etcd_set_default builderKey "${DEIS_BUILDER_KEY:-$(openssl rand -base64 64 | tr -d '\n')}" -etcd_set_default registrationMode "enabled" -etcd_set_default webEnabled 0 -etcd_set_default unitHostname default - -# safely create required keyspaces -etcd_safe_mkdir /deis/domains -etcd_safe_mkdir /deis/platform -etcd_safe_mkdir /deis/scheduler -etcd_safe_mkdir /deis/services - -# HACK: set up keys for database -etcd_safe_mkdir /deis/database -ETCD_PATH=/deis/database etcd_set_default engine postgresql_psycopg2 -ETCD_PATH=/deis/database etcd_set_default name deis -ETCD_PATH=/deis/database etcd_set_default user deis -ETCD_PATH=/deis/database etcd_set_default password changeme123 -ETCD_PATH=/deis/database etcd_set_default host "${DEIS_DATABASE_SERVICE_HOST:-127.0.0.1}" -ETCD_PATH=/deis/database etcd_set_default port "${DEIS_DATABASE_SERVICE_PORT:-5432}" - -# HACK: set up keys for logs -etcd_safe_mkdir /deis/logs -ETCD_PATH=/deis/logs etcd_set_default host "${DEIS_LOGS_SERVICE_HOST:-127.0.0.1}" - -# HACK: set up keys for platform -etcd_safe_mkdir /deis/platform -ETCD_PATH=/deis/platform etcd_set_default domain localhost - -# HACK: set up keys for registry -etcd_safe_mkdir /deis/registry -ETCD_PATH=/deis/registry etcd_set_default protocol "${DEIS_REGISTRY_SERVICE_PROTOCOL:-http}" -ETCD_PATH=/deis/registry etcd_set_default host "${DEIS_REGISTRY_SERVICE_HOST:-127.0.0.1}" -ETCD_PATH=/deis/registry etcd_set_default port "${DEIS_REGISTRY_SERVICE_PORT:-5000}" - -# run etcd data migrations -echo "controller: running etcd data migrations..." -for script in /app/migrations/data/*.sh; -do - # shellcheck disable=SC1090 - . "$script"; -done -echo "controller: done running etcd data migrations." - -# wait for confd to run once and install initial templates -until confd -onetime -node "$ETCD" --confdir /app --log-level error; do - echo "controller: waiting for confd to write initial templates..." - sleep $((ETCD_TTL/2)) # sleep for half the TTL -done - -cd /app - -mkdir -p /data/logs -chmod 777 /data/logs - -# allow deis user permission to Docker -if addgroup -g "$(stat -c "%g" /var/run/docker.sock)" docker; then - addgroup deis docker +# allow deis user permission to Docker if the socket is present +if [ -f /var/run/docker.sock ]; then + if addgroup -g "$(stat -c "%g" /var/run/docker.sock)" docker; then + addgroup deis docker + fi fi # run an idempotent database migration sudo -E -u deis ./manage.py syncdb --migrate --noinput -# spawn a gunicorn server in the background -sudo -E -u deis gunicorn -c deis/gconf.py deis.wsgi & - ./manage.py load_db_state_to_etcd -# smart shutdown on SIGTERM (SIGINT is handled by gunicorn) -function on_exit() { - GUNICORN_PID=$(cat /tmp/gunicorn.pid) - kill -TERM "$GUNICORN_PID" 2>/dev/null - wait "$GUNICORN_PID" 2>/dev/null - exit 0 -} -trap on_exit TERM - -# spawn confd in the background to update services based on etcd changes -confd -node "$ETCD" --confdir /app --log-level error --interval 5 & - -echo deis-controller running... - -# publish the service to etcd using the injected EXTERNAL_PORT -if [[ ! -z $EXTERNAL_PORT ]]; then - - # configure service discovery - PORT=${PORT:-8000} - PROTO=${PROTO:-tcp} - - set +e - - # wait for the service to become available on PORT - sleep 1 && while [[ -z $(netstat -lnt | awk "\$6 == \"LISTEN\" && \$4 ~ \".$PORT\" && \$1 ~ \"$PROTO.?\"") ]] ; do sleep 1; done - - # while the port is listening, publish to etcd - while [[ ! -z $(netstat -lnt | awk "\$6 == \"LISTEN\" && \$4 ~ \".$PORT\" && \$1 ~ \"$PROTO.?\"") ]] ; do - etcdctl --no-sync -C "$ETCD" set "$ETCD_PATH/host" "$HOST" --ttl "$ETCD_TTL" >/dev/null - etcdctl --no-sync -C "$ETCD" set "$ETCD_PATH/port" "$EXTERNAL_PORT" --ttl "$ETCD_TTL" >/dev/null - sleep $((ETCD_TTL/2)) # sleep for half the TTL - done - - # if the loop quits, something went wrong - exit 1 - -fi - -wait +# run the controller +exec sudo -E -u deis gunicorn -c deis/gconf.py deis.wsgi & diff --git a/rootfs/bin/reload b/rootfs/bin/reload deleted file mode 100755 index 1ce458cb9..000000000 --- a/rootfs/bin/reload +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -# gracefully reload gunicorn -kill -HUP "$(cat /tmp/gunicorn.pid)" - -exit 0 diff --git a/rootfs/build.sh b/rootfs/build.sh deleted file mode 100755 index 80e50fdf0..000000000 --- a/rootfs/build.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -# fail on any command exiting non-zero -set -eo pipefail - -if [[ -z $DOCKER_BUILD ]]; then - echo - echo "Note: this script is intended for use by the Dockerfile and not as a way to build the controller locally" - echo - exit 1 -fi - -# install required system packages -# HACK: install git so we can install bacongobbler's fork of django-fsm -apk add --update-cache \ - build-base \ - git \ - libffi-dev \ - libpq \ - openldap \ - openldap-dev \ - postgresql-dev \ - python \ - python-dev - -# install pip -curl -sSL https://raw.githubusercontent.com/pypa/pip/7.0.3/contrib/get-pip.py | python - - -# add a deis user -adduser deis -D -h /app -s /bin/bash - -# create a /app directory for storing application data -mkdir -p /app && chown -R deis:deis /app - -# create directory for confd templates -mkdir -p /templates && chown -R deis:deis /templates - -# install dependencies -pip install --disable-pip-version-check --no-cache-dir -r /app/requirements.txt - -# cleanup. -apk del --purge \ - build-base \ - git \ - libffi-dev \ - openldap-dev \ - postgresql-dev \ - python-dev -rm -rf /var/cache/apk/* diff --git a/rootfs/conf.d/confd_settings.toml b/rootfs/conf.d/confd_settings.toml deleted file mode 100644 index c6c8f5b15..000000000 --- a/rootfs/conf.d/confd_settings.toml +++ /dev/null @@ -1,16 +0,0 @@ -[template] -src = "confd_settings.py" -dest = "/templates/confd_settings.py" -uid = 1000 -gid = 1000 -mode = "0640" -keys = [ - "/deis/controller", - "/deis/database", - "/deis/registry", - "/deis/domains", - "/deis/platform", - "/deis/scheduler", - "/deis/logs", -] -reload_cmd = "/app/bin/reload" diff --git a/rootfs/conf.d/gconf.toml b/rootfs/conf.d/gconf.toml deleted file mode 100644 index ceb9326e7..000000000 --- a/rootfs/conf.d/gconf.toml +++ /dev/null @@ -1,10 +0,0 @@ -[template] -src = "gconf.py" -dest = "/app/deis/gconf.py" -uid = 1000 -gid = 1000 -mode = "0640" -keys = [ - "/deis/controller", -] -reload_cmd = "/app/bin/reload" diff --git a/rootfs/migrations/data/0001.sh b/rootfs/migrations/data/0001.sh deleted file mode 100755 index fccfb19b9..000000000 --- a/rootfs/migrations/data/0001.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash - -ETCDCTL="etcdctl -C $ETCD" - -if [[ "$($ETCDCTL get /deis/migrations/data/0001 2> /dev/null)" != "done" ]]; -then - for i in $($ETCDCTL ls /deis/domains 2> /dev/null); - do - for j in $($ETCDCTL get "$i"); - do - $ETCDCTL set "/deis/domains/$j" "$(basename "$i")" 1> /dev/null; - echo "migrated $j" - done; - $ETCDCTL rm "$i"; - done - $ETCDCTL set /deis/migrations/data/0001 "done" -fi diff --git a/rootfs/migrations/data/0002.sh b/rootfs/migrations/data/0002.sh deleted file mode 100755 index 83d2c8a15..000000000 --- a/rootfs/migrations/data/0002.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash - -ETCDCTL="etcdctl -C $ETCD" - -# April 8, 2015: If registrationEnabled key exists, migrate it to registrationMode and delete it. - -if [[ "$($ETCDCTL get /deis/migrations/data/0002 2> /dev/null)" != "done" ]]; -then - if $ETCDCTL ls /deis/controller | grep -q '/deis/controller/registrationEnabled' - then - if [[ "$($ETCDCTL get /deis/controller/registrationEnabled 2> /dev/null)" == "false" ]] - then - $ETCDCTL set /deis/controller/registrationMode "disabled" - else - $ETCDCTL set /deis/controller/registrationMode "enabled" - fi - - $ETCDCTL rm /deis/controller/registrationEnabled - else - echo "registrationEnabled key doesn't exist, skipping migration" - fi - - $ETCDCTL set /deis/migrations/data/0002 "done" -fi diff --git a/rootfs/scheduler/fleet.py b/rootfs/scheduler/fleet.py deleted file mode 100644 index 22cdc2338..000000000 --- a/rootfs/scheduler/fleet.py +++ /dev/null @@ -1,389 +0,0 @@ -import base64 -import copy -import cStringIO -import httplib -import json -import paramiko -import re -import socket -import time - -from django.conf import settings - -from . import AbstractSchedulerClient -from .states import JobState - - -MATCH = re.compile( - '(?P[a-z0-9-]+)_?(?Pv[0-9]+)?\.?(?P[a-z-_]+)?.(?P[0-9]+)') -RETRIES = 3 - - -class UHTTPConnection(httplib.HTTPConnection): - """Subclass of Python library HTTPConnection that uses a Unix domain socket. - """ - - def __init__(self, path): - httplib.HTTPConnection.__init__(self, 'localhost') - self.path = path - - def connect(self): - sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - sock.connect(self.path) - self.sock = sock - - -class FleetHTTPClient(AbstractSchedulerClient): - - def __init__(self, target, auth, options, pkey): - super(FleetHTTPClient, self).__init__(target, auth, options, pkey) - # single global connection - self.conn = UHTTPConnection(self.target) - - # connection helpers - - def _request_unit(self, method, name, body=None): - headers = {'Content-Type': 'application/json'} - self.conn.request(method, '/v1-alpha/units/{name}.service'.format(**locals()), - headers=headers, body=json.dumps(body)) - return self.conn.getresponse() - - def _get_unit(self, name): - for attempt in xrange(RETRIES): - try: - resp = self._request_unit('GET', name) - data = resp.read() - if not 200 <= resp.status <= 299: - errmsg = "Failed to retrieve unit: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return data - except: - if attempt >= (RETRIES - 1): - raise - - def _put_unit(self, name, body): - for attempt in xrange(RETRIES): - try: - resp = self._request_unit('PUT', name, body) - data = resp.read() - if not 200 <= resp.status <= 299: - errmsg = "Failed to create unit: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return data - except: - if attempt >= (RETRIES - 1): - raise - - def _delete_unit(self, name): - headers = {'Content-Type': 'application/json'} - self.conn.request('DELETE', '/v1-alpha/units/{name}.service'.format(**locals()), - headers=headers) - resp = self.conn.getresponse() - data = resp.read() - if resp.status not in (404, 204): - errmsg = "Failed to delete unit: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return data - - def _get_state(self, name=None): - headers = {'Content-Type': 'application/json'} - url = '/v1-alpha/state' - if name: - url += '?unitName={name}.service'.format(**locals()) - self.conn.request('GET', url, headers=headers) - resp = self.conn.getresponse() - data = resp.read() - if resp.status not in (200,): - errmsg = "Failed to retrieve state: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return json.loads(data) - - def _get_machines(self): - headers = {'Content-Type': 'application/json'} - url = '/v1-alpha/machines' - self.conn.request('GET', url, headers=headers) - resp = self.conn.getresponse() - data = resp.read() - if resp.status not in (200,): - errmsg = "Failed to retrieve machines: {} {} - {}".format( - resp.status, resp.reason, data) - raise RuntimeError(errmsg) - return json.loads(data) - - # container api - - def create(self, name, image, command='', template=None, **kwargs): - """Create a container.""" - self._create_container(name, image, command, - template or copy.deepcopy(CONTAINER_TEMPLATE), **kwargs) - - def _create_container(self, name, image, command, unit, **kwargs): - l = locals().copy() - l.update(re.match(MATCH, name).groupdict()) - # prepare memory limit for the container type - mem = kwargs.get('memory', {}).get(l['c_type'], None) - if mem: - l.update({'memory': '-m {} {}'.format(mem.lower(), settings.DISABLE_SWAP)}) - else: - l.update({'memory': ''}) - # prepare memory limit for the container type - cpu = kwargs.get('cpu', {}).get(l['c_type'], None) - if cpu: - l.update({'cpu': '-c {}'.format(cpu)}) - else: - l.update({'cpu': ''}) - # set unit hostname - l.update({'hostname': self._get_hostname(name)}) - # should a special entrypoint be used - entrypoint = kwargs.get('entrypoint') - if entrypoint: - l.update({'entrypoint': '{}'.format(entrypoint)}) - # encode command as utf-8 - if isinstance(l.get('command'), basestring): - l['command'] = l['command'].encode('utf-8') - # construct unit from template - for f in unit: - f['value'] = f['value'].format(**l) - # prepare tags only if one was provided - tags = kwargs.get('tags', {}) - tagset = ' '.join(['"{}={}"'.format(k, v) for k, v in tags.viewitems()]) - if settings.ENABLE_PLACEMENT_OPTIONS in ['true', 'True', 'TRUE', '1']: - unit.append({"section": "X-Fleet", "name": "MachineMetadata", - "value": tagset + ' "dataPlane=true"'}) - # post unit to fleet - self._put_unit(name, {"desiredState": "loaded", "options": unit}) - - def _get_hostname(self, application_name): - hostname = settings.UNIT_HOSTNAME - if hostname == "default": - return '' - elif hostname == "application": - # replace underscore with dots, since underscore is not valid in DNS hostnames - dns_name = application_name.replace("_", ".") - return '-h ' + dns_name - elif hostname == "server": - return '-h %H' - else: - raise RuntimeError('Unsupported hostname: ' + hostname) - - def start(self, name): - """Start a container.""" - self._put_unit(name, {'desiredState': 'launched'}) - self._wait_for_container_running(name) - - def _wait_for_container_state(self, name): - # wait for container to get scheduled - for _ in xrange(30): - states = self._get_state(name) - if states and len(states.get('states', [])) == 1: - return states.get('states')[0] - time.sleep(1) - else: - raise RuntimeError('container timeout while retrieving state') - - def _wait_for_container_running(self, name): - # we bump to 20 minutes here to match the timeout on the router and in the app unit files - try: - self._wait_for_job_state(name, JobState.up) - except RuntimeError: - raise RuntimeError('container failed to start') - - def _wait_for_job_state(self, name, state): - # we bump to 20 minutes here to match the timeout on the router and in the app unit files - for _ in xrange(1200): - if self.state(name) == state: - return - time.sleep(1) - else: - raise RuntimeError('timeout waiting for job state: {}'.format(state)) - - def _wait_for_destroy(self, name): - for _ in xrange(30): - if not self._get_state(name): - break - time.sleep(1) - else: - raise RuntimeError('timeout on container destroy') - - def stop(self, name): - """Stop a container.""" - self._put_unit(name, {"desiredState": "loaded"}) - self._wait_for_job_state(name, JobState.created) - - def destroy(self, name): - """Destroy a container.""" - # call all destroy functions, ignoring any errors - try: - self._destroy_container(name) - except: - pass - self._wait_for_destroy(name) - - def _destroy_container(self, name): - for attempt in xrange(RETRIES): - try: - self._delete_unit(name) - break - except: - if attempt == (RETRIES - 1): # account for 0 indexing - raise - - def run(self, name, image, entrypoint, command): # noqa - """Run a one-off command.""" - self._create_container(name, image, command, copy.deepcopy(RUN_TEMPLATE), - entrypoint=entrypoint) - # launch the container - self._put_unit(name, {'desiredState': 'launched'}) - # wait for the container to get scheduled - state = self._wait_for_container_state(name) - - try: - machineID = state.get('machineID') - - # find the machine - machines = self._get_machines() - if not machines: - raise RuntimeError('no available hosts to run command') - - # find the machine's primaryIP - primaryIP = None - for m in machines.get('machines', []): - if m['id'] == machineID: - primaryIP = m['primaryIP'] - if not primaryIP: - raise RuntimeError('could not find host') - - # prepare ssh key - file_obj = cStringIO.StringIO(base64.b64decode(self.pkey)) - pkey = paramiko.RSAKey(file_obj=file_obj) - - # grab output via docker logs over SSH - ssh = paramiko.SSHClient() - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - ssh.connect(primaryIP, username="core", pkey=pkey) - # share a transport - tran = ssh.get_transport() - - def _do_ssh(cmd): - with tran.open_session() as chan: - chan.exec_command(cmd) - while not chan.exit_status_ready(): - time.sleep(1) - out = chan.makefile() - output = out.read() - rc = chan.recv_exit_status() - return rc, output - - # wait for container to launch - # we loop indefinitely here, as we have no idea how long the docker pull will take - while True: - rc, _ = _do_ssh('docker inspect {name}'.format(**locals())) - if rc == 0: - break - time.sleep(1) - else: - raise RuntimeError('failed to create container') - - # wait for container to start - for _ in xrange(2): - _rc, _output = _do_ssh('docker inspect {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('failed to inspect container') - _container = json.loads(_output) - started_at = _container[0]["State"]["StartedAt"] - if not started_at.startswith('0001'): - break - time.sleep(1) - else: - raise RuntimeError('container failed to start') - - # wait for container to complete - for _ in xrange(1200): - _rc, _output = _do_ssh('docker inspect {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('failed to inspect container') - _container = json.loads(_output) - finished_at = _container[0]["State"]["FinishedAt"] - if not finished_at.startswith('0001'): - break - time.sleep(1) - else: - raise RuntimeError('container timed out') - - # gather container output - _rc, output = _do_ssh('docker logs {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('could not attach to container') - - # determine container exit code - _rc, _output = _do_ssh('docker inspect {name}'.format(**locals())) - if _rc != 0: - raise RuntimeError('could not determine exit code') - container = json.loads(_output) - rc = container[0]["State"]["ExitCode"] - - finally: - # cleanup - self._destroy_container(name) - self._wait_for_destroy(name) - - # return rc and output - return rc, output - - def state(self, name): - """Display the given job's running state.""" - systemdActiveStateMap = { - 'active': 'up', - 'reloading': 'down', - 'inactive': 'created', - 'failed': 'crashed', - 'activating': 'down', - 'deactivating': 'down', - } - try: - # NOTE (bacongobbler): this call to ._get_unit() acts as a pre-emptive check to - # determine if the job no longer exists (will raise a RuntimeError on 404) - self._get_unit(name) - state = self._wait_for_container_state(name) - activeState = state['systemdActiveState'] - # FIXME (bacongobbler): when fleet loads a job, sometimes it'll automatically start and - # stop the container, which in our case will return as 'failed', even though - # the container is perfectly fine. - if activeState == 'failed' and state['systemdLoadState'] == 'loaded': - return JobState.created - return getattr(JobState, systemdActiveStateMap[activeState]) - except KeyError: - # failed retrieving a proper response from the fleet API - return JobState.error - except RuntimeError: - # failed to retrieve a response from the fleet API, - # which means it does not exist - return JobState.destroyed - -SchedulerClient = FleetHTTPClient - - -CONTAINER_TEMPLATE = [ - {"section": "Unit", "name": "Description", "value": "{name}"}, - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker pull $IMAGE"'''}, # noqa - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "docker inspect {name} >/dev/null 2>&1 && docker rm -f {name} || true"'''}, # noqa - {"section": "Service", "name": "ExecStart", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker run --name {name} --rm {memory} {cpu} {hostname} -P $IMAGE {command}"'''}, # noqa - {"section": "Service", "name": "ExecStop", "value": '''/usr/bin/docker stop {name}'''}, - {"section": "Service", "name": "TimeoutStartSec", "value": "20m"}, - {"section": "Service", "name": "TimeoutStopSec", "value": "10"}, - {"section": "Service", "name": "RestartSec", "value": "5"}, - {"section": "Service", "name": "Restart", "value": "on-failure"}, -] - - -RUN_TEMPLATE = [ - {"section": "Unit", "name": "Description", "value": "{name} admin command"}, - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker pull $IMAGE"'''}, # noqa - {"section": "Service", "name": "ExecStartPre", "value": '''/bin/sh -c "docker inspect {name} >/dev/null 2>&1 && docker rm -f {name} || true"'''}, # noqa - {"section": "Service", "name": "ExecStart", "value": '''/bin/sh -c "IMAGE=$(etcdctl get /deis/registry/host 2>&1):$(etcdctl get /deis/registry/port 2>&1)/{image}; docker run --name {name} --entrypoint={entrypoint} -a stdout -a stderr $IMAGE {command}"'''}, # noqa - {"section": "Service", "name": "TimeoutStartSec", "value": "20m"}, -] diff --git a/rootfs/scheduler/mesos_marathon.py b/rootfs/scheduler/mesos_marathon.py deleted file mode 100644 index 3338c9c50..000000000 --- a/rootfs/scheduler/mesos_marathon.py +++ /dev/null @@ -1,115 +0,0 @@ -import re -import time - -from django.conf import settings -from docker import Client -from marathon import MarathonClient -from marathon.models import MarathonApp - -from . import AbstractSchedulerClient -from .fleet import FleetHTTPClient -from .states import JobState - -# turn down standard marathon logging - -MATCH = re.compile( - '(?P[a-z0-9-]+)_?(?Pv[0-9]+)?\.?(?P[a-z-_]+)?.(?P[0-9]+)') -RETRIES = 3 -POLL_ATTEMPTS = 30 -POLL_WAIT = 100 - - -class MarathonHTTPClient(AbstractSchedulerClient): - - def __init__(self, target, auth, options, pkey): - super(MarathonHTTPClient, self).__init__(target, auth, options, pkey) - self.target = settings.MARATHON_HOST - self.registry = settings.REGISTRY_HOST + ':' + settings.REGISTRY_PORT - self.client = MarathonClient('http://'+self.target+':8180') - self.fleet = FleetHTTPClient('/var/run/fleet.sock', auth, options, pkey) - - # helpers - def _app_id(self, name): - return name.replace('_', '.') - - # container api - def create(self, name, image, command='', **kwargs): - """Create a new container""" - app_id = self._app_id(name) - l = locals().copy() - l.update(re.match(MATCH, name).groupdict()) - image = self.registry + '/' + image - mems = kwargs.get('memory', {}).get(l['c_type']) - m = 0 - if mems: - mems = mems.lower() - if mems[-2:-1].isalpha() and mems[-1].isalpha(): - mems = mems[:-1] - m = int(mems[:-1]) - c = 0.5 - cpu = kwargs.get('cpu', {}).get(l['c_type']) - if cpu: - c = cpu - cmd = "docker run --name {name} -P {image} {command}".format(**locals()) - self.client.create_app(app_id, MarathonApp(cmd=cmd, mem=m, cpus=c, instances=0)) - for _ in xrange(POLL_ATTEMPTS): - if self.client.get_app(self._app_id(name)).tasks_running == 0: - return - time.sleep(1) - - def start(self, name): - """Start a container.""" - self.client.scale_app(self._app_id(name), 1, force=True) - for _ in xrange(POLL_ATTEMPTS): - if self.client.get_app(self._app_id(name)).tasks_running == 1: - break - time.sleep(1) - host = self.client.get_app(self._app_id(name)).tasks[0].host - self._waitforcontainer(host, name) - - def destroy(self, name): - """Destroy a container.""" - try: - host = self.client.get_app(self._app_id(name)).tasks[0].host - self.client.delete_app(self._app_id(name), force=True) - self._delete_container(host, name) - except: - self.client.delete_app(self._app_id(name), force=True) - - def _get_container_state(self, host, name): - docker_cli = Client("tcp://{}:2375".format(host), timeout=1200, version='1.17') - try: - if docker_cli.inspect_container(name)['State']['Running']: - return JobState.up - except: - return JobState.destroyed - - def _waitforcontainer(self, host, name): - for _ in xrange(POLL_WAIT): - if self._get_container_state(host, name) == JobState.up: - return - time.sleep(1) - raise RuntimeError("App container Not Started") - - def _delete_container(self, host, name): - docker_cli = Client("tcp://{}:2375".format(host), timeout=1200, version='1.17') - if docker_cli.inspect_container(name)['State']: - docker_cli.remove_container(name, force=True) - - def run(self, name, image, entrypoint, command): # noqa - """Run a one-off command.""" - return self.fleet.run(name, image, entrypoint, command) - - def state(self, name): - """Display the given job's running state.""" - try: - for _ in xrange(POLL_ATTEMPTS): - if self.client.get_app(self._app_id(name)).tasks_running == 1: - return JobState.up - elif self.client.get_app(self._app_id(name)).tasks_running == 0: - return JobState.created - time.sleep(1) - except: - return JobState.destroyed - -SchedulerClient = MarathonHTTPClient diff --git a/rootfs/scheduler/swarm.py b/rootfs/scheduler/swarm.py deleted file mode 100644 index 6d4142f4d..000000000 --- a/rootfs/scheduler/swarm.py +++ /dev/null @@ -1,124 +0,0 @@ -import re -import time - -from django.conf import settings -from docker import Client - -from . import AbstractSchedulerClient -from .states import JobState - - -MATCH = re.compile( - r'(?P[a-z0-9-]+)_?(?Pv[0-9]+)?\.?(?P[a-z-_]+)?.(?P[0-9]+)') - - -class SwarmClient(AbstractSchedulerClient): - - def __init__(self, target, auth, options, pkey): - super(SchedulerClient, self).__init__(target, auth, options, pkey) - self.target = settings.SWARM_HOST - # single global connection - self.registry = settings.REGISTRY_HOST + ':' + settings.REGISTRY_PORT - self.docker_cli = Client("tcp://{}:2395".format(self.target), - timeout=1200, version='1.17') - - def create(self, name, image, command='', template=None, **kwargs): - """Create a new container.""" - cimage = self.registry + '/' + image - affinity = "affinity:container!=~/{}*/".format(re.split(r'_v\d.', name)[0]) - l = locals().copy() - l.update(re.match(MATCH, name).groupdict()) - mem = kwargs.get('memory', {}).get(l['c_type']) - if mem: - mem = mem.lower() - if mem[-2:-1].isalpha() and mem[-1].isalpha(): - mem = mem[:-1] - cpu = kwargs.get('cpu', {}).get(l['c_type']) - self.docker_cli.create_container(image=cimage, name=name, - command=command.encode('utf-8'), - mem_limit=mem, - cpu_shares=cpu, - environment=[affinity], - host_config={'PublishAllPorts': True}) - - def start(self, name): - """Start a container.""" - self.docker_cli.start(name) - - def stop(self, name): - """Stop a container.""" - self.docker_cli.stop(name) - - def destroy(self, name): - """Destroy a container.""" - self.stop(name) - self.docker_cli.remove_container(name) - - def run(self, name, image, entrypoint, command): - """Run a one-off command.""" - cimage = self.registry + '/' + image - # use affinity for nodes that already have the image - affinity = "affinity:image==~{}".format(cimage) - self.docker_cli.create_container(image=cimage, name=name, - command=command.encode('utf-8'), - environment=[affinity], - entrypoint=[entrypoint]) - time.sleep(2) - self.start(name) - rc = 0 - while (True): - if self._get_container_state(name) == JobState.created: - break - time.sleep(1) - try: - output = self.docker_cli.logs(name) - return rc, output - except: - rc = 1 - return rc, output - - def _get_container_state(self, name): - try: - if self.docker_cli.inspect_container(name)['State']['Running']: - return JobState.up - else: - return JobState.created - except: - return JobState.destroyed - - def state(self, name): - """Display the given job's running state.""" - try: - for _ in xrange(30): - return self._get_container_state(name) - time.sleep(1) - # FIXME (smothiki): should be able to send JobState.crashed - except KeyError: - return JobState.error - except RuntimeError: - return JobState.destroyed - - def _get_hostname(self, application_name): - hostname = settings.UNIT_HOSTNAME - if hostname == 'default': - return '' - elif hostname == 'application': - # replace underscore with dots, since underscore is not valid in DNS hostnames - dns_name = application_name.replace('_', '.') - return dns_name - elif hostname == 'server': - raise NotImplementedError - else: - raise RuntimeError('Unsupported hostname: ' + hostname) - - def _get_portbindings(self, image): - dictports = self.docker_cli.inspect_image(image)['ContainerConfig']['ExposedPorts'] - for port in dictports: - dictports[port] = None - return dictports - - def _get_ports(self, image): - dictports = self.docker_cli.inspect_image(image)['ContainerConfig']['ExposedPorts'] - return [int(port.split('/')[0]) for port in dictports] - -SchedulerClient = SwarmClient diff --git a/rootfs/templates/confd_settings.py b/rootfs/templates/confd_settings.py deleted file mode 100644 index 2b7cd8eb4..000000000 --- a/rootfs/templates/confd_settings.py +++ /dev/null @@ -1,73 +0,0 @@ -# security keys and auth tokens -SECRET_KEY = '{{ getv "/deis/controller/secretKey" }}' -BUILDER_KEY = '{{ getv "/deis/controller/builderKey" }}' - -# scheduler settings -SCHEDULER_MODULE = 'scheduler.{{ if exists "/deis/controller/schedulerModule" }}{{ getv "/deis/controller/schedulerModule" }}{{ else }}fleet{{ end }}' -SCHEDULER_TARGET = '{{ if exists "/deis/controller/schedulerTarget" }}{{ getv "/deis/controller/schedulerTarget" }}{{ else }}/var/run/fleet.sock{{ end }}' -try: - SCHEDULER_OPTIONS = dict('{{ if exists "/deis/controller/schedulerOptions" }}{{ getv "/deis/controller/schedulerOptions" }}{{ else }}{}{{ end }}') -except: - SCHEDULER_OPTIONS = {} - -# scheduler swarm manager host - -SWARM_HOST = '{{ if exists "/deis/scheduler/swarm/host" }}{{ getv "/deis/scheduler/swarm/host" }}{{ else }}127.0.0.1{{ end }}' - -MARATHON_HOST = '{{ if exists "/deis/scheduler/mesos/marathon" }}{{ getv "/deis/scheduler/mesos/marathon" }}{{ else }}127.0.0.1{{ end }}' - -K8S_MASTER = '{{ if exists "/deis/scheduler/k8s/master" }}{{ getv "/deis/scheduler/k8s/master" }}{{ else }}127.0.0.1{{ end }}' - -# base64-encoded SSH private key to facilitate current version of "deis run" -SSH_PRIVATE_KEY = """{{ if exists "/deis/platform/sshPrivateKey" }}{{ getv "/deis/platform/sshPrivateKey" }}{{ else }}""{{end}}""" - -# platform domain must be provided -DEIS_DOMAIN = '{{ getv "/deis/platform/domain" }}' - -ENABLE_PLACEMENT_OPTIONS = """{{ if exists "/deis/platform/enablePlacementOptions" }}{{ getv "/deis/platform/enablePlacementOptions" }}{{ else }}false{{end}}""" - -# use the private registry module -REGISTRY_URL = '{{ getv "/deis/registry/protocol" }}://{{ getv "/deis/registry/host" }}:{{ getv "/deis/registry/port" }}' # noqa -REGISTRY_HOST = '{{ getv "/deis/registry/host" }}' -REGISTRY_PORT = '{{ getv "/deis/registry/port" }}' - -# default to sqlite3, but allow postgresql config through envvars -# 'ENGINE': 'django.db.backends.{{ getv "/deis/database/engine" }}', -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': '{{ getv "/deis/database/name" }}', - 'USER': '{{ getv "/deis/database/user" }}', - 'PASSWORD': '{{ getv "/deis/database/password" }}', - 'HOST': '{{ getv "/deis/database/host" }}', - 'PORT': '{{ getv "/deis/database/port" }}', - } -} - -LOGGER_HOST = '{{ getv "/deis/logs/host"}}' - -{{ if exists "/deis/controller/registrationMode" }} -REGISTRATION_MODE = '{{ getv "/deis/controller/registrationMode" }}' -{{ end }} - -{{ if exists "/deis/controller/webEnabled" }} -WEB_ENABLED = bool({{ getv "/deis/controller/webEnabled" }}) -{{ end }} -UNIT_HOSTNAME = '{{ if exists "/deis/controller/unitHostname" }}{{ getv "/deis/controller/unitHostname" }}{{ else }}default{{ end }}' - -{{ if exists "/deis/controller/subdomain" }} -DEIS_RESERVED_NAMES = ['{{ getv "/deis/controller/subdomain" }}'] -{{ end }} - -# AUTH -# LDAP -{{ if exists "/deis/controller/auth/ldap/endpoint" }} -LDAP_ENDPOINT = '{{ if exists "/deis/controller/auth/ldap/endpoint" }}{{ getv "/deis/controller/auth/ldap/endpoint"}}{{ else }} {{ end }}' -BIND_DN = '{{ if exists "/deis/controller/auth/ldap/bind/dn" }}{{ getv "/deis/controller/auth/ldap/bind/dn"}}{{ else }} {{ end }}' -BIND_PASSWORD = '{{ if exists "/deis/controller/auth/ldap/bind/password" }}{{ getv "/deis/controller/auth/ldap/bind/password"}}{{ else }} {{ end }}' -USER_BASEDN = '{{ if exists "/deis/controller/auth/ldap/user/basedn" }}{{ getv "/deis/controller/auth/ldap/user/basedn"}}{{ else }} {{ end }}' -USER_FILTER = '{{ if exists "/deis/controller/auth/ldap/user/filter" }}{{ getv "/deis/controller/auth/ldap/user/filter"}}{{ else }} {{ end }}' -GROUP_BASEDN = '{{ if exists "/deis/controller/auth/ldap/group/basedn" }}{{ getv "/deis/controller/auth/ldap/group/basedn"}}{{ else }} {{ end }}' -GROUP_FILTER = '{{ if exists "/deis/controller/auth/ldap/group/filter" }}{{ getv "/deis/controller/auth/ldap/group/filter"}}{{ else }} {{ end }}' -GROUP_TYPE = '{{ if exists "/deis/controller/auth/ldap/group/type" }}{{ getv "/deis/controller/auth/ldap/group/type"}}{{ else }} {{ end }}' -{{ end }} diff --git a/rootfs/web/__init__.py b/rootfs/web/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rootfs/web/fixtures/test_web.json b/rootfs/web/fixtures/test_web.json deleted file mode 100644 index 36ebbf687..000000000 --- a/rootfs/web/fixtures/test_web.json +++ /dev/null @@ -1,66 +0,0 @@ -[ -{ - "pk": -1, - "model": "auth.user", - "fields": { - "username": "AnonymousUser", - "first_name": "", - "last_name": "", - "is_active": true, - "is_superuser": false, - "is_staff": false, - "last_login": "2013-11-25T21:33:19.120Z", - "groups": [], - "user_permissions": [], - "password": "", - "email": "", - "date_joined": "2013-11-25T21:33:19.120Z" - } -}, -{ - "pk": 2, - "model": "auth.user", - "fields": { - "username": "autotest-1", - "first_name": "", - "last_name": "", - "is_active": true, - "is_superuser": false, - "is_staff": false, - "last_login": "2013-11-25T21:58:47.420Z", - "groups": [], - "user_permissions": [], - "password": "pbkdf2_sha256$10000$SLr4X1T9L3QA$NB4d4a0d+3NZuAwLbdnKGb2z3P/hQrKQHVaGG3zAaMw=", - "email": "autotest@deis.io", - "date_joined": "2013-11-25T21:58:46.208Z" - } -}, -{ - "pk": 3, - "model": "auth.user", - "fields": { - "username": "autotest-2", - "first_name": "", - "last_name": "", - "is_active": true, - "is_superuser": false, - "is_staff": false, - "last_login": "2013-11-25T21:59:31.404Z", - "groups": [], - "user_permissions": [], - "password": "pbkdf2_sha256$10000$FrfwTVAtWPMD$HUfDokMeY37YshdyS3uhDZ+d/r8galU7kNuBfZxJl2s=", - "email": "autotest@deis.io", - "date_joined": "2013-11-25T21:59:30.760Z" - } -}, -{ - "pk": "5a09a1e0-a27e-4839-928b-449310ed90f0", - "model": "api.app", - "fields": { - "updated": "2013-11-25T22:09:36.726Z", - "created": "2013-11-25T22:09:36.726Z", - "owner": 2, - "id": "autotest-1-app" - } -} -] diff --git a/rootfs/web/models.py b/rootfs/web/models.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/rootfs/web/static/css/bootstrap-responsive.min.css b/rootfs/web/static/css/bootstrap-responsive.min.css deleted file mode 100644 index 8bca63fcc..000000000 --- a/rootfs/web/static/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * 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:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-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:#999}.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:#111}.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:0;-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:#111;border-bottom-color:#111}.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/rootfs/web/static/css/bootstrap.min.css b/rootfs/web/static/css/bootstrap.min.css deleted file mode 100644 index f50f67640..000000000 --- a/rootfs/web/static/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * 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:auto;max-width:100%;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:.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:#333;background-color:#fff}a{color:#08c;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:1170px}.span12{width:1170px}.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:#999}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:#999}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 #eee}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 #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;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:#333;-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:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}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:#555;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:#fff;border:1px solid #ccc;-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 .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .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;-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;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}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:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-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:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.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:#eee}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 #fff;background-color:#eee;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;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.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 #ddd}.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 #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;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 #ddd}.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}.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 #000;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:#fff;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 #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#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:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#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:#999}.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 #000;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:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.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 .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.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:#333;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,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*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:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .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:.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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #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:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;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:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;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:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;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:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;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:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;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:#fff;background-color:#222;*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:#08c;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:#333;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:#04c}.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:#222}.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:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*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:#eee}.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:#999;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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.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 #fff}.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:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;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:#fff;background-color:#08c}.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:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.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:#555;border-bottom-color:#555}.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:#fff;background-color:#999;border-color:#999}.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:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.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:#eee #ddd #eee #eee}.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:#fff}.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:#eee #eee #eee #ddd}.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:#fff}.nav>.disabled>a{color:#999}.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,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#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:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;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:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;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:#fff;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:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \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 #fff;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 #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.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:#555;border-bottom-color:#555}.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,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);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:#999;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:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.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:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.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:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-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:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;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:#fff;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 #000;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:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \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 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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:#fff;border:1px solid #ddd;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:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;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:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;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:0;-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 .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .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 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.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:.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:#fff;text-align:center;text-decoration:none;background-color:#000;-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:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;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:#fff;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:#fff;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:#fff;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:#fff;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:#fff;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 .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-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:#555}.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:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.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:#fff;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:#333}.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:#fff;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 .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .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:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.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:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.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:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-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} diff --git a/rootfs/web/static/css/deis-controller.css b/rootfs/web/static/css/deis-controller.css deleted file mode 100644 index 08343f81e..000000000 --- a/rootfs/web/static/css/deis-controller.css +++ /dev/null @@ -1 +0,0 @@ -.social-menu {margin: 20px 0 20px 15px;} diff --git a/rootfs/web/static/css/deis-docs.css b/rootfs/web/static/css/deis-docs.css deleted file mode 100644 index a5e6bf2ae..000000000 --- a/rootfs/web/static/css/deis-docs.css +++ /dev/null @@ -1,32 +0,0 @@ - -a.headerlink { - visibility: hidden; - margin-left: 8px; - vertical-align: middle; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -span.viewcode-link { - font-size: 10px; - margin-left: 6px; - vertical-align: super; -} - -a.viewcode-back { - font-size: 10px; - margin-right: 6px; - vertical-align: super; -} - -blockquote { - border-left: none; -} diff --git a/rootfs/web/static/css/main.css b/rootfs/web/static/css/main.css deleted file mode 100644 index 2cf7c52cb..000000000 --- a/rootfs/web/static/css/main.css +++ /dev/null @@ -1,702 +0,0 @@ -footer { - display: none; - width: 201px; -} -.testClass { - padding: 0; - margin: 0; -} -h1, h2, h3, h4, h5, h6 { - font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; - font-weight: 300; -} -h1 { - display: inline-block; - padding: 50px 0 45px 0; - margin-bottom: 21px; - font-size: 36px; -} -h2 { - margin-top: 48px; - margin-bottom: 24px; - font-size: 36px; -} -h3 { - font-size: 16px; - font-weight: 300; -} -h4 { - margin: 50px 0 50px 0; - font-size: 28px; - font-style: italic; - line-height: normal; - color: #999; -} -a { - font-family: helvetica; - font-size: 16px; - font-weight: 300; - text-decoration: underline; - border: 0!important; -} -p { - font-family: helvetica; - font-size: 16px; - line-height: 22px; -} -img { - border: 0!important; -} -.fork { - float: right; -} -.fork .forkImage { - width: 103px; - height: 58px; - background: url(../img/fork.png); -} -.fork .forkImage:hover { - background: url(../img/fork.png) 0 -58px; -} -a.get-deis-link { - font-size: 28px; - font-style: italic; - line-height: normal; - color: #999!important; - text-decoration: none; -} -a.get-deis-link:hover { - color: #00aeff!important; - text-decoration: none; -} -.main-fork { - position: absolute; - right: 0; - z-index: 999; -} -.menu { - padding-right: 0; -} -.menu .divider { - margin: 0; - background: #ccc; - border-bottom: 0; -} -.menu a { - text-decoration: none; -} -.menu a .logo { - padding-top: 50px; - padding-bottom: 49px; -} -.menu a:hover { - background: none!important; -} -.nav-border { - border-right: solid 1px #ccc; -} -#video { - height: 390px; -} -.navitem { - padding: 0; -} -.navitem.selected.pink { - color: #ff135a; - border-right: solid 5px #ff135a; -} -.navitem.selected.pink a:hover { - color: #ff135a!important; -} -.navitem.selected.green { - color: #00bd50; - border-right: solid 5px #00bd50; -} -.navitem.selected.green a:hover { - color: #00bd50!important; -} -.navitem.selected.blue { - color: #00aeff; - border-right: solid 5px #00aeff; -} -.navitem.selected.blue a:hover { - color: #00aeff!important; -} -.navitem.overview:hover { - color: #00bd50; - border-right: solid 5px #00bd50; -} -.navitem.overview:hover a { - color: #00bd50; -} -.navitem.get-deis:hover { - color: #00aeff; - border-right: solid 5px #00aeff; -} -.navitem.get-deis:hover a { - color: #00aeff; -} -.navitem.get-involved:hover { - color: #ff135a; - border-right: solid 5px #ff135a; -} -.navitem.get-involved:hover a { - color: #ff135a; -} -.navitem.documentation:hover { - color: #00bd50; - border-right: solid 5px #00bd50; -} -.navitem.documentation:hover a { - color: #00bd50; -} -.navitem.blog:hover { - color: #00aeff; - border-right: solid 5px #00aeff; -} -.navitem.blog:hover a { - color: #00aeff; -} -.navitem a { - width: 227px; - padding-top: 26px!important; - padding-right: 0!important; - padding-bottom: 26px!important; - color: #999; -} -.navitem a:hover { - background: none!important; -} -.social-menu { - height: 34px; - margin: 0 0 28px 15px; -} -.social-menu a { - border: 0; -} -.social-menu a:hover { - border: 0; -} -.social-menu a span { - display: inline-block; - float: left; - width: 34px; - height: 33px; -} -.social-menu a span.twitter { - margin-right: 4px; - background: url(../img/social.png) 0 0; -} -.social-menu a span.twitter:hover { - background: url(../img/social.png) 0 -33px; -} -.social-menu a span.irc { - margin-right: 4px; - background: url(../img/social.png) -37px 0; -} -.social-menu a span.irc:hover { - background: url(../img/social.png) -37px -33px; -} -.social-menu a span.github { - margin-right: 4px; - background: url(../img/social.png) -74px 0; -} -.social-menu a span.github:hover { - background: url(../img/social.png) -74px -33px; -} -.social-menu a span.stack { - background: url(../img/social.png) -110px 0; -} -.social-menu a span.stack:hover { - background: url(../img/social.png) -110px -33px; -} -.byline-menu { - height: 34px; - margin-left: 15px; -} -.byline-menu a { - font-size: 12px; - line-height: 16px; - color: #ccc; - text-decoration: none; - border: 0; -} -.byline-menu a:hover { - color: #00aeff; - text-decoration: none; - border: 0; -} -.byline-menu span { - display: inline-block; - float: left; - width: 36px; - height: 33px; -} -.byline-menu span.cloud-logo { - margin-right: 15px; - background: url(../img/social.png) -143px 0; -} -.byline-menu p { - font-size: 12px; - line-height: 16px; - color: #ccc; -} -.home p { - line-height: 25px; - color: #ff135a; -} -.home img.cover-image { - padding-top: 165px; - padding-left: 100px; -} -.overview img { - width: 165px; - margin-top: 35px; - margin-left: 72px; -} -div.navigation-left { - float: left; -} -div.navigation-right { - float: right; -} -.pink a { - color: #ff135a; -} -.pink a:hover { - color: #999; -} -.pink h1 { - color: #ff135a; - border-bottom: solid 1px #ff135a; -} -.pink h2 { - color: #ff135a; -} -.pink h3 { - color: #ff135a; -} -.green a { - color: #00bd50; -} -.green a:hover { - color: #999; -} -.green h1 { - color: #00bd50; - border-bottom: solid 1px #00bd50; -} -.green h2 { - color: #00bd50; -} -.green h3 { - color: #00bd50; -} -.blue a { - color: #00aeff; -} -.blue a:hover { - color: #999; -} -.blue h1 { - color: #00aeff; - border-bottom: solid 1px #00aeff; -} -.blue h2 { - color: #00aeff; -} -.blue h3 { - color: #00aeff; -} -pre, code pre { - padding-top: 30px; - padding-bottom: 30px; - padding-left: 30px; - font-size: 12px; - color: #fff; - background-color: #00aeff; - border: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.gd-code p { - font-size: 15px; -} -.gd-code a { - font-size: 15px; -} -.spacer { - margin-bottom: 10px; -} -.spacer2 { - margin-bottom: 14px; -} -.social-container { - height: 330px; -} -.gi { - width: 434px; - height: 285px; -} -.gi.twitter { - float: left; - width: 436px; - height: 286px; - background: url(../img/large-social.png) 0 0; -} -.gi.twitter:hover { - background: url(../img/large-social.png) 0 -571px; -} -.gi.irc { - float: left; - height: 286px; - background: url(../img/large-social.png) -436px 0; -} -.gi.irc:hover { - background: url(../img/large-social.png) -436px -571px; -} -.gi.github { - float: left; - width: 436px; - background: url(../img/large-social.png) 0 -286px; -} -.gi.github:hover { - background: url(../img/large-social.png) 0 -857px; -} -.gi.stack { - float: left; - background: url(../img/large-social.png) -436px -286px; -} -.gi.stack:hover { - background: url(../img/large-social.png) -436px -857px; -} -.author-only { - padding-top: 16px; -} -.blog-social { - margin-top: 50px; -} -.blog-social .blog { - width: 32px; - height: 32px; -} -.blog-social .blog.facebook { - float: left; - margin-right: 5px; - background: url(../img/blog-social.png) 0 0; -} -.blog-social .blog.facebook:hover { - background: url(../img/blog-social.png) 0 -32px; -} -.blog-social .blog.twitter { - float: left; - margin-right: 5px; - background: url(../img/blog-social.png) -37px 0; -} -.blog-social .blog.twitter:hover { - background: url(../img/blog-social.png) -37px -32px; -} -.blog-social .blog.google-plus { - float: left; - background: url(../img/blog-social.png) -74px 0; -} -.blog-social .blog.google-plus:hover { - background: url(../img/blog-social.png) -74px -32px; -} -.blog-social .time { - display: inline-block; - padding-top: 7px; - padding-left: 30px; - color: #ccc; -} -.blog-social .time p { - display: inline; - padding-top: 5px; - font-weight: 300; -} -.blog-social .blog-tags { - padding-left: 86px; -} -.blog-social .blog-tags a { - color: #00aeff; - text-decoration: none; -} -.blog-social .blog-tags a:hover { - color: #999; -} -.blog a h1:hover { - color: #999; - border-bottom: solid 1px #999; -} -.blog-nav a { - display: inline-block; - padding: 23px 23px 23px 23px; - margin: 100px 5px 14px 0; - color: #fff; - text-decoration: none; - background-color: #00aeff; -} -.blog-nav a:hover { - background-color: #999; -} -.bio { - margin-top: 80px; -} -.bio .bio-pic { - float: left; -} -.bio .bio-info { - float: left; - width: 230px; - height: 98px; - padding-right: 30px; - margin-left: 20px; - border-right: solid 2px #ccc; -} -.bio .bio-info p { - margin-bottom: 0; - font-size: 12px; - line-height: 18px; -} -.bio .bio-info a { - font-size: 12px; - color: #00aeff; - text-decoration: none; -} -.bio .bio-info .bio-name { - font-weight: 600; -} -.bio .bio-info .bio-twitter { - margin-bottom: 0; -} -.bio .bio-links { - float: left; - margin-left: 30px; -} -.bio .bio-links a { - display: block; - font-size: 12px; - color: #00aeff; - text-decoration: none; -} -.bio .bio-links .inline { - display: inline; -} -.asciicast iframe { - height: 400px!important; -} -.content { - padding-bottom: 50px; -} -.doc-content { - padding-bottom: 50px; -} -.doc-content h1 { - height: 40px!important; - color: #00bd50; - border-bottom: solid 1px #00bd50; -} -.doc-content h2 { - color: #00bd50; -} -.doc-content h3 { - color: #00bd50; -} -.doc-content a, .doc-content a em, .doc-content em { - font-style: normal!imporant; - color: #00bd50!important; -} -.doc-content a:hover, .doc-content a em:hover, .doc-content em:hover { - color: #999!important; -} -.doc-content pre, .doc-content code pre { - color: #000!important; - background-color: #f5f5f5!important; -} -.doc-content .admonition { - padding: 10px; - margin-bottom: 10px; - border: solid 4px #00bd50; -} -.doc-content .admonition .admonition-title { - font-size: 18px; - font-weight: bold; - line-height: 26px; - text-indent: 50px; -} -.doc-content .warning { - border: solid 4px #F93; -} -.doc-content .warning .admonition-title { - background: url(../img/glyphs.png) no-repeat; -} -.doc-content .note .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -25px; -} -.doc-content .tip .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -53px; -} -.doc-content .important .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -81px; -} -.doc-content .hint .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -108px; -} -.doc-content .attention .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -135px; -} -.doc-content .caution .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -160px; -} -.doc-content .danger .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -186px; -} -.doc-content .error .admonition-title { - background: url(../img/glyphs.png) no-repeat 0 -218px; -} -.docs-sidebar { - position: absolute; - right: 0; - width: 195px!important; - min-height: 600px; - padding-bottom: 50px; - margin-left: 105px!important; -} -.docs-sidebar .docs-border { - margin: 145px 0 30px 0; - border-top: 1px solid #999; -} -.docs-sidebar .toctree-l1 ul { - display: none; -} -.docs-sidebar ul, .docs-sidebar li { - margin: 0; - list-style: none; -} -.docs-sidebar li.toctree-l1 { - margin-bottom: 20px; -} -.docs-sidebar li.toctree-l1 a { - color: #00bd50; - text-decoration: none; -} -.docs-sidebar li.toctree-l2.current:before { - content: "• "; - color: #00bd50; -} -.docs-sidebar li.toctree-l2 { - margin-top: 10px; -} -.docs-sidebar li.toctree-l2 a { - font-size: 16px; - color: #999; - text-decoration: none; -} -.searchbox { - width: 134px!important; - height: 54px!important; - padding-left: 50px!important; - font-family: helvetica!important; - font-size: 16px!important; - font-weight: 300!important; - color: white!important; - background: url(../img/mag_glass.png) no-repeat 15px 21px #ccc!important; - border: 0!important; - border-left: 5px solid #00bd50!important; - border-radius: 0!important; - border-shadow: none!important; -} -table.docutils { - border-spacing: 5px; -} -table.docutils td { - padding: 5px; -} -#notfound { - display: block; - width: 175px!important; - margin-top: 178px!important; -} -em { - font-style: normal!important; -} -.mc_merge_var, .mc_signup_submit { - float: left; -} -#mc_mv_EMAIL { - width: 211px!important; - height: 30px!important; - margin-bottom: 0; - font-family: helvetica!important; - font-size: 12px!important; - font-weight: 400!important; - color: #333!important; - border: 1px solid #ff135a; -} -.mc_merge_var input { - font-family: helvetica!important; - font-size: 12px!important; - font-weight: 400!important; - color: #333!important; -} -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 { - -webkit-box-shadow: none!important; - -moz-box-shadow: none!important; - box-shadow: none!important; - -webkit-transition: none!important; - -moz-transition: none!important; - -o-transition: none!important; - transition: none!important; -} -.mc_signup_submit { - margin-top: 5px; - margin-left: 10px; -} -#mc_signup_submit { - width: 49px!important; - padding: 6px 14px 4px 14px; - margin-top: 2px!important; - font-family: helvetica; - font-size: 12px; - color: #fff; - background: #ff135a; - border: 0; -} -.mailchimp form { - margin-bottom: 0; -} -.mailchimp p { - margin: 0; -} -#mc_message strong { - font-family: helvetica; - font-size: 12px; - font-weight: 400!important; - color: #333!important; -} -.mc_error_msg { - font-family: helvetica; - font-size: 12px; - font-weight: 400!important; - color: #333!important; -} -.mc_error_msg a { - font-size: 12px; - color: #ff135a; -} -.highlight-link { - display: none; -} -.rtd-docs br { - display: none!important; -} -@media(max-width:767px) { - .main-fork { - left: 1000px!important; -} -}@media(max-width:480px) { - .main-fork { - left: 1000px!important; -} -} diff --git a/rootfs/web/static/favicon.ico b/rootfs/web/static/favicon.ico deleted file mode 100644 index fdc7e80cf..000000000 Binary files a/rootfs/web/static/favicon.ico and /dev/null differ diff --git a/rootfs/web/static/img/404.png b/rootfs/web/static/img/404.png deleted file mode 100644 index ca2492b2b..000000000 Binary files a/rootfs/web/static/img/404.png and /dev/null differ diff --git a/rootfs/web/static/img/aws-ec2.png b/rootfs/web/static/img/aws-ec2.png deleted file mode 100644 index 1d27b8396..000000000 Binary files a/rootfs/web/static/img/aws-ec2.png and /dev/null differ diff --git a/rootfs/web/static/img/blog-social.png b/rootfs/web/static/img/blog-social.png deleted file mode 100644 index a379db88a..000000000 Binary files a/rootfs/web/static/img/blog-social.png and /dev/null differ diff --git a/rootfs/web/static/img/cover-image.png b/rootfs/web/static/img/cover-image.png deleted file mode 100644 index 83b7a0a64..000000000 Binary files a/rootfs/web/static/img/cover-image.png and /dev/null differ diff --git a/rootfs/web/static/img/deis-graphic.png b/rootfs/web/static/img/deis-graphic.png deleted file mode 100644 index 7a42f13aa..000000000 Binary files a/rootfs/web/static/img/deis-graphic.png and /dev/null differ diff --git a/rootfs/web/static/img/deis_builder.png b/rootfs/web/static/img/deis_builder.png deleted file mode 100644 index d25c059af..000000000 Binary files a/rootfs/web/static/img/deis_builder.png and /dev/null differ diff --git a/rootfs/web/static/img/deis_logo.png b/rootfs/web/static/img/deis_logo.png deleted file mode 100644 index 8059bc9bd..000000000 Binary files a/rootfs/web/static/img/deis_logo.png and /dev/null differ diff --git a/rootfs/web/static/img/favicon.png b/rootfs/web/static/img/favicon.png deleted file mode 100644 index 9d33fc3da..000000000 Binary files a/rootfs/web/static/img/favicon.png and /dev/null differ diff --git a/rootfs/web/static/img/fork.png b/rootfs/web/static/img/fork.png deleted file mode 100644 index 427caa6ff..000000000 Binary files a/rootfs/web/static/img/fork.png and /dev/null differ diff --git a/rootfs/web/static/img/glyphs.png b/rootfs/web/static/img/glyphs.png deleted file mode 100644 index 5f046512e..000000000 Binary files a/rootfs/web/static/img/glyphs.png and /dev/null differ diff --git a/rootfs/web/static/img/large-social.png b/rootfs/web/static/img/large-social.png deleted file mode 100644 index e95428419..000000000 Binary files a/rootfs/web/static/img/large-social.png and /dev/null differ diff --git a/rootfs/web/static/img/logo.png b/rootfs/web/static/img/logo.png deleted file mode 100644 index 8d6c479f3..000000000 Binary files a/rootfs/web/static/img/logo.png and /dev/null differ diff --git a/rootfs/web/static/img/mag_glass.png b/rootfs/web/static/img/mag_glass.png deleted file mode 100644 index 511274ef0..000000000 Binary files a/rootfs/web/static/img/mag_glass.png and /dev/null differ diff --git a/rootfs/web/static/img/menu-logo.png b/rootfs/web/static/img/menu-logo.png deleted file mode 100644 index cd3b7786b..000000000 Binary files a/rootfs/web/static/img/menu-logo.png and /dev/null differ diff --git a/rootfs/web/static/img/social.png b/rootfs/web/static/img/social.png deleted file mode 100644 index c25e10014..000000000 Binary files a/rootfs/web/static/img/social.png and /dev/null differ diff --git a/rootfs/web/static/js/adjustments.js b/rootfs/web/static/js/adjustments.js deleted file mode 100644 index 0ceae93d3..000000000 --- a/rootfs/web/static/js/adjustments.js +++ /dev/null @@ -1,60 +0,0 @@ -$(function(){ - var pageHeight; - - function set_columns() { - pageHeight = 0; - $('footer').css('margin-top', '0'); - $('.nav-border').css('height', '600'); - pageHeight = $(document).height(); - // console.log(pageHeight); - $('.nav-border').css('height', pageHeight); - - var margin = pageHeight - 511 - 158; - if (pageHeight < 800){ - margin = 270; - $('body').css('height', '930'); - $('.nav-border').css('height', '930'); - } - $('footer').css('margin-top', margin); - $('footer').css('display', 'block'); - - if($(window).width() > 1171){$('.docs-sidebar').css({'position': 'absolute', 'right': '0'})}; - if($(window).width() < 1171){$('.docs-sidebar').css('position', 'static');} - } - -//This variable checks if all accordions are closed. Used to ensure styling for Releases & FAQ page. - var allClosed; - - //Close all accordions, besides the menu containing the page that you've clicked on. - $('.toctree-l1').each(function(){ - if($(this).children('a').attr('state') == 'open') { - $(this).children('ul').show(); - set_columns(); - allClosed = false; - return false; - } else { - allClosed = true; - } - }); - - if (allClosed == true) {set_columns();} - - - //If menu is closed when clicked, expand it - $('.toctree-l1 > a').click(function() { - - //Make the titles of open accordions dead links - if ($(this).attr('state') == 'open') {return false;} - - //Clicking on a title of a closed accordion - if($(this).attr('state') != 'open' && $(this).siblings().size() > 0) { - $('.toctree-l1 > ul').hide(); - $('.toctree-l1 > a').attr('state', ''); - $(this).attr('state', 'open'); - $(this).next().slideDown(function(){set_columns();}); - return false; - } - }); - - $(window).resize(set_columns); -}); diff --git a/rootfs/web/static/js/bootstrap.min.js b/rootfs/web/static/js/bootstrap.min.js deleted file mode 100644 index 848258d38..000000000 --- a/rootfs/web/static/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! -* Bootstrap.js by @fat & @mdo -* Copyright 2013 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('