diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..f78ba9585 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +!/dist +vendor +vendor-prefixed diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 000000000..0795c6d0a --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,59 @@ +# https://docs.github.com/en/actions/publishing-packages/publishing-docker-images#publishing-images-to-github-packages +name: Create and publish a Docker image + +# Configures this workflow to run every time a change is pushed to the branch called `release`. +on: + push: + branches: ['beta', 'master'] + +# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds. +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu. +jobs: + build-and-push-image: + runs-on: ubuntu-latest + # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job. + permissions: + contents: read + packages: write + attestations: write + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install devbox + uses: jetify-com/devbox-install-action@v0.11.0 + + - name: Bootstrap Podlove Publisher + run: devbox run bootstrap + + - name: Build Podlove Publisher + run: devbox run build + + - name: Log in to the Container registry + uses: docker/login-action@v3.2.0 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5.5.1 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and push Docker image + id: push + uses: docker/build-push-action@v6.1.0 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..55c9a3b30 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM wordpress:6-php8.1-apache + +RUN apt-get update +RUN apt-get install zip default-mysql-client -y +RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && chmod +x wp-cli.phar && mv wp-cli.phar /usr/local/bin/wp + +WORKDIR /var/www/html + +COPY ./bin/docker-entry.sh /usr/local/bin/entry.sh +COPY ./bin/docker-setup.sh /usr/local/bin/setup.sh +COPY ./dist wp-content/plugins/podlove-podcasting-plugin-for-wordpress + +ENTRYPOINT ["entry.sh"] diff --git a/bin/docker-entry.sh b/bin/docker-entry.sh new file mode 100755 index 000000000..ee99f82b1 --- /dev/null +++ b/bin/docker-entry.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +# Waiting for the MySQL server to start +HOST=$(echo $WORDPRESS_DB_HOST | cut -d: -f1) +PORT=$(echo $WORDPRESS_DB_HOST | cut -d: -f2) + +until mysql -h $HOST -P $PORT -D $WORDPRESS_DB_NAME -u $WORDPRESS_DB_USER -p$WORDPRESS_DB_PASSWORD -e '\q'; do + >&2 echo "Mysql is unavailable - sleeping..." + sleep 2 +done + +uid="$(id -u)" +gid="$(id -g)" + +if [ "$uid" = '0' ]; then + user="${APACHE_RUN_USER:-www-data}" + group="${APACHE_RUN_GROUP:-www-data}" + + # strip off any '#' symbol ('#1000' is valid syntax for Apache) + pound='#' + user="${user#$pound}" + group="${group#$pound}" + + if [ ! -e index.php ] && [ ! -e wp-includes/version.php ]; then + # if the directory exists and WordPress doesn't appear to be installed AND the permissions of it are root:root, let's chown it (likely a Docker-created directory) + if [ "$uid" = '0' ] && [ "$(stat -c '%u:%g' .)" = '0:0' ]; then + chown "$user:$group" . + fi + + echo >&2 "WordPress not found in $PWD - copying now..." + if [ -n "$(find -mindepth 1 -maxdepth 1 -not -name wp-content)" ]; then + echo >&2 "WARNING: $PWD is not empty! (copying anyhow)" + fi + sourceTarArgs=( + --create + --file - + --directory /usr/src/wordpress + --owner "$user" --group "$group" + ) + targetTarArgs=( + --extract + --file - + ) + if [ "$uid" != '0' ]; then + # avoid "tar: .: Cannot utime: Operation not permitted" and "tar: .: Cannot change mode to rwxr-xr-x: Operation not permitted" + targetTarArgs+=( --no-overwrite-dir ) + fi + # loop over "pluggable" content in the source, and if it already exists in the destination, skip it + # https://github.com/docker-library/wordpress/issues/506 ("wp-content" persisted, "akismet" updated, WordPress container restarted/recreated, "akismet" downgraded) + for contentPath in \ + /usr/src/wordpress/.htaccess \ + /usr/src/wordpress/wp-content/*/*/ \ + ; do + contentPath="${contentPath%/}" + [ -e "$contentPath" ] || continue + contentPath="${contentPath#/usr/src/wordpress/}" # "wp-content/plugins/akismet", etc. + if [ -e "$PWD/$contentPath" ]; then + echo >&2 "WARNING: '$PWD/$contentPath' exists! (not copying the WordPress version)" + sourceTarArgs+=( --exclude "./$contentPath" ) + fi + done + tar "${sourceTarArgs[@]}" . | tar "${targetTarArgs[@]}" + echo >&2 "Complete! WordPress has been successfully copied to $PWD" + fi + + wpEnvs=( "${!WORDPRESS_@}" ) + if [ ! -s wp-config.php ] && [ "${#wpEnvs[@]}" -gt 0 ]; then + for wpConfigDocker in \ + wp-config-docker.php \ + /usr/src/wordpress/wp-config-docker.php \ + ; do + if [ -s "$wpConfigDocker" ]; then + echo >&2 "No 'wp-config.php' found in $PWD, but 'WORDPRESS_...' variables supplied; copying '$wpConfigDocker' (${wpEnvs[*]})" + # using "awk" to replace all instances of "put your unique phrase here" with a properly unique string (for AUTH_KEY and friends to have safe defaults if they aren't specified with environment variables) + awk ' + /put your unique phrase here/ { + cmd = "head -c1m /dev/urandom | sha1sum | cut -d\\ -f1" + cmd | getline str + close(cmd) + gsub("put your unique phrase here", str) + } + { print } + ' "$wpConfigDocker" > wp-config.php + if [ "$uid" = '0' ]; then + # attempt to ensure that wp-config.php is owned by the run user + # could be on a filesystem that doesn't allow chown (like some NFS setups) + chown "$user:$group" wp-config.php || true + fi + break + fi + done + fi +fi + +eval setup.sh +apache2-foreground diff --git a/bin/docker-setup.sh b/bin/docker-setup.sh new file mode 100755 index 000000000..f1f641af1 --- /dev/null +++ b/bin/docker-setup.sh @@ -0,0 +1 @@ +#!/usr/bin/env bash diff --git a/client/src/components/steps/Steps.vue b/client/src/components/steps/Steps.vue new file mode 100644 index 000000000..a76da485d --- /dev/null +++ b/client/src/components/steps/Steps.vue @@ -0,0 +1,68 @@ + + + \ No newline at end of file diff --git a/client/src/modules/contributors/components/Contribution.vue b/client/src/modules/contributors/components/Contribution.vue index 85ea7b056..902edab98 100644 --- a/client/src/modules/contributors/components/Contribution.vue +++ b/client/src/modules/contributors/components/Contribution.vue @@ -18,7 +18,7 @@

- {{ data.realname }} + {{ data.realname || data.publicname }}

{{ data.nickname }} diff --git a/client/src/sagas/admin.sagas.ts b/client/src/sagas/admin.sagas.ts new file mode 100644 index 000000000..8facd1de0 --- /dev/null +++ b/client/src/sagas/admin.sagas.ts @@ -0,0 +1,38 @@ +import { fork, select, put, takeEvery } from 'redux-saga/effects' +import { PodloveApiClient } from '@lib/api' +import { createApi } from './api' +import * as adminStore from '@store/admin.store' +import { takeFirst } from './helper' +import { selectors } from '@store' + +interface AdminData { + bannerHide: boolean | null + type: string | null + feedUrl: string | null +} + +function* adminSaga() { + const apiClient: PodloveApiClient = yield createApi() + yield fork(initialize, apiClient) + yield takeEvery(adminStore.UPDATE_TYPE, save, apiClient) +} + +function* initialize(api: PodloveApiClient) { + const { result }: { result: AdminData } = yield api.get('admin/onboarding') + + if (result) { + yield put(adminStore.set(result)) + } +} + +function* save(api: PodloveApiClient, action: {type: string}) { + const typeValue: string = yield select(selectors.admin.type) + + yield api.put('admin/onboarding', {type: typeValue}) +} + +export default function() { + return function* () { + yield takeFirst(adminStore.INIT, adminSaga) + } +} \ No newline at end of file diff --git a/client/src/store/admin.store.ts b/client/src/store/admin.store.ts new file mode 100644 index 000000000..934fb1ea1 --- /dev/null +++ b/client/src/store/admin.store.ts @@ -0,0 +1,43 @@ +import { get } from 'lodash' +import { handleActions, createAction } from 'redux-actions' + +export const INIT = 'podlove/publisher/admin/INIT' +export const SET = 'podlove/publisher/admin/SET' +export const UPDATE_TYPE = 'podlove/publisher/admin/UPDATE_TYPE' + +export type State = { + bannerHide: boolean | null, + type: string | null, + feedUrl: string | null +} + +export const initialState: State = { + bannerHide: null, + type: null, + feedUrl: null +} + +export const init = createAction(INIT) +export const set = createAction>(SET) +export const update_type = createAction(UPDATE_TYPE) + +export const reducer = handleActions( + { + [SET]: (state: State, action: { payload: Partial }): State => ({ + bannerHide: get(action, ['payload', 'banner_hide'], state.bannerHide), + type: get(action, ['payload', 'type'], state.type), + feedUrl: get(action, ['payload', 'feedUrl'], state.feedUrl), + }), + [UPDATE_TYPE]: (state: State, action: { payload: string }): State => ({ + ...state, + type: action.payload + }), + }, + initialState +) + +export const selectors = { + bannerHide: (state: State) => state.bannerHide, + type: (state: State) => state.type, + feedUrl: (state: State) => state.feedUrl, +} diff --git a/client/src/store/index.ts b/client/src/store/index.ts index 966df31fa..a59c1f45a 100644 --- a/client/src/store/index.ts +++ b/client/src/store/index.ts @@ -24,6 +24,7 @@ import { State as progressState } from './progress.store' import { State as mediafilesState } from './mediafiles.store' import { State as relatedEpisodesState } from './relatedEpisodes.store' import { State as showsState } from './shows.store' +import { State as adminState } from './admin.store' import lifecycleSaga from '../sagas/lifecycle.sagas' import podcastSaga from '../sagas/podcast.sagas' @@ -37,6 +38,7 @@ import auphonicSaga from '../sagas/auphonic.sagas' import mediafilesSaga from '../sagas/mediafiles.sagas' import relatedEpisodesSaga from '../sagas/relatedEpisodes.sagas' import showsSaga from '../sagas/shows.sagas' +import adminSaga from '../sagas/admin.sagas' export interface State { lifecycle: LifecycleState @@ -53,6 +55,7 @@ export interface State { mediafiles: mediafilesState relatedEpisodes: relatedEpisodesState shows: showsState + admin: adminState } const sagas = createSagaMiddleware() @@ -72,5 +75,6 @@ sagas.run(auphonicSaga()) sagas.run(mediafilesSaga()) sagas.run(relatedEpisodesSaga()) sagas.run(showsSaga()) +sagas.run(adminSaga()) export { selectors, sagas } diff --git a/client/src/store/reducers.ts b/client/src/store/reducers.ts index fef73fafa..6a32c4704 100644 --- a/client/src/store/reducers.ts +++ b/client/src/store/reducers.ts @@ -13,6 +13,7 @@ import * as progressStore from './progress.store' import * as mediafilesStore from './mediafiles.store' import * as relatedEpisodesStore from './relatedEpisodes.store' import * as showsStore from './shows.store' +import * as adminStore from './admin.store' export default combineReducers({ lifecycle: lifecycleStore.reducer, @@ -29,4 +30,5 @@ export default combineReducers({ mediafiles: mediafilesStore.reducer, relatedEpisodes: relatedEpisodesStore.reducer, shows: showsStore.reducer, + admin: adminStore.reducer, }) diff --git a/client/src/store/selectors.ts b/client/src/store/selectors.ts index 75be80ffc..9e25cf906 100644 --- a/client/src/store/selectors.ts +++ b/client/src/store/selectors.ts @@ -14,6 +14,7 @@ import * as progressStore from './progress.store' import * as mediafilesStore from './mediafiles.store' import * as relatedEpisodesStore from './relatedEpisodes.store' import * as showsStore from './shows.store' +import * as adminStore from './admin.store' const root = { lifecycle: (state: State) => state.lifecycle, @@ -30,6 +31,7 @@ const root = { settings: (state: State) => state.settings, relatedEpisodes: (state: State) => state.relatedEpisodes, shows: (state: State) => state.shows, + admin: (state: State) => state.admin, } const lifecycle = { @@ -184,6 +186,12 @@ const shows = { list: createSelector(root.shows, showsStore.selectors.shows), } +const admin = { + bannerHide: createSelector(root.admin, adminStore.selectors.bannerHide), + type: createSelector(root.admin, adminStore.selectors.type), + feedUrl: createSelector(root.admin, adminStore.selectors.feedUrl), +} + export default { lifecycle, podcast, @@ -199,4 +207,5 @@ export default { mediafiles, relatedEpisodes, shows, + admin } diff --git a/composer.json b/composer.json index a3292f6f5..550092049 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,7 @@ "monolog/monolog": "2.9.*", "symfony/yaml": "6.0.*", "symfony/polyfill-mbstring": "1.27.*", - "twig/twig": "~3.14", + "twig/twig": "3.14.*", "geoip2/geoip2": "~2.0", "matomo/device-detector": "6.1.*", "phpunit/php-timer": "5.0.*", @@ -17,6 +17,7 @@ "dariuszp/cli-progress-bar": "^1.0", "league/csv": "9.8.0", "gajus/dindent": "^2.0", + "ramsey/uuid": "^4.7", "symfony/deprecation-contracts": "^3.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 2570dec5a..ce2699b2e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,75 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5b022a91c1216131f90dcd0790efbdd9", + "content-hash": "ad91bc8ea85e19fdf1ca62187d08c5cf", "packages": [ + { + "name": "brick/math", + "version": "0.11.0", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/0ad82ce168c82ba30d1c01ec86116ab52f589478", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.11.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-01-15T23:15:59+00:00" + }, { "name": "composer/ca-bundle", - "version": "1.5.2", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137" + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/48a792895a2b7a6ee65dd5442c299d7b835b6137", - "reference": "48a792895a2b7a6ee65dd5442c299d7b835b6137", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2", + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2", "shasum": "" }, "require": { @@ -64,7 +119,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.2" + "source": "https://github.com/composer/ca-bundle/tree/1.5.3" }, "funding": [ { @@ -80,7 +135,7 @@ "type": "tidelift" } ], - "time": "2024-09-25T07:49:53+00:00" + "time": "2024-11-04T10:15:26+00:00" }, { "name": "dariuszp/cli-progress-bar", @@ -426,29 +481,27 @@ }, { "name": "maxmind-db/reader", - "version": "v1.11.1", + "version": "v1.12.0", "source": { "type": "git", "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git", - "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7" + "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1e66f73ffcf25e17c7a910a1317e9720a95497c7", - "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7", + "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90", + "reference": "5b2d7a721dedfaef9dc20822c5fe7d26f9f8eb90", "shasum": "" }, "require": { "php": ">=7.2" }, "conflict": { - "ext-maxminddb": "<1.11.1,>=2.0.0" + "ext-maxminddb": "<1.11.1 || >=2.0.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "3.*", - "php-coveralls/php-coveralls": "^2.1", "phpstan/phpstan": "*", - "phpunit/phpcov": ">=6.0.0", "phpunit/phpunit": ">=8.0.0,<10.0.0", "squizlabs/php_codesniffer": "3.*" }, @@ -485,9 +538,9 @@ ], "support": { "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", - "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.11.1" + "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.12.0" }, - "time": "2023-12-02T00:09:23+00:00" + "time": "2024-11-14T22:43:47+00:00" }, { "name": "maxmind/web-service-common", @@ -948,6 +1001,188 @@ }, "time": "2024-09-11T13:17:53+00:00" }, + { + "name": "ramsey/collection", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/ad7475d1c9e70b190ecffc58f2d989416af339b4", + "reference": "ad7475d1c9e70b190ecffc58f2d989416af339b4", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-27T19:12:24+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, { "name": "symfony/deprecation-contracts", "version": "v3.0.2", @@ -1329,16 +1564,16 @@ }, { "name": "twig/twig", - "version": "v3.14.1", + "version": "v3.14.2", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "f405356d20fb43603bcadc8b09bfb676cb04a379" + "reference": "0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/f405356d20fb43603bcadc8b09bfb676cb04a379", - "reference": "f405356d20fb43603bcadc8b09bfb676cb04a379", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a", + "reference": "0b6f9d8370bb3b7f1ce5313ed8feb0fafd6e399a", "shasum": "" }, "require": { @@ -1392,7 +1627,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.14.1" + "source": "https://github.com/twigphp/Twig/tree/v3.14.2" }, "funding": [ { @@ -1404,7 +1639,7 @@ "type": "tidelift" } ], - "time": "2024-11-06T18:17:38+00:00" + "time": "2024-11-07T12:36:22+00:00" } ], "packages-dev": [ @@ -1530,16 +1765,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -1578,7 +1813,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -1586,7 +1821,7 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "nikic/php-parser", diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..b6a251cf0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +services: + db: + image: mysql:latest + container_name: db + restart: unless-stopped + environment: + MYSQL_DATABASE: wordpress + MYSQL_ROOT_PASSWORD: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpress + expose: + - 3306 + networks: + - app-network + + wordpress: + build: . + + ports: + - 8080:80 + restart: always + depends_on: + - db + environment: + WORDPRESS_DB_HOST: db:3306 + WORDPRESS_DB_USER: wordpress + WORDPRESS_DB_PASSWORD: wordpress + WORDPRESS_DB_NAME: wordpress + networks: + - app-network + +networks: + app-network: + driver: bridge diff --git a/includes/api/admin/onboarding.php b/includes/api/admin/onboarding.php new file mode 100644 index 000000000..3ad58a417 --- /dev/null +++ b/includes/api/admin/onboarding.php @@ -0,0 +1,111 @@ +register_routes(); +}); + +class WP_REST_PodloveOnboarding_Controller extends WP_REST_Controller +{ + /** + * Constructor. + */ + public function __construct() + { + $this->namespace = 'podlove/v2'; + $this->rest_base = 'admin'; + } + + /** + * Register the component routes. + */ + public function register_routes() + { + register_rest_route($this->namespace, '/' . $this->rest_base . '/onboarding', [ + [ + 'methods' => WP_REST_Server::READABLE, + 'callback' => [$this, 'get_onboarding_options'], + 'permission_callback' => [$this, 'get_item_permissions_check'], + ], + [ + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => [$this, 'update_onboarding_options'], + 'permission_callback' => [$this, 'update_item_permissions_check'], + [ + 'args' => [ + 'banner_hide' => [ + 'description' => __('Hide the banner', 'podlove-podcasting-plugin-for-wordpress'), + 'type' => 'boolean' + ], + 'type' => [ + 'description' => __('Type of the onboarding', 'podlove-podcasting-plugin-for-wordpress'), + 'type' => 'string', + 'enum' => ['start', 'import', 'reset'] + ], + ] + ] + ], + ]); + } + + /** + * GET route + */ + + public function get_item_permissions_check($request) + { + if (!current_user_can('administrator')) { + return new \Podlove\Api\Error\ForbiddenAccess(); + } + + return true; + } + + public function get_onboarding_options($request) + { + $banner_flag = Onboarding::is_banner_hide(); + $type = Onboarding::get_onboarding_type(); + + return new \Podlove\Api\Response\OkResponse([ + 'banner_hide' => $banner_flag, + 'type' => $type + ]); + } + + /** + * PUT/PATCH/POST route + */ + + public function update_item_permissions_check($request) + { + if (!current_user_can('administrator')) { + return new \Podlove\Api\Error\ForbiddenAccess(); + } + + return true; + } + + public function update_onboarding_options($request) + { + if (isset($request['banner_hide'])) { + $option = $request['banner_hide']; + Onboarding::set_banner_hide($option); + } + + if (isset($request['type'])) { + $option = $request['type']; + Onboarding::set_onboarding_type($option); + } + + return new \Podlove\Api\Response\OkResponse([ + 'status' => 'ok', + ]); + } + +} diff --git a/includes/api/api.php b/includes/api/api.php index b1156b66f..a18d8aea9 100644 --- a/includes/api/api.php +++ b/includes/api/api.php @@ -14,3 +14,4 @@ require_once \Podlove\PLUGIN_DIR.'includes/api/episodes/related_episodes.php'; require_once \Podlove\PLUGIN_DIR.'includes/api/chapters.php'; require_once \Podlove\PLUGIN_DIR.'includes/api/tools.php'; +require_once \Podlove\PLUGIN_DIR.'includes/api/admin/onboarding.php'; diff --git a/includes/api/episodes.php b/includes/api/episodes.php index c50f8b83e..e697e5183 100644 --- a/includes/api/episodes.php +++ b/includes/api/episodes.php @@ -176,6 +176,10 @@ public function register_routes() 'description' => __('Filter by show slug.', 'podlove-podcasting-plugin-for-wordpress'), 'type' => 'string' ], + 'guid' => [ + 'description' => __('Filter by guid.', 'podlove-podcasting-plugin-for-wordpress'), + 'type' => 'string' + ], 'sort_by' => [ 'description' => __('Sort the list of episodes', 'podlove-podcasting-plugin-for-wordpress'), 'type' => 'string', @@ -229,6 +233,10 @@ public function register_routes() ], [ 'args' => [ + 'guid' => [ + 'description' => __('Globally unique id.', 'podlove-podcasting-plugin-for-wordpress'), + 'type' => 'string', + ], 'title' => [ 'description' => __('Clear, concise name for your episode.', 'podlove-podcasting-plugin-for-wordpress'), 'type' => 'string', @@ -465,6 +473,7 @@ public function get_items($request) $order_by = $request->get_param('order_by'); $sort_by = $request->get_param('sort_by'); + $guid_filter = $request->get_param('guid'); $args = []; if ($order_by) { @@ -504,6 +513,13 @@ public function get_items($request) } } + // filter by guid + if ($guid_filter) { + if (get_the_guid($episode->post_id) != $guid_filter) { + continue; + } + } + array_push($results, [ 'id' => $episode->id, 'title' => get_the_title($episode->post_id), @@ -557,6 +573,7 @@ public function get_item($request) $data = [ '_version' => 'v2', 'id' => $id, + 'guid' => get_the_guid($episode->post_id), 'slug' => $episode->slug, 'post_id' => $episode->post_id, 'title' => get_the_title($episode->post_id), @@ -568,7 +585,7 @@ public function get_item($request) 'publicationDate' => mysql2date('c', $post->post_date), 'recording_date' => $episode->recording_date, 'poster' => $episode->cover_art_with_fallback()->setWidth(500)->url(), - 'episode_poster' => $episode->cover, + 'episode_poster' => $episode->cover_art, 'link' => get_permalink($episode->post_id), 'audio' => \podlove_pwp5_audio_files($episode, null), 'files' => \podlove_pwp5_files($episode, null), @@ -742,6 +759,10 @@ public function update_item($request) return new \Podlove\Api\Error\NotFound(); } + if (isset($request['guid'])) { + update_post_meta($episode->post_id, '_podlove_guid', $request['guid']); + } + if (isset($request['title'])) { $title = $request['title']; $episode->title = $title; diff --git a/includes/api/podcast.php b/includes/api/podcast.php index f2bc269b6..1ab91ddba 100644 --- a/includes/api/podcast.php +++ b/includes/api/podcast.php @@ -28,10 +28,14 @@ public function __construct() public function register_routes() { $categories = \Podlove\Itunes\categories(false); - $categories_enum = []; - foreach ($categories as $key => $val) { - array_push( $categories_enum, $val ); - } + $categories_val = array_values($categories); + $categories_enum = array_map(function($val) { + return str_replace('&', 'and', $val); + }, $categories_val); + + + $locales = \Podlove\Locale\locales(); + $locales_enum = array_keys($locales); register_rest_route($this->namespace, '/'.$this->rest_base, [ [ @@ -44,6 +48,10 @@ public function register_routes() 'callback' => [$this, 'update_item'], 'permission_callback' => [$this, 'update_item_permissions_check'], 'args' => [ + 'guid' => [ + 'description' => __('Unique, global identifier for a podcast', 'podlove-podcasting-plugin-for-wordpress'), + 'type' => 'string', + ], 'title' => [ 'description' => __('Title of the podcast', 'podlove-podcasting-plugin-for-wordpress'), 'type' => 'string', @@ -60,6 +68,11 @@ public function register_routes() 'description' => __('Name of the podcast author. Publicly displayed in Podcast directories.', 'podlove-podcasting-plugin-for-wordpress'), 'type' => 'string', ], + 'cover_image' => [ + 'description' => __('Cover art for the podcast', 'podlove-podcasting-plugin-for-wordpress'), + 'type' => 'string', + 'validate_callback' => '\Podlove\Api\Validation::url' + ], 'podcast_email' => [ 'description' => __('Used by iTunes and other Podcast directories to contact you.', 'podlove-podcasting-plugin-for-wordpress'), 'type' => 'string', @@ -90,6 +103,11 @@ public function register_routes() 'description' => __('iTunes category of the podcast', 'podlove-podcasting-plugin-for-wordpress'), 'type' => 'string', 'enum' => $categories_enum, + ], + 'language' => [ + 'description' => __('The language that is spoken in the podcast.', 'podlove-podcasting-plugin-for-wordpress'), + 'type' => 'string', + 'enum' => $locales_enum, ] ] ] @@ -129,8 +147,14 @@ public function get_item($request) $explicit = true; } + $feeds = $podcast->feeds(['only_discoverable' => true]); + $feed_urls = array_map( function($feed) { + return ["$feed->slug" => $feed->get_subscribe_url()]; + }, $feeds); + $res = []; $res['_version'] = 'v2'; + $res['guid'] = $podcast->guid; $res['title'] = $podcast->title; $res['subtitle'] = $podcast->subtitle; $res['summary'] = $podcast->summary; @@ -148,8 +172,10 @@ public function get_item($request) $res['copyright'] = $podcast->copyright; $res['explicit'] = $explicit; $res['category'] = $this->getCategoryName($podcast->category_1); + $res['language'] = $this->getLanguageName($podcast->language); $res['license_url'] = $podcast->license_url; $res['license_name'] = $podcast->license_name; + $res['feeds'] = $feed_urls; $res = apply_filters('podlove_api_podcast_response', $res); @@ -159,6 +185,10 @@ public function get_item($request) public function update_item($request) { $podcast = Podcast::get(); + if (isset($request['guid'])) { + $guid = $request['guid']; + $podcast->guid = $guid; + } if (isset($request['title'])) { $title = $request['title']; $podcast->title = $title; @@ -179,6 +209,10 @@ public function update_item($request) $author = $request['author_name']; $podcast->author_name = $author; } + if (isset($request['cover_image'])) { + $cover = $request['cover_image']; + $podcast->cover_image = $cover; + } if (isset($request['podcast_email'])) { $podcast_email = $request['podcast_email']; $podcast->owner_email = $podcast_email; @@ -206,8 +240,15 @@ public function update_item($request) } if (isset($request['category'])) { $category = $request['category']; + $category = str_replace('and', '&', $category); $category_key = $this->getCategoryKey($category); - $podcast->category_1 = $category_key; + if ($category_key) { + $podcast->category_1 = $category_key; + } + } + if (isset($request['language'])) { + $language = $request['language']; + $podcast->language = $language; } if (isset($request['license_url'])) { $license_url = $request['license_url']; @@ -243,5 +284,20 @@ private function getCategoryName($category_key) return $val; } } + + return ""; + } + + private function getLanguageName($language_key) + { + $language = \Podlove\Locale\locales(); + foreach($language as $key => $val) { + if ($key == $language_key) { + return $val; + } + } + + return ""; } + } diff --git a/includes/downloads.php b/includes/downloads.php index fd129591b..ef8d04c97 100644 --- a/includes/downloads.php +++ b/includes/downloads.php @@ -33,7 +33,7 @@ function ga_track_download($request_id, $media_file, $ua_string, $ptm_context, $ $debug_ga = false; $ga_collect_endpoint = 'https://www.google-analytics.com/'.($debug_ga ? 'debug/' : '').'collect'; - $ga_tracking_id = trim(\Podlove\get_setting('tracking', 'ga')); + $ga_tracking_id = trim(\Podlove\get_setting('tracking', 'ga') ?? ''); if (!$ga_tracking_id || $ga_tracking_id === '') { return; } diff --git a/includes/feature.php b/includes/feature.php new file mode 100644 index 000000000..438872d87 --- /dev/null +++ b/includes/feature.php @@ -0,0 +1,17 @@ +limit_items) { $podcast->limit_items = Model\Feed::ITEMS_NO_LIMIT; $podcast->feed_transcripts = 'generated'; } + + if (!$podcast->guid) { + $podcast->guid = UUID::uuid4(); + } + $podcast->save(); } @@ -91,7 +99,8 @@ function podlove_setup_modules() // 'feed_validation', 'import_export', 'subscribe_button', - 'automatic_numbering' + 'automatic_numbering', + 'onboarding' ]; foreach ($default_modules as $module) { diff --git a/lib/ajax/ajax.php b/lib/ajax/ajax.php index 062d26d0d..143cee7d7 100644 --- a/lib/ajax/ajax.php +++ b/lib/ajax/ajax.php @@ -4,6 +4,7 @@ use League\Csv\Writer; use Podlove\Model; +use Podlove\Modules\Onboarding\Onboarding; class Ajax { @@ -21,6 +22,7 @@ public function __construct() 'update-feed-position', 'podcast', 'hide-teaser', + 'banner-hide', 'get-license-url', 'get-license-name', 'get-license-parameters-from-url', @@ -915,6 +917,16 @@ public function hide_teaser() update_option('_podlove_hide_teaser', true); } + public function banner_hide() + { + if (!wp_verify_nonce($_REQUEST['_podlove_nonce'], 'podlove_onboarding')) { + http_response_code(401); + exit; + } + + Onboarding::set_banner_hide('true'); + } + public function get_license_url() { self::respond_with_json(\Podlove\Model\License::get_url_from_license(self::parse_get_parameter_into_url_array())); diff --git a/lib/authentication.php b/lib/authentication.php new file mode 100644 index 000000000..31e0b77eb --- /dev/null +++ b/lib/authentication.php @@ -0,0 +1,46 @@ + username + * $applicationPassword['password'] -> password + */ + + class Authentication { + private static $appId = 'podlove-publisher'; + private static $appName = 'Podlove Publisher'; + + // generates a one time password for authentication + public static function application_password() + { + $user = wp_get_current_user(); + + $applicationPasswords = \WP_Application_Passwords::get_user_application_passwords($user->data->ID); + + // find the app by the provided id since wordpress only has helper functions for their generated uuid ... + $publisherApp = current(array_filter($applicationPasswords, function ($app) { + return $app['app_id'] == self::$appId; + })); + + // delete the existing password + if ($publisherApp) { + \WP_Application_Passwords::delete_application_password($user->data->ID, $publisherApp['uuid']); + } + + $appPassword = \WP_Application_Passwords::create_new_application_password($user->data->ID, [ + 'name' => self::$appName, + 'app_id' => self::$appId, + ]); + + return [ + 'name' => $user->data->user_login, + 'password' => current($appPassword), + ]; + } + } diff --git a/lib/custom_guid.php b/lib/custom_guid.php index cf8f99e48..c74fce1df 100644 --- a/lib/custom_guid.php +++ b/lib/custom_guid.php @@ -2,6 +2,8 @@ namespace Podlove; +use Ramsey\Uuid\Uuid as UUID; + /** * Add custom GUID to episodes. * Display in all podcast feeds. @@ -120,14 +122,7 @@ public static function generate_guid_for_episodes($post_id, $post) */ public static function guid_for_post($post) { - $segments = []; - - $segments[] = apply_filters('podlove_guid_prefix', 'podlove'); - $segments[] = apply_filters('podlove_guid_time', gmdate('c')); - $hash = substr(sha1($post->ID.$post->post_title.time()), 0, 15); - $segments[] = apply_filters('podlove_guid_hash', $hash); - - return apply_filters('podlove_guid', strtolower(implode('-', $segments))); + return apply_filters('podlove_guid', UUID::uuid4()); } /** diff --git a/lib/feeds/base.php b/lib/feeds/base.php index 3eb95872b..67207be03 100644 --- a/lib/feeds/base.php +++ b/lib/feeds/base.php @@ -253,6 +253,12 @@ function override_feed_head($hook, $podcast, $feed, $format) add_action($hook, function () use ($podcast, $feed, $format) { echo PHP_EOL; + if ($podcast->guid) { + $guid = "\t".get_xml_text_node('podcast:guid', $podcast->guid); + echo apply_filters('podlove_feed_guid', $guid); + echo PHP_EOL; + } + $copyright = "\t".get_xml_text_node('copyright', $podcast->copyright ?? $podcast->default_copyright_claim()); echo apply_filters('podlove_feed_copyright', $copyright); echo PHP_EOL; diff --git a/lib/model/podcast.php b/lib/model/podcast.php index 910e9b454..bad3cebed 100644 --- a/lib/model/podcast.php +++ b/lib/model/podcast.php @@ -492,3 +492,4 @@ private function fetch() Podcast::property('funding_url'); Podcast::property('funding_label'); Podcast::property('copyright'); +Podcast::property('guid'); diff --git a/lib/modules/migration/css/bootstrap.min.css b/lib/modules/migration/css/bootstrap.min.css deleted file mode 100644 index 8a5c6dd27..000000000 --- a/lib/modules/migration/css/bootstrap.min.css +++ /dev/null @@ -1,948 +0,0 @@ -/*! - * Bootstrap v2.2.2 - * - * Copyright 2012 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 @twitter by @mdo and @fat. - */ - .bootstrap .clearfix{*zoom:1;} - .bootstrap .clearfix:before,.bootstrap .clearfix:after{display:table;content:"";line-height:0;} - .bootstrap .clearfix:after{clear:both;} - .bootstrap .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} - .bootstrap .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} - .bootstrap article,.bootstrap aside,.bootstrap details,.bootstrap figcaption,.bootstrap figure,.bootstrap footer,.bootstrap header,.bootstrap hgroup,.bootstrap nav,.bootstrap section{display:block;} - .bootstrap audio,.bootstrap canvas,.bootstrap video{display:inline-block;*display:inline;*zoom:1;} - .bootstrap audio:not([controls]){display:none;} - .bootstrap html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} - .bootstrap a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} - .bootstrap a:hover,.bootstrap a:active{outline:0;} - .bootstrap sub,.bootstrap sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} - .bootstrap sup{top:-0.5em;} - .bootstrap sub{bottom:-0.25em;} - .bootstrap img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} - .bootstrap #map_canvas img,.bootstrap .google-maps img{max-width:none;} - .bootstrap button,.bootstrap input,.bootstrap select,.bootstrap textarea{margin:0;font-size:100%;vertical-align:middle;} - .bootstrap button,.bootstrap input{*overflow:visible;line-height:normal;} - .bootstrap button::-moz-focus-inner,.bootstrap input::-moz-focus-inner{padding:0;border:0;} - .bootstrap button,.bootstrap html input[type="button"],.bootstrap input[type="reset"],.bootstrap input[type="submit"]{-webkit-appearance:button;cursor:pointer;} - .bootstrap label,.bootstrap select,.bootstrap button,.bootstrap input[type="button"],.bootstrap input[type="reset"],.bootstrap input[type="submit"],.bootstrap input[type="radio"],.bootstrap input[type="checkbox"]{cursor:pointer;} - .bootstrap input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} - .bootstrap input[type="search"]::-webkit-search-decoration,.bootstrap input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} - .bootstrap textarea{overflow:auto;vertical-align:top;} - @media print{.bootstrap *{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} .bootstrap a,.bootstrap a:visited{text-decoration:underline;} .bootstrap a[href]:after{content:" (" attr(href) ")";} .bootstrap abbr[title]:after{content:" (" attr(title) ")";} .bootstrap .ir a:after,.bootstrap a[href^="javascript:"]:after,.bootstrap a[href^="#"]:after{content:"";} .bootstrap pre,.bootstrap blockquote{border:1px solid #999;page-break-inside:avoid;} .bootstrap thead{display:table-header-group;} .bootstrap tr,.bootstrap img{page-break-inside:avoid;} .bootstrap img{max-width:100% !important;} @page {margin:0.5cm;}.bootstrap p,.bootstrap h2,.bootstrap h3{orphans:3;widows:3;} .bootstrap h2,.bootstrap h3{page-break-after:avoid;}}body .bootstrap{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;} - .bootstrap a{color:#0088cc;text-decoration:none;} - .bootstrap a:hover{color:#005580;text-decoration:underline;} - .bootstrap .img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} - .bootstrap .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);} - .bootstrap .img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} - .bootstrap .row{margin-left:-20px;*zoom:1;} - .bootstrap .row:before,.bootstrap .row:after{display:table;content:"";line-height:0;} - .bootstrap .row:after{clear:both;} - .bootstrap [class*="span"]{float:left;min-height:1px;margin-left:20px;} - .bootstrap .container,.bootstrap .navbar-static-top .container,.bootstrap .navbar-fixed-top .container,.bootstrap .navbar-fixed-bottom .container{width:940px;} - .bootstrap .span12{width:940px;} - .bootstrap .span11{width:860px;} - .bootstrap .span10{width:780px;} - .bootstrap .span9{width:700px;} - .bootstrap .span8{width:620px;} - .bootstrap .span7{width:540px;} - .bootstrap .span6{width:460px;} - .bootstrap .span5{width:380px;} - .bootstrap .span4{width:300px;} - .bootstrap .span3{width:220px;} - .bootstrap .span2{width:140px;} - .bootstrap .span1{width:60px;} - .bootstrap .offset12{margin-left:980px;} - .bootstrap .offset11{margin-left:900px;} - .bootstrap .offset10{margin-left:820px;} - .bootstrap .offset9{margin-left:740px;} - .bootstrap .offset8{margin-left:660px;} - .bootstrap .offset7{margin-left:580px;} - .bootstrap .offset6{margin-left:500px;} - .bootstrap .offset5{margin-left:420px;} - .bootstrap .offset4{margin-left:340px;} - .bootstrap .offset3{margin-left:260px;} - .bootstrap .offset2{margin-left:180px;} - .bootstrap .offset1{margin-left:100px;} - .bootstrap .row-fluid{width:100%;*zoom:1;} - .bootstrap .row-fluid:before,.bootstrap .row-fluid:after{display:table;content:"";line-height:0;} - .bootstrap .row-fluid:after{clear:both;} - .bootstrap .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} - .bootstrap .row-fluid [class*="span"]:first-child{margin-left:0;} - .bootstrap .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;} - .bootstrap .row-fluid .span12{width:100%;*width:99.94680851063829%;} - .bootstrap .row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} - .bootstrap .row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} - .bootstrap .row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} - .bootstrap .row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} - .bootstrap .row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} - .bootstrap .row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} - .bootstrap .row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} - .bootstrap .row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} - .bootstrap .row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} - .bootstrap .row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} - .bootstrap .row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} - .bootstrap .row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} - .bootstrap .row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} - .bootstrap .row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} - .bootstrap .row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} - .bootstrap .row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} - .bootstrap .row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} - .bootstrap .row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} - .bootstrap .row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} - .bootstrap .row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} - .bootstrap .row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} - .bootstrap .row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} - .bootstrap .row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} - .bootstrap .row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} - .bootstrap .row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} - .bootstrap .row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} - .bootstrap .row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} - .bootstrap .row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} - .bootstrap .row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} - .bootstrap .row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} - .bootstrap .row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} - .bootstrap .row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} - .bootstrap .row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} - .bootstrap .row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} - .bootstrap .row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} - .bootstrap [class*="span"].hide,.bootstrap .row-fluid [class*="span"].hide{display:none;} - .bootstrap [class*="span"].pull-right,.bootstrap .row-fluid [class*="span"].pull-right{float:right;} - .bootstrap .container{margin-right:auto;margin-left:auto;*zoom:1;} - .bootstrap .container:before,.bootstrap .container:after{display:table;content:"";line-height:0;} - .bootstrap .container:after{clear:both;} - .bootstrap .container-fluid{padding-right:20px;padding-left:20px;*zoom:1;} - .bootstrap .container-fluid:before,.bootstrap .container-fluid:after{display:table;content:"";line-height:0;} - .bootstrap .container-fluid:after{clear:both;} - .bootstrap p{margin:0 0 10px;} - .bootstrap .lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;} - .bootstrap small{font-size:85%;} - .bootstrap strong{font-weight:bold;} - .bootstrap em{font-style:italic;} - .bootstrap cite{font-style:normal;} - .bootstrap .muted{color:#999999;} - .bootstrap a.muted:hover{color:#808080;} - .bootstrap .text-warning{color:#c09853;} - .bootstrap a.text-warning:hover{color:#a47e3c;} - .bootstrap .text-error{color:#b94a48;} - .bootstrap a.text-error:hover{color:#953b39;} - .bootstrap .text-info{color:#3a87ad;} - .bootstrap a.text-info:hover{color:#2d6987;} - .bootstrap .text-success{color:#468847;} - .bootstrap a.text-success:hover{color:#356635;} - .bootstrap h1,.bootstrap h2,.bootstrap h3,.bootstrap h4,.bootstrap h5,.bootstrap h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;} - .bootstrap h1 small,.bootstrap h2 small,.bootstrap h3 small,.bootstrap h4 small,.bootstrap h5 small,.bootstrap h6 small{font-weight:normal;line-height:1;color:#999999;} - .bootstrap h1,.bootstrap h2,.bootstrap h3{line-height:40px;} - .bootstrap h1{font-size:38.5px;} - .bootstrap h2{font-size:31.5px;} - .bootstrap h3{font-size:24.5px;} - .bootstrap h4{font-size:17.5px;} - .bootstrap h5{font-size:14px;} - .bootstrap h6{font-size:11.9px;} - .bootstrap h1 small{font-size:24.5px;} - .bootstrap h2 small{font-size:17.5px;} - .bootstrap h3 small{font-size:14px;} - .bootstrap h4 small{font-size:14px;} - .bootstrap .page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} - .bootstrap ul,.bootstrap ol{padding:0;margin:0 0 10px 25px;} - .bootstrap ul ul,.bootstrap ul ol,.bootstrap ol ol,.bootstrap ol ul{margin-bottom:0;} - .bootstrap li{line-height:20px;} - .bootstrap ul.unstyled,.bootstrap ol.unstyled{margin-left:0;list-style:none;} - .bootstrap ul.inline,.bootstrap ol.inline{margin-left:0;list-style:none;} - .bootstrap ul.inline>li,.bootstrap ol.inline>li{display:inline-block;padding-left:5px;padding-right:5px;} - .bootstrap dl{margin-bottom:20px;} - .bootstrap dt,.bootstrap dd{line-height:20px;} - .bootstrap dt{font-weight:bold;} - .bootstrap dd{margin-left:10px;} - .bootstrap .dl-horizontal{*zoom:1;} - .bootstrap .dl-horizontal:before,.bootstrap .dl-horizontal:after{display:table;content:"";line-height:0;} - .bootstrap .dl-horizontal:after{clear:both;} - .bootstrap .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} - .bootstrap .dl-horizontal dd{margin-left:180px;} - .bootstrap hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} - .bootstrap abbr[title],.bootstrap abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;} - .bootstrap abbr.initialism{font-size:90%;text-transform:uppercase;} - .bootstrap blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;} - .bootstrap blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;} - .bootstrap blockquote small{display:block;line-height:20px;color:#999999;} - .bootstrap blockquote small:before{content:'\2014 \00A0';} - .bootstrap blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;} - .bootstrap blockquote.pull-right p,.bootstrap blockquote.pull-right small{text-align:right;} - .bootstrap blockquote.pull-right small:before{content:'';} - .bootstrap blockquote.pull-right small:after{content:'\00A0 \2014';} - .bootstrap q:before,.bootstrap q:after,.bootstrap blockquote:before,.bootstrap blockquote:after{content:"";} - .bootstrap address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} - .bootstrap code,.bootstrap pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} - .bootstrap code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap;} - .bootstrap 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;} - .bootstrap pre.prettyprint{margin-bottom:20px;} - .bootstrap pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0;} - .bootstrap .pre-scrollable{max-height:340px;overflow-y:scroll;} - .bootstrap .label,.bootstrap .badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} - .bootstrap .label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} - .bootstrap .badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} - .bootstrap .label:empty,.bootstrap .badge:empty{display:none;} - .bootstrap a.label:hover,.bootstrap a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} - .bootstrap .label-important,.bootstrap .badge-important{background-color:#b94a48;} - .bootstrap .label-important[href],.bootstrap .badge-important[href]{background-color:#953b39;} - .bootstrap .label-warning,.bootstrap .badge-warning{background-color:#f89406;} - .bootstrap .label-warning[href],.bootstrap .badge-warning[href]{background-color:#c67605;} - .bootstrap .label-success,.bootstrap .badge-success{background-color:#468847;} - .bootstrap .label-success[href],.bootstrap .badge-success[href]{background-color:#356635;} - .bootstrap .label-info,.bootstrap .badge-info{background-color:#3a87ad;} - .bootstrap .label-info[href],.bootstrap .badge-info[href]{background-color:#2d6987;} - .bootstrap .label-inverse,.bootstrap .badge-inverse{background-color:#333333;} - .bootstrap .label-inverse[href],.bootstrap .badge-inverse[href]{background-color:#1a1a1a;} - .bootstrap .btn .label,.bootstrap .btn .badge{position:relative;top:-1px;} - .bootstrap .btn-mini .label,.bootstrap .btn-mini .badge{top:0;} - .bootstrap table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} - .bootstrap .table{width:100%;margin-bottom:20px;} - .bootstrap .table th,.bootstrap .table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} - .bootstrap .table th{font-weight:bold;} - .bootstrap .table thead th{vertical-align:bottom;} - .bootstrap .table caption+thead tr:first-child th,.bootstrap .table caption+thead tr:first-child td,.bootstrap .table colgroup+thead tr:first-child th,.bootstrap .table colgroup+thead tr:first-child td,.bootstrap .table thead:first-child tr:first-child th,.bootstrap .table thead:first-child tr:first-child td{border-top:0;} - .bootstrap .table tbody+tbody{border-top:2px solid #dddddd;} - .bootstrap .table .table{background-color:#ffffff;} - .bootstrap .table-condensed th,.bootstrap .table-condensed td{padding:4px 5px;} - .bootstrap .table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} - .bootstrap .table-bordered th,.bootstrap .table-bordered td{border-left:1px solid #dddddd;} - .bootstrap .table-bordered caption+thead tr:first-child th,.bootstrap .table-bordered caption+tbody tr:first-child th,.bootstrap .table-bordered caption+tbody tr:first-child td,.bootstrap .table-bordered colgroup+thead tr:first-child th,.bootstrap .table-bordered colgroup+tbody tr:first-child th,.bootstrap .table-bordered colgroup+tbody tr:first-child td,.bootstrap .table-bordered thead:first-child tr:first-child th,.bootstrap .table-bordered tbody:first-child tr:first-child th,.bootstrap .table-bordered tbody:first-child tr:first-child td{border-top:0;} - .bootstrap .table-bordered thead:first-child tr:first-child>th:first-child,.bootstrap .table-bordered tbody:first-child tr:first-child>td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} - .bootstrap .table-bordered thead:first-child tr:first-child>th:last-child,.bootstrap .table-bordered tbody:first-child tr:first-child>td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} - .bootstrap .table-bordered thead:last-child tr:last-child>th:first-child,.bootstrap .table-bordered tbody:last-child tr:last-child>td:first-child,.bootstrap .table-bordered tfoot:last-child tr:last-child>td:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} - .bootstrap .table-bordered thead:last-child tr:last-child>th:last-child,.bootstrap .table-bordered tbody:last-child tr:last-child>td:last-child,.bootstrap .table-bordered tfoot:last-child tr:last-child>td:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} - .bootstrap .table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;} - .bootstrap .table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;} - .bootstrap .table-bordered caption+thead tr:first-child th:first-child,.bootstrap .table-bordered caption+tbody tr:first-child td:first-child,.bootstrap .table-bordered colgroup+thead tr:first-child th:first-child,.bootstrap .table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} - .bootstrap .table-bordered caption+thead tr:first-child th:last-child,.bootstrap .table-bordered caption+tbody tr:first-child td:last-child,.bootstrap .table-bordered colgroup+thead tr:first-child th:last-child,.bootstrap .table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} - .bootstrap .table-striped tbody>tr:nth-child(odd)>td,.bootstrap .table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;} - .bootstrap .table-hover tbody tr:hover td,.bootstrap .table-hover tbody tr:hover th{background-color:#f5f5f5;} - .bootstrap table td[class*="span"],.bootstrap table th[class*="span"],.bootstrap .row-fluid table td[class*="span"],.bootstrap .row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;} - .bootstrap .table td.span1,.bootstrap .table th.span1{float:none;width:44px;margin-left:0;} - .bootstrap .table td.span2,.bootstrap .table th.span2{float:none;width:124px;margin-left:0;} - .bootstrap .table td.span3,.bootstrap .table th.span3{float:none;width:204px;margin-left:0;} - .bootstrap .table td.span4,.bootstrap .table th.span4{float:none;width:284px;margin-left:0;} - .bootstrap .table td.span5,.bootstrap .table th.span5{float:none;width:364px;margin-left:0;} - .bootstrap .table td.span6,.bootstrap .table th.span6{float:none;width:444px;margin-left:0;} - .bootstrap .table td.span7,.bootstrap .table th.span7{float:none;width:524px;margin-left:0;} - .bootstrap .table td.span8,.bootstrap .table th.span8{float:none;width:604px;margin-left:0;} - .bootstrap .table td.span9,.bootstrap .table th.span9{float:none;width:684px;margin-left:0;} - .bootstrap .table td.span10,.bootstrap .table th.span10{float:none;width:764px;margin-left:0;} - .bootstrap .table td.span11,.bootstrap .table th.span11{float:none;width:844px;margin-left:0;} - .bootstrap .table td.span12,.bootstrap .table th.span12{float:none;width:924px;margin-left:0;} - .bootstrap .table tbody tr.success td{background-color:#dff0d8;} - .bootstrap .table tbody tr.error td{background-color:#f2dede;} - .bootstrap .table tbody tr.warning td{background-color:#fcf8e3;} - .bootstrap .table tbody tr.info td{background-color:#d9edf7;} - .bootstrap .table-hover tbody tr.success:hover td{background-color:#d0e9c6;} - .bootstrap .table-hover tbody tr.error:hover td{background-color:#ebcccc;} - .bootstrap .table-hover tbody tr.warning:hover td{background-color:#faf2cc;} - .bootstrap .table-hover tbody tr.info:hover td{background-color:#c4e3f3;} - .bootstrap form{margin:0 0 20px;} - .bootstrap fieldset{padding:0;margin:0;border:0;} - .bootstrap legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;} - .bootstrap legend small{font-size:15px;color:#999999;} - .bootstrap label,.bootstrap input,.bootstrap button,.bootstrap select,.bootstrap textarea{font-size:14px;font-weight:normal;line-height:20px;} - .bootstrap input,.bootstrap button,.bootstrap select,.bootstrap textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} - .bootstrap label{display:block;margin-bottom:5px;} - .bootstrap select,.bootstrap textarea,.bootstrap input[type="text"],.bootstrap input[type="password"],.bootstrap input[type="datetime"],.bootstrap input[type="datetime-local"],.bootstrap input[type="date"],.bootstrap input[type="month"],.bootstrap input[type="time"],.bootstrap input[type="week"],.bootstrap input[type="number"],.bootstrap input[type="email"],.bootstrap input[type="url"],.bootstrap input[type="search"],.bootstrap input[type="tel"],.bootstrap input[type="color"],.bootstrap .uneditable-input{display:inline-block;height:auto;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;} - .bootstrap input,.bootstrap textarea,.bootstrap .uneditable-input{width:206px;} - .bootstrap textarea{height:auto;} - .bootstrap textarea,.bootstrap input[type="text"],.bootstrap input[type="password"],.bootstrap input[type="datetime"],.bootstrap input[type="datetime-local"],.bootstrap input[type="date"],.bootstrap input[type="month"],.bootstrap input[type="time"],.bootstrap input[type="week"],.bootstrap input[type="number"],.bootstrap input[type="email"],.bootstrap input[type="url"],.bootstrap input[type="search"],.bootstrap input[type="tel"],.bootstrap input[type="color"],.bootstrap .uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} - .bootstrap textarea:focus,.bootstrap input[type="text"]:focus,.bootstrap input[type="password"]:focus,.bootstrap input[type="datetime"]:focus,.bootstrap input[type="datetime-local"]:focus,.bootstrap input[type="date"]:focus,.bootstrap input[type="month"]:focus,.bootstrap input[type="time"]:focus,.bootstrap input[type="week"]:focus,.bootstrap input[type="number"]:focus,.bootstrap input[type="email"]:focus,.bootstrap input[type="url"]:focus,.bootstrap input[type="search"]:focus,.bootstrap input[type="tel"]:focus,.bootstrap input[type="color"]:focus,.bootstrap .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);} - .bootstrap input[type="radio"],.bootstrap input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;} - .bootstrap input[type="file"],.bootstrap input[type="image"],.bootstrap input[type="submit"],.bootstrap input[type="reset"],.bootstrap input[type="button"],.bootstrap input[type="radio"],.bootstrap input[type="checkbox"]{width:auto;} - .bootstrap select,.bootstrap input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} - .bootstrap select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} - .bootstrap select[multiple],.bootstrap select[size]{height:auto;} - .bootstrap select:focus,.bootstrap input[type="file"]:focus,.bootstrap input[type="radio"]:focus,.bootstrap input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} - .bootstrap .uneditable-input,.bootstrap .uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} - .bootstrap .uneditable-input{overflow:hidden;white-space:nowrap;} - .bootstrap .uneditable-textarea{width:auto;height:auto;} - .bootstrap input:-moz-placeholder,.bootstrap textarea:-moz-placeholder{color:#999999;} - .bootstrap input:-ms-input-placeholder,.bootstrap textarea:-ms-input-placeholder{color:#999999;} - .bootstrap input::-webkit-input-placeholder,.bootstrap textarea::-webkit-input-placeholder{color:#999999;} - .bootstrap .radio,.bootstrap .checkbox{min-height:20px;padding-left:20px;} - .bootstrap .radio input[type="radio"],.bootstrap .checkbox input[type="checkbox"]{float:left;margin-left:-20px;} - .bootstrap .controls>.radio:first-child,.bootstrap .controls>.checkbox:first-child{padding-top:5px;} - .bootstrap .radio.inline,.bootstrap .checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} - .bootstrap .radio.inline+.radio.inline,.bootstrap .checkbox.inline+.checkbox.inline{margin-left:10px;} - .bootstrap .input-mini{width:60px;} - .bootstrap .input-small{width:90px;} - .bootstrap .input-medium{width:150px;} - .bootstrap .input-large{width:210px;} - .bootstrap .input-xlarge{width:270px;} - .bootstrap .input-xxlarge{width:530px;} - .bootstrap input[class*="span"],.bootstrap select[class*="span"],.bootstrap textarea[class*="span"],.bootstrap .uneditable-input[class*="span"],.bootstrap .row-fluid input[class*="span"],.bootstrap .row-fluid select[class*="span"],.bootstrap .row-fluid textarea[class*="span"],.bootstrap .row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} - .bootstrap .input-append input[class*="span"],.bootstrap .input-append .uneditable-input[class*="span"],.bootstrap .input-prepend input[class*="span"],.bootstrap .input-prepend .uneditable-input[class*="span"],.bootstrap .row-fluid input[class*="span"],.bootstrap .row-fluid select[class*="span"],.bootstrap .row-fluid textarea[class*="span"],.bootstrap .row-fluid .uneditable-input[class*="span"],.bootstrap .row-fluid .input-prepend [class*="span"],.bootstrap .row-fluid .input-append [class*="span"]{display:inline-block;} - .bootstrap input,.bootstrap textarea,.bootstrap .uneditable-input{margin-left:0;} - .bootstrap .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} - .bootstrap input.span12,.bootstrap textarea.span12,.bootstrap .uneditable-input.span12{width:926px;} - .bootstrap input.span11,.bootstrap textarea.span11,.bootstrap .uneditable-input.span11{width:846px;} - .bootstrap input.span10,.bootstrap textarea.span10,.bootstrap .uneditable-input.span10{width:766px;} - .bootstrap input.span9,.bootstrap textarea.span9,.bootstrap .uneditable-input.span9{width:686px;} - .bootstrap input.span8,.bootstrap textarea.span8,.bootstrap .uneditable-input.span8{width:606px;} - .bootstrap input.span7,.bootstrap textarea.span7,.bootstrap .uneditable-input.span7{width:526px;} - .bootstrap input.span6,.bootstrap textarea.span6,.bootstrap .uneditable-input.span6{width:446px;} - .bootstrap input.span5,.bootstrap textarea.span5,.bootstrap .uneditable-input.span5{width:366px;} - .bootstrap input.span4,.bootstrap textarea.span4,.bootstrap .uneditable-input.span4{width:286px;} - .bootstrap input.span3,.bootstrap textarea.span3,.bootstrap .uneditable-input.span3{width:206px;} - .bootstrap input.span2,.bootstrap textarea.span2,.bootstrap .uneditable-input.span2{width:126px;} - .bootstrap input.span1,.bootstrap textarea.span1,.bootstrap .uneditable-input.span1{width:46px;} - .bootstrap .controls-row{*zoom:1;} - .bootstrap .controls-row:before,.bootstrap .controls-row:after{display:table;content:"";line-height:0;} - .bootstrap .controls-row:after{clear:both;} - .bootstrap .controls-row [class*="span"],.bootstrap .row-fluid .controls-row [class*="span"]{float:left;} - .bootstrap .controls-row .checkbox[class*="span"],.bootstrap .controls-row .radio[class*="span"]{padding-top:5px;} - .bootstrap input[disabled],.bootstrap select[disabled],.bootstrap textarea[disabled],.bootstrap input[readonly],.bootstrap select[readonly],.bootstrap textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} - .bootstrap input[type="radio"][disabled],.bootstrap input[type="checkbox"][disabled],.bootstrap input[type="radio"][readonly],.bootstrap input[type="checkbox"][readonly]{background-color:transparent;} - .bootstrap .control-group.warning .control-label,.bootstrap .control-group.warning .help-block,.bootstrap .control-group.warning .help-inline{color:#c09853;} - .bootstrap .control-group.warning .checkbox,.bootstrap .control-group.warning .radio,.bootstrap .control-group.warning input,.bootstrap .control-group.warning select,.bootstrap .control-group.warning textarea{color:#c09853;} - .bootstrap .control-group.warning input,.bootstrap .control-group.warning select,.bootstrap .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);} - .bootstrap .control-group.warning input:focus,.bootstrap .control-group.warning select:focus,.bootstrap .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;} - .bootstrap .control-group.warning .input-prepend .add-on,.bootstrap .control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} - .bootstrap .control-group.error .control-label,.bootstrap .control-group.error .help-block,.bootstrap .control-group.error .help-inline{color:#b94a48;} - .bootstrap .control-group.error .checkbox,.bootstrap .control-group.error .radio,.bootstrap .control-group.error input,.bootstrap .control-group.error select,.bootstrap .control-group.error textarea{color:#b94a48;} - .bootstrap .control-group.error input,.bootstrap .control-group.error select,.bootstrap .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);} - .bootstrap .control-group.error input:focus,.bootstrap .control-group.error select:focus,.bootstrap .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;} - .bootstrap .control-group.error .input-prepend .add-on,.bootstrap .control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} - .bootstrap .control-group.success .control-label,.bootstrap .control-group.success .help-block,.bootstrap .control-group.success .help-inline{color:#468847;} - .bootstrap .control-group.success .checkbox,.bootstrap .control-group.success .radio,.bootstrap .control-group.success input,.bootstrap .control-group.success select,.bootstrap .control-group.success textarea{color:#468847;} - .bootstrap .control-group.success input,.bootstrap .control-group.success select,.bootstrap .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);} - .bootstrap .control-group.success input:focus,.bootstrap .control-group.success select:focus,.bootstrap .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;} - .bootstrap .control-group.success .input-prepend .add-on,.bootstrap .control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} - .bootstrap .control-group.info .control-label,.bootstrap .control-group.info .help-block,.bootstrap .control-group.info .help-inline{color:#3a87ad;} - .bootstrap .control-group.info .checkbox,.bootstrap .control-group.info .radio,.bootstrap .control-group.info input,.bootstrap .control-group.info select,.bootstrap .control-group.info textarea{color:#3a87ad;} - .bootstrap .control-group.info input,.bootstrap .control-group.info select,.bootstrap .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);} - .bootstrap .control-group.info input:focus,.bootstrap .control-group.info select:focus,.bootstrap .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;} - .bootstrap .control-group.info .input-prepend .add-on,.bootstrap .control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} - .bootstrap input:focus:invalid,.bootstrap textarea:focus:invalid,.bootstrap select:focus:invalid{color:#b94a48;border-color:#ee5f5b;} - .bootstrap input:focus:invalid:focus,.bootstrap textarea:focus:invalid:focus,.bootstrap 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;} - .bootstrap .form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;} - .bootstrap .form-actions:before,.bootstrap .form-actions:after{display:table;content:"";line-height:0;} - .bootstrap .form-actions:after{clear:both;} - .bootstrap .help-block,.bootstrap .help-inline{color:#595959;} - .bootstrap .help-block{display:block;margin-bottom:10px;} - .bootstrap .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} - .bootstrap .input-append,.bootstrap .input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;} - .bootstrap .input-append input,.bootstrap .input-prepend input,.bootstrap .input-append select,.bootstrap .input-prepend select,.bootstrap .input-append .uneditable-input,.bootstrap .input-prepend .uneditable-input,.bootstrap .input-append .dropdown-menu,.bootstrap .input-prepend .dropdown-menu{font-size:14px;} - .bootstrap .input-append input,.bootstrap .input-prepend input,.bootstrap .input-append select,.bootstrap .input-prepend select,.bootstrap .input-append .uneditable-input,.bootstrap .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;} - .bootstrap .input-append input:focus,.bootstrap .input-prepend input:focus,.bootstrap .input-append select:focus,.bootstrap .input-prepend select:focus,.bootstrap .input-append .uneditable-input:focus,.bootstrap .input-prepend .uneditable-input:focus{z-index:2;} - .bootstrap .input-append .add-on,.bootstrap .input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} - .bootstrap .input-append .add-on,.bootstrap .input-prepend .add-on,.bootstrap .input-append .btn,.bootstrap .input-prepend .btn,.bootstrap .input-append .btn-group>.dropdown-toggle,.bootstrap .input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .input-append .active,.bootstrap .input-prepend .active{background-color:#a9dba9;border-color:#46a546;} - .bootstrap .input-prepend .add-on,.bootstrap .input-prepend .btn{margin-right:-1px;} - .bootstrap .input-prepend .add-on:first-child,.bootstrap .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;} - .bootstrap .input-append input,.bootstrap .input-append select,.bootstrap .input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} - .bootstrap .input-append input+.btn-group .btn:last-child,.bootstrap .input-append select+.btn-group .btn:last-child,.bootstrap .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;} - .bootstrap .input-append .add-on,.bootstrap .input-append .btn,.bootstrap .input-append .btn-group{margin-left:-1px;} - .bootstrap .input-append .add-on:last-child,.bootstrap .input-append .btn:last-child,.bootstrap .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;} - .bootstrap .input-prepend.input-append input,.bootstrap .input-prepend.input-append select,.bootstrap .input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .input-prepend.input-append input+.btn-group .btn,.bootstrap .input-prepend.input-append select+.btn-group .btn,.bootstrap .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;} - .bootstrap .input-prepend.input-append .add-on:first-child,.bootstrap .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;} - .bootstrap .input-prepend.input-append .add-on:last-child,.bootstrap .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;} - .bootstrap .input-prepend.input-append .btn-group:first-child{margin-left:0;} - .bootstrap 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;} - .bootstrap .form-search .input-append .search-query,.bootstrap .form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .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;} - .bootstrap .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;} - .bootstrap .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;} - .bootstrap .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;} - .bootstrap .form-search input,.bootstrap .form-inline input,.bootstrap .form-horizontal input,.bootstrap .form-search textarea,.bootstrap .form-inline textarea,.bootstrap .form-horizontal textarea,.bootstrap .form-search select,.bootstrap .form-inline select,.bootstrap .form-horizontal select,.bootstrap .form-search .help-inline,.bootstrap .form-inline .help-inline,.bootstrap .form-horizontal .help-inline,.bootstrap .form-search .uneditable-input,.bootstrap .form-inline .uneditable-input,.bootstrap .form-horizontal .uneditable-input,.bootstrap .form-search .input-prepend,.bootstrap .form-inline .input-prepend,.bootstrap .form-horizontal .input-prepend,.bootstrap .form-search .input-append,.bootstrap .form-inline .input-append,.bootstrap .form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} - .bootstrap .form-search .hide,.bootstrap .form-inline .hide,.bootstrap .form-horizontal .hide{display:none;} - .bootstrap .form-search label,.bootstrap .form-inline label,.bootstrap .form-search .btn-group,.bootstrap .form-inline .btn-group{display:inline-block;} - .bootstrap .form-search .input-append,.bootstrap .form-inline .input-append,.bootstrap .form-search .input-prepend,.bootstrap .form-inline .input-prepend{margin-bottom:0;} - .bootstrap .form-search .radio,.bootstrap .form-search .checkbox,.bootstrap .form-inline .radio,.bootstrap .form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} - .bootstrap .form-search .radio input[type="radio"],.bootstrap .form-search .checkbox input[type="checkbox"],.bootstrap .form-inline .radio input[type="radio"],.bootstrap .form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} - .bootstrap .control-group{margin-bottom:10px;} - .bootstrap legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} - .bootstrap .form-horizontal .control-group{margin-bottom:20px;*zoom:1;} - .bootstrap .form-horizontal .control-group:before,.bootstrap .form-horizontal .control-group:after{display:table;content:"";line-height:0;} - .bootstrap .form-horizontal .control-group:after{clear:both;} - .bootstrap .form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} - .bootstrap .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;} - .bootstrap .form-horizontal .controls:first-child{*padding-left:180px;} - .bootstrap .form-horizontal .help-block{margin-bottom:0;} - .bootstrap .form-horizontal input+.help-block,.bootstrap .form-horizontal select+.help-block,.bootstrap .form-horizontal textarea+.help-block,.bootstrap .form-horizontal .uneditable-input+.help-block,.bootstrap .form-horizontal .input-prepend+.help-block,.bootstrap .form-horizontal .input-append+.help-block{margin-top:10px;} - .bootstrap .form-horizontal .form-actions{padding-left:180px;} - .bootstrap .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=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);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #bbbbbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-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);} - .bootstrap .btn:hover,.bootstrap .btn:active,.bootstrap .btn.active,.bootstrap .btn.disabled,.bootstrap .btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} - .bootstrap .btn:active,.bootstrap .btn.active{background-color:#cccccc \9;} - .bootstrap .btn:first-child{*margin-left:0;} - .bootstrap .btn:hover{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} - .bootstrap .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} - .bootstrap .btn.active,.bootstrap .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);} - .bootstrap .btn.disabled,.bootstrap .btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} - .bootstrap .btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} - .bootstrap .btn-large [class^="icon-"],.bootstrap .btn-large [class*=" icon-"]{margin-top:4px;} - .bootstrap .btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} - .bootstrap .btn-small [class^="icon-"],.bootstrap .btn-small [class*=" icon-"]{margin-top:0;} - .bootstrap .btn-mini [class^="icon-"],.bootstrap .btn-mini [class*=" icon-"]{margin-top:-1px;} - .bootstrap .btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} - .bootstrap .btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} - .bootstrap .btn-block+.btn-block{margin-top:5px;} - .bootstrap input[type="submit"].btn-block,.bootstrap input[type="reset"].btn-block,.bootstrap input[type="button"].btn-block{width:100%;} - .bootstrap .btn-primary.active,.bootstrap .btn-warning.active,.bootstrap .btn-danger.active,.bootstrap .btn-success.active,.bootstrap .btn-info.active,.bootstrap .btn-inverse.active{color:rgba(255, 255, 255, 0.75);} - .bootstrap .btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);} - .bootstrap .btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);} - .bootstrap .btn-primary:hover,.bootstrap .btn-primary:active,.bootstrap .btn-primary.active,.bootstrap .btn-primary.disabled,.bootstrap .btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} - .bootstrap .btn-primary:active,.bootstrap .btn-primary.active{background-color:#003399 \9;} - .bootstrap .btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);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);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);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);} - .bootstrap .btn-warning:hover,.bootstrap .btn-warning:active,.bootstrap .btn-warning.active,.bootstrap .btn-warning.disabled,.bootstrap .btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} - .bootstrap .btn-warning:active,.bootstrap .btn-warning.active{background-color:#c67605 \9;} - .bootstrap .btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;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;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);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);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);} - .bootstrap .btn-danger:hover,.bootstrap .btn-danger:active,.bootstrap .btn-danger.active,.bootstrap .btn-danger.disabled,.bootstrap .btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} - .bootstrap .btn-danger:active,.bootstrap .btn-danger.active{background-color:#942a25 \9;} - .bootstrap .btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;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;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);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);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);} - .bootstrap .btn-success:hover,.bootstrap .btn-success:active,.bootstrap .btn-success.active,.bootstrap .btn-success.disabled,.bootstrap .btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} - .bootstrap .btn-success:active,.bootstrap .btn-success.active{background-color:#408140 \9;} - .bootstrap .btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;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;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);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);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);} - .bootstrap .btn-info:hover,.bootstrap .btn-info:active,.bootstrap .btn-info.active,.bootstrap .btn-info.disabled,.bootstrap .btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} - .bootstrap .btn-info:active,.bootstrap .btn-info.active{background-color:#24748c \9;} - .bootstrap .btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);} - .bootstrap .btn-inverse:hover,.bootstrap .btn-inverse:active,.bootstrap .btn-inverse.active,.bootstrap .btn-inverse.disabled,.bootstrap .btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} - .bootstrap .btn-inverse:active,.bootstrap .btn-inverse.active{background-color:#080808 \9;} - .bootstrap button.btn,.bootstrap input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;} - .bootstrap button.btn::-moz-focus-inner,.bootstrap input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} - .bootstrap button.btn.btn-large,.bootstrap input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} - .bootstrap button.btn.btn-small,.bootstrap input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} - .bootstrap button.btn.btn-mini,.bootstrap input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} - .bootstrap .btn-link,.bootstrap .btn-link:active,.bootstrap .btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} - .bootstrap .btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent;} - .bootstrap .btn-link[disabled]:hover{color:#333333;text-decoration:none;} - .bootstrap [class^="icon-"],.bootstrap [class*=" icon-"]{display:inline-block;width:14px;height:14px;*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;margin-top:1px;} - .bootstrap .icon-white,.bootstrap .nav-pills>.active>a>[class^="icon-"],.bootstrap .nav-pills>.active>a>[class*=" icon-"],.bootstrap .nav-list>.active>a>[class^="icon-"],.bootstrap .nav-list>.active>a>[class*=" icon-"],.bootstrap .navbar-inverse .nav>.active>a>[class^="icon-"],.bootstrap .navbar-inverse .nav>.active>a>[class*=" icon-"],.bootstrap .dropdown-menu>li>a:hover>[class^="icon-"],.bootstrap .dropdown-menu>li>a:hover>[class*=" icon-"],.bootstrap .dropdown-menu>.active>a>[class^="icon-"],.bootstrap .dropdown-menu>.active>a>[class*=" icon-"],.bootstrap .dropdown-submenu:hover>a>[class^="icon-"],.bootstrap .dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");} - .bootstrap .icon-glass{background-position:0 0;} - .bootstrap .icon-music{background-position:-24px 0;} - .bootstrap .icon-search{background-position:-48px 0;} - .bootstrap .icon-envelope{background-position:-72px 0;} - .bootstrap .icon-heart{background-position:-96px 0;} - .bootstrap .icon-star{background-position:-120px 0;} - .bootstrap .icon-star-empty{background-position:-144px 0;} - .bootstrap .icon-user{background-position:-168px 0;} - .bootstrap .icon-film{background-position:-192px 0;} - .bootstrap .icon-th-large{background-position:-216px 0;} - .bootstrap .icon-th{background-position:-240px 0;} - .bootstrap .icon-th-list{background-position:-264px 0;} - .bootstrap .icon-ok{background-position:-288px 0;} - .bootstrap .icon-remove{background-position:-312px 0;} - .bootstrap .icon-zoom-in{background-position:-336px 0;} - .bootstrap .icon-zoom-out{background-position:-360px 0;} - .bootstrap .icon-off{background-position:-384px 0;} - .bootstrap .icon-signal{background-position:-408px 0;} - .bootstrap .icon-cog{background-position:-432px 0;} - .bootstrap .icon-trash{background-position:-456px 0;} - .bootstrap .icon-home{background-position:0 -24px;} - .bootstrap .icon-file{background-position:-24px -24px;} - .bootstrap .icon-time{background-position:-48px -24px;} - .bootstrap .icon-road{background-position:-72px -24px;} - .bootstrap .icon-download-alt{background-position:-96px -24px;} - .bootstrap .icon-download{background-position:-120px -24px;} - .bootstrap .icon-upload{background-position:-144px -24px;} - .bootstrap .icon-inbox{background-position:-168px -24px;} - .bootstrap .icon-play-circle{background-position:-192px -24px;} - .bootstrap .icon-repeat{background-position:-216px -24px;} - .bootstrap .icon-refresh{background-position:-240px -24px;} - .bootstrap .icon-list-alt{background-position:-264px -24px;} - .bootstrap .icon-lock{background-position:-287px -24px;} - .bootstrap .icon-flag{background-position:-312px -24px;} - .bootstrap .icon-headphones{background-position:-336px -24px;} - .bootstrap .icon-volume-off{background-position:-360px -24px;} - .bootstrap .icon-volume-down{background-position:-384px -24px;} - .bootstrap .icon-volume-up{background-position:-408px -24px;} - .bootstrap .icon-qrcode{background-position:-432px -24px;} - .bootstrap .icon-barcode{background-position:-456px -24px;} - .bootstrap .icon-tag{background-position:0 -48px;} - .bootstrap .icon-tags{background-position:-25px -48px;} - .bootstrap .icon-book{background-position:-48px -48px;} - .bootstrap .icon-bookmark{background-position:-72px -48px;} - .bootstrap .icon-print{background-position:-96px -48px;} - .bootstrap .icon-camera{background-position:-120px -48px;} - .bootstrap .icon-font{background-position:-144px -48px;} - .bootstrap .icon-bold{background-position:-167px -48px;} - .bootstrap .icon-italic{background-position:-192px -48px;} - .bootstrap .icon-text-height{background-position:-216px -48px;} - .bootstrap .icon-text-width{background-position:-240px -48px;} - .bootstrap .icon-align-left{background-position:-264px -48px;} - .bootstrap .icon-align-center{background-position:-288px -48px;} - .bootstrap .icon-align-right{background-position:-312px -48px;} - .bootstrap .icon-align-justify{background-position:-336px -48px;} - .bootstrap .icon-list{background-position:-360px -48px;} - .bootstrap .icon-indent-left{background-position:-384px -48px;} - .bootstrap .icon-indent-right{background-position:-408px -48px;} - .bootstrap .icon-facetime-video{background-position:-432px -48px;} - .bootstrap .icon-picture{background-position:-456px -48px;} - .bootstrap .icon-pencil{background-position:0 -72px;} - .bootstrap .icon-map-marker{background-position:-24px -72px;} - .bootstrap .icon-adjust{background-position:-48px -72px;} - .bootstrap .icon-tint{background-position:-72px -72px;} - .bootstrap .icon-edit{background-position:-96px -72px;} - .bootstrap .icon-share{background-position:-120px -72px;} - .bootstrap .icon-check{background-position:-144px -72px;} - .bootstrap .icon-move{background-position:-168px -72px;} - .bootstrap .icon-step-backward{background-position:-192px -72px;} - .bootstrap .icon-fast-backward{background-position:-216px -72px;} - .bootstrap .icon-backward{background-position:-240px -72px;} - .bootstrap .icon-play{background-position:-264px -72px;} - .bootstrap .icon-pause{background-position:-288px -72px;} - .bootstrap .icon-stop{background-position:-312px -72px;} - .bootstrap .icon-forward{background-position:-336px -72px;} - .bootstrap .icon-fast-forward{background-position:-360px -72px;} - .bootstrap .icon-step-forward{background-position:-384px -72px;} - .bootstrap .icon-eject{background-position:-408px -72px;} - .bootstrap .icon-chevron-left{background-position:-432px -72px;} - .bootstrap .icon-chevron-right{background-position:-456px -72px;} - .bootstrap .icon-plus-sign{background-position:0 -96px;} - .bootstrap .icon-minus-sign{background-position:-24px -96px;} - .bootstrap .icon-remove-sign{background-position:-48px -96px;} - .bootstrap .icon-ok-sign{background-position:-72px -96px;} - .bootstrap .icon-question-sign{background-position:-96px -96px;} - .bootstrap .icon-info-sign{background-position:-120px -96px;} - .bootstrap .icon-screenshot{background-position:-144px -96px;} - .bootstrap .icon-remove-circle{background-position:-168px -96px;} - .bootstrap .icon-ok-circle{background-position:-192px -96px;} - .bootstrap .icon-ban-circle{background-position:-216px -96px;} - .bootstrap .icon-arrow-left{background-position:-240px -96px;} - .bootstrap .icon-arrow-right{background-position:-264px -96px;} - .bootstrap .icon-arrow-up{background-position:-289px -96px;} - .bootstrap .icon-arrow-down{background-position:-312px -96px;} - .bootstrap .icon-share-alt{background-position:-336px -96px;} - .bootstrap .icon-resize-full{background-position:-360px -96px;} - .bootstrap .icon-resize-small{background-position:-384px -96px;} - .bootstrap .icon-plus{background-position:-408px -96px;} - .bootstrap .icon-minus{background-position:-433px -96px;} - .bootstrap .icon-asterisk{background-position:-456px -96px;} - .bootstrap .icon-exclamation-sign{background-position:0 -120px;} - .bootstrap .icon-gift{background-position:-24px -120px;} - .bootstrap .icon-leaf{background-position:-48px -120px;} - .bootstrap .icon-fire{background-position:-72px -120px;} - .bootstrap .icon-eye-open{background-position:-96px -120px;} - .bootstrap .icon-eye-close{background-position:-120px -120px;} - .bootstrap .icon-warning-sign{background-position:-144px -120px;} - .bootstrap .icon-plane{background-position:-168px -120px;} - .bootstrap .icon-calendar{background-position:-192px -120px;} - .bootstrap .icon-random{background-position:-216px -120px;width:16px;} - .bootstrap .icon-comment{background-position:-240px -120px;} - .bootstrap .icon-magnet{background-position:-264px -120px;} - .bootstrap .icon-chevron-up{background-position:-288px -120px;} - .bootstrap .icon-chevron-down{background-position:-313px -119px;} - .bootstrap .icon-retweet{background-position:-336px -120px;} - .bootstrap .icon-shopping-cart{background-position:-360px -120px;} - .bootstrap .icon-folder-close{background-position:-384px -120px;} - .bootstrap .icon-folder-open{background-position:-408px -120px;width:16px;} - .bootstrap .icon-resize-vertical{background-position:-432px -119px;} - .bootstrap .icon-resize-horizontal{background-position:-456px -118px;} - .bootstrap .icon-hdd{background-position:0 -144px;} - .bootstrap .icon-bullhorn{background-position:-24px -144px;} - .bootstrap .icon-bell{background-position:-48px -144px;} - .bootstrap .icon-certificate{background-position:-72px -144px;} - .bootstrap .icon-thumbs-up{background-position:-96px -144px;} - .bootstrap .icon-thumbs-down{background-position:-120px -144px;} - .bootstrap .icon-hand-right{background-position:-144px -144px;} - .bootstrap .icon-hand-left{background-position:-168px -144px;} - .bootstrap .icon-hand-up{background-position:-192px -144px;} - .bootstrap .icon-hand-down{background-position:-216px -144px;} - .bootstrap .icon-circle-arrow-right{background-position:-240px -144px;} - .bootstrap .icon-circle-arrow-left{background-position:-264px -144px;} - .bootstrap .icon-circle-arrow-up{background-position:-288px -144px;} - .bootstrap .icon-circle-arrow-down{background-position:-312px -144px;} - .bootstrap .icon-globe{background-position:-336px -144px;} - .bootstrap .icon-wrench{background-position:-360px -144px;} - .bootstrap .icon-tasks{background-position:-384px -144px;} - .bootstrap .icon-filter{background-position:-408px -144px;} - .bootstrap .icon-briefcase{background-position:-432px -144px;} - .bootstrap .icon-fullscreen{background-position:-456px -144px;} - .bootstrap .btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;} - .bootstrap .btn-group:first-child{*margin-left:0;} - .bootstrap .btn-group+.btn-group{margin-left:5px;} - .bootstrap .btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;} - .bootstrap .btn-toolbar>.btn+.btn,.bootstrap .btn-toolbar>.btn-group+.btn,.bootstrap .btn-toolbar>.btn+.btn-group{margin-left:5px;} - .bootstrap .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .btn-group>.btn+.btn{margin-left:-1px;} - .bootstrap .btn-group>.btn,.bootstrap .btn-group>.dropdown-menu,.bootstrap .btn-group>.popover{font-size:14px;} - .bootstrap .btn-group>.btn-mini{font-size:10.5px;} - .bootstrap .btn-group>.btn-small{font-size:11.9px;} - .bootstrap .btn-group>.btn-large{font-size:17.5px;} - .bootstrap .btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} - .bootstrap .btn-group>.btn:last-child,.bootstrap .btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} - .bootstrap .btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} - .bootstrap .btn-group>.btn.large:last-child,.bootstrap .btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} - .bootstrap .btn-group>.btn:hover,.bootstrap .btn-group>.btn:focus,.bootstrap .btn-group>.btn:active,.bootstrap .btn-group>.btn.active{z-index:2;} - .bootstrap .btn-group .dropdown-toggle:active,.bootstrap .btn-group.open .dropdown-toggle{outline:0;} - .bootstrap .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right: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);*padding-top:5px;*padding-bottom:5px;} - .bootstrap .btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} - .bootstrap .btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} - .bootstrap .btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} - .bootstrap .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);} - .bootstrap .btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} - .bootstrap .btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} - .bootstrap .btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} - .bootstrap .btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} - .bootstrap .btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} - .bootstrap .btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} - .bootstrap .btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} - .bootstrap .btn .caret{margin-top:8px;margin-left:0;} - .bootstrap .btn-mini .caret,.bootstrap .btn-small .caret,.bootstrap .btn-large .caret{margin-top:6px;} - .bootstrap .btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} - .bootstrap .dropup .btn-large .caret{border-bottom-width:5px;} - .bootstrap .btn-primary .caret,.bootstrap .btn-warning .caret,.bootstrap .btn-danger .caret,.bootstrap .btn-info .caret,.bootstrap .btn-success .caret,.bootstrap .btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} - .bootstrap .btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} - .bootstrap .btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;} - .bootstrap .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;} - .bootstrap .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;} - .bootstrap .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;} - .bootstrap .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;} - .bootstrap .nav{margin-left:0;margin-bottom:20px;list-style:none;} - .bootstrap .nav>li>a{display:block;} - .bootstrap .nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} - .bootstrap .nav>li>a>img{max-width:none;} - .bootstrap .nav>.pull-right{float:right;} - .bootstrap .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} - .bootstrap .nav li+.nav-header{margin-top:9px;} - .bootstrap .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} - .bootstrap .nav-list>li>a,.bootstrap .nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} - .bootstrap .nav-list>li>a{padding:3px 15px;} - .bootstrap .nav-list>.active>a,.bootstrap .nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} - .bootstrap .nav-list [class^="icon-"],.bootstrap .nav-list [class*=" icon-"]{margin-right:2px;} - .bootstrap .nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} - .bootstrap .nav-tabs,.bootstrap .nav-pills{*zoom:1;} - .bootstrap .nav-tabs:before,.bootstrap .nav-pills:before,.bootstrap .nav-tabs:after,.bootstrap .nav-pills:after{display:table;content:"";line-height:0;} - .bootstrap .nav-tabs:after,.bootstrap .nav-pills:after{clear:both;} - .bootstrap .nav-tabs>li,.bootstrap .nav-pills>li{float:left;} - .bootstrap .nav-tabs>li>a,.bootstrap .nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} - .bootstrap .nav-tabs{border-bottom:1px solid #ddd;} - .bootstrap .nav-tabs>li{margin-bottom:-1px;} - .bootstrap .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;} - .bootstrap .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} - .bootstrap .nav-tabs>.active>a,.bootstrap .nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} - .bootstrap .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;} - .bootstrap .nav-pills>.active>a,.bootstrap .nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;} - .bootstrap .nav-stacked>li{float:none;} - .bootstrap .nav-stacked>li>a{margin-right:0;} - .bootstrap .nav-tabs.nav-stacked{border-bottom:0;} - .bootstrap .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} - .bootstrap .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} - .bootstrap .nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} - .bootstrap .nav-pills.nav-stacked>li>a{margin-bottom:3px;} - .bootstrap .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} - .bootstrap .nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} - .bootstrap .nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} - .bootstrap .nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} - .bootstrap .nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} - .bootstrap .nav-tabs .dropdown-toggle .caret{margin-top:8px;} - .bootstrap .nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} - .bootstrap .nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} - .bootstrap .nav>.dropdown.active>a:hover{cursor:pointer;} - .bootstrap .nav-tabs .open .dropdown-toggle,.bootstrap .nav-pills .open .dropdown-toggle,.bootstrap .nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} - .bootstrap .nav li.dropdown.open .caret,.bootstrap .nav li.dropdown.open.active .caret,.bootstrap .nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} - .bootstrap .tabs-stacked .open>a:hover{border-color:#999999;} - .bootstrap .tabbable{*zoom:1;} - .bootstrap .tabbable:before,.bootstrap .tabbable:after{display:table;content:"";line-height:0;} - .bootstrap .tabbable:after{clear:both;} - .bootstrap .tab-content{overflow:auto;} - .bootstrap .tabs-below>.nav-tabs,.bootstrap .tabs-right>.nav-tabs,.bootstrap .tabs-left>.nav-tabs{border-bottom:0;} - .bootstrap .tab-content>.tab-pane,.bootstrap .pill-content>.pill-pane{display:none;} - .bootstrap .tab-content>.active,.bootstrap .pill-content>.active{display:block;} - .bootstrap .tabs-below>.nav-tabs{border-top:1px solid #ddd;} - .bootstrap .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} - .bootstrap .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;} - .bootstrap .tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} - .bootstrap .tabs-below>.nav-tabs>.active>a,.bootstrap .tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;} - .bootstrap .tabs-left>.nav-tabs>li,.bootstrap .tabs-right>.nav-tabs>li{float:none;} - .bootstrap .tabs-left>.nav-tabs>li>a,.bootstrap .tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} - .bootstrap .tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} - .bootstrap .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;} - .bootstrap .tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} - .bootstrap .tabs-left>.nav-tabs .active>a,.bootstrap .tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} - .bootstrap .tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} - .bootstrap .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;} - .bootstrap .tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} - .bootstrap .tabs-right>.nav-tabs .active>a,.bootstrap .tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} - .bootstrap .nav>.disabled>a{color:#999999;} - .bootstrap .nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;} - .bootstrap .navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;} - .bootstrap .navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-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);*zoom:1;} - .bootstrap .navbar-inner:before,.bootstrap .navbar-inner:after{display:table;content:"";line-height:0;} - .bootstrap .navbar-inner:after{clear:both;} - .bootstrap .navbar .container{width:auto;} - .bootstrap .nav-collapse.collapse{height:auto;overflow:visible;} - .bootstrap .navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;} - .bootstrap .navbar .brand:hover{text-decoration:none;} - .bootstrap .navbar-text{margin-bottom:0;line-height:40px;color:#777777;} - .bootstrap .navbar-link{color:#777777;} - .bootstrap .navbar-link:hover{color:#333333;} - .bootstrap .navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} - .bootstrap .navbar .btn,.bootstrap .navbar .btn-group{margin-top:5px;} - .bootstrap .navbar .btn-group .btn,.bootstrap .navbar .input-prepend .btn,.bootstrap .navbar .input-append .btn{margin-top:0;} - .bootstrap .navbar-form{margin-bottom:0;*zoom:1;} - .bootstrap .navbar-form:before,.bootstrap .navbar-form:after{display:table;content:"";line-height:0;} - .bootstrap .navbar-form:after{clear:both;} - .bootstrap .navbar-form input,.bootstrap .navbar-form select,.bootstrap .navbar-form .radio,.bootstrap .navbar-form .checkbox{margin-top:5px;} - .bootstrap .navbar-form input,.bootstrap .navbar-form select,.bootstrap .navbar-form .btn{display:inline-block;margin-bottom:0;} - .bootstrap .navbar-form input[type="image"],.bootstrap .navbar-form input[type="checkbox"],.bootstrap .navbar-form input[type="radio"]{margin-top:3px;} - .bootstrap .navbar-form .input-append,.bootstrap .navbar-form .input-prepend{margin-top:5px;white-space:nowrap;} - .bootstrap .navbar-form .input-append input,.bootstrap .navbar-form .input-prepend input{margin-top:0;} - .bootstrap .navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;} - .bootstrap .navbar-search .search-query{margin-bottom:0;padding:4px 14px;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;} - .bootstrap .navbar-static-top{position:static;margin-bottom:0;} - .bootstrap .navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .navbar-fixed-top,.bootstrap .navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} - .bootstrap .navbar-fixed-top .navbar-inner,.bootstrap .navbar-static-top .navbar-inner{border-width:0 0 1px;} - .bootstrap .navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} - .bootstrap .navbar-fixed-top .navbar-inner,.bootstrap .navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} - .bootstrap .navbar-static-top .container,.bootstrap .navbar-fixed-top .container,.bootstrap .navbar-fixed-bottom .container{width:940px;} - .bootstrap .navbar-fixed-top{top:0;} - .bootstrap .navbar-fixed-top .navbar-inner,.bootstrap .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);} - .bootstrap .navbar-fixed-bottom{bottom:0;} - .bootstrap .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);} - .bootstrap .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} - .bootstrap .navbar .nav.pull-right{float:right;margin-right:0;} - .bootstrap .navbar .nav>li{float:left;} - .bootstrap .navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} - .bootstrap .navbar .nav .dropdown-toggle .caret{margin-top:8px;} - .bootstrap .navbar .nav>li>a:focus,.bootstrap .navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} - .bootstrap .navbar .nav>.active>a,.bootstrap .navbar .nav>.active>a:hover,.bootstrap .navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} - .bootstrap .navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;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;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);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);*background-color:#e5e5e5;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);} - .bootstrap .navbar .btn-navbar:hover,.bootstrap .navbar .btn-navbar:active,.bootstrap .navbar .btn-navbar.active,.bootstrap .navbar .btn-navbar.disabled,.bootstrap .navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} - .bootstrap .navbar .btn-navbar:active,.bootstrap .navbar .btn-navbar.active{background-color:#cccccc \9;} - .bootstrap .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);} - .bootstrap .btn-navbar .icon-bar+.icon-bar{margin-top:3px;} - .bootstrap .navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} - .bootstrap .navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} - .bootstrap .navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} - .bootstrap .navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} - .bootstrap .navbar .nav li.dropdown>a:hover .caret{border-top-color:#555555;border-bottom-color:#555555;} - .bootstrap .navbar .nav li.dropdown.open>.dropdown-toggle,.bootstrap .navbar .nav li.dropdown.active>.dropdown-toggle,.bootstrap .navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} - .bootstrap .navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} - .bootstrap .navbar .nav li.dropdown.open>.dropdown-toggle .caret,.bootstrap .navbar .nav li.dropdown.active>.dropdown-toggle .caret,.bootstrap .navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} - .bootstrap .navbar .pull-right>li>.dropdown-menu,.bootstrap .navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;} - .bootstrap .navbar .pull-right>li>.dropdown-menu:before,.bootstrap .navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} - .bootstrap .navbar .pull-right>li>.dropdown-menu:after,.bootstrap .navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} - .bootstrap .navbar .pull-right>li>.dropdown-menu .dropdown-menu,.bootstrap .navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} - .bootstrap .navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;} - .bootstrap .navbar-inverse .brand,.bootstrap .navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} - .bootstrap .navbar-inverse .brand:hover,.bootstrap .navbar-inverse .nav>li>a:hover{color:#ffffff;} - .bootstrap .navbar-inverse .brand{color:#999999;} - .bootstrap .navbar-inverse .navbar-text{color:#999999;} - .bootstrap .navbar-inverse .nav>li>a:focus,.bootstrap .navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} - .bootstrap .navbar-inverse .nav .active>a,.bootstrap .navbar-inverse .nav .active>a:hover,.bootstrap .navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} - .bootstrap .navbar-inverse .navbar-link{color:#999999;} - .bootstrap .navbar-inverse .navbar-link:hover{color:#ffffff;} - .bootstrap .navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} - .bootstrap .navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.bootstrap .navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.bootstrap .navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} - .bootstrap .navbar-inverse .nav li.dropdown>a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} - .bootstrap .navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} - .bootstrap .navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.bootstrap .navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.bootstrap .navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} - .bootstrap .navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0 rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0 rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0 rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;} - .bootstrap .navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} - .bootstrap .navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} - .bootstrap .navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} - .bootstrap .navbar-inverse .navbar-search .search-query:focus,.bootstrap .navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border: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);outline:0;} - .bootstrap .navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;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;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);} - .bootstrap .navbar-inverse .btn-navbar:hover,.bootstrap .navbar-inverse .btn-navbar:active,.bootstrap .navbar-inverse .btn-navbar.active,.bootstrap .navbar-inverse .btn-navbar.disabled,.bootstrap .navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} - .bootstrap .navbar-inverse .btn-navbar:active,.bootstrap .navbar-inverse .btn-navbar.active{background-color:#000000 \9;} - .bootstrap .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;} - .bootstrap .breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;} - .bootstrap .breadcrumb>li>.divider{padding:0 5px;color:#ccc;} - .bootstrap .breadcrumb>.active{color:#999999;} - .bootstrap .pagination{margin:20px 0;} - .bootstrap .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-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);} - .bootstrap .pagination ul>li{display:inline;} - .bootstrap .pagination ul>li>a,.bootstrap .pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} - .bootstrap .pagination ul>li>a:hover,.bootstrap .pagination ul>.active>a,.bootstrap .pagination ul>.active>span{background-color:#f5f5f5;} - .bootstrap .pagination ul>.active>a,.bootstrap .pagination ul>.active>span{color:#999999;cursor:default;} - .bootstrap .pagination ul>.disabled>span,.bootstrap .pagination ul>.disabled>a,.bootstrap .pagination ul>.disabled>a:hover{color:#999999;background-color:transparent;cursor:default;} - .bootstrap .pagination ul>li:first-child>a,.bootstrap .pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} - .bootstrap .pagination ul>li:last-child>a,.bootstrap .pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} - .bootstrap .pagination-centered{text-align:center;} - .bootstrap .pagination-right{text-align:right;} - .bootstrap .pagination-large ul>li>a,.bootstrap .pagination-large ul>li>span{padding:11px 19px;font-size:17.5px;} - .bootstrap .pagination-large ul>li:first-child>a,.bootstrap .pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} - .bootstrap .pagination-large ul>li:last-child>a,.bootstrap .pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} - .bootstrap .pagination-mini ul>li:first-child>a,.bootstrap .pagination-small ul>li:first-child>a,.bootstrap .pagination-mini ul>li:first-child>span,.bootstrap .pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;} - .bootstrap .pagination-mini ul>li:last-child>a,.bootstrap .pagination-small ul>li:last-child>a,.bootstrap .pagination-mini ul>li:last-child>span,.bootstrap .pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;} - .bootstrap .pagination-small ul>li>a,.bootstrap .pagination-small ul>li>span{padding:2px 10px;font-size:11.9px;} - .bootstrap .pagination-mini ul>li>a,.bootstrap .pagination-mini ul>li>span{padding:0 6px;font-size:10.5px;} - .bootstrap .pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;} - .bootstrap .pager:before,.bootstrap .pager:after{display:table;content:"";line-height:0;} - .bootstrap .pager:after{clear:both;} - .bootstrap .pager li{display:inline;} - .bootstrap .pager li>a,.bootstrap .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;} - .bootstrap .pager li>a:hover{text-decoration:none;background-color:#f5f5f5;} - .bootstrap .pager .next>a,.bootstrap .pager .next>span{float:right;} - .bootstrap .pager .previous>a,.bootstrap .pager .previous>span{float:left;} - .bootstrap .pager .disabled>a,.bootstrap .pager .disabled>a:hover,.bootstrap .pager .disabled>span{color:#999999;background-color:#fff;cursor:default;} - .bootstrap .thumbnails{margin-left:-20px;list-style:none;*zoom:1;} - .bootstrap .thumbnails:before,.bootstrap .thumbnails:after{display:table;content:"";line-height:0;} - .bootstrap .thumbnails:after{clear:both;} - .bootstrap .row-fluid .thumbnails{margin-left:0;} - .bootstrap .thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} - .bootstrap .thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} - .bootstrap a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} - .bootstrap .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} - .bootstrap .thumbnail .caption{padding:9px;color:#555555;} - .bootstrap .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;} - .bootstrap .alert,.bootstrap .alert h4{color:#c09853;} - .bootstrap .alert h4{margin:0;} - .bootstrap .alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} - .bootstrap .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} - .bootstrap .alert-success h4{color:#468847;} - .bootstrap .alert-danger,.bootstrap .alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} - .bootstrap .alert-danger h4,.bootstrap .alert-error h4{color:#b94a48;} - .bootstrap .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} - .bootstrap .alert-info h4{color:#3a87ad;} - .bootstrap .alert-block{padding-top:14px;padding-bottom:14px;} - .bootstrap .alert-block>p,.bootstrap .alert-block>ul{margin-bottom:0;} - .bootstrap .alert-block p+p{margin-top:5px;} - @-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;}}.bootstrap .progress{overflow:hidden;height:20px;margin-bottom:20px;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;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);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} - .bootstrap .progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} - .bootstrap .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);} - .bootstrap .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;} - .bootstrap .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;} - .bootstrap .progress-danger .bar,.bootstrap .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);} - .bootstrap .progress-danger.progress-striped .bar,.bootstrap .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);} - .bootstrap .progress-success .bar,.bootstrap .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);} - .bootstrap .progress-success.progress-striped .bar,.bootstrap .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);} - .bootstrap .progress-info .bar,.bootstrap .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);} - .bootstrap .progress-info.progress-striped .bar,.bootstrap .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);} - .bootstrap .progress-warning .bar,.bootstrap .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);} - .bootstrap .progress-warning.progress-striped .bar,.bootstrap .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);} - .bootstrap .hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} - .bootstrap .hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} - .bootstrap .hero-unit li{line-height:30px;} - .bootstrap .media,.bootstrap .media-body{overflow:hidden;*overflow:visible;zoom:1;} - .bootstrap .media,.bootstrap .media .media{margin-top:15px;} - .bootstrap .media:first-child{margin-top:0;} - .bootstrap .media-object{display:block;} - .bootstrap .media-heading{margin:0 0 5px;} - .bootstrap .media .pull-left{margin-right:10px;} - .bootstrap .media .pull-right{margin-left:10px;} - .bootstrap .media-list{margin-left:0;list-style:none;} - .bootstrap .tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);} - .bootstrap .tooltip.in{opacity:0.8;filter:alpha(opacity=80);} - .bootstrap .tooltip.top{margin-top:-3px;} - .bootstrap .tooltip.right{margin-left:3px;} - .bootstrap .tooltip.bottom{margin-top:3px;} - .bootstrap .tooltip.left{margin-left:-3px;} - .bootstrap .tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} - .bootstrap .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;} - .bootstrap .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;} - .bootstrap .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;} - .bootstrap .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;} - .bootstrap .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;} - .bootstrap .popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;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);white-space:normal;} - .bootstrap .popover.top{margin-top:-10px;} - .bootstrap .popover.right{margin-left:10px;} - .bootstrap .popover.bottom{margin-top:10px;} - .bootstrap .popover.left{margin-left:-10px;} - .bootstrap .popover-title{margin:0;padding:8px 14px;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;} - .bootstrap .popover-content{padding:9px 14px;} - .bootstrap .popover .arrow,.bootstrap .popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;} - .bootstrap .popover .arrow{border-width:11px;} - .bootstrap .popover .arrow:after{border-width:10px;content:"";} - .bootstrap .popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0, 0, 0, 0.25);bottom:-11px;} - .bootstrap .popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff;} - .bootstrap .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0, 0, 0, 0.25);} - .bootstrap .popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff;} - .bootstrap .popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0, 0, 0, 0.25);top:-11px;} - .bootstrap .popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff;} - .bootstrap .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0, 0, 0, 0.25);} - .bootstrap .popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px;} - .bootstrap .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;} - .bootstrap .modal-backdrop.fade{opacity:0;} - .bootstrap .modal-backdrop,.bootstrap .modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} - .bootstrap .modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-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;outline:none;} - .bootstrap .modal.fade{-webkit-transition:opacity 0.3s linear,top 0.3s ease-out;-moz-transition:opacity 0.3s linear,top 0.3s ease-out;-o-transition:opacity 0.3s linear,top 0.3s ease-out;transition:opacity 0.3s linear,top 0.3s ease-out;top:-25%;} - .bootstrap .modal.fade.in{top:10%;} - .bootstrap .modal-header{padding:9px 15px;border-bottom:1px solid #eee;} - .bootstrap .modal-header .close{margin-top:2px;} - .bootstrap .modal-header h3{margin:0;line-height:30px;} - .bootstrap .modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px;} - .bootstrap .modal-form{margin-bottom:0;} - .bootstrap .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;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;} - .bootstrap .modal-footer:before,.bootstrap .modal-footer:after{display:table;content:"";line-height:0;} - .bootstrap .modal-footer:after{clear:both;} - .bootstrap .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} - .bootstrap .modal-footer .btn-group .btn+.btn{margin-left:-1px;} - .bootstrap .modal-footer .btn-block+.btn-block{margin-left:0;} - .bootstrap .dropup,.bootstrap .dropdown{position:relative;} - .bootstrap .dropdown-toggle{*margin-bottom:-3px;} - .bootstrap .dropdown-toggle:active,.bootstrap .open .dropdown-toggle{outline:0;} - .bootstrap .caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";} - .bootstrap .dropdown .caret{margin-top:8px;margin-left:2px;} - .bootstrap .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;} - .bootstrap .dropdown-menu.pull-right{right:0;left:auto;} - .bootstrap .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} - .bootstrap .dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;} - .bootstrap .dropdown-menu li>a:hover,.bootstrap .dropdown-menu li>a:focus,.bootstrap .dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} - .bootstrap .dropdown-menu .active>a,.bootstrap .dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} - .bootstrap .dropdown-menu .disabled>a,.bootstrap .dropdown-menu .disabled>a:hover{color:#999999;} - .bootstrap .dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:default;} - .bootstrap .open{*z-index:1000;} - .bootstrap .open>.dropdown-menu{display:block;} - .bootstrap .pull-right>.dropdown-menu{right:0;left:auto;} - .bootstrap .dropup .caret,.bootstrap .navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";} - .bootstrap .dropup .dropdown-menu,.bootstrap .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} - .bootstrap .dropdown-submenu{position:relative;} - .bootstrap .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;} - .bootstrap .dropdown-submenu:hover>.dropdown-menu{display:block;} - .bootstrap .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;} - .bootstrap .dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} - .bootstrap .dropdown-submenu:hover>a:after{border-left-color:#ffffff;} - .bootstrap .dropdown-submenu.pull-left{float:none;} - .bootstrap .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;} - .bootstrap .dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;} - .bootstrap .typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} - .bootstrap .accordion{margin-bottom:20px;} - .bootstrap .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} - .bootstrap .accordion-heading{border-bottom:0;} - .bootstrap .accordion-heading .accordion-toggle{display:block;padding:8px 15px;} - .bootstrap .accordion-toggle{cursor:pointer;} - .bootstrap .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} - .bootstrap .carousel{position:relative;margin-bottom:20px;line-height:1;} - .bootstrap .carousel-inner{overflow:hidden;width:100%;position:relative;} - .bootstrap .carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} - .bootstrap .carousel-inner>.item>img{display:block;line-height:1;} - .bootstrap .carousel-inner>.active,.bootstrap .carousel-inner>.next,.bootstrap .carousel-inner>.prev{display:block;} - .bootstrap .carousel-inner>.active{left:0;} - .bootstrap .carousel-inner>.next,.bootstrap .carousel-inner>.prev{position:absolute;top:0;width:100%;} - .bootstrap .carousel-inner>.next{left:100%;} - .bootstrap .carousel-inner>.prev{left:-100%;} - .bootstrap .carousel-inner>.next.left,.bootstrap .carousel-inner>.prev.right{left:0;} - .bootstrap .carousel-inner>.active.left{left:-100%;} - .bootstrap .carousel-inner>.active.right{left:100%;} - .bootstrap .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);} - .bootstrap .carousel-control.right{left:auto;right:15px;} - .bootstrap .carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} - .bootstrap .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);} - .bootstrap .carousel-caption h4,.bootstrap .carousel-caption p{color:#ffffff;line-height:20px;} - .bootstrap .carousel-caption h4{margin:0 0 5px;} - .bootstrap .carousel-caption p{margin-bottom:0;} - .bootstrap .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);} - .bootstrap .well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} - .bootstrap .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} - .bootstrap .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} - .bootstrap .close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);} - .bootstrap .close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} - .bootstrap button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} - .bootstrap .pull-right{float:right;} - .bootstrap .pull-left{float:left;} - .bootstrap .hide{display:none;} - .bootstrap .show{display:block;} - .bootstrap .invisible{visibility:hidden;} - .bootstrap .affix{position:fixed;} - .bootstrap .fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;} - .bootstrap .fade.in{opacity:1;} - .bootstrap .collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;} - .bootstrap .collapse.in{height:auto;} - .bootstrap .hidden{display:none;visibility:hidden;} - .bootstrap .visible-phone{display:none !important;} - .bootstrap .visible-tablet{display:none !important;} - .bootstrap .hidden-desktop{display:none !important;} - .bootstrap .visible-desktop{display:inherit !important;} - @media (min-width:768px) and (max-width:979px){.bootstrap .hidden-desktop{display:inherit !important;} .bootstrap .visible-desktop{display:none !important ;} .bootstrap .visible-tablet{display:inherit !important;} .bootstrap .hidden-tablet{display:none !important;}}@media (max-width:767px){.bootstrap .hidden-desktop{display:inherit !important;} .bootstrap .visible-desktop{display:none !important;} .bootstrap .visible-phone{display:inherit !important;} .bootstrap .hidden-phone{display:none !important;}}@media (max-width:767px){body .bootstrap{padding-left:20px;padding-right:20px;} .bootstrap .navbar-fixed-top,.bootstrap .navbar-fixed-bottom,.bootstrap .navbar-static-top{margin-left:-20px;margin-right:-20px;} .bootstrap .container-fluid{padding:0;} .bootstrap .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .bootstrap .dl-horizontal dd{margin-left:0;} .bootstrap .container{width:auto;} .bootstrap .row-fluid{width:100%;} .bootstrap .row,.bootstrap .thumbnails{margin-left:0;} .bootstrap .thumbnails>li{float:none;margin-left:0;} .bootstrap [class*="span"],.bootstrap .uneditable-input[class*="span"],.bootstrap .row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .bootstrap .span12,.bootstrap .row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .bootstrap .row-fluid [class*="offset"]:first-child{margin-left:0;} .bootstrap .input-large,.bootstrap .input-xlarge,.bootstrap .input-xxlarge,.bootstrap input[class*="span"],.bootstrap select[class*="span"],.bootstrap textarea[class*="span"],.bootstrap .uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .bootstrap .input-prepend input,.bootstrap .input-append input,.bootstrap .input-prepend input[class*="span"],.bootstrap .input-append input[class*="span"]{display:inline-block;width:auto;} .bootstrap .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .bootstrap .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;} .bootstrap .modal.fade{top:-100px;} .bootstrap .modal.fade.in{top:20px;}}@media (max-width:480px){.bootstrap .nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .bootstrap .page-header h1 small{display:block;line-height:20px;} .bootstrap input[type="checkbox"],.bootstrap input[type="radio"]{border:1px solid #ccc;} .bootstrap .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .bootstrap .form-horizontal .controls{margin-left:0;} .bootstrap .form-horizontal .control-list{padding-top:0;} .bootstrap .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .bootstrap .media .pull-left,.bootstrap .media .pull-right{float:none;display:block;margin-bottom:10px;} .bootstrap .media-object{margin-right:0;margin-left:0;} .bootstrap .modal{top:10px;left:10px;right:10px;} .bootstrap .modal-header .close{padding:10px;margin:-10px;} .bootstrap .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.bootstrap .row{margin-left:-20px;*zoom:1;} .bootstrap .row:before,.bootstrap .row:after{display:table;content:"";line-height:0;} .bootstrap .row:after{clear:both;} .bootstrap [class*="span"]{float:left;min-height:1px;margin-left:20px;} .bootstrap .container,.bootstrap .navbar-static-top .container,.bootstrap .navbar-fixed-top .container,.bootstrap .navbar-fixed-bottom .container{width:724px;} .bootstrap .span12{width:724px;} .bootstrap .span11{width:662px;} .bootstrap .span10{width:600px;} .bootstrap .span9{width:538px;} .bootstrap .span8{width:476px;} .bootstrap .span7{width:414px;} .bootstrap .span6{width:352px;} .bootstrap .span5{width:290px;} .bootstrap .span4{width:228px;} .bootstrap .span3{width:166px;} .bootstrap .span2{width:104px;} .bootstrap .span1{width:42px;} .bootstrap .offset12{margin-left:764px;} .bootstrap .offset11{margin-left:702px;} .bootstrap .offset10{margin-left:640px;} .bootstrap .offset9{margin-left:578px;} .bootstrap .offset8{margin-left:516px;} .bootstrap .offset7{margin-left:454px;} .bootstrap .offset6{margin-left:392px;} .bootstrap .offset5{margin-left:330px;} .bootstrap .offset4{margin-left:268px;} .bootstrap .offset3{margin-left:206px;} .bootstrap .offset2{margin-left:144px;} .bootstrap .offset1{margin-left:82px;} .bootstrap .row-fluid{width:100%;*zoom:1;} .bootstrap .row-fluid:before,.bootstrap .row-fluid:after{display:table;content:"";line-height:0;} .bootstrap .row-fluid:after{clear:both;} .bootstrap .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .bootstrap .row-fluid [class*="span"]:first-child{margin-left:0;} .bootstrap .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .bootstrap .row-fluid .span12{width:100%;*width:99.94680851063829%;} .bootstrap .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .bootstrap .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .bootstrap .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .bootstrap .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .bootstrap .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .bootstrap .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .bootstrap .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .bootstrap .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .bootstrap .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .bootstrap .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .bootstrap .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .bootstrap .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .bootstrap .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .bootstrap .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .bootstrap .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .bootstrap .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .bootstrap .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .bootstrap .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .bootstrap .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .bootstrap .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .bootstrap .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .bootstrap .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .bootstrap .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .bootstrap .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .bootstrap .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .bootstrap .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .bootstrap .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .bootstrap .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .bootstrap .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .bootstrap .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .bootstrap .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .bootstrap .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .bootstrap .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .bootstrap .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .bootstrap .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} .bootstrap input,.bootstrap textarea,.bootstrap .uneditable-input{margin-left:0;} .bootstrap .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} .bootstrap input.span12,.bootstrap textarea.span12,.bootstrap .uneditable-input.span12{width:710px;} .bootstrap input.span11,.bootstrap textarea.span11,.bootstrap .uneditable-input.span11{width:648px;} .bootstrap input.span10,.bootstrap textarea.span10,.bootstrap .uneditable-input.span10{width:586px;} .bootstrap input.span9,.bootstrap textarea.span9,.bootstrap .uneditable-input.span9{width:524px;} .bootstrap input.span8,.bootstrap textarea.span8,.bootstrap .uneditable-input.span8{width:462px;} .bootstrap input.span7,.bootstrap textarea.span7,.bootstrap .uneditable-input.span7{width:400px;} .bootstrap input.span6,.bootstrap textarea.span6,.bootstrap .uneditable-input.span6{width:338px;} .bootstrap input.span5,.bootstrap textarea.span5,.bootstrap .uneditable-input.span5{width:276px;} .bootstrap input.span4,.bootstrap textarea.span4,.bootstrap .uneditable-input.span4{width:214px;} .bootstrap input.span3,.bootstrap textarea.span3,.bootstrap .uneditable-input.span3{width:152px;} .bootstrap input.span2,.bootstrap textarea.span2,.bootstrap .uneditable-input.span2{width:90px;} .bootstrap input.span1,.bootstrap textarea.span1,.bootstrap .uneditable-input.span1{width:28px;}}@media (min-width:1200px){.bootstrap .row{margin-left:-30px;*zoom:1;} .bootstrap .row:before,.bootstrap .row:after{display:table;content:"";line-height:0;} .bootstrap .row:after{clear:both;} .bootstrap [class*="span"]{float:left;min-height:1px;margin-left:30px;} .bootstrap .container,.bootstrap .navbar-static-top .container,.bootstrap .navbar-fixed-top .container,.bootstrap .navbar-fixed-bottom .container{width:1170px;} .bootstrap .span12{width:1170px;} .bootstrap .span11{width:1070px;} .bootstrap .span10{width:970px;} .bootstrap .span9{width:870px;} .bootstrap .span8{width:770px;} .bootstrap .span7{width:670px;} .bootstrap .span6{width:570px;} .bootstrap .span5{width:470px;} .bootstrap .span4{width:370px;} .bootstrap .span3{width:270px;} .bootstrap .span2{width:170px;} .bootstrap .span1{width:70px;} .bootstrap .offset12{margin-left:1230px;} .bootstrap .offset11{margin-left:1130px;} .bootstrap .offset10{margin-left:1030px;} .bootstrap .offset9{margin-left:930px;} .bootstrap .offset8{margin-left:830px;} .bootstrap .offset7{margin-left:730px;} .bootstrap .offset6{margin-left:630px;} .bootstrap .offset5{margin-left:530px;} .bootstrap .offset4{margin-left:430px;} .bootstrap .offset3{margin-left:330px;} .bootstrap .offset2{margin-left:230px;} .bootstrap .offset1{margin-left:130px;} .bootstrap .row-fluid{width:100%;*zoom:1;} .bootstrap .row-fluid:before,.bootstrap .row-fluid:after{display:table;content:"";line-height:0;} .bootstrap .row-fluid:after{clear:both;} .bootstrap .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .bootstrap .row-fluid [class*="span"]:first-child{margin-left:0;} .bootstrap .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .bootstrap .row-fluid .span12{width:100%;*width:99.94680851063829%;} .bootstrap .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .bootstrap .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .bootstrap .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .bootstrap .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .bootstrap .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .bootstrap .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .bootstrap .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .bootstrap .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .bootstrap .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .bootstrap .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .bootstrap .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .bootstrap .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .bootstrap .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .bootstrap .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .bootstrap .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .bootstrap .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .bootstrap .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .bootstrap .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .bootstrap .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .bootstrap .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .bootstrap .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .bootstrap .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .bootstrap .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .bootstrap .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .bootstrap .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .bootstrap .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .bootstrap .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .bootstrap .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .bootstrap .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .bootstrap .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .bootstrap .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .bootstrap .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .bootstrap .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .bootstrap .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .bootstrap .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} .bootstrap input,.bootstrap textarea,.bootstrap .uneditable-input{margin-left:0;} .bootstrap .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} .bootstrap input.span12,.bootstrap textarea.span12,.bootstrap .uneditable-input.span12{width:1156px;} .bootstrap input.span11,.bootstrap textarea.span11,.bootstrap .uneditable-input.span11{width:1056px;} .bootstrap input.span10,.bootstrap textarea.span10,.bootstrap .uneditable-input.span10{width:956px;} .bootstrap input.span9,.bootstrap textarea.span9,.bootstrap .uneditable-input.span9{width:856px;} .bootstrap input.span8,.bootstrap textarea.span8,.bootstrap .uneditable-input.span8{width:756px;} .bootstrap input.span7,.bootstrap textarea.span7,.bootstrap .uneditable-input.span7{width:656px;} .bootstrap input.span6,.bootstrap textarea.span6,.bootstrap .uneditable-input.span6{width:556px;} .bootstrap input.span5,.bootstrap textarea.span5,.bootstrap .uneditable-input.span5{width:456px;} .bootstrap input.span4,.bootstrap textarea.span4,.bootstrap .uneditable-input.span4{width:356px;} .bootstrap input.span3,.bootstrap textarea.span3,.bootstrap .uneditable-input.span3{width:256px;} .bootstrap input.span2,.bootstrap textarea.span2,.bootstrap .uneditable-input.span2{width:156px;} .bootstrap input.span1,.bootstrap textarea.span1,.bootstrap .uneditable-input.span1{width:56px;} .bootstrap .thumbnails{margin-left:-30px;} .bootstrap .thumbnails>li{margin-left:30px;} .bootstrap .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body .bootstrap{padding-top:0;} .bootstrap .navbar-fixed-top,.bootstrap .navbar-fixed-bottom{position:static;} .bootstrap .navbar-fixed-top{margin-bottom:20px;} .bootstrap .navbar-fixed-bottom{margin-top:20px;} .bootstrap .navbar-fixed-top .navbar-inner,.bootstrap .navbar-fixed-bottom .navbar-inner{padding:5px;} .bootstrap .navbar .container{width:auto;padding:0;} .bootstrap .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .bootstrap .nav-collapse{clear:both;} .bootstrap .nav-collapse .nav{float:none;margin:0 0 10px;} .bootstrap .nav-collapse .nav>li{float:none;} .bootstrap .nav-collapse .nav>li>a{margin-bottom:2px;} .bootstrap .nav-collapse .nav>.divider-vertical{display:none;} .bootstrap .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .bootstrap .nav-collapse .nav>li>a,.bootstrap .nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .bootstrap .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .bootstrap .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .bootstrap .nav-collapse .nav>li>a:hover,.bootstrap .nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2;} .bootstrap .navbar-inverse .nav-collapse .nav>li>a,.bootstrap .navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .bootstrap .navbar-inverse .nav-collapse .nav>li>a:hover,.bootstrap .navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111111;} .bootstrap .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .bootstrap .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .bootstrap .nav-collapse .open>.dropdown-menu{display:block;} .bootstrap .nav-collapse .dropdown-menu:before,.bootstrap .nav-collapse .dropdown-menu:after{display:none;} .bootstrap .nav-collapse .dropdown-menu .divider{display:none;} .bootstrap .nav-collapse .nav>li>.dropdown-menu:before,.bootstrap .nav-collapse .nav>li>.dropdown-menu:after{display:none;} .bootstrap .nav-collapse .navbar-form,.bootstrap .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);} .bootstrap .navbar-inverse .nav-collapse .navbar-form,.bootstrap .navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .bootstrap .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .bootstrap .nav-collapse,.bootstrap .nav-collapse.collapse{overflow:hidden;height:0;} .bootstrap .navbar .btn-navbar{display:block;} .bootstrap .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.bootstrap .nav-collapse.collapse{height:auto !important;overflow:visible !important;}} diff --git a/lib/modules/migration/css/migration_assistant.css b/lib/modules/migration/css/migration_assistant.css deleted file mode 100644 index 03c791fd5..000000000 --- a/lib/modules/migration/css/migration_assistant.css +++ /dev/null @@ -1,67 +0,0 @@ -#podlove_welcome { - position: relative; - height: 210px; - width: 98%; - background: #1a1a19 url(../../../../images/podlove_header.jpg) top left no-repeat; - background-size: auto 100%; - - font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; - color: #E7E7E7; - font-size: 14px; - font-weight: 300; - - margin-top: 15px; - padding-top: 15px; - padding-right: 10px; - padding-left: 185px; - box-sizing: border-box; - - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -#podlove_welcome .dismiss { - position: absolute; - bottom: 15px; - right: 15px; -} - -#podlove_welcome a { - color: #9BA7B5; - text-decoration: none; - line-height: 20px; -} - -#podlove_welcome a:visited { - color: #9BA7B5; -} - -#podlove_welcome h3 { - line-height: 22px; - font-size: 1.6em; - margin: 10px 0px; - text-rendering: optimizelegibility; -} - -#podlove_welcome p { - font-size: 1.3em; - line-height: 20px; - margin: 0 0 10px 0; -} - -.bootstrap.wrap { - margin-right: 15px; - background: transparent; -} - -.bootstrap.wrap h2 .tooltip { - text-shadow: none; - white-space: normal; - line-height: 20px; - width: 200px; -} - -.bootstrap #migration_header { - text-align: center; -} diff --git a/lib/modules/migration/enclosure.php b/lib/modules/migration/enclosure.php deleted file mode 100644 index 2fa9068ac..000000000 --- a/lib/modules/migration/enclosure.php +++ /dev/null @@ -1,188 +0,0 @@ -file_type && !in_array($enclosure->file_type->id, $file_types_for_this_episode)) { - $file_types_for_this_episode[] = $enclosure->file_type->id; - } - - $enclosures[] = $enclosure; - } - - // process podPress files - $podPress_enclosures = get_post_meta($post_id, '_podPressMedia', false); - if (is_array($podPress_enclosures) && !empty($podPress_enclosures)) { - foreach ($podPress_enclosures[0] as $file) { - $enclosure = Enclosure::from_enclosure_podPress($file, $post_id); - - if (in_array($enclosure->file_type->id, $file_types_for_this_episode)) { - continue; - } - - $file_types_for_this_episode[] = $enclosure->file_type->id; - $enclosures[] = $enclosure; - } - } - - // if ( isset( $args['only_valid'] ) && $args['only_valid'] ) { - // foreach ( $enclosures as $enclosure ) { - // if ( $enclosure->errors ) { - // // unset( current( $enclosure ) ); - // } - // } - // } - - return $enclosures; - } - - /** - * Takes a WordPress enclosure data blob and wraps it in a convenient API. - * - * @param string $url - * @param int $post_id - * @param mixed $enclosure_meta - * - * @return Enclosure - */ - public static function from_enclosure_meta($enclosure_meta, $post_id = null) - { - $enclosure = new self(); - - $enc_data = explode("\n", $enclosure_meta); - $mime_data = preg_split('/[ \t]/', trim($enc_data[2])); - $extra_data = (isset($enc_data[3])) ? unserialize($enc_data[3]) : []; - - if (is_array($extra_data) && array_key_exists('duration', $extra_data)) { - $duration = new Duration($extra_data['duration']); - $enclosure->duration = $duration->get(); - } - - $enclosure->post_id = $post_id; - $enclosure->url = trim($enc_data[0]); - $enclosure->content_length = trim($enc_data[1]); - $enclosure->mime_type = trim($mime_data[0]); - $enclosure->file_type = Model\FileType::find_one_by_mime_type($enclosure->mime_type); - - $enclosure->extension = pathinfo($enclosure->url, PATHINFO_EXTENSION); - - if (!$enclosure->file_type) { - $enclosure->errors[] = sprintf( - __('Unknown mime type "%s" in post %s If you want to migrate files with this mime type, you need to create your own %sfile type%s', 'podlove-podcasting-plugin-for-wordpress'), - $enclosure->mime_type, - sprintf('%s', get_edit_post_link($enclosure->post_id), get_the_title($enclosure->post_id)), - '', - '' - ); - - return $enclosure; - } - - return $enclosure; - } - - public static function from_enclosure_podPress($file, $post_id = null) - { - $mime_type = str_replace( - ['audio_mp3', 'audio_m4a', '_'], - ['audio/mpeg', 'audio/mp4', '/'], - $file['type'] - ); - - $enclosure = new self(); - - $enclosure->post_id = $post_id; - $enclosure->url = $file['URI']; - $enclosure->content_length = $file['size']; - $enclosure->mime_type = $mime_type; - $enclosure->file_type = Model\FileType::find_one_by_mime_type($enclosure->mime_type); - - $duration = new Duration($file['duration']); - $enclosure->duration = $duration->get(); - - $enclosure->extension = pathinfo($enclosure->url, PATHINFO_EXTENSION); - - if (!$enclosure->file_type) { - $enclosure->errors[] = sprintf( - __('Unknown mime type "%s" in post %s If you want to migrate files with this mime type, you need to create your own %sfile type%s', 'podlove-podcasting-plugin-for-wordpress'), - $enclosure->mime_type, - sprintf('%s', get_edit_post_link($enclosure->post_id), get_the_title($enclosure->post_id)), - '', - '' - ); - - return $enclosure; - } - - return $enclosure; - } - - /** - * Takes a URL and extracts some information from it. - * - * Right now it does *not* actually request the URL to get further information. - * - * @param string $url - * @param int $post_id - * - * @return Enclosure - */ - public static function from_url($url, $post_id = null) - { - $enclosure = new self(); - - $enclosure->post_id = $post_id; - $enclosure->url = $url; - - $enclosure->extension = pathinfo($enclosure->url, PATHINFO_EXTENSION); - $enclosure->file_type = Model\FileType::find_one_by_extension($enclosure->extension); - - if (filter_var($enclosure->url, FILTER_VALIDATE_URL) === false) { - $enclosure->errors[] = sprintf( - 'Invalid URL for enclosure in %s', - sprintf('%s', get_edit_post_link($enclosure->post_id), get_the_title($enclosure->post_id)) - ); - - return $enclosure; - } - - if (!$enclosure->file_type) { - $enclosure->errors[] = sprintf( - __('Unknown extension "%s" in post %s If you want to migrate files with this extension, you need to create your own %sfile type%s', 'podlove-podcasting-plugin-for-wordpress'), - $enclosure->extension, - sprintf('%s', get_edit_post_link($enclosure->post_id), get_the_title($enclosure->post_id)), - '', - '' - ); - - return $enclosure; - } - - return $enclosure; - } -} diff --git a/lib/modules/migration/js/bootstrap.min.js b/lib/modules/migration/js/bootstrap.min.js deleted file mode 100755 index 3ed387760..000000000 --- a/lib/modules/migration/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/** -* Bootstrap.js by @fat & @mdo -* plugins: bootstrap-tooltip.js -* Copyright 2012 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f,g,h,i;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,g=this.options.trigger.split(" ");for(i=g.length;i--;)h=g[i],h=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):h!="manual"&&(e=h=="hover"?"mouseenter":"focus",f=h=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this)));this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,this.$element.data(),b),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a.fn[this.type].defaults,d={},e;this._options&&a.each(this._options,function(a,b){c[a]!=b&&(d[a]=b)},this),e=a(b.currentTarget)[this.type](d).data(this.type);if(!e.options.delay||!e.options.delay.show)return e.show();clearTimeout(this.timeout),e.hoverState="in",this.timeout=setTimeout(function(){e.hoverState=="in"&&e.show()},e.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var b,c,d,e,f,g,h=a.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(h);if(h.isDefaultPrevented())return;b=this.tip(),this.setContent(),this.options.animation&&b.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,b[0],this.$element[0]):this.options.placement,b.detach().css({top:0,left:0,display:"block"}),this.options.container?b.appendTo(this.options.container):b.insertAfter(this.$element),c=this.getPosition(),d=b[0].offsetWidth,e=b[0].offsetHeight;switch(f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}this.applyPlacement(g,f),this.$element.trigger("shown")}},applyPlacement:function(a,b){var c=this.tip(),d=c[0].offsetWidth,e=c[0].offsetHeight,f,g,h,i;c.offset(a).addClass(b).addClass("in"),f=c[0].offsetWidth,g=c[0].offsetHeight,b=="top"&&g!=e&&(a.top=a.top+e-g,i=!0),b=="bottom"||b=="top"?(h=0,a.left<0&&(h=a.left*-2,a.left=0,c.offset(a),f=c[0].offsetWidth,g=c[0].offsetHeight),this.replaceArrow(h-d+f,f,"left")):this.replaceArrow(g-e,g,"top"),i&&c.offset(a)},replaceArrow:function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function e(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip(),d=a.Event("hide");this.$element.trigger(d);if(d.isDefaultPrevented())return;return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?e():c.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var b=this.$element[0];return a.extend({},typeof b.getBoundingClientRect=="function"?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=b?a(b.currentTarget)[this.type](this._options).data(this.type):this;c.tip().hasClass("in")?c.hide():c.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'

',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery) \ No newline at end of file diff --git a/lib/modules/migration/legacy_post_parser.php b/lib/modules/migration/legacy_post_parser.php deleted file mode 100644 index bbda57588..000000000 --- a/lib/modules/migration/legacy_post_parser.php +++ /dev/null @@ -1,60 +0,0 @@ -post_id = $post_id; - $this->post = get_post($post_id); - $this->parse(); - } - - public function get_duration() - { - return $this->duration; - } - - public function get_subtitle() - { - $subtitle = get_post_meta($this->post_id, 'subtitle', true); - - if (isset($this->podPress_meta['itunes:subtitle']) && substr($this->podPress_meta['itunes:subtitle'], 0, 2) !== '##') { - $subtitle = $this->podPress_meta['itunes:subtitle']; - } - - return $subtitle; - } - - public function get_summary() - { - $summary = get_post_meta($this->post_id, 'summary', true); - - if (isset($this->podPress_meta['itunes:summary']) && substr($this->podPress_meta['itunes:summary'], 0, 2) !== '##') { - $summary = $this->podPress_meta['itunes:summary']; - } - - return $summary; - } - - private function parse() - { - foreach (Enclosure::all_for_post($this->post_id) as $enclosure) { - if ($enclosure->duration) { - $this->duration = $enclosure->duration; - } - } - - $this->podPress_meta = get_post_meta($this->post_id, '_podPressPostSpecific', true); - } -} diff --git a/lib/modules/migration/migration.php b/lib/modules/migration/migration.php deleted file mode 100644 index b9b567103..000000000 --- a/lib/modules/migration/migration.php +++ /dev/null @@ -1,318 +0,0 @@ - -
-

- -

-

- ', - '', - '' - ); ?> -

-

- -

-
- - - -
-
- - - get_module_url().'/js/bootstrap.min.js'); - wp_enqueue_script('twitter-bootstrap-script', 'jquery'); - - wp_register_style('twitter-bootstrap-style', $this->get_module_url().'/css/bootstrap.min.css'); - wp_enqueue_style('twitter-bootstrap-style'); - } - - wp_register_style('podlove-migration-style', $this->get_module_url().'/css/migration_assistant.css'); - wp_enqueue_style('podlove-migration-style'); - } - - public function register_menu() - { - new Settings\Assistant(\Podlove\Podcast_Post_Type::SETTINGS_PAGE_HANDLE); - } -} - -function get_podcast_settings() -{ - $migration_settings = get_option('podlove_migration', []); - $migration_settings = (isset($migration_settings['podcast'])) ? $migration_settings['podcast'] : []; - - $itunes_summary_default = ''; - $itunes_subtitle_default = get_bloginfo('description'); - - // harvest low hanging podPress fruits - if ($podPress_config = get_option('podPress_config')) { - if (isset($podPress_config['iTunes']['summary']) && $podPress_config['iTunes']['summary']) { - $itunes_summary_default = $podPress_config['iTunes']['summary']; - } - if (isset($podPress_config['iTunes']['subtitle']) && $podPress_config['iTunes']['subtitle']) { - $itunes_subtitle_default = $podPress_config['iTunes']['subtitle']; - } - } - - // harvest low hanging podPress fruits - if ($powerPress_config = get_option('powerpress_feed')) { - if (isset($powerPress_config['itunes_summary']) && $powerPress_config['itunes_summary']) { - $itunes_summary_default = $powerPress_config['itunes_summary']; - } - if (isset($powerPress_config['itunes_subtitle']) && $powerPress_config['itunes_subtitle']) { - $itunes_subtitle_default = $powerPress_config['itunes_subtitle']; - } - } - - $defaults = [ - 'title' => get_bloginfo('name'), - 'subtitle' => $itunes_subtitle_default, - 'summary' => $itunes_summary_default, - 'media_file_base_url_option' => 'preset', - 'media_file_base_url_preset' => null, - 'media_file_base_url_custom' => '', - ]; - - return wp_parse_args($migration_settings, $defaults); -} - -function get_media_file_base_url() -{ - $podcast = get_podcast_settings(); - - if (isset($podcast['media_file_base_url_option']) && $podcast['media_file_base_url_option'] == 'preset') { - return $podcast['media_file_base_url_preset']; - } - - return $podcast['media_file_base_url_custom']; -} - -function migrate_post($post_id) -{ - $post = get_post($post_id); - $migration_settings = get_option('podlove_migration', []); - - $post_content = $post->post_content; - - if ($migration_settings['cleanup']['player']) { - $post_content = preg_replace('/\[(powerpress|podloveaudio|podlovevideo|display_podcast)[^\]]*\]/', '', $post_content); - } - - $new_post = [ - 'menu_order' => $post->menu_order, - 'comment_status' => $post->comment_status, - 'ping_status' => $post->ping_status, - 'post_author' => $post->post_author, - 'post_content' => $post_content, - 'post_excerpt' => $post->post_excerpt, - 'post_mime_type' => $post->post_mime_type, - 'post_parent' => $post_id, - 'post_password' => $post->post_password, - 'post_status' => 'pending', - 'post_title' => $post->post_title, - 'post_type' => 'podcast', - 'post_date' => $post->post_date, - 'post_date_gmt' => get_gmt_from_date($post->post_date), - ]; - - $new_slug = null; - switch ($migration_settings['post_slug']) { - case 'wordpress': - $new_slug = $post->post_name; - - break; - case 'file': - $new_slug = Assistant::get_file_slug($post); - - break; - case 'number': - $new_slug = Assistant::get_number_slug($post); - - break; - } - - $override_slug = function ($data, $postarr) use ($new_slug) { - if ($new_slug) { - $data['post_name'] = $new_slug; - } - - return $data; - }; - - add_filter('wp_insert_post_data', $override_slug, 10, 2); - $new_post_id = wp_insert_post($new_post); - remove_filter('wp_insert_post_data', $override_slug, 10, 2); - - $new_post = get_post($new_post_id); - - // update guid - update_post_meta($new_post_id, '_podlove_guid', $post->guid); - - // add redirect from previous url - add_post_meta($new_post_id, 'podlove_alternate_url', get_permalink($post_id)); - - // prevent adn module from triggering a post - update_post_meta($new_post_id, '_podlove_episode_was_published', true); - - // migrate taxonomies - $taxonomies = get_object_taxonomies(get_post_type($post_id)); - - foreach ($taxonomies as $tax) { - $terms = wp_get_object_terms($post_id, $tax); - $term = []; - foreach ($terms as $t) { - $term[] = $t->slug; - } - - wp_set_object_terms($new_post_id, $term, $tax); - } - - $post_data = new Legacy_Post_Parser($post_id); - - $episode = Model\Episode::find_or_create_by_post_id($new_post_id); - $episode->slug = Assistant::get_episode_slug($post, $migration_settings['slug']); - $episode->duration = $post_data->get_duration(); - $episode->subtitle = $post_data->get_subtitle(); - $episode->summary = $post_data->get_summary(); - $episode->save(); - - foreach (Model\EpisodeAsset::all() as $asset) { - Model\MediaFile::find_or_create_by_episode_id_and_episode_asset_id($episode->id, $asset->id); - } - - // copy all meta - $meta = get_post_meta($post_id); - foreach ($meta as $key => $values) { - if (!in_array($key, ['enclosure', '_podPressPostSpecific', '_podPressMedia']) || !$migration_settings['cleanup']['enclosures']) { - foreach ($values as $value) { - add_post_meta($new_post_id, $key, $value); - } - } - } - - // copy all comments - $comments_map = []; // map old comment IDs to new comment IDs - foreach (get_comments(['post_id' => $post_id, 'order' => 'ASC']) as $comment) { - $old_comment_id = $comment->comment_ID; - $comment->comment_post_ID = $new_post_id; - - if ($comment->comment_parent && isset($comments_map[$comment->comment_parent])) { - $comment->comment_parent = $comments_map[$comment->comment_parent]; - } - - $new_comment_id = wp_insert_comment((array) $comment); - $comments_map[$old_comment_id] = $new_comment_id; - } - - return $new_post_id; -} - -function ajax_migrate_post() -{ - $new_post_id = migrate_post((int) $_REQUEST['post_id']); - - $migration_cache = get_option('podlove_migrated_posts_cache', []); - $migration_cache[(int) $_REQUEST['post_id']] = (int) $new_post_id; - update_option('podlove_migrated_posts_cache', $migration_cache); - - header('Cache-Control: no-cache, must-revalidate'); - header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); - header('Content-type: application/json'); - echo wp_json_encode(['url' => get_edit_post_link($new_post_id)]); - - exit(); -} -add_action('wp_ajax_podlove-migrate-post', '\Podlove\Modules\Migration\ajax_migrate_post'); - -function update_migration_settings() -{ - $migration_settings = get_option('podlove_migration', []); - - if (isset($_REQUEST['file_types'])) { - $file_type_id = (int) $_REQUEST['file_types'][0]; - $is_checked = $_REQUEST['file_types'][1] == 'true'; - - if (!isset($migration_settings['file_types'])) { - $migration_settings['file_types'] = []; - } - - if ($is_checked) { - $migration_settings['file_types'][$file_type_id] = 'on'; - } else { - unset($migration_settings['file_types'][$file_type_id]); - } - } - - if (isset($_REQUEST['post_slug'])) { - $migration_settings['post_slug'] = $_REQUEST['post_slug']; - } - - if (isset($_REQUEST['cleanup'])) { - $cleanup_key = $_REQUEST['cleanup'][0]; - $cleanup_val = $_REQUEST['cleanup'][1]; - - if (!isset($migration_settings['cleanup'])) { - $migration_settings['cleanup'] = []; - } - - $migration_settings['cleanup'][$cleanup_key] = $cleanup_val; - } - - update_option('podlove_migration', $migration_settings); - exit(); -} -add_action('wp_ajax_podlove-update-migration-settings', '\Podlove\Modules\Migration\update_migration_settings'); diff --git a/lib/modules/migration/settings/assistant.php b/lib/modules/migration/settings/assistant.php deleted file mode 100644 index ea6ea8da9..000000000 --- a/lib/modules/migration/settings/assistant.php +++ /dev/null @@ -1,218 +0,0 @@ -reset_migration(); - wp_redirect(admin_url('admin.php?page=podlove_settings_migration_handle')); - } - } - - public static function get_page_link($step = 1) - { - return sprintf('?page=%s&step=%s', 'podlove_settings_migration_handle', $step); - } - - public function process_request() - { - if (!isset($_REQUEST['podlove_migration'])) { - return; - } - - $migration_settings = get_option('podlove_migration', []); - - foreach ($_REQUEST['podlove_migration'] as $setting_key => $setting_value) { - $migration_settings[$setting_key] = $setting_value; - } - - update_option('podlove_migration', $migration_settings); - } - - public function page() - { - set_time_limit(1800); // increase max_execution_time for migration actions - - $wizard = [ - new Wizard\StepWelcome(), - new Wizard\StepBasics(), - new Wizard\StepPosts(), - new Wizard\StepMigrate(), - new Wizard\StepFinalize(), - ]; - - // start-index must be 1, not 0 - array_unshift($wizard, 'whatever'); - unset($wizard[0]); - - $this->process_request(); - - $steps = array_map(function ($step) { - return $step->title; - }, $wizard); - - if (isset($_REQUEST['prev']) || isset($_REQUEST['next']) || isset($_REQUEST['stay'])) { - $current_step = Migration::instance()->get_module_option('current_step', 1); - if (isset($_REQUEST['next'])) { - ++$current_step; - Migration::instance()->update_module_option('current_step', $current_step); - } elseif (isset($_REQUEST['prev'])) { - --$current_step; - Migration::instance()->update_module_option('current_step', $current_step); - } - } elseif (isset($_REQUEST['step']) && $_REQUEST['step'] > 0 && $_REQUEST['step'] <= count($steps)) { - $current_step = (int) $_REQUEST['step']; - Migration::instance()->update_module_option('current_step', $current_step); - } else { - $current_step = Migration::instance()->get_module_option('current_step', 1); - } - - if ($current_step < 1) { - $current_step = 1; - } ?> - - - -
-

- -

- Migrate your existing episodes to the Podlove Publisher. -
- If you get stuck, feel free to reset the migration and - - - - - . -
- There's also documentation if you'd like to get into details. -

-

- -
- - - - template(); ?> -
- post_name; - - break; - case 'number': - return self::get_number_slug($post); - - break; - case 'file': - return self::get_file_slug($post); - - break; - } - } - - public static function get_number_slug($post) - { - if (preg_match('/\\d+/', \get_the_title($post->ID), $matches)) { - return $matches[0]; - } - - return ''; - } - - public static function get_file_slug($post) - { - $enclosures = Enclosure::all_for_post($post->ID); - foreach ($enclosures as $enclosure) { - if (!$enclosure->errors) { - $file_name = end(explode('/', $enclosure->url)); - - return substr($file_name, 0, strrpos($file_name, '.')); - } - } - - return null; - } - - private function reset_migration() - { - delete_option('podlove_module_migration'); - delete_option('podlove_migration'); - delete_option('podlove_migration_validation_cache'); - delete_option('podlove_asset_assignment'); - delete_option('podlove_migrated_posts_cache'); - - $args = [ - 'post_type' => 'podcast', - 'posts_per_page' => -1, - ]; - $query = new \WP_Query($args); - - while ($query->have_posts()) { - $query->the_post(); - wp_delete_post(get_the_ID()); - } - - wp_reset_postdata(); - - foreach (Model\EpisodeAsset::all() as $asset) { - $asset->delete(); - } - - foreach (Model\Feed::all() as $feed) { - $feed->delete(); - } - } -} diff --git a/lib/modules/migration/settings/wizard/step.php b/lib/modules/migration/settings/wizard/step.php deleted file mode 100644 index 4ba40727f..000000000 --- a/lib/modules/migration/settings/wizard/step.php +++ /dev/null @@ -1,13 +0,0 @@ - -
-
-

The Podlove Mindset

-

- Podlove Publisher assumes all your media files are in the same directory and follow - a certain naming scheme. - All your files must be accessible via http and start with the same - Media File Base URL (e.g. http://cdn.example.com/pod/). -

-

- Every episode is identified by a unique episode slug. - This is an identifying lowercase name for an episode which is part of the media file url. - A common pattern is to use the episode number (001, 002 etc.) or the number prefixed with - the podcast mnemonic (lh001, lh002 etc. if your podcast is "LoveHounds"). - A media file will be accessed by combining the media file base url, slug and file extension. -

-

- Complete example: http://cdn.example.com/pod/lh001.mp3 -

-
-
-

Checklist

-
    -
  1. - Copy all your files into the same publicly accessible directory. -
  2. -
  3. - Depending on your current naming scheme you might or might not have to rename your files. If you are not sure, don't worry. It will be more obvious in the next step. -
  4. -
  5. - Case sensitivity matters! To avoid conflicts, stick to one naming scheme. -
  6. -
-
-
- - -1]; - $query = new \WP_Query($args); - while ($query->have_posts()) { - $query->next_post(); - $enclosures = Enclosure::all_for_post($query->post->ID); - foreach ($enclosures as $enclosure) { - $base_url = substr($enclosure->url, 0, strrpos($enclosure->url, '/') + 1); - if (isset($base_urls[$base_url])) { - ++$base_urls[$base_url]; - } else { - $base_urls[$base_url] = 1; - } - } - } - - arsort($base_urls); - - $podcast = \Podlove\Modules\Migration\get_podcast_settings(); ?> - -
-
-

Basic Settings

-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
-
- > - -
-
- > - -
-
- -
-
-
- - -
-
- - - - -
-
-
- 'podcast', - 'posts_per_page' => -1, - ]; - $query = new \WP_Query($args); - - while ($query->have_posts()) { - $query->the_post(); - $post = get_post(); - - // publicize episode - wp_update_post([ - 'ID' => $post->ID, - 'post_status' => 'publish', - ]); - - // put legacy post in trash - wp_delete_post($post->post_parent); - } - - wp_reset_postdata(); - - // cleanup temporary migration settings - // delete_option( 'podlove_module_migration' ); - delete_option('podlove_migration'); - delete_option('podlove_migration_validation_cache'); - delete_option('podlove_migrated_posts_cache'); - } - - $unpublished_episodes = $wpdb->get_var(" - SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'podcast' AND post_status = 'pending' - "); ?> - - 0) { ?> -
-

- -

-

- All your episodes are migrated and marked as pending. Your original posts are still published. - You can now preview your episodes and adjust them to your liking. Then it's time to pull the trigger. -

-

- Pushing this button depublicizes all migrated posts and publishes all episodes at once. -

-

- Ready? -

-

-

- - - -
-

-
- - - - title = $migration_settings['podcast']['title']; - $podcast->subtitle = $migration_settings['podcast']['subtitle']; - $podcast->summary = $migration_settings['podcast']['summary']; - $podcast->media_file_base_uri = \Podlove\Modules\Migration\get_media_file_base_url(); - - // harvest low hanging podPress fruits - if ($podPress_config = get_option('podPress_config')) { - if (isset($podPress_config['iTunes']['image']) && !$podcast->cover_image) { - $podcast->cover_image = $podPress_config['iTunes']['image']; - } - } - - // harvest low hanging PowerPress fruits - if ($powerPress_config = get_option('powerpress_feed')) { - if (isset($powerPress_config['itunes_image']) && !$podcast->cover_image) { - $podcast->cover_image = $powerPress_config['itunes_image']; - } - if (isset($powerPress_config['itunes_cat_1']) && !$podcast->category_1) { - $podcast->category_1 = $powerPress_config['itunes_cat_1']; - } - if (isset($powerPress_config['itunes_cat_2']) && !$podcast->category_2) { - $podcast->category_2 = $powerPress_config['itunes_cat_2']; - } - if (isset($powerPress_config['itunes_cat_3']) && !$podcast->category_3) { - $podcast->category_3 = $powerPress_config['itunes_cat_3']; - } - } - - $podcast->save(); - - // Create Template - $template = Model\Template::find_one_by_title('default'); - if (!$template) { - $template = new Model\Template(); - $template->title = 'default'; - $template->content = <<<'EOT' -{{ episode.player }} -[podlove-episode-downloads] -EOT; - $template->save(); - } - - $template_assignment = Model\TemplateAssignment::get_instance(); - if ($template_assignment->has_property($migration_settings['cleanup']['template'])) { - $template_assignment->{$migration_settings['cleanup']['template']} = $template->id; - $template_assignment->save(); - } - - // Create Assets - $assets = []; - foreach ($migration_settings['file_types'] as $file_type_id => $_) { - $file_type = Model\FileType::find_one_by_id($file_type_id); - $is_image = in_array($file_type->extension, ['png', 'jpg', 'jpeg', 'gif']); - - $asset = Model\EpisodeAsset::find_one_by_file_type_id($file_type_id); - if (!$asset) { - $asset = new Model\EpisodeAsset(); - $asset->title = $file_type->name; - $asset->file_type_id = $file_type_id; - $asset->downloadable = !$is_image; - $asset->save(); - } - $assets[] = $asset; - - if ($is_image) { - $asset_assignments = get_option('podlove_asset_assignment', []); - if (!$asset_assignments['image']) { - $asset_assignments['image'] = $asset->id; - update_option('podlove_asset_assignment', $asset_assignments); - } - } - - // create feeds - if (stripos($file_type->mime_type, 'audio') !== false) { - $feed = Model\Feed::find_one_by_episode_asset_id($asset->id); - if (!$feed) { - $feed = new Model\Feed(); - $feed->episode_asset_id = $asset->id; - $feed->name = $file_type->name; - $feed->title = $file_type->name; - $feed->slug = $file_type->extension; - $feed->format = 'rss'; - $feed->enable = true; - $feed->discoverable = true; - $feed->limit_items = -1; - $feed->save(); - } - } - - // set web player settings - $webplayer_formats = get_option('podlove_webplayer_formats', []); - if (!isset($webplayer_formats['audio'])) { - $webplayer_formats['audio'] = []; - } - - if (stripos($file_type->mime_type, 'audio/mpeg') !== false) { - $webplayer_formats['audio']['mp3'] = $asset->id; - } elseif (stripos($file_type->mime_type, 'audio/mp4') !== false) { - $webplayer_formats['audio']['mp4'] = $asset->id; - } elseif (stripos($file_type->mime_type, 'audio/ogg') !== false) { - $webplayer_formats['audio']['ogg'] = $asset->id; - } elseif (stripos($file_type->mime_type, 'audio/opus') !== false) { - $webplayer_formats['audio']['opus'] = $asset->id; - } - update_option('podlove_webplayer_formats', $webplayer_formats); - } - - // flush rules after migration - set_transient('podlove_needs_to_flush_rewrite_rules', true); ?> - -
- - -
- -
-
-

Migrating

-
-
- -
-
-
- -

- - Starting the migration creates the actual episodes one by one. -

- - - - - - - - - - - $_) { ?> - - > - - - - - -
StatusEpisode
- >not yet migrated - - > - - - - - - - - -
- - - -1]; - - $episodes = []; - $file_types = []; - $errors = []; - - $query = new \WP_Query($args); - while ($query->have_posts()) { - $query->next_post(); - - // look for the cover - $metas = get_post_meta($query->post->ID, '', true); - $metas = array_map(function ($m) { - return $m[0]; - }, $metas); - foreach ($metas as $key => $value) { - if (filter_var($value, FILTER_VALIDATE_URL) === false) { - continue; - } - - $enclosure = Enclosure::from_url($value, $query->post->ID); - - if (!in_array($enclosure->extension, ['gif', 'jpg', 'jpeg', 'png'])) { - continue; - } - - if ($enclosure->errors) { - $errors = array_merge($enclosure->errors, $errors); - } elseif (isset($file_types[$enclosure->file_type->id])) { - ++$file_types[$enclosure->file_type->id]['count']; - } else { - $file_types[$enclosure->file_type->id] = ['file_type' => $enclosure->file_type, 'count' => 1]; - } - } - - $enclosures = Enclosure::all_for_post($query->post->ID); - foreach ($enclosures as $enclosure) { - if ($enclosure->errors) { - $errors = array_merge($enclosure->errors, $errors); - } elseif (isset($file_types[$enclosure->file_type->id])) { - ++$file_types[$enclosure->file_type->id]['count']; - } else { - $file_types[$enclosure->file_type->id] = ['file_type' => $enclosure->file_type, 'count' => 1]; - } - } - - if (count($enclosures)) { - foreach ($enclosures as $enclosure) { - if (empty($enclosure->errors)) { - $episodes[] = $query->post; - - break; - } - } - } - } - - if (!count($episodes)) { - $errors[] = __('No Episodes Found! You can only migrate posts with enclosures. However, there don\'t seem to be any. Sorry!', 'podlove-podcasting-plugin-for-wordpress'); - } - - $migration_settings = get_option('podlove_migration', []); - - // educated guess: activate all audio files by default - if (!isset($migration_settings['file_types'])) { - $migration_settings['file_types'] = []; - foreach ($file_types as $file_type) { - if (stripos($file_type['file_type']->mime_type, 'audio') !== false) { - $migration_settings['file_types'][$file_type['file_type']->id] = 'on'; - } - } - } - - $slug_type = 'file'; - if (!isset($migration_settings['post_slug']) || !$post_slug_type = $migration_settings['post_slug']) { - $post_slug_type = 'wordpress'; - } - - if (!isset($migration_settings['cleanup'])) { - $migration_settings['cleanup'] = []; - } - $migration_settings['cleanup'] = wp_parse_args($migration_settings['cleanup'], [ - 'enclosures' => 1, - 'player' => 1, - 'template' => 'bottom', - ]); - - $validation_cache = get_option('podlove_migration_validation_cache', []); ?> - -
-
-
- - - - -
- -
-
-

About Episodes and Assets

-

- A single podcast recording is called episode. Below are all posts identified as episodes. Please check that the results match your expectations. - Podlove knows about the assets you distribute for each episode. Assets are audio/video files but also images, chapter files, subtitle files etc. -

-

- When everything looks good and the verification bar is green (and maybe yellow, but not red), continue to migration. -

-
-
- -
- - -

Warnings

- -
- -
- - - -

choose assets to use in your podcast

-

- These are all detected assets. Please choose those that you want to use in your podcast. - For each asset, a feed will be created and users will be able to download those files (you can change this after the migration). -

- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
- id]) && $migration_settings['file_types'][$file_type['file_type']->id] == 'on'); ?> - name="podlove_migration[file_types][id; ?>]" - class="asset_checkbox" - > - - name; ?> - - mime_type; ?> - - extension; ?> - - -
- - - -
- -
-

Url slug for the WordPress page

- - - -
- -
-

- -
- -
- -
- - -
-
- -
- -
- - -
-
- -
- -
- - - -
-
- -
-
- -
- -

-
- - - -
- -
    -
  • - Green: All media files for these episodes are valid. -
  • -
  • - Yellow: Some, but not all media files for these episodes are missing. You can add them later, so not necessarily a dealbreaker. -
  • -
  • - Red: No media for these episodes exist! -
  • -
- -

-

- Select the episodes to migrate. Use the rest of the displayed data to verify the extracted data. -

- - - - - - - - - - - ID); ?> - - - - - - - - - - - -
- - # - -
- ID]) || !isset($migration_settings['episodes'])); ?> name="podlove_migration[episodes][ID; ?>]"> - - ID; ?> - - - ID); ?> - -
- - - - - - - - - - - - - - - - - - - - - - - - - -
Post Slug - $episode_post->post_name, - 'file' => Assistant::get_file_slug($episode_post), - 'number' => Assistant::get_number_slug($episode_post), - ]; - - foreach ($slugs as $slug_key => $slug_value) { - $class = $post_slug_type == $slug_key ? '' : 'hidden'; - echo "".$slug_value.''; - } ?> -
Subtitleget_subtitle(); ?>
Summaryget_summary(); ?>
Durationget_duration(); ?>
Episode Media File Slug
Assets - - - id]); - $asset_name = $file_type['file_type']->name; - $asset_url = sprintf( - '%s%s.%s', - \Podlove\Modules\Migration\get_media_file_base_url(), - Assistant::get_episode_slug($episode_post, $slug_type), - $file_type['file_type']->extension - ); - - $status = 'unknown'; - if (isset($validation_cache[$asset_url])) { - $status = $validation_cache[$asset_url] ? 'success' : 'failure'; - } ?> - > - - - - -
- - - %s', - $asset_url, - Assistant::get_episode_slug($episode_post, $slug_type).'.'.$file_type['file_type']->extension - ); ?> -
-
- updating ... -
-
- -
-
-
-
> - -
-
> - -
-
-
-
-
- - - - - - - - -
-
-
- -
-
-

Is this for you?

-

- This tool is for you if you are using this WordPress setup to publish a podcast right now. - The assistant has explicit support for podPress and PowerPress setups but it will - work with anything that relies on WordPress enclosures. -

-
-
-

Preparation

-

- Before you start, please backup your database!. - The assistant won't edit or delete any data. However, nobody has ever lost any data by backing up. Play it safe. -

-

- BackWPup.'; ?> -

-
-
-

System Check

-

- render(); ?> - -

-
-
-
-
- - - -
-
- + +
+
+ ' + ); ?> +
+
+
+ +
+
+
+
+ +
+
+
+

+

+ +

+ +
+
+
+
+
+
+ +get_module_url().'/css/podlove-onboarding-banner.css'); + wp_enqueue_style('podlove-onboarding-banner-style'); + } + + public function add_onboarding_menu() + { + new OnboardingPage(\Podlove\Podcast_Post_Type::SETTINGS_PAGE_HANDLE); + } + + /** + * Onboarding options: + * - hide banner + * - type: start / import + * - feedurl + */ + public static function is_banner_hide() + { + $onboarding_options = self::get_options(); + if (isset($onboarding_options['hide_banner'])) { + return $onboarding_options['hide_banner']; + } + + return false; + } + + public static function set_banner_hide($option) + { + $onboarding_options = self::get_options(); + if (strtolower($option) == 'true') { + $onboarding_options['hide_banner'] = true; + } else { + if (isset($onboarding_options['hide_banner'])) { + unset($onboarding_options['hide_banner']); + } + } + self::update_options($onboarding_options); + } + + /** PHP 8.1 change this to an enum */ + public static function get_onboarding_type() + { + $onboarding_options = self::get_options(); + if (isset($onboarding_options['type'])) { + return $onboarding_options['type']; + } + } + + public static function set_onboarding_type($option) + { + $onboarding_options = self::get_options(); + switch (strtolower($option)) { + case 'start': + case 'import': + $onboarding_options['type'] = $option; + + break; + + default: + if (isset($onboarding_options['type'])) { + unset($onboarding_options['type']); + } + + break; + } + self::update_options($onboarding_options); + } + + private static function get_options() + { + return get_option('podlove_modules_onboarding', []); + } + + private static function update_options($onboarding_options) + { + update_option('podlove_modules_onboarding', $onboarding_options); + } + + /** + * Onboarding API init (add to admin-route). + */ + public function api_init() + { + $api_onboarding = new WP_REST_PodloveOnboarding_Controller(); + $api_onboarding->register_routes(); + } +} diff --git a/lib/modules/onboarding/rest_api.php b/lib/modules/onboarding/rest_api.php new file mode 100644 index 000000000..6c1902e13 --- /dev/null +++ b/lib/modules/onboarding/rest_api.php @@ -0,0 +1,72 @@ +namespace = 'podlove/v2'; + $this->rest_base = 'onboarding'; + } + + /** + * Register the component routes. + */ + public function register_routes() + { + register_rest_route($this->namespace, $this->rest_base."/setup", [ + [ + 'methods' => \WP_REST_SERVER::EDITABLE, + 'callback' => [$this, 'update_items'], + 'permission_callback' => [$this, 'update_permissions_check'] + ] + ]); + } + + public function update_items($request) + { + // activate File-Upload-Module and set default settings + if (!\Podlove\Modules\Base::is_active('wordpress_file_upload')) { + \Podlove\Modules\Base::activate('wordpress_file_upload'); + } + $upload_modul = Wordpress_File_Upload::instance(); + $upload_modul->update_module_option('upload_subdir', 'podlove-media'); + // set upload loaction to emty + $settings = get_option('podlove_podcast'); + $settings["media_file_base_uri"] = ""; + update_option('podlove_podcast', $settings); + // activated contributor module + if (isset($request['contributor'])) { + $contributor = $request['contributor']; + if (!\Podlove\Modules\Base::is_active('contributors') && $contributor) { + \Podlove\Modules\Base::activate('contributors'); + } + } + // activated transcript module + if (isset($request['transcript'])) { + $transcript = $request['transcript']; + if (!\Podlove\Modules\Base::is_active('transcripts') && $transcript) { + \Podlove\Modules\Base::activate('transcripts'); + } + } + return new \Podlove\Api\Response\OkResponse([ + 'status' => 'ok' + ]); + } + + public function update_permissions_check($request) + { + if (!current_user_can('edit_posts')) { + return new \Podlove\Api\Error\ForbiddenAccess(); + } + + return true; + } +} diff --git a/lib/modules/onboarding/settings/onboarding_page.php b/lib/modules/onboarding/settings/onboarding_page.php new file mode 100644 index 000000000..f215c4f76 --- /dev/null +++ b/lib/modules/onboarding/settings/onboarding_page.php @@ -0,0 +1,159 @@ + +
+
+

{$acknowledgeHeadline}

+

{$acknowledgeDescription}

+ +
+
+ + + + + EOD; + } +} diff --git a/lib/modules/wordpress_file_upload/wordpress_file_upload.php b/lib/modules/wordpress_file_upload/wordpress_file_upload.php index 7b9c5ade0..8b4ea1455 100644 --- a/lib/modules/wordpress_file_upload/wordpress_file_upload.php +++ b/lib/modules/wordpress_file_upload/wordpress_file_upload.php @@ -12,6 +12,7 @@ class Wordpress_File_Upload extends \Podlove\Modules\Base public function load() { + add_action('init', [$this, 'register_public_hooks']); add_action('admin_init', [$this, 'register_hooks']); // FIXME: this is huge. admin_init is not run for REST calls? what else might this affect? add_action('rest_api_init', [$this, 'register_hooks']); @@ -25,7 +26,7 @@ public function load() ], ])); - $podlove_subdir = trim($this->get_module_option('upload_subdir')); + $podlove_subdir = trim($this->get_module_option('upload_subdir') ?? ''); if (!$podlove_subdir) { add_action('admin_notices', function () { ?> @@ -50,11 +51,15 @@ public function load() } } + public function register_public_hooks() + { + add_filter('podlove_media_file_base_uri', [$this, 'set_media_file_base_uri']); + } + public function register_hooks() { add_filter('upload_dir', [$this, 'custom_media_upload_dir']); add_filter('podlove_media_file_base_uri_form', [$this, 'set_form_placeholder']); - add_filter('podlove_media_file_base_uri', [$this, 'set_media_file_base_uri']); } public function set_media_file_base_uri($uri) @@ -93,7 +98,13 @@ public function custom_media_upload_dir($upload, $force_override = false) $podlove_subdir = $this->get_subdir(); $id = isset($_REQUEST['post_id']) ? (int) $_REQUEST['post_id'] : 0; - $parent = $id ? get_post($id)->post_parent : 0; + + if (isset($_REQUEST['post'])) { + // when uploaded via POST /wp/v2/media + $parent = (int) $_REQUEST['post']; + } else { + $parent = $id ? get_post($id)->post_parent : 0; + } if ($force_override || 'podcast' == get_post_type($id) || 'podcast' == get_post_type($parent)) { $upload['subdir'] = $podlove_subdir; diff --git a/lib/version.php b/lib/version.php index e269f79d0..243d980b6 100644 --- a/lib/version.php +++ b/lib/version.php @@ -42,7 +42,7 @@ use Podlove\Jobs\CronJobRunner; -define('Podlove\DATABASE_VERSION', 158); +define('Podlove\DATABASE_VERSION', 159); add_action('admin_init', '\Podlove\maybe_run_database_migrations'); add_action('admin_init', '\Podlove\run_database_migrations', 5); @@ -1664,12 +1664,19 @@ function run_migrations_for_version($version) } break; - case 158: + case 159: if (Modules\Social\Model\Service::table_exists()) { Modules\Social\Social::update_existing_services(); Modules\Social\Social::build_missing_services(); } + $podcast = Model\Podcast::get(); + + if (!$podcast->guid) { + $podcast->guid = \Ramsey\Uuid\Uuid::uuid4(); + $podcast->save(); + } + break; } } diff --git a/plugin.php b/plugin.php index e9ef4dfc6..3572ec29e 100644 --- a/plugin.php +++ b/plugin.php @@ -216,6 +216,7 @@ function uninstall_for_current_blog() require_once \Podlove\PLUGIN_DIR.'includes/episode_number_column.php'; require_once \Podlove\PLUGIN_DIR.'includes/episode_number_quick_edit_form.php'; require_once \Podlove\PLUGIN_DIR.'includes/extras.php'; +require_once \Podlove\PLUGIN_DIR.'includes/feature.php'; require_once \Podlove\PLUGIN_DIR.'includes/feed_discovery.php'; require_once \Podlove\PLUGIN_DIR.'includes/frontend_styles.php'; require_once \Podlove\PLUGIN_DIR.'includes/http.php'; diff --git a/podlove.php b/podlove.php index 40e0c42fa..19b79b568 100644 --- a/podlove.php +++ b/podlove.php @@ -2,7 +2,7 @@ /** * Plugin Name: Podlove Podcast Publisher * Plugin URI: https://podlove.org/podlove-podcast-publisher/ - * Version: 4.1.25 + * Version: 4.2.0 * Requires at least: 4.9.6 * Requires PHP: 8.0 * Author: Podlove diff --git a/readme.txt b/readme.txt index 648273349..7519c0da7 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ Contributors: eteubert Donate link: https://opencollective.com/podlove Tags: podlove, podcast, publishing, rss, audio Tested up to: 6.7.1 -Stable tag: 4.1.25 +Stable tag: 4.2.0 Requires at least: 4.9.6 Requires PHP: 8.0 License: MIT @@ -115,6 +115,10 @@ This product includes GeoLite2 data created by MaxMind, available from http://ww == Changelog == += 4.2.0 = + +TODO: announcement for setup & import assistant + = 4.1.25 = * fix: Auphonic "Start Production" is working again