diff --git a/build-dkan.make b/build-dkan.make index dba34acb9..101bf9739 100644 --- a/build-dkan.make +++ b/build-dkan.make @@ -8,8 +8,8 @@ includes[core] = drupal-org-core.make projects[dkan][type] = profile projects[dkan][download][type] = git projects[dkan][download][url] = https://github.com/NuCivic/dkan.git -projects[dkan][download][tag] = 7.x-1.12.10 +projects[dkan][download][tag] = 7.x-1.12.11 ; Un-comment if diff is not empty. -projects[dkan][patch][1] = https://github.com/NuCivic/dkan/compare/7.x-1.12.10...release-1-12.diff +projects[dkan][patch][1] = https://github.com/NuCivic/dkan/compare/7.x-1.12.11...release-1-12.diff diff --git a/circle.yml b/circle.yml index 92099debf..466063d98 100644 --- a/circle.yml +++ b/circle.yml @@ -73,8 +73,9 @@ dependencies: test: override: - ruby dkan/.ahoy/.scripts/circle-behat.rb docroot/profiles/dkan/test/features --tags='~@customizable&&~@fixme&&~@testBug': - parallel: true - + timeout: 1200 + parallel: true + post: - echo $CIRCLE_ARTIFACTS; cp -av dkan/test/assets $CIRCLE_ARTIFACTS: parallel: true diff --git a/config/config.php b/config/config.php index bfaa7ea79..0fe235603 100644 --- a/config/config.php +++ b/config/config.php @@ -22,6 +22,17 @@ 'queue' => '50MB', ), ), + 'private' => + array ( + 'aws' => + array ( + 'scrubbed_data_url' => 'CHANGE ME', + ), + 'probo' => + array ( + 'password' => 'CHANGE ME', + ), + ), 'acquia' => array ( 'subscription' => 'professional', diff --git a/dkan/.ahoy/.scripts/behat-parse-params.rb b/dkan/.ahoy/.scripts/behat-parse-params.rb index d26b92de1..a0652db99 100644 --- a/dkan/.ahoy/.scripts/behat-parse-params.rb +++ b/dkan/.ahoy/.scripts/behat-parse-params.rb @@ -51,7 +51,7 @@ def behat_parse_params args params.push param end end - + params.push '--colors' {:files => files, :params => params} end diff --git a/dkan/.ahoy/.scripts/circle-behat-balancer.rb b/dkan/.ahoy/.scripts/circle-behat-balancer.rb new file mode 100644 index 000000000..9eba42eee --- /dev/null +++ b/dkan/.ahoy/.scripts/circle-behat-balancer.rb @@ -0,0 +1,87 @@ +require "pathname" + +TOKENS = { + "s" => (1), + "m" => (60), + "h" => (60 * 60), + "d" => (60 * 60 * 24) +} + + +def parse_time(time_string, measure = "m") + time = 0 + time_string.scan(/([-+]?[0-9]*\.?[0-9]*)(\w)/).each do |amount, measure| + begin + time += amount.to_i * TOKENS[measure] + rescue TypeError => te + puts "Missing time header" + rescue StandardError => se + puts "An error happen trying to parse the time header" + end + end + return time +end + +def parse_header(file) + file = Pathname(file).realpath.to_s + first_line = File.open(file, &:gets) + first_line.sub! "#", "" + if first_line.include? "time" + time = first_line.split(":")[1].strip + time = parse_time(time) + else + time = 60 # For missing headers default to 60s + end + return time +end + +def sort_files(files) + sorted_files = {} + files.each_index do |i| + sorted_files[files[i]] = parse_header(files[i]) + end + return sorted_files.sort_by {|k, v| v}.reverse +end + +def node_total() + unless ENV.has_key?("CIRCLE_NODE_TOTAL") + return 1 + else + return ENV["CIRCLE_NODE_TOTAL"].to_i + end +end + +def node_index() + unless ENV.has_key?("CIRCLE_NODE_INDEX") + return 0 + else + return ENV["CIRCLE_NODE_INDEX"].to_i + end +end + +def get_containers() + return Array.new(node_total(), 0) +end + +def get_distribution() + distribution = {} + to = node_total() - 1; + for i in 0..to + distribution[i] = [] + end + return distribution +end + +def balance(files) + containers = get_containers() + distribution = get_distribution() + files = sort_files(files) + files.each_index do |i| + emptier = containers.each_with_index.min[1] + file, weight = files[i] + containers[emptier] += weight + distribution[emptier].push(file) + end + return distribution +end + diff --git a/dkan/.ahoy/.scripts/circle-behat.rb b/dkan/.ahoy/.scripts/circle-behat.rb index fdf5cb5ae..dcf97eeb7 100644 --- a/dkan/.ahoy/.scripts/circle-behat.rb +++ b/dkan/.ahoy/.scripts/circle-behat.rb @@ -4,18 +4,18 @@ # Ex. There are 3 VMs setup: (3) require "pathname" require "./dkan/.ahoy/.scripts/behat-parse-params.rb" +require "./dkan/.ahoy/.scripts/circle-behat-balancer.rb" require "pp" -unless ENV.has_key?("CIRCLE_NODE_INDEX") - puts "No parrallelism found, setting defaults to run all tests." - CIRCLE_NODE_TOTAL=1 - CIRCLE_NODE_INDEX=0 -else - CIRCLE_NODE_TOTAL = ENV['CIRCLE_NODE_TOTAL'].to_i - CIRCLE_NODE_INDEX = ENV['CIRCLE_NODE_INDEX'].to_i -end - CIRCLE_ARTIFACTS = ENV.has_key?("CIRCLE_ARTIFACTS") ? ENV['CIRCLE_ARTIFACTS'] : "assets" +CIRCLE_NODE_TOTAL = node_total() +CIRCLE_NODE_INDEX = node_index() +TOKENS = { + "s" => (1), + "m" => (60), + "h" => (60 * 60), + "d" => (60 * 60 * 24) +} puts "CIRCLE_NODE_TOTAL = #{CIRCLE_NODE_TOTAL}" puts "CIRCLE_NODE_INDEX = #{CIRCLE_NODE_INDEX}" @@ -23,22 +23,20 @@ error = 0 parsed = behat_parse_params(ARGV) -files = parsed[:files] params = behat_join_params parsed[:params] +files = balance(parsed[:files]) -files.each_index do |i| - if (i % CIRCLE_NODE_TOTAL) == CIRCLE_NODE_INDEX - file = Pathname(files[i]).realpath.to_s - puts "RUNNING: ahoy dkan test #{file} --format=pretty --out=std --format=junit --out='#{CIRCLE_ARTIFACTS}/junit' #{params} --colors" - IO.popen( - "ahoy dkan test #{file} --format=pretty --out=std --format=junit --out='#{CIRCLE_ARTIFACTS}/junit' #{params} --colors" - ) do |io| - while line = io.gets - print line - end - io.close - error = 1 unless $?.success? +files[CIRCLE_NODE_INDEX].each_index do |i| + file = Pathname(files[CIRCLE_NODE_INDEX][i]).realpath.to_s + puts "RUNNING: ahoy dkan test #{file} --format=pretty --out=std --format=junit --out='#{CIRCLE_ARTIFACTS}/junit' #{params} --colors" + IO.popen( + "ahoy dkan test #{file} --format=pretty --out=std --format=junit --out='#{CIRCLE_ARTIFACTS}/junit' #{params} --colors" + ) do |io| + while line = io.gets + print line end + io.close + error = 1 unless $?.success? end end diff --git a/dkan/.ahoy/.scripts/dkan-make.sh b/dkan/.ahoy/.scripts/dkan-make.sh new file mode 100644 index 000000000..102a3e8ad --- /dev/null +++ b/dkan/.ahoy/.scripts/dkan-make.sh @@ -0,0 +1,13 @@ +if [ $(uname) == "Darwin" ]; then + concurrency=`sysctl -n hw.ncpu` +else + concurrency=`grep -c ^processor /proc/cpuinfo` +fi + +if [ "$AHOY_CMD_PROXY" = "DOCKER" ]; then + working_copy="--working-copy" +else + working_copy="" +fi + +drush --root=docroot -y make --no-core --contrib-destination=./ dkan/drupal-org.make --no-recursion --no-cache --verbose $working_copy --concurrency=$concurrency docroot/profiles/dkan $@ diff --git a/dkan/.ahoy/.scripts/dkan-si.sh b/dkan/.ahoy/.scripts/dkan-si.sh new file mode 100644 index 000000000..2f2b9db35 --- /dev/null +++ b/dkan/.ahoy/.scripts/dkan-si.sh @@ -0,0 +1,4 @@ +drush si dkan --root=docroot --verbose --account-pass='admin' "$1" --site-name='DKAN' install_configure_form.update_status_module='array(FALSE,FALSE)' --yes && \ + drush --root=docroot sql-dump > backups/last_install.sql.tmp && \ + mv backups/last_install.sql.tmp backups/last_install.sql && \ + echo "Installed DKAN and created a new backup at backups/last_install.sql" diff --git a/dkan/.ahoy/.scripts/drupal-rebuild.sh b/dkan/.ahoy/.scripts/drupal-rebuild.sh new file mode 100644 index 000000000..bd64c7616 --- /dev/null +++ b/dkan/.ahoy/.scripts/drupal-rebuild.sh @@ -0,0 +1,16 @@ +if [ $(uname) == "Darwin" ]; then + concurrency=`sysctl -n hw.ncpu` +else + concurrency=`grep -c ^processor /proc/cpuinfo` +fi + +if [ "$AHOY_CMD_PROXY" = "DOCKER" ]; then + working_copy="--working-copy" +else + working_copy="" +fi + +drush --root=docroot make --concurrency=$concurrency --prepare-install dkan/drupal-org-core.make docroot --yes + +drush --root=docroot -y --verbose $root si minimal --sites-subdir=default --account-pass='admin' --db-url=$1 install_configure_form.update_status_module='array(false,false)' && + ln -s ../../dkan docroot/profiles/dkan diff --git a/dkan/.ahoy/dkan.ahoy.yml b/dkan/.ahoy/dkan.ahoy.yml index ee5d33296..54fe97de0 100644 --- a/dkan/.ahoy/dkan.ahoy.yml +++ b/dkan/.ahoy/dkan.ahoy.yml @@ -4,7 +4,12 @@ commands: drupal-rebuild: usage: 'Builds a drupal site in ./docroot. Requires database url.' cmd: | - if [[ "{{args}}" != mysql* ]]; then + if [ "$AHOY_CMD_PROXY" != "DOCKER" ]; then + ARGS="{{args}}" + else + ARGS=`ahoy docker mysql-url` + fi + if [[ "$ARGS" != mysql* ]]; then echo "You need to specify the drupal db url to use in the form mysql://root:root@localhost/db as an argument." exit 1 fi @@ -14,20 +19,23 @@ commands: ahoy confirm "./docroot folder alredy exists. Delete it and reinstall drupal?" && chmod -R 777 docroot/sites/default && rm -rf docroot || { echo ".. skipping installation"; exit 1;} fi - ahoy drush make --prepare-install dkan/drupal-org-core.make docroot --yes - ln -s ../../dkan docroot/profiles/dkan && - ahoy drush "-y --verbose si minimal --sites-subdir=default --account-pass='admin' --db-url={{args}} install_configure_form.update_status_module=\"'array\(FALSE,FALSE\)'\"" + ahoy cmd-proxy bash dkan/.ahoy/.scripts/drupal-rebuild.sh $ARGS remake: usage: Rebuild all the dkan projects from the drupal-org.make file using drush make. # Note that we tried using --overwrite, but that seems to delete the entire modules/dkan folder which includes both checked-in modules and modules from make. # So, we delete the specific folders. cmd: | - rm -rf docroot/profiles/dkan/modules/dkan/dkan_dataset ; - rm -rf docroot/profiles/dkan/modules/dkan/dkan_datastore ; - rm -rf docroot/profiles/dkan/modules/contrib ; - echo "removed dkan/modules folders created by make and running a fresh drush make." - ahoy drush -y make --no-core --contrib-destination=./ dkan/drupal-org.make --no-recursion --no-cache --verbose --working-copy docroot/profiles/dkan + ARGS="{{args}}" + if [ -z "$ARGS" ]; then + rm -rf docroot/profiles/dkan/modules/contrib ; + ARGS='' + echo "removed dkan/modules folders created by make and running a fresh drush make." + else + ARGS="--projects=$ARGS" + echo "Running drush make for the following modules: $ARGS." + fi + ahoy cmd-proxy bash dkan/.ahoy/.scripts/dkan-make.sh "$ARGS" reinstall: usage: Reinstall the dkan install profile (db only). @@ -41,11 +49,15 @@ commands: ahoy dkan sqlc < backups/last_install.sql && \ echo "Installed dkan from backup" else - ahoy drush "si dkan --verbose --account-pass='admin' --site-name='DKAN' install_configure_form.update_status_module=\"\'array\(FALSE,FALSE\)\'\" --yes" && \ - ahoy drush sql-dump > backups/last_install.sql.tmp && \ - mv backups/last_install.sql.tmp backups/last_install.sql && \ - echo "Installed DKAN and created a new backup at backups/last_install.sql" + if [ "$AHOY_CMD_PROXY" == "DOCKER" ]; then + MYSQL=`ahoy docker mysql-url` + MYSQL="--db-url=$MYSQL" + else + MYSQL='' + fi + ahoy cmd-proxy bash dkan/.ahoy/.scripts/dkan-si.sh $MYSQL fi + module-fetch: usage: Checkout a dkan module from the NuCivic github repo. cmd: | diff --git a/dkan/.ahoy/docker-compose.yml b/dkan/.ahoy/docker-compose.yml index 7ca6fbd0f..ef4187f84 100644 --- a/dkan/.ahoy/docker-compose.yml +++ b/dkan/.ahoy/docker-compose.yml @@ -43,7 +43,7 @@ db: # Used for all console commands and tools. cli: hostname: cli - image: nuams/drupal-cli + image: nuams/drupal-cli:2016-10-16 environment: - XDEBUG_CONFIG=idekey=cli - PHP_IDE_CONFIG=serverName=dkan.docker @@ -88,7 +88,7 @@ memcached: # Uncomment the service definition section below and the link in the web service above to start using selenium2 driver for Behat tests requiring JS support. browser: hostname: browser - image: selenium/standalone-chrome-debug:2.49.1 + image: selenium/standalone-chrome-debug:2.53.1 # This helps keep selenium-chrome from crashing because it uses shared memory. volumes: - /dev/shm:/dev/shm diff --git a/dkan/.ahoy/docker.ahoy.yml b/dkan/.ahoy/docker.ahoy.yml index 1193f6937..bb29fcc9c 100644 --- a/dkan/.ahoy/docker.ahoy.yml +++ b/dkan/.ahoy/docker.ahoy.yml @@ -1,10 +1,6 @@ ahoyapi: v1 version: 0.0.0 commands: - diagnose: - usage: A series of ahoy-docker setup diagnosis commands. - import: dkan/.ahoy/diagnose.ahoy.yml - hide: true env: cmd: | cat << EOF @@ -67,8 +63,13 @@ commands: # if the input is not empty, then don't use tty docker exec -i $id bash -c "$command $args" fi - usage: run a command in the docker-compose cli or in any other docker service container. - + usage: run a command in the docker-compose cli service container. + mysql-url: + cmd: | + MYSQL=`docker exec -it $(ahoy docker compose ps -q cli) bash -c 'echo "mysql://$DB_1_ENV_MYSQL_USER:$DB_1_ENV_MYSQL_PASSWORD@$DB_1_PORT_3306_TCP_ADDR/$DB_1_ENV_MYSQL_DATABASE"'` + MYSQL="$(echo -e "${MYSQL}" | tr -d '[[:space:]]')" + echo "$MYSQL" + usage: Outputs a mysql-url mysql: cmd: "docker exec -it $(ahoy docker compose ps -q cli) bash -c 'mysql -uroot -p$DB_ENV_MYSQL_ROOT_PASSWORD -h$DB_PORT_3306_TCP_ADDR $DB_ENV_MYSQL_DATABASE'" usage: Connect to the default mysql database as the root user. diff --git a/dkan/.ahoy/site/.ahoy.yml b/dkan/.ahoy/site/.ahoy.yml index 21a973083..9cc4805e8 100644 --- a/dkan/.ahoy/site/.ahoy.yml +++ b/dkan/.ahoy/site/.ahoy.yml @@ -15,6 +15,15 @@ commands: hide: true import: dkan/.ahoy/dkan.ahoy.yml + diagnose: + usage: A series of ahoy-docker setup diagnosis commands. + import: dkan/.ahoy/diagnose.ahoy.yml + hide: true + + doctor: + usage: A series of ahoy-docker setup diagnosis commands. + import: dkan/.ahoy/diagnose.ahoy.yml + hide: true confirm: cmd: ahoy -f dkan/.ahoy/utils.ahoy.yml confirm {{args}} @@ -23,7 +32,7 @@ commands: docker: usage: A series of docker commands for dkan development (experimental) import: dkan/.ahoy/docker.ahoy.yml - hide: false + hide: true init: cmd: echo "ahoy.yml file already exists." diff --git a/dkan/.ahoy/site/build.ahoy.yml b/dkan/.ahoy/site/build.ahoy.yml index 0329e2810..55967149b 100644 --- a/dkan/.ahoy/site/build.ahoy.yml +++ b/dkan/.ahoy/site/build.ahoy.yml @@ -163,8 +163,8 @@ commands: set -e AHOY_CMD_PROXY='' DIRNAME=${PWD##*/} - if [[ "$DIRNAME" != "dkan_starter" ]]; then - echo "This command should only be use from a dkan_starter working copy" + if [[ "$DIRNAME" != "data_starter_private" ]]; then + echo "This command should only be use from a data_starter_private working copy" exit 0 fi @@ -179,7 +179,7 @@ commands: fi # No ahoy commands after cd-ing out of project folder. cd .. - git clone 'git@github.com:NuCivic/dkan_starter.git' {{args}} --depth=1 + git clone 'git@github.com:NuCivic/data_starter_private.git' {{args}} --depth=1 cd {{args}} rm -rf .git build.make build-dkan.make drupal-org-core.make echo "Site {{args}} initiated at ../{{args}}" diff --git a/dkan/.ahoy/site/composer.lock b/dkan/.ahoy/site/composer.lock new file mode 100644 index 000000000..a36408a00 --- /dev/null +++ b/dkan/.ahoy/site/composer.lock @@ -0,0 +1,128 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "468a0156cfe5ce7cb1a0cd09a204d2e1", + "packages": [ + { + "name": "symfony/yaml", + "version": "v3.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "368b9738d4033c8b93454cb0dbd45d305135a6d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/368b9738d4033c8b93454cb0dbd45d305135a6d3", + "reference": "368b9738d4033c8b93454cb0dbd45d305135a6d3", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2016-09-25 08:27:07" + }, + { + "name": "twig/twig", + "version": "v1.26.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "a09d8ee17ac1cfea29ed60c83960ad685c6a898d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a09d8ee17ac1cfea29ed60c83960ad685c6a898d", + "reference": "a09d8ee17ac1cfea29ed60c83960ad685c6a898d", + "shasum": "" + }, + "require": { + "php": ">=5.2.7" + }, + "require-dev": { + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.26-dev" + } + }, + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ], + "time": "2016-10-05 18:57:41" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/dkan/.ahoy/site/vendor/autoload.php b/dkan/.ahoy/site/vendor/autoload.php new file mode 100644 index 000000000..ad8864efa --- /dev/null +++ b/dkan/.ahoy/site/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0 class loader + * + * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + + private $classMapAuthoritative = false; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-0 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 + if ('\\' == $class[0]) { + $class = substr($class, 1); + } + + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative) { + return false; + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if ($file === null && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if ($file === null) { + // Remember that this class does not exist. + return $this->classMap[$class] = false; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { + if (0 === strpos($class, $prefix)) { + foreach ($this->prefixDirsPsr4[$prefix] as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/dkan/.ahoy/site/vendor/composer/LICENSE b/dkan/.ahoy/site/vendor/composer/LICENSE new file mode 100644 index 000000000..c8d57af8b --- /dev/null +++ b/dkan/.ahoy/site/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) 2015 Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_classmap.php b/dkan/.ahoy/site/vendor/composer/autoload_classmap.php similarity index 100% rename from dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_classmap.php rename to dkan/.ahoy/site/vendor/composer/autoload_classmap.php diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_namespaces.php b/dkan/.ahoy/site/vendor/composer/autoload_namespaces.php similarity index 66% rename from dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_namespaces.php rename to dkan/.ahoy/site/vendor/composer/autoload_namespaces.php index 3812a4add..a7edd32d5 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_namespaces.php +++ b/dkan/.ahoy/site/vendor/composer/autoload_namespaces.php @@ -6,5 +6,5 @@ $baseDir = dirname($vendorDir); return array( - 'JsonSchema' => array($vendorDir . '/justinrainbow/json-schema/src'), + 'Twig_' => array($vendorDir . '/twig/twig/lib'), ); diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_psr4.php b/dkan/.ahoy/site/vendor/composer/autoload_psr4.php similarity index 66% rename from dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_psr4.php rename to dkan/.ahoy/site/vendor/composer/autoload_psr4.php index b265c64a2..57d40095c 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_psr4.php +++ b/dkan/.ahoy/site/vendor/composer/autoload_psr4.php @@ -6,4 +6,5 @@ $baseDir = dirname($vendorDir); return array( + 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), ); diff --git a/dkan/.ahoy/site/vendor/composer/autoload_real.php b/dkan/.ahoy/site/vendor/composer/autoload_real.php new file mode 100644 index 000000000..88095ea6a --- /dev/null +++ b/dkan/.ahoy/site/vendor/composer/autoload_real.php @@ -0,0 +1,50 @@ + $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + + $loader->register(true); + + return $loader; + } +} + +function composerRequire3f438b517b423e0b6622bd8fa4aeb8c6($file) +{ + require $file; +} diff --git a/dkan/.ahoy/site/vendor/composer/installed.json b/dkan/.ahoy/site/vendor/composer/installed.json new file mode 100644 index 000000000..6f8f524a6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/composer/installed.json @@ -0,0 +1,116 @@ +[ + { + "name": "symfony/yaml", + "version": "v3.1.5", + "version_normalized": "3.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "368b9738d4033c8b93454cb0dbd45d305135a6d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/368b9738d4033c8b93454cb0dbd45d305135a6d3", + "reference": "368b9738d4033c8b93454cb0dbd45d305135a6d3", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "time": "2016-09-25 08:27:07", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com" + }, + { + "name": "twig/twig", + "version": "v1.26.1", + "version_normalized": "1.26.1.0", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "a09d8ee17ac1cfea29ed60c83960ad685c6a898d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a09d8ee17ac1cfea29ed60c83960ad685c6a898d", + "reference": "a09d8ee17ac1cfea29ed60c83960ad685c6a898d", + "shasum": "" + }, + "require": { + "php": ">=5.2.7" + }, + "require-dev": { + "symfony/debug": "~2.7", + "symfony/phpunit-bridge": "~2.7" + }, + "time": "2016-10-05 18:57:41", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.26-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ] + } +] diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/CHANGELOG.md b/dkan/.ahoy/site/vendor/symfony/yaml/CHANGELOG.md new file mode 100644 index 000000000..aa0c3fa56 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/CHANGELOG.md @@ -0,0 +1,67 @@ +CHANGELOG +========= + +3.1.0 +----- + + * Strings that are not UTF-8 encoded will be dumped as base64 encoded binary + data. + + * Added support for dumping multi line strings as literal blocks. + + * Added support for parsing base64 encoded binary data when they are tagged + with the `!!binary` tag. + + * Added support for parsing timestamps as `\DateTime` objects: + + ```php + Yaml::parse('2001-12-15 21:59:43.10 -5', Yaml::PARSE_DATETIME); + ``` + + * `\DateTime` and `\DateTimeImmutable` objects are dumped as YAML timestamps. + + * Deprecated usage of `%` at the beginning of an unquoted string. + + * Added support for customizing the YAML parser behavior through an optional bit field: + + ```php + Yaml::parse('{ "foo": "bar", "fiz": "cat" }', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE | Yaml::PARSE_OBJECT | Yaml::PARSE_OBJECT_FOR_MAP); + ``` + + * Added support for customizing the dumped YAML string through an optional bit field: + + ```php + Yaml::dump(array('foo' => new A(), 'bar' => 1), 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT); + ``` + +3.0.0 +----- + + * Yaml::parse() now throws an exception when a blackslash is not escaped + in double-quoted strings + +2.8.0 +----- + + * Deprecated usage of a colon in an unquoted mapping value + * Deprecated usage of @, \`, | and > at the beginning of an unquoted string + * When surrounding strings with double-quotes, you must now escape `\` characters. Not + escaping those characters (when surrounded by double-quotes) is deprecated. + + Before: + + ```yml + class: "Foo\Var" + ``` + + After: + + ```yml + class: "Foo\\Var" + ``` + +2.1.0 +----- + + * Yaml::parse() does not evaluate loaded files as PHP files by default + anymore (call Yaml::enablePhpParsing() to get back the old behavior) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Dumper.php b/dkan/.ahoy/site/vendor/symfony/yaml/Dumper.php new file mode 100644 index 000000000..10ffe82b0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Dumper.php @@ -0,0 +1,114 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +/** + * Dumper dumps PHP variables to YAML strings. + * + * @author Fabien Potencier + */ +class Dumper +{ + /** + * The amount of spaces to use for indentation of nested nodes. + * + * @var int + */ + protected $indentation; + + /** + * @param int $indentation + */ + public function __construct($indentation = 4) + { + if ($indentation < 1) { + throw new \InvalidArgumentException('The indentation must be greater than zero.'); + } + + $this->indentation = $indentation; + } + + /** + * Sets the indentation. + * + * @param int $num The amount of spaces to use for indentation of nested nodes + */ + public function setIndentation($num) + { + @trigger_error('The '.__METHOD__.' method is deprecated since version 3.1 and will be removed in 4.0. Pass the indentation to the constructor instead.', E_USER_DEPRECATED); + + $this->indentation = (int) $num; + } + + /** + * Dumps a PHP value to YAML. + * + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The level of indentation (used internally) + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + * + * @return string The YAML representation of the PHP value + */ + public function dump($input, $inline = 0, $indent = 0, $flags = 0) + { + if (is_bool($flags)) { + @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED); + + if ($flags) { + $flags = Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE; + } else { + $flags = 0; + } + } + + if (func_num_args() >= 5) { + @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_OBJECT flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(4)) { + $flags |= Yaml::DUMP_OBJECT; + } + } + + $output = ''; + $prefix = $indent ? str_repeat(' ', $indent) : ''; + + if ($inline <= 0 || !is_array($input) || empty($input)) { + $output .= $prefix.Inline::dump($input, $flags); + } else { + $isAHash = Inline::isHash($input); + + foreach ($input as $key => $value) { + if ($inline > 1 && Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && is_string($value) && false !== strpos($value, "\n")) { + $output .= sprintf("%s%s%s |\n", $prefix, $isAHash ? Inline::dump($key, $flags).':' : '-', ''); + + foreach (preg_split('/\n|\r\n/', $value) as $row) { + $output .= sprintf("%s%s%s\n", $prefix, str_repeat(' ', $this->indentation), $row); + } + + continue; + } + + $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value); + + $output .= sprintf('%s%s%s%s', + $prefix, + $isAHash ? Inline::dump($key, $flags).':' : '-', + $willBeInlined ? ' ' : "\n", + $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags) + ).($willBeInlined ? "\n" : ''); + } + } + + return $output; + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Escaper.php b/dkan/.ahoy/site/vendor/symfony/yaml/Escaper.php new file mode 100644 index 000000000..a74f14dd9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Escaper.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +/** + * Escaper encapsulates escaping rules for single and double-quoted + * YAML strings. + * + * @author Matthew Lewinski + * + * @internal + */ +class Escaper +{ + // Characters that would cause a dumped string to require double quoting. + const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9"; + + // Mapping arrays for escaping a double quoted string. The backslash is + // first to ensure proper escaping because str_replace operates iteratively + // on the input arrays. This ordering of the characters avoids the use of strtr, + // which performs more slowly. + private static $escapees = array('\\', '\\\\', '\\"', '"', + "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", + "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", + "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", + "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", + "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9"); + private static $escaped = array('\\\\', '\\"', '\\\\', '\\"', + '\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a', + '\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f', + '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17', + '\\x18', '\\x19', '\\x1a', '\\e', '\\x1c', '\\x1d', '\\x1e', '\\x1f', + '\\N', '\\_', '\\L', '\\P'); + + /** + * Determines if a PHP value would require double quoting in YAML. + * + * @param string $value A PHP value + * + * @return bool True if the value would require double quotes + */ + public static function requiresDoubleQuoting($value) + { + return preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value); + } + + /** + * Escapes and surrounds a PHP value with double quotes. + * + * @param string $value A PHP value + * + * @return string The quoted, escaped string + */ + public static function escapeWithDoubleQuotes($value) + { + return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value)); + } + + /** + * Determines if a PHP value would require single quoting in YAML. + * + * @param string $value A PHP value + * + * @return bool True if the value would require single quotes + */ + public static function requiresSingleQuoting($value) + { + // Determines if a PHP value is entirely composed of a value that would + // require single quoting in YAML. + if (in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'))) { + return true; + } + + // Determines if the PHP value contains any single characters that would + // cause it to require single quoting in YAML. + return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value); + } + + /** + * Escapes and surrounds a PHP value with single quotes. + * + * @param string $value A PHP value + * + * @return string The quoted, escaped string + */ + public static function escapeWithSingleQuotes($value) + { + return sprintf("'%s'", str_replace('\'', '\'\'', $value)); + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Exception/DumpException.php b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/DumpException.php new file mode 100644 index 000000000..cce972f24 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/DumpException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during dumping. + * + * @author Fabien Potencier + */ +class DumpException extends RuntimeException +{ +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Exception/ExceptionInterface.php b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/ExceptionInterface.php new file mode 100644 index 000000000..ad850eea1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception interface for all exceptions thrown by the component. + * + * @author Fabien Potencier + */ +interface ExceptionInterface +{ +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Exception/ParseException.php b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/ParseException.php new file mode 100644 index 000000000..ba3be7d4f --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/ParseException.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during parsing. + * + * @author Fabien Potencier + */ +class ParseException extends RuntimeException +{ + private $parsedFile; + private $parsedLine; + private $snippet; + private $rawMessage; + + /** + * Constructor. + * + * @param string $message The error message + * @param int $parsedLine The line where the error occurred + * @param int $snippet The snippet of code near the problem + * @param string $parsedFile The file name where the error occurred + * @param \Exception $previous The previous exception + */ + public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null) + { + $this->parsedFile = $parsedFile; + $this->parsedLine = $parsedLine; + $this->snippet = $snippet; + $this->rawMessage = $message; + + $this->updateRepr(); + + parent::__construct($this->message, 0, $previous); + } + + /** + * Gets the snippet of code near the error. + * + * @return string The snippet of code + */ + public function getSnippet() + { + return $this->snippet; + } + + /** + * Sets the snippet of code near the error. + * + * @param string $snippet The code snippet + */ + public function setSnippet($snippet) + { + $this->snippet = $snippet; + + $this->updateRepr(); + } + + /** + * Gets the filename where the error occurred. + * + * This method returns null if a string is parsed. + * + * @return string The filename + */ + public function getParsedFile() + { + return $this->parsedFile; + } + + /** + * Sets the filename where the error occurred. + * + * @param string $parsedFile The filename + */ + public function setParsedFile($parsedFile) + { + $this->parsedFile = $parsedFile; + + $this->updateRepr(); + } + + /** + * Gets the line where the error occurred. + * + * @return int The file line + */ + public function getParsedLine() + { + return $this->parsedLine; + } + + /** + * Sets the line where the error occurred. + * + * @param int $parsedLine The file line + */ + public function setParsedLine($parsedLine) + { + $this->parsedLine = $parsedLine; + + $this->updateRepr(); + } + + private function updateRepr() + { + $this->message = $this->rawMessage; + + $dot = false; + if ('.' === substr($this->message, -1)) { + $this->message = substr($this->message, 0, -1); + $dot = true; + } + + if (null !== $this->parsedFile) { + $this->message .= sprintf(' in %s', json_encode($this->parsedFile, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); + } + + if ($this->parsedLine >= 0) { + $this->message .= sprintf(' at line %d', $this->parsedLine); + } + + if ($this->snippet) { + $this->message .= sprintf(' (near "%s")', $this->snippet); + } + + if ($dot) { + $this->message .= '.'; + } + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Exception/RuntimeException.php b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/RuntimeException.php new file mode 100644 index 000000000..3f36b73be --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Exception/RuntimeException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during parsing. + * + * @author Romain Neutron + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Inline.php b/dkan/.ahoy/site/vendor/symfony/yaml/Inline.php new file mode 100644 index 000000000..6853e5a0b --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Inline.php @@ -0,0 +1,685 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\ParseException; +use Symfony\Component\Yaml\Exception\DumpException; + +/** + * Inline implements a YAML parser/dumper for the YAML inline syntax. + * + * @author Fabien Potencier + * + * @internal + */ +class Inline +{ + const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')'; + + private static $exceptionOnInvalidType = false; + private static $objectSupport = false; + private static $objectForMap = false; + + /** + * Converts a YAML string to a PHP array. + * + * @param string $value A YAML string + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * @param array $references Mapping of variable names to values + * + * @return array A PHP array representing the YAML string + * + * @throws ParseException + */ + public static function parse($value, $flags = 0, $references = array()) + { + if (is_bool($flags)) { + @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED); + + if ($flags) { + $flags = Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE; + } else { + $flags = 0; + } + } + + if (func_num_args() >= 3 && !is_array($references)) { + @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT flag instead.', E_USER_DEPRECATED); + + if ($references) { + $flags |= Yaml::PARSE_OBJECT; + } + + if (func_num_args() >= 4) { + @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(3)) { + $flags |= Yaml::PARSE_OBJECT_FOR_MAP; + } + } + + if (func_num_args() >= 5) { + $references = func_get_arg(4); + } else { + $references = array(); + } + } + + self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags); + self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags); + self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags); + + $value = trim($value); + + if ('' === $value) { + return ''; + } + + if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } + + $i = 0; + switch ($value[0]) { + case '[': + $result = self::parseSequence($value, $flags, $i, $references); + ++$i; + break; + case '{': + $result = self::parseMapping($value, $flags, $i, $references); + ++$i; + break; + default: + $result = self::parseScalar($value, $flags, null, array('"', "'"), $i, true, $references); + } + + // some comments are allowed at the end + if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) { + throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i))); + } + + if (isset($mbEncoding)) { + mb_internal_encoding($mbEncoding); + } + + return $result; + } + + /** + * Dumps a given PHP variable to a YAML string. + * + * @param mixed $value The PHP variable to convert + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + * + * @return string The YAML string representing the PHP array + * + * @throws DumpException When trying to dump PHP resource + */ + public static function dump($value, $flags = 0) + { + if (is_bool($flags)) { + @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED); + + if ($flags) { + $flags = Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE; + } else { + $flags = 0; + } + } + + if (func_num_args() >= 3) { + @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_OBJECT flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(2)) { + $flags |= Yaml::DUMP_OBJECT; + } + } + + switch (true) { + case is_resource($value): + if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { + throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value))); + } + + return 'null'; + case $value instanceof \DateTimeInterface: + return $value->format('c'); + case is_object($value): + if (Yaml::DUMP_OBJECT & $flags) { + return '!php/object:'.serialize($value); + } + + if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) { + return self::dumpArray((array) $value, $flags); + } + + if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { + throw new DumpException('Object support when dumping a YAML file has been disabled.'); + } + + return 'null'; + case is_array($value): + return self::dumpArray($value, $flags); + case null === $value: + return 'null'; + case true === $value: + return 'true'; + case false === $value: + return 'false'; + case ctype_digit($value): + return is_string($value) ? "'$value'" : (int) $value; + case is_numeric($value): + $locale = setlocale(LC_NUMERIC, 0); + if (false !== $locale) { + setlocale(LC_NUMERIC, 'C'); + } + if (is_float($value)) { + $repr = (string) $value; + if (is_infinite($value)) { + $repr = str_ireplace('INF', '.Inf', $repr); + } elseif (floor($value) == $value && $repr == $value) { + // Preserve float data type since storing a whole number will result in integer value. + $repr = '!!float '.$repr; + } + } else { + $repr = is_string($value) ? "'$value'" : (string) $value; + } + if (false !== $locale) { + setlocale(LC_NUMERIC, $locale); + } + + return $repr; + case '' == $value: + return "''"; + case self::isBinaryString($value): + return '!!binary '.base64_encode($value); + case Escaper::requiresDoubleQuoting($value): + return Escaper::escapeWithDoubleQuotes($value); + case Escaper::requiresSingleQuoting($value): + case preg_match(self::getHexRegex(), $value): + case preg_match(self::getTimestampRegex(), $value): + return Escaper::escapeWithSingleQuotes($value); + default: + return $value; + } + } + + /** + * Check if given array is hash or just normal indexed array. + * + * @internal + * + * @param array $value The PHP array to check + * + * @return bool true if value is hash array, false otherwise + */ + public static function isHash(array $value) + { + $expectedKey = 0; + + foreach ($value as $key => $val) { + if ($key !== $expectedKey++) { + return true; + } + } + + return false; + } + + /** + * Dumps a PHP array to a YAML string. + * + * @param array $value The PHP array to dump + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + * + * @return string The YAML string representing the PHP array + */ + private static function dumpArray($value, $flags) + { + // array + if ($value && !self::isHash($value)) { + $output = array(); + foreach ($value as $val) { + $output[] = self::dump($val, $flags); + } + + return sprintf('[%s]', implode(', ', $output)); + } + + // hash + $output = array(); + foreach ($value as $key => $val) { + $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags)); + } + + return sprintf('{ %s }', implode(', ', $output)); + } + + /** + * Parses a scalar to a YAML string. + * + * @param string $scalar + * @param int $flags + * @param string $delimiters + * @param array $stringDelimiters + * @param int &$i + * @param bool $evaluate + * @param array $references + * + * @return string A YAML string + * + * @throws ParseException When malformed inline YAML string is parsed + * + * @internal + */ + public static function parseScalar($scalar, $flags = 0, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true, $references = array()) + { + if (in_array($scalar[$i], $stringDelimiters)) { + // quoted scalar + $output = self::parseQuotedScalar($scalar, $i); + + if (null !== $delimiters) { + $tmp = ltrim(substr($scalar, $i), ' '); + if (!in_array($tmp[0], $delimiters)) { + throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i))); + } + } + } else { + // "normal" string + if (!$delimiters) { + $output = substr($scalar, $i); + $i += strlen($output); + + // remove comments + if (preg_match('/[ \t]+#/', $output, $match, PREG_OFFSET_CAPTURE)) { + $output = substr($output, 0, $match[0][1]); + } + } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) { + $output = $match[1]; + $i += strlen($output); + } else { + throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar)); + } + + // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >) + if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0])) { + throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0])); + } + + if ($output && '%' === $output[0]) { + @trigger_error(sprintf('Not quoting the scalar "%s" starting with the "%%" indicator character is deprecated since Symfony 3.1 and will throw a ParseException in 4.0.' , $output), E_USER_DEPRECATED); + } + + if ($evaluate) { + $output = self::evaluateScalar($output, $flags, $references); + } + } + + return $output; + } + + /** + * Parses a quoted scalar to YAML. + * + * @param string $scalar + * @param int &$i + * + * @return string A YAML string + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseQuotedScalar($scalar, &$i) + { + if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) { + throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i))); + } + + $output = substr($match[0], 1, strlen($match[0]) - 2); + + $unescaper = new Unescaper(); + if ('"' == $scalar[$i]) { + $output = $unescaper->unescapeDoubleQuotedString($output); + } else { + $output = $unescaper->unescapeSingleQuotedString($output); + } + + $i += strlen($match[0]); + + return $output; + } + + /** + * Parses a sequence to a YAML string. + * + * @param string $sequence + * @param int $flags + * @param int &$i + * @param array $references + * + * @return string A YAML string + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseSequence($sequence, $flags, &$i = 0, $references = array()) + { + $output = array(); + $len = strlen($sequence); + ++$i; + + // [foo, bar, ...] + while ($i < $len) { + switch ($sequence[$i]) { + case '[': + // nested sequence + $output[] = self::parseSequence($sequence, $flags, $i, $references); + break; + case '{': + // nested mapping + $output[] = self::parseMapping($sequence, $flags, $i, $references); + break; + case ']': + return $output; + case ',': + case ' ': + break; + default: + $isQuoted = in_array($sequence[$i], array('"', "'")); + $value = self::parseScalar($sequence, $flags, array(',', ']'), array('"', "'"), $i, true, $references); + + // the value can be an array if a reference has been resolved to an array var + if (is_string($value) && !$isQuoted && false !== strpos($value, ': ')) { + // embedded mapping? + try { + $pos = 0; + $value = self::parseMapping('{'.$value.'}', $flags, $pos, $references); + } catch (\InvalidArgumentException $e) { + // no, it's not + } + } + + $output[] = $value; + + --$i; + } + + ++$i; + } + + throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence)); + } + + /** + * Parses a mapping to a YAML string. + * + * @param string $mapping + * @param int $flags + * @param int &$i + * @param array $references + * + * @return string A YAML string + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseMapping($mapping, $flags, &$i = 0, $references = array()) + { + $output = array(); + $len = strlen($mapping); + ++$i; + + // {foo: bar, bar:foo, ...} + while ($i < $len) { + switch ($mapping[$i]) { + case ' ': + case ',': + ++$i; + continue 2; + case '}': + if (self::$objectForMap) { + return (object) $output; + } + + return $output; + } + + // key + $key = self::parseScalar($mapping, $flags, array(':', ' '), array('"', "'"), $i, false); + + // value + $done = false; + + while ($i < $len) { + switch ($mapping[$i]) { + case '[': + // nested sequence + $value = self::parseSequence($mapping, $flags, $i, $references); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + if (!isset($output[$key])) { + $output[$key] = $value; + } + $done = true; + break; + case '{': + // nested mapping + $value = self::parseMapping($mapping, $flags, $i, $references); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + if (!isset($output[$key])) { + $output[$key] = $value; + } + $done = true; + break; + case ':': + case ' ': + break; + default: + $value = self::parseScalar($mapping, $flags, array(',', '}'), array('"', "'"), $i, true, $references); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + if (!isset($output[$key])) { + $output[$key] = $value; + } + $done = true; + --$i; + } + + ++$i; + + if ($done) { + continue 2; + } + } + } + + throw new ParseException(sprintf('Malformed inline YAML string %s', $mapping)); + } + + /** + * Evaluates scalars and replaces magic values. + * + * @param string $scalar + * @param int $flags + * @param array $references + * + * @return string A YAML string + * + * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved + */ + private static function evaluateScalar($scalar, $flags, $references = array()) + { + $scalar = trim($scalar); + $scalarLower = strtolower($scalar); + + if (0 === strpos($scalar, '*')) { + if (false !== $pos = strpos($scalar, '#')) { + $value = substr($scalar, 1, $pos - 2); + } else { + $value = substr($scalar, 1); + } + + // an unquoted * + if (false === $value || '' === $value) { + throw new ParseException('A reference must contain at least one character.'); + } + + if (!array_key_exists($value, $references)) { + throw new ParseException(sprintf('Reference "%s" does not exist.', $value)); + } + + return $references[$value]; + } + + switch (true) { + case 'null' === $scalarLower: + case '' === $scalar: + case '~' === $scalar: + return; + case 'true' === $scalarLower: + return true; + case 'false' === $scalarLower: + return false; + // Optimise for returning strings. + case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]): + switch (true) { + case 0 === strpos($scalar, '!str'): + return (string) substr($scalar, 5); + case 0 === strpos($scalar, '! '): + return (int) self::parseScalar(substr($scalar, 2), $flags); + case 0 === strpos($scalar, '!php/object:'): + if (self::$objectSupport) { + return unserialize(substr($scalar, 12)); + } + + if (self::$exceptionOnInvalidType) { + throw new ParseException('Object support when parsing a YAML file has been disabled.'); + } + + return; + case 0 === strpos($scalar, '!!php/object:'): + if (self::$objectSupport) { + @trigger_error('The !!php/object tag to indicate dumped PHP objects is deprecated since version 3.1 and will be removed in 4.0. Use the !php/object tag instead.', E_USER_DEPRECATED); + + return unserialize(substr($scalar, 13)); + } + + if (self::$exceptionOnInvalidType) { + throw new ParseException('Object support when parsing a YAML file has been disabled.'); + } + + return; + case 0 === strpos($scalar, '!!float '): + return (float) substr($scalar, 8); + case ctype_digit($scalar): + $raw = $scalar; + $cast = (int) $scalar; + + return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw); + case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)): + $raw = $scalar; + $cast = (int) $scalar; + + return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw === (string) $cast) ? $cast : $raw); + case is_numeric($scalar): + case preg_match(self::getHexRegex(), $scalar): + return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar; + case '.inf' === $scalarLower: + case '.nan' === $scalarLower: + return -log(0); + case '-.inf' === $scalarLower: + return log(0); + case 0 === strpos($scalar, '!!binary '): + return self::evaluateBinaryScalar(substr($scalar, 9)); + case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar): + return (float) str_replace(',', '', $scalar); + case preg_match(self::getTimestampRegex(), $scalar): + if (Yaml::PARSE_DATETIME & $flags) { + return new \DateTime($scalar, new \DateTimeZone('UTC')); + } + + $timeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $time = strtotime($scalar); + date_default_timezone_set($timeZone); + + return $time; + } + default: + return (string) $scalar; + } + } + + /** + * @param string $scalar + * + * @return string + * + * @internal + */ + public static function evaluateBinaryScalar($scalar) + { + $parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar)); + + if (0 !== (strlen($parsedBinaryData) % 4)) { + throw new ParseException(sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', strlen($parsedBinaryData))); + } + + if (!preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) { + throw new ParseException(sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData)); + } + + return base64_decode($parsedBinaryData, true); + } + + private static function isBinaryString($value) + { + return !preg_match('//u', $value) || preg_match('/[^\x09-\x0d\x20-\xff]/', $value); + } + + /** + * Gets a regex that matches a YAML date. + * + * @return string The regular expression + * + * @see http://www.yaml.org/spec/1.2/spec.html#id2761573 + */ + private static function getTimestampRegex() + { + return <<[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)? + $~x +EOF; + } + + /** + * Gets a regex that matches a YAML number in hexadecimal notation. + * + * @return string + */ + private static function getHexRegex() + { + return '~^0x[0-9a-f]++$~i'; + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/LICENSE b/dkan/.ahoy/site/vendor/symfony/yaml/LICENSE new file mode 100644 index 000000000..12a74531e --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2016 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Parser.php b/dkan/.ahoy/site/vendor/symfony/yaml/Parser.php new file mode 100644 index 000000000..de908c8a3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Parser.php @@ -0,0 +1,845 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\ParseException; + +/** + * Parser parses YAML strings to convert them to PHP arrays. + * + * @author Fabien Potencier + */ +class Parser +{ + const TAG_PATTERN = '((?P![\w!.\/:-]+) +)?'; + const BLOCK_SCALAR_HEADER_PATTERN = '(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?'; + + private $offset = 0; + private $totalNumberOfLines; + private $lines = array(); + private $currentLineNb = -1; + private $currentLine = ''; + private $refs = array(); + private $skippedLineNumbers = array(); + private $locallySkippedLineNumbers = array(); + + /** + * Constructor. + * + * @param int $offset The offset of YAML document (used for line numbers in error messages) + * @param int|null $totalNumberOfLines The overall number of lines being parsed + * @param int[] $skippedLineNumbers Number of comment lines that have been skipped by the parser + */ + public function __construct($offset = 0, $totalNumberOfLines = null, array $skippedLineNumbers = array()) + { + $this->offset = $offset; + $this->totalNumberOfLines = $totalNumberOfLines; + $this->skippedLineNumbers = $skippedLineNumbers; + } + + /** + * Parses a YAML string to a PHP value. + * + * @param string $value A YAML string + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @return mixed A PHP value + * + * @throws ParseException If the YAML is not valid + */ + public function parse($value, $flags = 0) + { + if (is_bool($flags)) { + @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED); + + if ($flags) { + $flags = Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE; + } else { + $flags = 0; + } + } + + if (func_num_args() >= 3) { + @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(2)) { + $flags |= Yaml::PARSE_OBJECT; + } + } + + if (func_num_args() >= 4) { + @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(3)) { + $flags |= Yaml::PARSE_OBJECT_FOR_MAP; + } + } + + if (!preg_match('//u', $value)) { + throw new ParseException('The YAML value does not appear to be valid UTF-8.'); + } + $this->currentLineNb = -1; + $this->currentLine = ''; + $value = $this->cleanup($value); + $this->lines = explode("\n", $value); + + if (null === $this->totalNumberOfLines) { + $this->totalNumberOfLines = count($this->lines); + } + + if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('UTF-8'); + } + + $data = array(); + $context = null; + $allowOverwrite = false; + while ($this->moveToNextLine()) { + if ($this->isCurrentLineEmpty()) { + continue; + } + + // tab? + if ("\t" === $this->currentLine[0]) { + throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + $isRef = $mergeNode = false; + if (preg_match('#^\-((?P\s+)(?P.+?))?\s*$#u', $this->currentLine, $values)) { + if ($context && 'mapping' == $context) { + throw new ParseException('You cannot define a sequence item when in a mapping', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + $context = 'sequence'; + + if (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#u', $values['value'], $matches)) { + $isRef = $matches['ref']; + $values['value'] = $matches['value']; + } + + // array + if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { + $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags); + } else { + if (isset($values['leadspaces']) + && preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P.+?))?\s*$#u', $values['value'], $matches) + ) { + // this is a compact notation element, add to next block and parse + $block = $values['value']; + if ($this->isNextLineIndented()) { + $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1); + } + + $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags); + } else { + $data[] = $this->parseValue($values['value'], $flags, $context); + } + } + if ($isRef) { + $this->refs[$isRef] = end($data); + } + } elseif (preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P.+?))?\s*$#u', $this->currentLine, $values) && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'")))) { + if ($context && 'sequence' == $context) { + throw new ParseException('You cannot define a mapping item when in a sequence', $this->currentLineNb + 1, $this->currentLine); + } + $context = 'mapping'; + + // force correct settings + Inline::parse(null, $flags, $this->refs); + try { + $key = Inline::parseScalar($values['key']); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + + // Convert float keys to strings, to avoid being converted to integers by PHP + if (is_float($key)) { + $key = (string) $key; + } + + if ('<<' === $key) { + $mergeNode = true; + $allowOverwrite = true; + if (isset($values['value']) && 0 === strpos($values['value'], '*')) { + $refName = substr($values['value'], 1); + if (!array_key_exists($refName, $this->refs)) { + throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + $refValue = $this->refs[$refName]; + + if (!is_array($refValue)) { + throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + foreach ($refValue as $key => $value) { + if (!isset($data[$key])) { + $data[$key] = $value; + } + } + } else { + if (isset($values['value']) && $values['value'] !== '') { + $value = $values['value']; + } else { + $value = $this->getNextEmbedBlock(); + } + $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags); + + if (!is_array($parsed)) { + throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + if (isset($parsed[0])) { + // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes + // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier + // in the sequence override keys specified in later mapping nodes. + foreach ($parsed as $parsedItem) { + if (!is_array($parsedItem)) { + throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem); + } + + foreach ($parsedItem as $key => $value) { + if (!isset($data[$key])) { + $data[$key] = $value; + } + } + } + } else { + // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the + // current mapping, unless the key already exists in it. + foreach ($parsed as $key => $value) { + if (!isset($data[$key])) { + $data[$key] = $value; + } + } + } + } + } elseif (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#u', $values['value'], $matches)) { + $isRef = $matches['ref']; + $values['value'] = $matches['value']; + } + + if ($mergeNode) { + // Merge keys + } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { + // hash + // if next line is less indented or equal, then it means that the current value is null + if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) { + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if ($allowOverwrite || !isset($data[$key])) { + $data[$key] = null; + } + } else { + $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags); + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if ($allowOverwrite || !isset($data[$key])) { + $data[$key] = $value; + } + } + } else { + $value = $this->parseValue($values['value'], $flags, $context); + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if ($allowOverwrite || !isset($data[$key])) { + $data[$key] = $value; + } + } + if ($isRef) { + $this->refs[$isRef] = $data[$key]; + } + } else { + // multiple documents are not supported + if ('---' === $this->currentLine) { + throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine); + } + + // 1-liner optionally followed by newline(s) + if (is_string($value) && $this->lines[0] === trim($value)) { + try { + $value = Inline::parse($this->lines[0], $flags, $this->refs); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + + if (isset($mbEncoding)) { + mb_internal_encoding($mbEncoding); + } + + return $value; + } + + switch (preg_last_error()) { + case PREG_INTERNAL_ERROR: + $error = 'Internal PCRE error.'; + break; + case PREG_BACKTRACK_LIMIT_ERROR: + $error = 'pcre.backtrack_limit reached.'; + break; + case PREG_RECURSION_LIMIT_ERROR: + $error = 'pcre.recursion_limit reached.'; + break; + case PREG_BAD_UTF8_ERROR: + $error = 'Malformed UTF-8 data.'; + break; + case PREG_BAD_UTF8_OFFSET_ERROR: + $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.'; + break; + default: + $error = 'Unable to parse.'; + } + + throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + } + + if (isset($mbEncoding)) { + mb_internal_encoding($mbEncoding); + } + + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && !is_object($data) && 'mapping' === $context) { + $object = new \stdClass(); + + foreach ($data as $key => $value) { + $object->$key = $value; + } + + $data = $object; + } + + return empty($data) ? null : $data; + } + + private function parseBlock($offset, $yaml, $flags) + { + $skippedLineNumbers = $this->skippedLineNumbers; + + foreach ($this->locallySkippedLineNumbers as $lineNumber) { + if ($lineNumber < $offset) { + continue; + } + + $skippedLineNumbers[] = $lineNumber; + } + + $parser = new self($offset, $this->totalNumberOfLines, $skippedLineNumbers); + $parser->refs = &$this->refs; + + return $parser->parse($yaml, $flags); + } + + /** + * Returns the current line number (takes the offset into account). + * + * @return int The current line number + */ + private function getRealCurrentLineNb() + { + $realCurrentLineNumber = $this->currentLineNb + $this->offset; + + foreach ($this->skippedLineNumbers as $skippedLineNumber) { + if ($skippedLineNumber > $realCurrentLineNumber) { + break; + } + + ++$realCurrentLineNumber; + } + + return $realCurrentLineNumber; + } + + /** + * Returns the current line indentation. + * + * @return int The current line indentation + */ + private function getCurrentLineIndentation() + { + return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' ')); + } + + /** + * Returns the next embed block of YAML. + * + * @param int $indentation The indent level at which the block is to be read, or null for default + * @param bool $inSequence True if the enclosing data structure is a sequence + * + * @return string A YAML string + * + * @throws ParseException When indentation problem are detected + */ + private function getNextEmbedBlock($indentation = null, $inSequence = false) + { + $oldLineIndentation = $this->getCurrentLineIndentation(); + $blockScalarIndentations = array(); + + if ($this->isBlockScalarHeader()) { + $blockScalarIndentations[] = $this->getCurrentLineIndentation(); + } + + if (!$this->moveToNextLine()) { + return; + } + + if (null === $indentation) { + $newIndent = $this->getCurrentLineIndentation(); + + $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem(); + + if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) { + throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + } else { + $newIndent = $indentation; + } + + $data = array(); + if ($this->getCurrentLineIndentation() >= $newIndent) { + $data[] = substr($this->currentLine, $newIndent); + } else { + $this->moveToPreviousLine(); + + return; + } + + if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) { + // the previous line contained a dash but no item content, this line is a sequence item with the same indentation + // and therefore no nested list or mapping + $this->moveToPreviousLine(); + + return; + } + + $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem(); + + if (empty($blockScalarIndentations) && $this->isBlockScalarHeader()) { + $blockScalarIndentations[] = $this->getCurrentLineIndentation(); + } + + $previousLineIndentation = $this->getCurrentLineIndentation(); + + while ($this->moveToNextLine()) { + $indent = $this->getCurrentLineIndentation(); + + // terminate all block scalars that are more indented than the current line + if (!empty($blockScalarIndentations) && $indent < $previousLineIndentation && trim($this->currentLine) !== '') { + foreach ($blockScalarIndentations as $key => $blockScalarIndentation) { + if ($blockScalarIndentation >= $this->getCurrentLineIndentation()) { + unset($blockScalarIndentations[$key]); + } + } + } + + if (empty($blockScalarIndentations) && !$this->isCurrentLineComment() && $this->isBlockScalarHeader()) { + $blockScalarIndentations[] = $this->getCurrentLineIndentation(); + } + + $previousLineIndentation = $indent; + + if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) { + $this->moveToPreviousLine(); + break; + } + + if ($this->isCurrentLineBlank()) { + $data[] = substr($this->currentLine, $newIndent); + continue; + } + + // we ignore "comment" lines only when we are not inside a scalar block + if (empty($blockScalarIndentations) && $this->isCurrentLineComment()) { + // remember ignored comment lines (they are used later in nested + // parser calls to determine real line numbers) + // + // CAUTION: beware to not populate the global property here as it + // will otherwise influence the getRealCurrentLineNb() call here + // for consecutive comment lines and subsequent embedded blocks + $this->locallySkippedLineNumbers[] = $this->getRealCurrentLineNb(); + + continue; + } + + if ($indent >= $newIndent) { + $data[] = substr($this->currentLine, $newIndent); + } elseif (0 == $indent) { + $this->moveToPreviousLine(); + + break; + } else { + throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + } + + return implode("\n", $data); + } + + /** + * Moves the parser to the next line. + * + * @return bool + */ + private function moveToNextLine() + { + if ($this->currentLineNb >= count($this->lines) - 1) { + return false; + } + + $this->currentLine = $this->lines[++$this->currentLineNb]; + + return true; + } + + /** + * Moves the parser to the previous line. + * + * @return bool + */ + private function moveToPreviousLine() + { + if ($this->currentLineNb < 1) { + return false; + } + + $this->currentLine = $this->lines[--$this->currentLineNb]; + + return true; + } + + /** + * Parses a YAML value. + * + * @param string $value A YAML value + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * @param string $context The parser context (either sequence or mapping) + * + * @return mixed A PHP value + * + * @throws ParseException When reference does not exist + */ + private function parseValue($value, $flags, $context) + { + if (0 === strpos($value, '*')) { + if (false !== $pos = strpos($value, '#')) { + $value = substr($value, 1, $pos - 2); + } else { + $value = substr($value, 1); + } + + if (!array_key_exists($value, $this->refs)) { + throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine); + } + + return $this->refs[$value]; + } + + if (preg_match('/^'.self::TAG_PATTERN.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) { + $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : ''; + + $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), (int) abs($modifiers)); + + if (isset($matches['tag']) && '!!binary' === $matches['tag']) { + return Inline::evaluateBinaryScalar($data); + } + + return $data; + } + + try { + $parsedValue = Inline::parse($value, $flags, $this->refs); + + if ('mapping' === $context && is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) { + throw new ParseException('A colon cannot be used in an unquoted mapping value.'); + } + + return $parsedValue; + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + } + + /** + * Parses a block scalar. + * + * @param string $style The style indicator that was used to begin this block scalar (| or >) + * @param string $chomping The chomping indicator that was used to begin this block scalar (+ or -) + * @param int $indentation The indentation indicator that was used to begin this block scalar + * + * @return string The text value + */ + private function parseBlockScalar($style, $chomping = '', $indentation = 0) + { + $notEOF = $this->moveToNextLine(); + if (!$notEOF) { + return ''; + } + + $isCurrentLineBlank = $this->isCurrentLineBlank(); + $blockLines = array(); + + // leading blank lines are consumed before determining indentation + while ($notEOF && $isCurrentLineBlank) { + // newline only if not EOF + if ($notEOF = $this->moveToNextLine()) { + $blockLines[] = ''; + $isCurrentLineBlank = $this->isCurrentLineBlank(); + } + } + + // determine indentation if not specified + if (0 === $indentation) { + if (preg_match('/^ +/', $this->currentLine, $matches)) { + $indentation = strlen($matches[0]); + } + } + + if ($indentation > 0) { + $pattern = sprintf('/^ {%d}(.*)$/', $indentation); + + while ( + $notEOF && ( + $isCurrentLineBlank || + preg_match($pattern, $this->currentLine, $matches) + ) + ) { + if ($isCurrentLineBlank && strlen($this->currentLine) > $indentation) { + $blockLines[] = substr($this->currentLine, $indentation); + } elseif ($isCurrentLineBlank) { + $blockLines[] = ''; + } else { + $blockLines[] = $matches[1]; + } + + // newline only if not EOF + if ($notEOF = $this->moveToNextLine()) { + $isCurrentLineBlank = $this->isCurrentLineBlank(); + } + } + } elseif ($notEOF) { + $blockLines[] = ''; + } + + if ($notEOF) { + $blockLines[] = ''; + $this->moveToPreviousLine(); + } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) { + $blockLines[] = ''; + } + + // folded style + if ('>' === $style) { + $text = ''; + $previousLineIndented = false; + $previousLineBlank = false; + + for ($i = 0; $i < count($blockLines); ++$i) { + if ('' === $blockLines[$i]) { + $text .= "\n"; + $previousLineIndented = false; + $previousLineBlank = true; + } elseif (' ' === $blockLines[$i][0]) { + $text .= "\n".$blockLines[$i]; + $previousLineIndented = true; + $previousLineBlank = false; + } elseif ($previousLineIndented) { + $text .= "\n".$blockLines[$i]; + $previousLineIndented = false; + $previousLineBlank = false; + } elseif ($previousLineBlank || 0 === $i) { + $text .= $blockLines[$i]; + $previousLineIndented = false; + $previousLineBlank = false; + } else { + $text .= ' '.$blockLines[$i]; + $previousLineIndented = false; + $previousLineBlank = false; + } + } + } else { + $text = implode("\n", $blockLines); + } + + // deal with trailing newlines + if ('' === $chomping) { + $text = preg_replace('/\n+$/', "\n", $text); + } elseif ('-' === $chomping) { + $text = preg_replace('/\n+$/', '', $text); + } + + return $text; + } + + /** + * Returns true if the next line is indented. + * + * @return bool Returns true if the next line is indented, false otherwise + */ + private function isNextLineIndented() + { + $currentIndentation = $this->getCurrentLineIndentation(); + $EOF = !$this->moveToNextLine(); + + while (!$EOF && $this->isCurrentLineEmpty()) { + $EOF = !$this->moveToNextLine(); + } + + if ($EOF) { + return false; + } + + $ret = false; + if ($this->getCurrentLineIndentation() > $currentIndentation) { + $ret = true; + } + + $this->moveToPreviousLine(); + + return $ret; + } + + /** + * Returns true if the current line is blank or if it is a comment line. + * + * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise + */ + private function isCurrentLineEmpty() + { + return $this->isCurrentLineBlank() || $this->isCurrentLineComment(); + } + + /** + * Returns true if the current line is blank. + * + * @return bool Returns true if the current line is blank, false otherwise + */ + private function isCurrentLineBlank() + { + return '' == trim($this->currentLine, ' '); + } + + /** + * Returns true if the current line is a comment line. + * + * @return bool Returns true if the current line is a comment line, false otherwise + */ + private function isCurrentLineComment() + { + //checking explicitly the first char of the trim is faster than loops or strpos + $ltrimmedLine = ltrim($this->currentLine, ' '); + + return '' !== $ltrimmedLine && $ltrimmedLine[0] === '#'; + } + + private function isCurrentLineLastLineInDocument() + { + return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1); + } + + /** + * Cleanups a YAML string to be parsed. + * + * @param string $value The input YAML string + * + * @return string A cleaned up YAML string + */ + private function cleanup($value) + { + $value = str_replace(array("\r\n", "\r"), "\n", $value); + + // strip YAML header + $count = 0; + $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count); + $this->offset += $count; + + // remove leading comments + $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count); + if ($count == 1) { + // items have been removed, update the offset + $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); + $value = $trimmedValue; + } + + // remove start of the document marker (---) + $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count); + if ($count == 1) { + // items have been removed, update the offset + $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); + $value = $trimmedValue; + + // remove end of the document marker (...) + $value = preg_replace('#\.\.\.\s*$#', '', $value); + } + + return $value; + } + + /** + * Returns true if the next line starts unindented collection. + * + * @return bool Returns true if the next line starts unindented collection, false otherwise + */ + private function isNextLineUnIndentedCollection() + { + $currentIndentation = $this->getCurrentLineIndentation(); + $notEOF = $this->moveToNextLine(); + + while ($notEOF && $this->isCurrentLineEmpty()) { + $notEOF = $this->moveToNextLine(); + } + + if (false === $notEOF) { + return false; + } + + $ret = false; + if ( + $this->getCurrentLineIndentation() == $currentIndentation + && + $this->isStringUnIndentedCollectionItem() + ) { + $ret = true; + } + + $this->moveToPreviousLine(); + + return $ret; + } + + /** + * Returns true if the string is un-indented collection item. + * + * @return bool Returns true if the string is un-indented collection item, false otherwise + */ + private function isStringUnIndentedCollectionItem() + { + return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- '); + } + + /** + * Tests whether or not the current line is the header of a block scalar. + * + * @return bool + */ + private function isBlockScalarHeader() + { + return (bool) preg_match('~'.self::BLOCK_SCALAR_HEADER_PATTERN.'$~', $this->currentLine); + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/README.md b/dkan/.ahoy/site/vendor/symfony/yaml/README.md new file mode 100644 index 000000000..0d324881c --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/README.md @@ -0,0 +1,13 @@ +Yaml Component +============== + +The Yaml component loads and dumps YAML files. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/yaml/index.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/DumperTest.php b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/DumperTest.php new file mode 100644 index 000000000..afc491209 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/DumperTest.php @@ -0,0 +1,370 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Tests; + +use Symfony\Component\Yaml\Parser; +use Symfony\Component\Yaml\Dumper; +use Symfony\Component\Yaml\Yaml; + +class DumperTest extends \PHPUnit_Framework_TestCase +{ + protected $parser; + protected $dumper; + protected $path; + + protected $array = array( + '' => 'bar', + 'foo' => '#bar', + 'foo\'bar' => array(), + 'bar' => array(1, 'foo'), + 'foobar' => array( + 'foo' => 'bar', + 'bar' => array(1, 'foo'), + 'foobar' => array( + 'foo' => 'bar', + 'bar' => array(1, 'foo'), + ), + ), + ); + + protected function setUp() + { + $this->parser = new Parser(); + $this->dumper = new Dumper(); + $this->path = __DIR__.'/Fixtures'; + } + + protected function tearDown() + { + $this->parser = null; + $this->dumper = null; + $this->path = null; + $this->array = null; + } + + public function testIndentationInConstructor() + { + $dumper = new Dumper(7); + $expected = <<<'EOF' +'': bar +foo: '#bar' +'foo''bar': { } +bar: + - 1 + - foo +foobar: + foo: bar + bar: + - 1 + - foo + foobar: + foo: bar + bar: + - 1 + - foo + +EOF; + $this->assertEquals($expected, $dumper->dump($this->array, 4, 0)); + } + + /** + * @group legacy + */ + public function testSetIndentation() + { + $this->dumper->setIndentation(7); + + $expected = <<<'EOF' +'': bar +foo: '#bar' +'foo''bar': { } +bar: + - 1 + - foo +foobar: + foo: bar + bar: + - 1 + - foo + foobar: + foo: bar + bar: + - 1 + - foo + +EOF; + $this->assertEquals($expected, $this->dumper->dump($this->array, 4, 0)); + } + + public function testSpecifications() + { + $files = $this->parser->parse(file_get_contents($this->path.'/index.yml')); + foreach ($files as $file) { + $yamls = file_get_contents($this->path.'/'.$file.'.yml'); + + // split YAMLs documents + foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) { + if (!$yaml) { + continue; + } + + $test = $this->parser->parse($yaml); + if (isset($test['dump_skip']) && $test['dump_skip']) { + continue; + } elseif (isset($test['todo']) && $test['todo']) { + // TODO + } else { + eval('$expected = '.trim($test['php']).';'); + $this->assertSame($expected, $this->parser->parse($this->dumper->dump($expected, 10)), $test['test']); + } + } + } + } + + public function testInlineLevel() + { + $expected = <<<'EOF' +{ '': bar, foo: '#bar', 'foo''bar': { }, bar: [1, foo], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } } +EOF; + $this->assertEquals($expected, $this->dumper->dump($this->array, -10), '->dump() takes an inline level argument'); + $this->assertEquals($expected, $this->dumper->dump($this->array, 0), '->dump() takes an inline level argument'); + + $expected = <<<'EOF' +'': bar +foo: '#bar' +'foo''bar': { } +bar: [1, foo] +foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } + +EOF; + $this->assertEquals($expected, $this->dumper->dump($this->array, 1), '->dump() takes an inline level argument'); + + $expected = <<<'EOF' +'': bar +foo: '#bar' +'foo''bar': { } +bar: + - 1 + - foo +foobar: + foo: bar + bar: [1, foo] + foobar: { foo: bar, bar: [1, foo] } + +EOF; + $this->assertEquals($expected, $this->dumper->dump($this->array, 2), '->dump() takes an inline level argument'); + + $expected = <<<'EOF' +'': bar +foo: '#bar' +'foo''bar': { } +bar: + - 1 + - foo +foobar: + foo: bar + bar: + - 1 + - foo + foobar: + foo: bar + bar: [1, foo] + +EOF; + $this->assertEquals($expected, $this->dumper->dump($this->array, 3), '->dump() takes an inline level argument'); + + $expected = <<<'EOF' +'': bar +foo: '#bar' +'foo''bar': { } +bar: + - 1 + - foo +foobar: + foo: bar + bar: + - 1 + - foo + foobar: + foo: bar + bar: + - 1 + - foo + +EOF; + $this->assertEquals($expected, $this->dumper->dump($this->array, 4), '->dump() takes an inline level argument'); + $this->assertEquals($expected, $this->dumper->dump($this->array, 10), '->dump() takes an inline level argument'); + } + + public function testObjectSupportEnabled() + { + $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, Yaml::DUMP_OBJECT); + + $this->assertEquals('{ foo: !php/object:O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', $dump, '->dump() is able to dump objects'); + } + + /** + * @group legacy + */ + public function testObjectSupportEnabledPassingTrue() + { + $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, false, true); + + $this->assertEquals('{ foo: !php/object:O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', $dump, '->dump() is able to dump objects'); + } + + public function testObjectSupportDisabledButNoExceptions() + { + $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1)); + + $this->assertEquals('{ foo: null, bar: 1 }', $dump, '->dump() does not dump objects when disabled'); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\DumpException + */ + public function testObjectSupportDisabledWithExceptions() + { + $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE); + } + + /** + * @group legacy + * @expectedException \Symfony\Component\Yaml\Exception\DumpException + */ + public function testObjectSupportDisabledWithExceptionsPassingTrue() + { + $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, true); + } + + /** + * @dataProvider getEscapeSequences + */ + public function testEscapedEscapeSequencesInQuotedScalar($input, $expected) + { + $this->assertEquals($expected, $this->dumper->dump($input)); + } + + public function getEscapeSequences() + { + return array( + 'null' => array("\t\\0", '"\t\\\\0"'), + 'bell' => array("\t\\a", '"\t\\\\a"'), + 'backspace' => array("\t\\b", '"\t\\\\b"'), + 'horizontal-tab' => array("\t\\t", '"\t\\\\t"'), + 'line-feed' => array("\t\\n", '"\t\\\\n"'), + 'vertical-tab' => array("\t\\v", '"\t\\\\v"'), + 'form-feed' => array("\t\\f", '"\t\\\\f"'), + 'carriage-return' => array("\t\\r", '"\t\\\\r"'), + 'escape' => array("\t\\e", '"\t\\\\e"'), + 'space' => array("\t\\ ", '"\t\\\\ "'), + 'double-quote' => array("\t\\\"", '"\t\\\\\\""'), + 'slash' => array("\t\\/", '"\t\\\\/"'), + 'backslash' => array("\t\\\\", '"\t\\\\\\\\"'), + 'next-line' => array("\t\\N", '"\t\\\\N"'), + 'non-breaking-space' => array("\t\\�", '"\t\\\\�"'), + 'line-separator' => array("\t\\L", '"\t\\\\L"'), + 'paragraph-separator' => array("\t\\P", '"\t\\\\P"'), + ); + } + + public function testBinaryDataIsDumpedBase64Encoded() + { + $binaryData = file_get_contents(__DIR__.'/Fixtures/arrow.gif'); + $expected = '{ data: !!binary '.base64_encode($binaryData).' }'; + + $this->assertSame($expected, $this->dumper->dump(array('data' => $binaryData))); + } + + public function testNonUtf8DataIsDumpedBase64Encoded() + { + // "für" (ISO-8859-1 encoded) + $this->assertSame('!!binary ZsM/cg==', $this->dumper->dump("f\xc3\x3fr")); + } + + /** + * @dataProvider objectAsMapProvider + */ + public function testDumpObjectAsMap($object, $expected) + { + $yaml = $this->dumper->dump($object, 0, 0, Yaml::DUMP_OBJECT_AS_MAP); + + $this->assertEquals($expected, Yaml::parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP)); + } + + public function objectAsMapProvider() + { + $tests = array(); + + $bar = new \stdClass(); + $bar->class = 'classBar'; + $bar->args = array('bar'); + $zar = new \stdClass(); + $foo = new \stdClass(); + $foo->bar = $bar; + $foo->zar = $zar; + $object = new \stdClass(); + $object->foo = $foo; + $tests['stdClass'] = array($object, $object); + + $arrayObject = new \ArrayObject(); + $arrayObject['foo'] = 'bar'; + $arrayObject['baz'] = 'foobar'; + $parsedArrayObject = new \stdClass(); + $parsedArrayObject->foo = 'bar'; + $parsedArrayObject->baz = 'foobar'; + $tests['ArrayObject'] = array($arrayObject, $parsedArrayObject); + + $a = new A(); + $tests['arbitrary-object'] = array($a, null); + + return $tests; + } + + public function testDumpMultiLineStringAsScalarBlock() + { + $data = array( + 'data' => array( + 'single_line' => 'foo bar baz', + 'multi_line' => "foo\nline with trailing spaces:\n \nbar\r\ninteger like line:\n123456789\nempty line:\n\nbaz", + 'nested_inlined_multi_line_string' => array( + 'inlined_multi_line' => "foo\nbar\r\nempty line:\n\nbaz", + ), + ), + ); + + $this->assertSame(file_get_contents(__DIR__.'/Fixtures/multiple_lines_as_literal_block.yml'), $this->dumper->dump($data, 3, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK)); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testZeroIndentationThrowsException() + { + new Dumper(0); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testNegativeIndentationThrowsException() + { + new Dumper(-4); + } +} + +class A +{ + public $a = 'foo'; +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml new file mode 100644 index 000000000..5f9c94275 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml @@ -0,0 +1,31 @@ +--- %YAML:1.0 +test: Simple Alias Example +brief: > + If you need to refer to the same item of data twice, + you can give that item an alias. The alias is a plain + string, starting with an ampersand. The item may then + be referred to by the alias throughout your document + by using an asterisk before the name of the alias. + This is called an anchor. +yaml: | + - &showell Steve + - Clark + - Brian + - Oren + - *showell +php: | + array('Steve', 'Clark', 'Brian', 'Oren', 'Steve') + +--- +test: Alias of a Mapping +brief: > + An alias can be used on any item of data, including + sequences, mappings, and other complex data types. +yaml: | + - &hello + Meat: pork + Starch: potato + - banana + - *hello +php: | + array(array('Meat'=>'pork', 'Starch'=>'potato'), 'banana', array('Meat'=>'pork', 'Starch'=>'potato')) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml new file mode 100644 index 000000000..dfd93021d --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml @@ -0,0 +1,202 @@ +--- %YAML:1.0 +test: Simple Sequence +brief: | + You can specify a list in YAML by placing each + member of the list on a new line with an opening + dash. These lists are called sequences. +yaml: | + - apple + - banana + - carrot +php: | + array('apple', 'banana', 'carrot') +--- +test: Sequence With Item Being Null In The Middle +brief: | + You can specify a list in YAML by placing each + member of the list on a new line with an opening + dash. These lists are called sequences. +yaml: | + - apple + - + - carrot +php: | + array('apple', null, 'carrot') +--- +test: Sequence With Last Item Being Null +brief: | + You can specify a list in YAML by placing each + member of the list on a new line with an opening + dash. These lists are called sequences. +yaml: | + - apple + - banana + - +php: | + array('apple', 'banana', null) +--- +test: Nested Sequences +brief: | + You can include a sequence within another + sequence by giving the sequence an empty + dash, followed by an indented list. +yaml: | + - + - foo + - bar + - baz +php: | + array(array('foo', 'bar', 'baz')) +--- +test: Mixed Sequences +brief: | + Sequences can contain any YAML data, + including strings and other sequences. +yaml: | + - apple + - + - foo + - bar + - x123 + - banana + - carrot +php: | + array('apple', array('foo', 'bar', 'x123'), 'banana', 'carrot') +--- +test: Deeply Nested Sequences +brief: | + Sequences can be nested even deeper, with each + level of indentation representing a level of + depth. +yaml: | + - + - + - uno + - dos +php: | + array(array(array('uno', 'dos'))) +--- +test: Simple Mapping +brief: | + You can add a keyed list (also known as a dictionary or + hash) to your document by placing each member of the + list on a new line, with a colon separating the key + from its value. In YAML, this type of list is called + a mapping. +yaml: | + foo: whatever + bar: stuff +php: | + array('foo' => 'whatever', 'bar' => 'stuff') +--- +test: Sequence in a Mapping +brief: | + A value in a mapping can be a sequence. +yaml: | + foo: whatever + bar: + - uno + - dos +php: | + array('foo' => 'whatever', 'bar' => array('uno', 'dos')) +--- +test: Nested Mappings +brief: | + A value in a mapping can be another mapping. +yaml: | + foo: whatever + bar: + fruit: apple + name: steve + sport: baseball +php: | + array( + 'foo' => 'whatever', + 'bar' => array( + 'fruit' => 'apple', + 'name' => 'steve', + 'sport' => 'baseball' + ) + ) +--- +test: Mixed Mapping +brief: | + A mapping can contain any assortment + of mappings and sequences as values. +yaml: | + foo: whatever + bar: + - + fruit: apple + name: steve + sport: baseball + - more + - + python: rocks + perl: papers + ruby: scissorses +php: | + array( + 'foo' => 'whatever', + 'bar' => array( + array( + 'fruit' => 'apple', + 'name' => 'steve', + 'sport' => 'baseball' + ), + 'more', + array( + 'python' => 'rocks', + 'perl' => 'papers', + 'ruby' => 'scissorses' + ) + ) + ) +--- +test: Mapping-in-Sequence Shortcut +todo: true +brief: | + If you are adding a mapping to a sequence, you + can place the mapping on the same line as the + dash as a shortcut. +yaml: | + - work on YAML.py: + - work on Store +php: | + array(array('work on YAML.py' => array('work on Store'))) +--- +test: Sequence-in-Mapping Shortcut +todo: true +brief: | + The dash in a sequence counts as indentation, so + you can add a sequence inside of a mapping without + needing spaces as indentation. +yaml: | + allow: + - 'localhost' + - '%.sourceforge.net' + - '%.freepan.org' +php: | + array('allow' => array('localhost', '%.sourceforge.net', '%.freepan.org')) +--- +todo: true +test: Merge key +brief: | + A merge key ('<<') can be used in a mapping to insert other mappings. If + the value associated with the merge key is a mapping, each of its key/value + pairs is inserted into the current mapping. +yaml: | + mapping: + name: Joe + job: Accountant + <<: + age: 38 +php: | + array( + 'mapping' => + array( + 'name' => 'Joe', + 'job' => 'Accountant', + 'age' => 38 + ) + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml new file mode 100644 index 000000000..f7ca469b4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml @@ -0,0 +1,51 @@ +--- +test: One Element Mapping +brief: | + A mapping with one key/value pair +yaml: | + foo: bar +php: | + array('foo' => 'bar') +--- +test: Multi Element Mapping +brief: | + More than one key/value pair +yaml: | + red: baron + white: walls + blue: berries +php: | + array( + 'red' => 'baron', + 'white' => 'walls', + 'blue' => 'berries', + ) +--- +test: Values aligned +brief: | + Often times human editors of documents will align the values even + though YAML emitters generally don't. +yaml: | + red: baron + white: walls + blue: berries +php: | + array( + 'red' => 'baron', + 'white' => 'walls', + 'blue' => 'berries', + ) +--- +test: Colons aligned +brief: | + Spaces can come before the ': ' key/value separator. +yaml: | + red : baron + white : walls + blue : berries +php: | + array( + 'red' => 'baron', + 'white' => 'walls', + 'blue' => 'berries', + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml new file mode 100644 index 000000000..d98810256 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml @@ -0,0 +1,85 @@ +--- %YAML:1.0 +test: Trailing Document Separator +todo: true +brief: > + You can separate YAML documents + with a string of three dashes. +yaml: | + - foo: 1 + bar: 2 + --- + more: stuff +python: | + [ + [ { 'foo': 1, 'bar': 2 } ], + { 'more': 'stuff' } + ] +ruby: | + [ { 'foo' => 1, 'bar' => 2 } ] + +--- +test: Leading Document Separator +todo: true +brief: > + You can explicitly give an opening + document separator to your YAML stream. +yaml: | + --- + - foo: 1 + bar: 2 + --- + more: stuff +python: | + [ + [ {'foo': 1, 'bar': 2}], + {'more': 'stuff'} + ] +ruby: | + [ { 'foo' => 1, 'bar' => 2 } ] + +--- +test: YAML Header +todo: true +brief: > + The opening separator can contain directives + to the YAML parser, such as the version + number. +yaml: | + --- %YAML:1.0 + foo: 1 + bar: 2 +php: | + array('foo' => 1, 'bar' => 2) +documents: 1 + +--- +test: Red Herring Document Separator +brief: > + Separators included in blocks or strings + are treated as blocks or strings, as the + document separator should have no indentation + preceding it. +yaml: | + foo: | + --- +php: | + array('foo' => "---\n") + +--- +test: Multiple Document Separators in Block +brief: > + This technique allows you to embed other YAML + documents within literal blocks. +yaml: | + foo: | + --- + foo: bar + --- + yo: baz + bar: | + fooness +php: | + array( + 'foo' => "---\nfoo: bar\n---\nyo: baz\n", + 'bar' => "fooness\n" + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml new file mode 100644 index 000000000..e8506fcb6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml @@ -0,0 +1,25 @@ +--- +test: Missing value for hash item +todo: true +brief: | + Third item in this hash doesn't have a value +yaml: | + okay: value + also okay: ~ + causes error because no value specified + last key: value okay here too +python-error: causes error because no value specified + +--- +test: Not indenting enough +brief: | + There was a bug in PyYaml where it was off by one + in the indentation check. It was allowing the YAML + below. +# This is actually valid YAML now. Someone should tell showell. +yaml: | + foo: + firstline: 1 + secondline: 2 +php: | + array('foo' => null, 'firstline' => 1, 'secondline' => 2) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml new file mode 100644 index 000000000..03090e4ab --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml @@ -0,0 +1,60 @@ +--- +test: Simple Inline Array +brief: > + Sequences can be contained on a + single line, using the inline syntax. + Separate each entry with commas and + enclose in square brackets. +yaml: | + seq: [ a, b, c ] +php: | + array('seq' => array('a', 'b', 'c')) +--- +test: Simple Inline Hash +brief: > + Mapping can also be contained on + a single line, using the inline + syntax. Each key-value pair is + separated by a colon, with a comma + between each entry in the mapping. + Enclose with curly braces. +yaml: | + hash: { name: Steve, foo: bar } +php: | + array('hash' => array('name' => 'Steve', 'foo' => 'bar')) +--- +test: Multi-line Inline Collections +todo: true +brief: > + Both inline sequences and inline mappings + can span multiple lines, provided that you + indent the additional lines. +yaml: | + languages: [ Ruby, + Perl, + Python ] + websites: { YAML: yaml.org, + Ruby: ruby-lang.org, + Python: python.org, + Perl: use.perl.org } +php: | + array( + 'languages' => array('Ruby', 'Perl', 'Python'), + 'websites' => array( + 'YAML' => 'yaml.org', + 'Ruby' => 'ruby-lang.org', + 'Python' => 'python.org', + 'Perl' => 'use.perl.org' + ) + ) +--- +test: Commas in Values (not in the spec!) +todo: true +brief: > + List items in collections are delimited by commas, but + there must be a space after each comma. This allows you + to add numbers without quoting. +yaml: | + attendances: [ 45,123, 70,000, 17,222 ] +php: | + array('attendances' => array(45123, 70000, 17222)) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml new file mode 100644 index 000000000..a14735a55 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml @@ -0,0 +1,176 @@ +--- %YAML:1.0 +test: Single ending newline +brief: > + A pipe character, followed by an indented + block of text is treated as a literal + block, in which newlines are preserved + throughout the block, including the final + newline. +yaml: | + --- + this: | + Foo + Bar +php: | + array('this' => "Foo\nBar\n") +--- +test: The '+' indicator +brief: > + The '+' indicator says to keep newlines at the end of text + blocks. +yaml: | + normal: | + extra new lines not kept + + preserving: |+ + extra new lines are kept + + + dummy: value +php: | + array( + 'normal' => "extra new lines not kept\n", + 'preserving' => "extra new lines are kept\n\n\n", + 'dummy' => 'value' + ) +--- +test: Three trailing newlines in literals +brief: > + To give you more control over how space + is preserved in text blocks, YAML has + the keep '+' and chomp '-' indicators. + The keep indicator will preserve all + ending newlines, while the chomp indicator + will strip all ending newlines. +yaml: | + clipped: | + This has one newline. + + + + same as "clipped" above: "This has one newline.\n" + + stripped: |- + This has no newline. + + + + same as "stripped" above: "This has no newline." + + kept: |+ + This has four newlines. + + + + same as "kept" above: "This has four newlines.\n\n\n\n" +php: | + array( + 'clipped' => "This has one newline.\n", + 'same as "clipped" above' => "This has one newline.\n", + 'stripped' => 'This has no newline.', + 'same as "stripped" above' => 'This has no newline.', + 'kept' => "This has four newlines.\n\n\n\n", + 'same as "kept" above' => "This has four newlines.\n\n\n\n" + ) +--- +test: Extra trailing newlines with spaces +todo: true +brief: > + Normally, only a single newline is kept + from the end of a literal block, unless the + keep '+' character is used in combination + with the pipe. The following example + will preserve all ending whitespace + since the last line of both literal blocks + contains spaces which extend past the indentation + level. +yaml: | + --- + this: | + Foo + + + kept: |+ + Foo + + +php: | + array('this' => "Foo\n\n \n", + 'kept' => "Foo\n\n \n" ) + +--- +test: Folded Block in a Sequence +brief: > + A greater-then character, followed by an indented + block of text is treated as a folded block, in + which lines of text separated by a single newline + are concatenated as a single line. +yaml: | + --- + - apple + - banana + - > + can't you see + the beauty of yaml? + hmm + - dog +php: | + array( + 'apple', + 'banana', + "can't you see the beauty of yaml? hmm\n", + 'dog' + ) +--- +test: Folded Block as a Mapping Value +brief: > + Both literal and folded blocks can be + used in collections, as values in a + sequence or a mapping. +yaml: | + --- + quote: > + Mark McGwire's + year was crippled + by a knee injury. + source: espn +php: | + array( + 'quote' => "Mark McGwire's year was crippled by a knee injury.\n", + 'source' => 'espn' + ) +--- +test: Three trailing newlines in folded blocks +brief: > + The keep and chomp indicators can also + be applied to folded blocks. +yaml: | + clipped: > + This has one newline. + + + + same as "clipped" above: "This has one newline.\n" + + stripped: >- + This has no newline. + + + + same as "stripped" above: "This has no newline." + + kept: >+ + This has four newlines. + + + + same as "kept" above: "This has four newlines.\n\n\n\n" +php: | + array( + 'clipped' => "This has one newline.\n", + 'same as "clipped" above' => "This has one newline.\n", + 'stripped' => 'This has no newline.', + 'same as "stripped" above' => 'This has no newline.', + 'kept' => "This has four newlines.\n\n\n\n", + 'same as "kept" above' => "This has four newlines.\n\n\n\n" + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml new file mode 100644 index 000000000..9a5300f2e --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml @@ -0,0 +1,45 @@ +--- %YAML:1.0 +test: Empty Sequence +brief: > + You can represent the empty sequence + with an empty inline sequence. +yaml: | + empty: [] +php: | + array('empty' => array()) +--- +test: Empty Mapping +brief: > + You can represent the empty mapping + with an empty inline mapping. +yaml: | + empty: {} +php: | + array('empty' => array()) +--- +test: Empty Sequence as Entire Document +yaml: | + [] +php: | + array() +--- +test: Empty Mapping as Entire Document +yaml: | + {} +php: | + array() +--- +test: Null as Document +yaml: | + ~ +php: | + null +--- +test: Empty String +brief: > + You can represent an empty string + with a pair of quotes. +yaml: | + '' +php: | + '' diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml new file mode 100644 index 000000000..ec1c4c3a1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml @@ -0,0 +1,1697 @@ +--- %YAML:1.0 +test: Sequence of scalars +spec: 2.1 +yaml: | + - Mark McGwire + - Sammy Sosa + - Ken Griffey +php: | + array('Mark McGwire', 'Sammy Sosa', 'Ken Griffey') +--- +test: Mapping of scalars to scalars +spec: 2.2 +yaml: | + hr: 65 + avg: 0.278 + rbi: 147 +php: | + array('hr' => 65, 'avg' => 0.278, 'rbi' => 147) +--- +test: Mapping of scalars to sequences +spec: 2.3 +yaml: | + american: + - Boston Red Sox + - Detroit Tigers + - New York Yankees + national: + - New York Mets + - Chicago Cubs + - Atlanta Braves +php: | + array('american' => + array( 'Boston Red Sox', 'Detroit Tigers', + 'New York Yankees' ), + 'national' => + array( 'New York Mets', 'Chicago Cubs', + 'Atlanta Braves' ) + ) +--- +test: Sequence of mappings +spec: 2.4 +yaml: | + - + name: Mark McGwire + hr: 65 + avg: 0.278 + - + name: Sammy Sosa + hr: 63 + avg: 0.288 +php: | + array( + array('name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278), + array('name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288) + ) +--- +test: Legacy A5 +todo: true +spec: legacy_A5 +yaml: | + ? + - New York Yankees + - Atlanta Braves + : + - 2001-07-02 + - 2001-08-12 + - 2001-08-14 + ? + - Detroit Tigers + - Chicago Cubs + : + - 2001-07-23 +perl-busted: > + YAML.pm will be able to emulate this behavior soon. In this regard + it may be somewhat more correct than Python's native behaviour which + can only use tuples as mapping keys. PyYAML will also need to figure + out some clever way to roundtrip structured keys. +python: | + [ + { + ('New York Yankees', 'Atlanta Braves'): + [yaml.timestamp('2001-07-02'), + yaml.timestamp('2001-08-12'), + yaml.timestamp('2001-08-14')], + ('Detroit Tigers', 'Chicago Cubs'): + [yaml.timestamp('2001-07-23')] + } + ] +ruby: | + { + [ 'New York Yankees', 'Atlanta Braves' ] => + [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ], + [ 'Detroit Tigers', 'Chicago Cubs' ] => + [ Date.new( 2001, 7, 23 ) ] + } +syck: | + struct test_node seq1[] = { + { T_STR, 0, "New York Yankees" }, + { T_STR, 0, "Atlanta Braves" }, + end_node + }; + struct test_node seq2[] = { + { T_STR, 0, "2001-07-02" }, + { T_STR, 0, "2001-08-12" }, + { T_STR, 0, "2001-08-14" }, + end_node + }; + struct test_node seq3[] = { + { T_STR, 0, "Detroit Tigers" }, + { T_STR, 0, "Chicago Cubs" }, + end_node + }; + struct test_node seq4[] = { + { T_STR, 0, "2001-07-23" }, + end_node + }; + struct test_node map[] = { + { T_SEQ, 0, 0, seq1 }, + { T_SEQ, 0, 0, seq2 }, + { T_SEQ, 0, 0, seq3 }, + { T_SEQ, 0, 0, seq4 }, + end_node + }; + struct test_node stream[] = { + { T_MAP, 0, 0, map }, + end_node + }; + +--- +test: Sequence of sequences +spec: 2.5 +yaml: | + - [ name , hr , avg ] + - [ Mark McGwire , 65 , 0.278 ] + - [ Sammy Sosa , 63 , 0.288 ] +php: | + array( + array( 'name', 'hr', 'avg' ), + array( 'Mark McGwire', 65, 0.278 ), + array( 'Sammy Sosa', 63, 0.288 ) + ) +--- +test: Mapping of mappings +todo: true +spec: 2.6 +yaml: | + Mark McGwire: {hr: 65, avg: 0.278} + Sammy Sosa: { + hr: 63, + avg: 0.288 + } +php: | + array( + 'Mark McGwire' => + array( 'hr' => 65, 'avg' => 0.278 ), + 'Sammy Sosa' => + array( 'hr' => 63, 'avg' => 0.288 ) + ) +--- +test: Two documents in a stream each with a leading comment +todo: true +spec: 2.7 +yaml: | + # Ranking of 1998 home runs + --- + - Mark McGwire + - Sammy Sosa + - Ken Griffey + + # Team ranking + --- + - Chicago Cubs + - St Louis Cardinals +ruby: | + y = YAML::Stream.new + y.add( [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] ) + y.add( [ 'Chicago Cubs', 'St Louis Cardinals' ] ) +documents: 2 + +--- +test: Play by play feed from a game +todo: true +spec: 2.8 +yaml: | + --- + time: 20:03:20 + player: Sammy Sosa + action: strike (miss) + ... + --- + time: 20:03:47 + player: Sammy Sosa + action: grand slam + ... +perl: | + [ 'Mark McGwire', 'Sammy Sosa', 'Ken Griffey' ] +documents: 2 + +--- +test: Single document with two comments +spec: 2.9 +yaml: | + hr: # 1998 hr ranking + - Mark McGwire + - Sammy Sosa + rbi: + # 1998 rbi ranking + - Sammy Sosa + - Ken Griffey +php: | + array( + 'hr' => array( 'Mark McGwire', 'Sammy Sosa' ), + 'rbi' => array( 'Sammy Sosa', 'Ken Griffey' ) + ) +--- +test: Node for Sammy Sosa appears twice in this document +spec: 2.10 +yaml: | + --- + hr: + - Mark McGwire + # Following node labeled SS + - &SS Sammy Sosa + rbi: + - *SS # Subsequent occurrence + - Ken Griffey +php: | + array( + 'hr' => + array('Mark McGwire', 'Sammy Sosa'), + 'rbi' => + array('Sammy Sosa', 'Ken Griffey') + ) +--- +test: Mapping between sequences +todo: true +spec: 2.11 +yaml: | + ? # PLAY SCHEDULE + - Detroit Tigers + - Chicago Cubs + : + - 2001-07-23 + + ? [ New York Yankees, + Atlanta Braves ] + : [ 2001-07-02, 2001-08-12, + 2001-08-14 ] +ruby: | + { + [ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ], + [ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ), Date.new( 2001, 8, 12 ), Date.new( 2001, 8, 14 ) ] + } +syck: | + struct test_node seq1[] = { + { T_STR, 0, "New York Yankees" }, + { T_STR, 0, "Atlanta Braves" }, + end_node + }; + struct test_node seq2[] = { + { T_STR, 0, "2001-07-02" }, + { T_STR, 0, "2001-08-12" }, + { T_STR, 0, "2001-08-14" }, + end_node + }; + struct test_node seq3[] = { + { T_STR, 0, "Detroit Tigers" }, + { T_STR, 0, "Chicago Cubs" }, + end_node + }; + struct test_node seq4[] = { + { T_STR, 0, "2001-07-23" }, + end_node + }; + struct test_node map[] = { + { T_SEQ, 0, 0, seq3 }, + { T_SEQ, 0, 0, seq4 }, + { T_SEQ, 0, 0, seq1 }, + { T_SEQ, 0, 0, seq2 }, + end_node + }; + struct test_node stream[] = { + { T_MAP, 0, 0, map }, + end_node + }; + +--- +test: Sequence key shortcut +spec: 2.12 +yaml: | + --- + # products purchased + - item : Super Hoop + quantity: 1 + - item : Basketball + quantity: 4 + - item : Big Shoes + quantity: 1 +php: | + array ( + array ( + 'item' => 'Super Hoop', + 'quantity' => 1, + ), + array ( + 'item' => 'Basketball', + 'quantity' => 4, + ), + array ( + 'item' => 'Big Shoes', + 'quantity' => 1, + ) + ) +perl: | + [ + { item => 'Super Hoop', quantity => 1 }, + { item => 'Basketball', quantity => 4 }, + { item => 'Big Shoes', quantity => 1 } + ] + +ruby: | + [ + { 'item' => 'Super Hoop', 'quantity' => 1 }, + { 'item' => 'Basketball', 'quantity' => 4 }, + { 'item' => 'Big Shoes', 'quantity' => 1 } + ] +python: | + [ + { 'item': 'Super Hoop', 'quantity': 1 }, + { 'item': 'Basketball', 'quantity': 4 }, + { 'item': 'Big Shoes', 'quantity': 1 } + ] +syck: | + struct test_node map1[] = { + { T_STR, 0, "item" }, + { T_STR, 0, "Super Hoop" }, + { T_STR, 0, "quantity" }, + { T_STR, 0, "1" }, + end_node + }; + struct test_node map2[] = { + { T_STR, 0, "item" }, + { T_STR, 0, "Basketball" }, + { T_STR, 0, "quantity" }, + { T_STR, 0, "4" }, + end_node + }; + struct test_node map3[] = { + { T_STR, 0, "item" }, + { T_STR, 0, "Big Shoes" }, + { T_STR, 0, "quantity" }, + { T_STR, 0, "1" }, + end_node + }; + struct test_node seq[] = { + { T_MAP, 0, 0, map1 }, + { T_MAP, 0, 0, map2 }, + { T_MAP, 0, 0, map3 }, + end_node + }; + struct test_node stream[] = { + { T_SEQ, 0, 0, seq }, + end_node + }; + + +--- +test: Literal perserves newlines +todo: true +spec: 2.13 +yaml: | + # ASCII Art + --- | + \//||\/|| + // || ||_ +perl: | + "\\//||\\/||\n// || ||_\n" +ruby: | + "\\//||\\/||\n// || ||_\n" +python: | + [ + flushLeft( + """ + \//||\/|| + // || ||_ + """ + ) + ] +syck: | + struct test_node stream[] = { + { T_STR, 0, "\\//||\\/||\n// || ||_\n" }, + end_node + }; + +--- +test: Folded treats newlines as a space +todo: true +spec: 2.14 +yaml: | + --- + Mark McGwire's + year was crippled + by a knee injury. +perl: | + "Mark McGwire's year was crippled by a knee injury." +ruby: | + "Mark McGwire's year was crippled by a knee injury." +python: | + [ "Mark McGwire's year was crippled by a knee injury." ] +syck: | + struct test_node stream[] = { + { T_STR, 0, "Mark McGwire's year was crippled by a knee injury." }, + end_node + }; + +--- +test: Newlines preserved for indented and blank lines +todo: true +spec: 2.15 +yaml: | + --- > + Sammy Sosa completed another + fine season with great stats. + + 63 Home Runs + 0.288 Batting Average + + What a year! +perl: | + "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" +ruby: | + "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" +python: | + [ + flushLeft( + """ + Sammy Sosa completed another fine season with great stats. + + 63 Home Runs + 0.288 Batting Average + + What a year! + """ + ) + ] +syck: | + struct test_node stream[] = { + { T_STR, 0, "Sammy Sosa completed another fine season with great stats.\n\n 63 Home Runs\n 0.288 Batting Average\n\nWhat a year!\n" }, + end_node + }; + + +--- +test: Indentation determines scope +spec: 2.16 +yaml: | + name: Mark McGwire + accomplishment: > + Mark set a major league + home run record in 1998. + stats: | + 65 Home Runs + 0.278 Batting Average +php: | + array( + 'name' => 'Mark McGwire', + 'accomplishment' => "Mark set a major league home run record in 1998.\n", + 'stats' => "65 Home Runs\n0.278 Batting Average\n" + ) +--- +test: Quoted scalars +todo: true +spec: 2.17 +yaml: | + unicode: "Sosa did fine.\u263A" + control: "\b1998\t1999\t2000\n" + hexesc: "\x0D\x0A is \r\n" + + single: '"Howdy!" he cried.' + quoted: ' # not a ''comment''.' + tie-fighter: '|\-*-/|' +ruby: | + { + "tie-fighter" => "|\\-*-/|", + "control"=>"\0101998\t1999\t2000\n", + "unicode"=>"Sosa did fine." + ["263A".hex ].pack('U*'), + "quoted"=>" # not a 'comment'.", + "single"=>"\"Howdy!\" he cried.", + "hexesc"=>"\r\n is \r\n" + } +--- +test: Multiline flow scalars +todo: true +spec: 2.18 +yaml: | + plain: + This unquoted scalar + spans many lines. + + quoted: "So does this + quoted scalar.\n" +ruby: | + { + 'plain' => 'This unquoted scalar spans many lines.', + 'quoted' => "So does this quoted scalar.\n" + } +--- +test: Integers +spec: 2.19 +yaml: | + canonical: 12345 + decimal: +12,345 + octal: 014 + hexadecimal: 0xC +php: | + array( + 'canonical' => 12345, + 'decimal' => 12345.0, + 'octal' => 014, + 'hexadecimal' => 0xC + ) +--- +# FIX: spec shows parens around -inf and NaN +test: Floating point +spec: 2.20 +yaml: | + canonical: 1.23015e+3 + exponential: 12.3015e+02 + fixed: 1,230.15 + negative infinity: -.inf + not a number: .NaN + float as whole number: !!float 1 +php: | + array( + 'canonical' => 1230.15, + 'exponential' => 1230.15, + 'fixed' => 1230.15, + 'negative infinity' => log(0), + 'not a number' => -log(0), + 'float as whole number' => (float) 1 + ) +--- +test: Miscellaneous +spec: 2.21 +yaml: | + null: ~ + true: true + false: false + string: '12345' +php: | + array( + '' => null, + 1 => true, + 0 => false, + 'string' => '12345' + ) +--- +test: Timestamps +todo: true +spec: 2.22 +yaml: | + canonical: 2001-12-15T02:59:43.1Z + iso8601: 2001-12-14t21:59:43.10-05:00 + spaced: 2001-12-14 21:59:43.10 -05:00 + date: 2002-12-14 # Time is noon UTC +php: | + array( + 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ), + 'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), + 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), + 'date' => Date.new( 2002, 12, 14 ) + ) +--- +test: legacy Timestamps test +todo: true +spec: legacy D4 +yaml: | + canonical: 2001-12-15T02:59:43.00Z + iso8601: 2001-02-28t21:59:43.00-05:00 + spaced: 2001-12-14 21:59:43.00 -05:00 + date: 2002-12-14 +php: | + array( + 'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ), + 'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ), + 'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ), + 'date' => Date.new( 2002, 12, 14 ) + ) +--- +test: Various explicit families +todo: true +spec: 2.23 +yaml: | + not-date: !str 2002-04-28 + picture: !binary | + R0lGODlhDAAMAIQAAP//9/X + 17unp5WZmZgAAAOfn515eXv + Pz7Y6OjuDg4J+fn5OTk6enp + 56enmleECcgggoBADs= + + application specific tag: !!something | + The semantics of the tag + above may be different for + different documents. + +ruby-setup: | + YAML.add_private_type( "something" ) do |type, val| + "SOMETHING: #{val}" + end +ruby: | + { + 'not-date' => '2002-04-28', + 'picture' => "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236i^\020' \202\n\001\000;", + 'application specific tag' => "SOMETHING: The semantics of the tag\nabove may be different for\ndifferent documents.\n" + } +--- +test: Application specific family +todo: true +spec: 2.24 +yaml: | + # Establish a tag prefix + --- !clarkevans.com,2002/graph/^shape + # Use the prefix: shorthand for + # !clarkevans.com,2002/graph/circle + - !^circle + center: &ORIGIN {x: 73, 'y': 129} + radius: 7 + - !^line # !clarkevans.com,2002/graph/line + start: *ORIGIN + finish: { x: 89, 'y': 102 } + - !^label + start: *ORIGIN + color: 0xFFEEBB + value: Pretty vector drawing. +ruby-setup: | + YAML.add_domain_type( "clarkevans.com,2002", 'graph/shape' ) { |type, val| + if Array === val + val << "Shape Container" + val + else + raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect + end + } + one_shape_proc = Proc.new { |type, val| + scheme, domain, type = type.split( /:/, 3 ) + if val.is_a? ::Hash + val['TYPE'] = "Shape: #{type}" + val + else + raise YAML::Error, "Invalid graph of class #{ val.class }: " + val.inspect + end + } + YAML.add_domain_type( "clarkevans.com,2002", 'graph/circle', &one_shape_proc ) + YAML.add_domain_type( "clarkevans.com,2002", 'graph/line', &one_shape_proc ) + YAML.add_domain_type( "clarkevans.com,2002", 'graph/label', &one_shape_proc ) +ruby: | + [ + { + "radius" => 7, + "center"=> + { + "x" => 73, + "y" => 129 + }, + "TYPE" => "Shape: graph/circle" + }, { + "finish" => + { + "x" => 89, + "y" => 102 + }, + "TYPE" => "Shape: graph/line", + "start" => + { + "x" => 73, + "y" => 129 + } + }, { + "TYPE" => "Shape: graph/label", + "value" => "Pretty vector drawing.", + "start" => + { + "x" => 73, + "y" => 129 + }, + "color" => 16772795 + }, + "Shape Container" + ] +# --- +# test: Unordered set +# spec: 2.25 +# yaml: | +# # sets are represented as a +# # mapping where each key is +# # associated with the empty string +# --- !set +# ? Mark McGwire +# ? Sammy Sosa +# ? Ken Griff +--- +test: Ordered mappings +todo: true +spec: 2.26 +yaml: | + # ordered maps are represented as + # a sequence of mappings, with + # each mapping having one key + --- !omap + - Mark McGwire: 65 + - Sammy Sosa: 63 + - Ken Griffy: 58 +ruby: | + YAML::Omap[ + 'Mark McGwire', 65, + 'Sammy Sosa', 63, + 'Ken Griffy', 58 + ] +--- +test: Invoice +dump_skip: true +spec: 2.27 +yaml: | + --- !clarkevans.com,2002/^invoice + invoice: 34843 + date : 2001-01-23 + bill-to: &id001 + given : Chris + family : Dumars + address: + lines: | + 458 Walkman Dr. + Suite #292 + city : Royal Oak + state : MI + postal : 48046 + ship-to: *id001 + product: + - + sku : BL394D + quantity : 4 + description : Basketball + price : 450.00 + - + sku : BL4438H + quantity : 1 + description : Super Hoop + price : 2392.00 + tax : 251.42 + total: 4443.52 + comments: > + Late afternoon is best. + Backup contact is Nancy + Billsmer @ 338-4338. +php: | + array( + 'invoice' => 34843, 'date' => gmmktime(0, 0, 0, 1, 23, 2001), + 'bill-to' => + array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) ) + , 'ship-to' => + array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) ) + , 'product' => + array( + array( 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ), + array( 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 ) + ), + 'tax' => 251.42, 'total' => 4443.52, + 'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n" + ) +--- +test: Log file +todo: true +spec: 2.28 +yaml: | + --- + Time: 2001-11-23 15:01:42 -05:00 + User: ed + Warning: > + This is an error message + for the log file + --- + Time: 2001-11-23 15:02:31 -05:00 + User: ed + Warning: > + A slightly different error + message. + --- + Date: 2001-11-23 15:03:17 -05:00 + User: ed + Fatal: > + Unknown variable "bar" + Stack: + - file: TopClass.py + line: 23 + code: | + x = MoreObject("345\n") + - file: MoreClass.py + line: 58 + code: |- + foo = bar +ruby: | + y = YAML::Stream.new + y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 01, 42, 00, "-05:00" ), + 'User' => 'ed', 'Warning' => "This is an error message for the log file\n" } ) + y.add( { 'Time' => YAML::mktime( 2001, 11, 23, 15, 02, 31, 00, "-05:00" ), + 'User' => 'ed', 'Warning' => "A slightly different error message.\n" } ) + y.add( { 'Date' => YAML::mktime( 2001, 11, 23, 15, 03, 17, 00, "-05:00" ), + 'User' => 'ed', 'Fatal' => "Unknown variable \"bar\"\n", + 'Stack' => [ + { 'file' => 'TopClass.py', 'line' => 23, 'code' => "x = MoreObject(\"345\\n\")\n" }, + { 'file' => 'MoreClass.py', 'line' => 58, 'code' => "foo = bar" } ] } ) +documents: 3 + +--- +test: Throwaway comments +yaml: | + ### These are four throwaway comment ### + + ### lines (the second line is empty). ### + this: | # Comments may trail lines. + contains three lines of text. + The third one starts with a + # character. This isn't a comment. + + # These are three throwaway comment + # lines (the first line is empty). +php: | + array( + 'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n" + ) +--- +test: Document with a single value +todo: true +yaml: | + --- > + This YAML stream contains a single text value. + The next stream is a log file - a sequence of + log entries. Adding an entry to the log is a + simple matter of appending it at the end. +ruby: | + "This YAML stream contains a single text value. The next stream is a log file - a sequence of log entries. Adding an entry to the log is a simple matter of appending it at the end.\n" +--- +test: Document stream +todo: true +yaml: | + --- + at: 2001-08-12 09:25:00.00 Z + type: GET + HTTP: '1.0' + url: '/index.html' + --- + at: 2001-08-12 09:25:10.00 Z + type: GET + HTTP: '1.0' + url: '/toc.html' +ruby: | + y = YAML::Stream.new + y.add( { + 'at' => Time::utc( 2001, 8, 12, 9, 25, 00 ), + 'type' => 'GET', + 'HTTP' => '1.0', + 'url' => '/index.html' + } ) + y.add( { + 'at' => Time::utc( 2001, 8, 12, 9, 25, 10 ), + 'type' => 'GET', + 'HTTP' => '1.0', + 'url' => '/toc.html' + } ) +documents: 2 + +--- +test: Top level mapping +yaml: | + # This stream is an example of a top-level mapping. + invoice : 34843 + date : 2001-01-23 + total : 4443.52 +php: | + array( + 'invoice' => 34843, + 'date' => gmmktime(0, 0, 0, 1, 23, 2001), + 'total' => 4443.52 + ) +--- +test: Single-line documents +todo: true +yaml: | + # The following is a sequence of three documents. + # The first contains an empty mapping, the second + # an empty sequence, and the last an empty string. + --- {} + --- [ ] + --- '' +ruby: | + y = YAML::Stream.new + y.add( {} ) + y.add( [] ) + y.add( '' ) +documents: 3 + +--- +test: Document with pause +todo: true +yaml: | + # A communication channel based on a YAML stream. + --- + sent at: 2002-06-06 11:46:25.10 Z + payload: Whatever + # Receiver can process this as soon as the following is sent: + ... + # Even if the next message is sent long after: + --- + sent at: 2002-06-06 12:05:53.47 Z + payload: Whatever + ... +ruby: | + y = YAML::Stream.new + y.add( + { 'sent at' => YAML::mktime( 2002, 6, 6, 11, 46, 25, 0.10 ), + 'payload' => 'Whatever' } + ) + y.add( + { "payload" => "Whatever", "sent at" => YAML::mktime( 2002, 6, 6, 12, 5, 53, 0.47 ) } + ) +documents: 2 + +--- +test: Explicit typing +yaml: | + integer: 12 + also int: ! "12" + string: !str 12 +php: | + array( 'integer' => 12, 'also int' => 12, 'string' => '12' ) +--- +test: Private types +todo: true +yaml: | + # Both examples below make use of the 'x-private:ball' + # type family URI, but with different semantics. + --- + pool: !!ball + number: 8 + color: black + --- + bearing: !!ball + material: steel +ruby: | + y = YAML::Stream.new + y.add( { 'pool' => + YAML::PrivateType.new( 'ball', + { 'number' => 8, 'color' => 'black' } ) } + ) + y.add( { 'bearing' => + YAML::PrivateType.new( 'ball', + { 'material' => 'steel' } ) } + ) +documents: 2 + +--- +test: Type family under yaml.org +yaml: | + # The URI is 'tag:yaml.org,2002:str' + - !str a Unicode string +php: | + array( 'a Unicode string' ) +--- +test: Type family under perl.yaml.org +todo: true +yaml: | + # The URI is 'tag:perl.yaml.org,2002:Text::Tabs' + - !perl/Text::Tabs {} +ruby: | + [ YAML::DomainType.new( 'perl.yaml.org,2002', 'Text::Tabs', {} ) ] +--- +test: Type family under clarkevans.com +todo: true +yaml: | + # The URI is 'tag:clarkevans.com,2003-02:timesheet' + - !clarkevans.com,2003-02/timesheet {} +ruby: | + [ YAML::DomainType.new( 'clarkevans.com,2003-02', 'timesheet', {} ) ] +--- +test: URI Escaping +todo: true +yaml: | + same: + - !domain.tld,2002/type\x30 value + - !domain.tld,2002/type0 value + different: # As far as the YAML parser is concerned + - !domain.tld,2002/type%30 value + - !domain.tld,2002/type0 value +ruby-setup: | + YAML.add_domain_type( "domain.tld,2002", "type0" ) { |type, val| + "ONE: #{val}" + } + YAML.add_domain_type( "domain.tld,2002", "type%30" ) { |type, val| + "TWO: #{val}" + } +ruby: | + { 'same' => [ 'ONE: value', 'ONE: value' ], 'different' => [ 'TWO: value', 'ONE: value' ] } +--- +test: URI Prefixing +todo: true +yaml: | + # 'tag:domain.tld,2002:invoice' is some type family. + invoice: !domain.tld,2002/^invoice + # 'seq' is shorthand for 'tag:yaml.org,2002:seq'. + # This does not effect '^customer' below + # because it is does not specify a prefix. + customers: !seq + # '^customer' is shorthand for the full + # notation 'tag:domain.tld,2002:customer'. + - !^customer + given : Chris + family : Dumars +ruby-setup: | + YAML.add_domain_type( "domain.tld,2002", /(invoice|customer)/ ) { |type, val| + if val.is_a? ::Hash + scheme, domain, type = type.split( /:/, 3 ) + val['type'] = "domain #{type}" + val + else + raise YAML::Error, "Not a Hash in domain.tld/invoice: " + val.inspect + end + } +ruby: | + { "invoice"=> { "customers"=> [ { "given"=>"Chris", "type"=>"domain customer", "family"=>"Dumars" } ], "type"=>"domain invoice" } } + +--- +test: Overriding anchors +yaml: | + anchor : &A001 This scalar has an anchor. + override : &A001 > + The alias node below is a + repeated use of this value. + alias : *A001 +php: | + array( 'anchor' => 'This scalar has an anchor.', + 'override' => "The alias node below is a repeated use of this value.\n", + 'alias' => "The alias node below is a repeated use of this value.\n" ) +--- +test: Flow and block formatting +todo: true +yaml: | + empty: [] + flow: [ one, two, three # May span lines, + , four, # indentation is + five ] # mostly ignored. + block: + - First item in top sequence + - + - Subordinate sequence entry + - > + A folded sequence entry + - Sixth item in top sequence +ruby: | + { 'empty' => [], 'flow' => [ 'one', 'two', 'three', 'four', 'five' ], + 'block' => [ 'First item in top sequence', [ 'Subordinate sequence entry' ], + "A folded sequence entry\n", 'Sixth item in top sequence' ] } +--- +test: Complete mapping test +todo: true +yaml: | + empty: {} + flow: { one: 1, two: 2 } + spanning: { one: 1, + two: 2 } + block: + first : First entry + second: + key: Subordinate mapping + third: + - Subordinate sequence + - { } + - Previous mapping is empty. + - A key: value pair in a sequence. + A second: key:value pair. + - The previous entry is equal to the following one. + - + A key: value pair in a sequence. + A second: key:value pair. + !float 12 : This key is a float. + ? > + ? + : This key had to be protected. + "\a" : This key had to be escaped. + ? > + This is a + multi-line + folded key + : Whose value is + also multi-line. + ? this also works as a key + : with a value at the next line. + ? + - This key + - is a sequence + : + - With a sequence value. + ? + This: key + is a: mapping + : + with a: mapping value. +ruby: | + { 'empty' => {}, 'flow' => { 'one' => 1, 'two' => 2 }, + 'spanning' => { 'one' => 1, 'two' => 2 }, + 'block' => { 'first' => 'First entry', 'second' => + { 'key' => 'Subordinate mapping' }, 'third' => + [ 'Subordinate sequence', {}, 'Previous mapping is empty.', + { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' }, + 'The previous entry is equal to the following one.', + { 'A key' => 'value pair in a sequence.', 'A second' => 'key:value pair.' } ], + 12.0 => 'This key is a float.', "?\n" => 'This key had to be protected.', + "\a" => 'This key had to be escaped.', + "This is a multi-line folded key\n" => "Whose value is also multi-line.", + 'this also works as a key' => 'with a value at the next line.', + [ 'This key', 'is a sequence' ] => [ 'With a sequence value.' ] } } + # Couldn't recreate map exactly, so we'll do a detailed check to be sure it's entact + obj_y['block'].keys.each { |k| + if Hash === k + v = obj_y['block'][k] + if k['This'] == 'key' and k['is a'] == 'mapping' and v['with a'] == 'mapping value.' + obj_r['block'][k] = v + end + end + } +--- +test: Literal explicit indentation +yaml: | + # Explicit indentation must + # be given in all the three + # following cases. + leading spaces: |2 + This value starts with four spaces. + + leading line break: |2 + + This value starts with a line break. + + leading comment indicator: |2 + # first line starts with a + # character. + + # Explicit indentation may + # also be given when it is + # not required. + redundant: |2 + This value is indented 2 spaces. +php: | + array( + 'leading spaces' => " This value starts with four spaces.\n", + 'leading line break' => "\nThis value starts with a line break.\n", + 'leading comment indicator' => "# first line starts with a\n# character.\n", + 'redundant' => "This value is indented 2 spaces.\n" + ) +--- +test: Chomping and keep modifiers +yaml: | + clipped: | + This has one newline. + + same as "clipped" above: "This has one newline.\n" + + stripped: |- + This has no newline. + + same as "stripped" above: "This has no newline." + + kept: |+ + This has two newlines. + + same as "kept" above: "This has two newlines.\n\n" +php: | + array( + 'clipped' => "This has one newline.\n", + 'same as "clipped" above' => "This has one newline.\n", + 'stripped' => 'This has no newline.', + 'same as "stripped" above' => 'This has no newline.', + 'kept' => "This has two newlines.\n\n", + 'same as "kept" above' => "This has two newlines.\n\n" + ) +--- +test: Literal combinations +todo: true +yaml: | + empty: | + + literal: | + The \ ' " characters may be + freely used. Leading white + space is significant. + + Line breaks are significant. + Thus this value contains one + empty line and ends with a + single line break, but does + not start with one. + + is equal to: "The \\ ' \" characters may \ + be\nfreely used. Leading white\n space \ + is significant.\n\nLine breaks are \ + significant.\nThus this value contains \ + one\nempty line and ends with a\nsingle \ + line break, but does\nnot start with one.\n" + + # Comments may follow a block + # scalar value. They must be + # less indented. + + # Modifiers may be combined in any order. + indented and chomped: |2- + This has no newline. + + also written as: |-2 + This has no newline. + + both are equal to: " This has no newline." +php: | + array( + 'empty' => '', + 'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " + + "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" + + "empty line and ends with a\nsingle line break, but does\nnot start with one.\n", + 'is equal to' => "The \\ ' \" characters may be\nfreely used. Leading white\n space " + + "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" + + "empty line and ends with a\nsingle line break, but does\nnot start with one.\n", + 'indented and chomped' => ' This has no newline.', + 'also written as' => ' This has no newline.', + 'both are equal to' => ' This has no newline.' + ) +--- +test: Folded combinations +todo: true +yaml: | + empty: > + + one paragraph: > + Line feeds are converted + to spaces, so this value + contains no line breaks + except for the final one. + + multiple paragraphs: >2 + + An empty line, either + at the start or in + the value: + + Is interpreted as a + line break. Thus this + value contains three + line breaks. + + indented text: > + This is a folded + paragraph followed + by a list: + * first entry + * second entry + Followed by another + folded paragraph, + another list: + + * first entry + + * second entry + + And a final folded + paragraph. + + above is equal to: | + This is a folded paragraph followed by a list: + * first entry + * second entry + Followed by another folded paragraph, another list: + + * first entry + + * second entry + + And a final folded paragraph. + + # Explicit comments may follow + # but must be less indented. +php: | + array( + 'empty' => '', + 'one paragraph' => 'Line feeds are converted to spaces, so this value'. + " contains no line breaks except for the final one.\n", + 'multiple paragraphs' => "\nAn empty line, either at the start or in the value:\n". + "Is interpreted as a line break. Thus this value contains three line breaks.\n", + 'indented text' => "This is a folded paragraph followed by a list:\n". + " * first entry\n * second entry\nFollowed by another folded paragraph, ". + "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n", + 'above is equal to' => "This is a folded paragraph followed by a list:\n". + " * first entry\n * second entry\nFollowed by another folded paragraph, ". + "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n" + ) +--- +test: Single quotes +todo: true +yaml: | + empty: '' + second: '! : \ etc. can be used freely.' + third: 'a single quote '' must be escaped.' + span: 'this contains + six spaces + + and one + line break' + is same as: "this contains six spaces\nand one line break" +php: | + array( + 'empty' => '', + 'second' => '! : \\ etc. can be used freely.', + 'third' => "a single quote ' must be escaped.", + 'span' => "this contains six spaces\nand one line break", + 'is same as' => "this contains six spaces\nand one line break" + ) +--- +test: Double quotes +todo: true +yaml: | + empty: "" + second: "! : etc. can be used freely." + third: "a \" or a \\ must be escaped." + fourth: "this value ends with an LF.\n" + span: "this contains + four \ + spaces" + is equal to: "this contains four spaces" +php: | + array( + 'empty' => '', + 'second' => '! : etc. can be used freely.', + 'third' => 'a " or a \\ must be escaped.', + 'fourth' => "this value ends with an LF.\n", + 'span' => "this contains four spaces", + 'is equal to' => "this contains four spaces" + ) +--- +test: Unquoted strings +todo: true +yaml: | + first: There is no unquoted empty string. + + second: 12 ## This is an integer. + + third: !str 12 ## This is a string. + + span: this contains + six spaces + + and one + line break + + indicators: this has no comments. + #:foo and bar# are + both text. + + flow: [ can span + lines, # comment + like + this ] + + note: { one-line keys: but multi-line values } + +php: | + array( + 'first' => 'There is no unquoted empty string.', + 'second' => 12, + 'third' => '12', + 'span' => "this contains six spaces\nand one line break", + 'indicators' => "this has no comments. #:foo and bar# are both text.", + 'flow' => [ 'can span lines', 'like this' ], + 'note' => { 'one-line keys' => 'but multi-line values' } + ) +--- +test: Spanning sequences +todo: true +yaml: | + # The following are equal seqs + # with different identities. + flow: [ one, two ] + spanning: [ one, + two ] + block: + - one + - two +php: | + array( + 'flow' => [ 'one', 'two' ], + 'spanning' => [ 'one', 'two' ], + 'block' => [ 'one', 'two' ] + ) +--- +test: Flow mappings +yaml: | + # The following are equal maps + # with different identities. + flow: { one: 1, two: 2 } + block: + one: 1 + two: 2 +php: | + array( + 'flow' => array( 'one' => 1, 'two' => 2 ), + 'block' => array( 'one' => 1, 'two' => 2 ) + ) +--- +test: Representations of 12 +todo: true +yaml: | + - 12 # An integer + # The following scalars + # are loaded to the + # string value '1' '2'. + - !str 12 + - '12' + - "12" + - "\ + 1\ + 2\ + " + # Strings containing paths and regexps can be unquoted: + - /foo/bar + - d:/foo/bar + - foo/bar + - /a.*b/ +php: | + array( 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' ) +--- +test: "Null" +todo: true +yaml: | + canonical: ~ + + english: null + + # This sequence has five + # entries, two with values. + sparse: + - ~ + - 2nd entry + - Null + - 4th entry + - + + four: This mapping has five keys, + only two with values. + +php: | + array ( + 'canonical' => null, + 'english' => null, + 'sparse' => array( null, '2nd entry', null, '4th entry', null ]), + 'four' => 'This mapping has five keys, only two with values.' + ) +--- +test: Omap +todo: true +yaml: | + # Explicitly typed dictionary. + Bestiary: !omap + - aardvark: African pig-like ant eater. Ugly. + - anteater: South-American ant eater. Two species. + - anaconda: South-American constrictor snake. Scary. + # Etc. +ruby: | + { + 'Bestiary' => YAML::Omap[ + 'aardvark', 'African pig-like ant eater. Ugly.', + 'anteater', 'South-American ant eater. Two species.', + 'anaconda', 'South-American constrictor snake. Scary.' + ] + } + +--- +test: Pairs +todo: true +yaml: | + # Explicitly typed pairs. + tasks: !pairs + - meeting: with team. + - meeting: with boss. + - break: lunch. + - meeting: with client. +ruby: | + { + 'tasks' => YAML::Pairs[ + 'meeting', 'with team.', + 'meeting', 'with boss.', + 'break', 'lunch.', + 'meeting', 'with client.' + ] + } + +--- +test: Set +todo: true +yaml: | + # Explicitly typed set. + baseball players: !set + Mark McGwire: + Sammy Sosa: + Ken Griffey: +ruby: | + { + 'baseball players' => YAML::Set[ + 'Mark McGwire', nil, + 'Sammy Sosa', nil, + 'Ken Griffey', nil + ] + } + +--- +test: Boolean +yaml: | + false: used as key + logical: true + answer: false +php: | + array( + false => 'used as key', + 'logical' => true, + 'answer' => false + ) +--- +test: Integer +yaml: | + canonical: 12345 + decimal: +12,345 + octal: 014 + hexadecimal: 0xC +php: | + array( + 'canonical' => 12345, + 'decimal' => 12345.0, + 'octal' => 12, + 'hexadecimal' => 12 + ) +--- +test: Float +yaml: | + canonical: 1.23015e+3 + exponential: 12.3015e+02 + fixed: 1,230.15 + negative infinity: -.inf + not a number: .NaN +php: | + array( + 'canonical' => 1230.15, + 'exponential' => 1230.15, + 'fixed' => 1230.15, + 'negative infinity' => log(0), + 'not a number' => -log(0) + ) +--- +test: Timestamp +todo: true +yaml: | + canonical: 2001-12-15T02:59:43.1Z + valid iso8601: 2001-12-14t21:59:43.10-05:00 + space separated: 2001-12-14 21:59:43.10 -05:00 + date (noon UTC): 2002-12-14 +ruby: | + array( + 'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ), + 'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), + 'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), + 'date (noon UTC)' => Date.new( 2002, 12, 14 ) + ) +--- +test: Binary +todo: true +yaml: | + canonical: !binary "\ + R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\ + OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\ + +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\ + AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=" + base64: !binary | + R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 + OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ + +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC + AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= + description: > + The binary value above is a tiny arrow + encoded as a gif image. +ruby-setup: | + arrow_gif = "GIF89a\f\000\f\000\204\000\000\377\377\367\365\365\356\351\351\345fff\000\000\000\347\347\347^^^\363\363\355\216\216\216\340\340\340\237\237\237\223\223\223\247\247\247\236\236\236iiiccc\243\243\243\204\204\204\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371\377\376\371!\376\016Made with GIMP\000,\000\000\000\000\f\000\f\000\000\005, \216\2010\236\343@\024\350i\020\304\321\212\010\034\317\200M$z\357\3770\205p\270\2601f\r\e\316\001\303\001\036\020' \202\n\001\000;" +ruby: | + { + 'canonical' => arrow_gif, + 'base64' => arrow_gif, + 'description' => "The binary value above is a tiny arrow encoded as a gif image.\n" + } + +--- +test: Merge key +todo: true +yaml: | + --- + - &CENTER { x: 1, y: 2 } + - &LEFT { x: 0, y: 2 } + - &BIG { r: 10 } + - &SMALL { r: 1 } + + # All the following maps are equal: + + - # Explicit keys + x: 1 + y: 2 + r: 10 + label: center/big + + - # Merge one map + << : *CENTER + r: 10 + label: center/big + + - # Merge multiple maps + << : [ *CENTER, *BIG ] + label: center/big + + - # Override + << : [ *BIG, *LEFT, *SMALL ] + x: 1 + label: center/big + +ruby-setup: | + center = { 'x' => 1, 'y' => 2 } + left = { 'x' => 0, 'y' => 2 } + big = { 'r' => 10 } + small = { 'r' => 1 } + node1 = { 'x' => 1, 'y' => 2, 'r' => 10, 'label' => 'center/big' } + node2 = center.dup + node2.update( { 'r' => 10, 'label' => 'center/big' } ) + node3 = big.dup + node3.update( center ) + node3.update( { 'label' => 'center/big' } ) + node4 = small.dup + node4.update( left ) + node4.update( big ) + node4.update( { 'x' => 1, 'label' => 'center/big' } ) + +ruby: | + [ + center, left, big, small, node1, node2, node3, node4 + ] + +--- +test: Default key +todo: true +yaml: | + --- # Old schema + link with: + - library1.dll + - library2.dll + --- # New schema + link with: + - = : library1.dll + version: 1.2 + - = : library2.dll + version: 2.3 +ruby: | + y = YAML::Stream.new + y.add( { 'link with' => [ 'library1.dll', 'library2.dll' ] } ) + obj_h = Hash[ 'version' => 1.2 ] + obj_h.default = 'library1.dll' + obj_h2 = Hash[ 'version' => 2.3 ] + obj_h2.default = 'library2.dll' + y.add( { 'link with' => [ obj_h, obj_h2 ] } ) +documents: 2 + +--- +test: Special keys +todo: true +yaml: | + "!": These three keys + "&": had to be quoted + "=": and are normal strings. + # NOTE: the following node should NOT be serialized this way. + encoded node : + !special '!' : '!type' + !special|canonical '&' : 12 + = : value + # The proper way to serialize the above node is as follows: + node : !!type &12 value +ruby: | + { '!' => 'These three keys', '&' => 'had to be quoted', + '=' => 'and are normal strings.', + 'encoded node' => YAML::PrivateType.new( 'type', 'value' ), + 'node' => YAML::PrivateType.new( 'type', 'value' ) } diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml new file mode 100644 index 000000000..46c8d4a2c --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml @@ -0,0 +1,244 @@ +--- %YAML:1.0 +test: Strings +brief: > + Any group of characters beginning with an + alphabetic or numeric character is a string, + unless it belongs to one of the groups below + (such as an Integer or Time). +yaml: | + String +php: | + 'String' +--- +test: String characters +brief: > + A string can contain any alphabetic or + numeric character, along with many + punctuation characters, including the + period, dash, space, quotes, exclamation, and + question mark. +yaml: | + - What's Yaml? + - It's for writing data structures in plain text. + - And? + - And what? That's not good enough for you? + - No, I mean, "And what about Yaml?" + - Oh, oh yeah. Uh.. Yaml for Ruby. +php: | + array( + "What's Yaml?", + "It's for writing data structures in plain text.", + "And?", + "And what? That's not good enough for you?", + "No, I mean, \"And what about Yaml?\"", + "Oh, oh yeah. Uh.. Yaml for Ruby." + ) +--- +test: Indicators in Strings +brief: > + Be careful using indicators in strings. In particular, + the comma, colon, and pound sign must be used carefully. +yaml: | + the colon followed by space is an indicator: but is a string:right here + same for the pound sign: here we have it#in a string + the comma can, honestly, be used in most cases: [ but not in, inline collections ] +php: | + array( + 'the colon followed by space is an indicator' => 'but is a string:right here', + 'same for the pound sign' => 'here we have it#in a string', + 'the comma can, honestly, be used in most cases' => array('but not in', 'inline collections') + ) +--- +test: Forcing Strings +brief: > + Any YAML type can be forced into a string using the + explicit !str method. +yaml: | + date string: !str 2001-08-01 + number string: !str 192 +php: | + array( + 'date string' => '2001-08-01', + 'number string' => '192' + ) +--- +test: Single-quoted Strings +brief: > + You can also enclose your strings within single quotes, + which allows use of slashes, colons, and other indicators + freely. Inside single quotes, you can represent a single + quote in your string by using two single quotes next to + each other. +yaml: | + all my favorite symbols: '#:!/%.)' + a few i hate: '&(*' + why do i hate them?: 'it''s very hard to explain' + entities: '£ me' +php: | + array( + 'all my favorite symbols' => '#:!/%.)', + 'a few i hate' => '&(*', + 'why do i hate them?' => 'it\'s very hard to explain', + 'entities' => '£ me' + ) +--- +test: Double-quoted Strings +brief: > + Enclosing strings in double quotes allows you + to use escapings to represent ASCII and + Unicode characters. +yaml: | + i know where i want my line breaks: "one here\nand another here\n" +php: | + array( + 'i know where i want my line breaks' => "one here\nand another here\n" + ) +--- +test: Multi-line Quoted Strings +todo: true +brief: > + Both single- and double-quoted strings may be + carried on to new lines in your YAML document. + They must be indented a step and indentation + is interpreted as a single space. +yaml: | + i want a long string: "so i'm going to + let it go on and on to other lines + until i end it with a quote." +php: | + array('i want a long string' => "so i'm going to ". + "let it go on and on to other lines ". + "until i end it with a quote." + ) + +--- +test: Plain scalars +todo: true +brief: > + Unquoted strings may also span multiple lines, if they + are free of YAML space indicators and indented. +yaml: | + - My little toe is broken in two places; + - I'm crazy to have skied this way; + - I'm not the craziest he's seen, since there was always the German guy + who skied for 3 hours on a broken shin bone (just below the kneecap); + - Nevertheless, second place is respectable, and he doesn't + recommend going for the record; + - He's going to put my foot in plaster for a month; + - This would impair my skiing ability somewhat for the + duration, as can be imagined. +php: | + array( + "My little toe is broken in two places;", + "I'm crazy to have skied this way;", + "I'm not the craziest he's seen, since there was always ". + "the German guy who skied for 3 hours on a broken shin ". + "bone (just below the kneecap);", + "Nevertheless, second place is respectable, and he doesn't ". + "recommend going for the record;", + "He's going to put my foot in plaster for a month;", + "This would impair my skiing ability somewhat for the duration, ". + "as can be imagined." + ) +--- +test: 'Null' +brief: > + You can use the tilde '~' character for a null value. +yaml: | + name: Mr. Show + hosted by: Bob and David + date of next season: ~ +php: | + array( + 'name' => 'Mr. Show', + 'hosted by' => 'Bob and David', + 'date of next season' => null + ) +--- +test: Boolean +brief: > + You can use 'true' and 'false' for Boolean values. +yaml: | + Is Gus a Liar?: true + Do I rely on Gus for Sustenance?: false +php: | + array( + 'Is Gus a Liar?' => true, + 'Do I rely on Gus for Sustenance?' => false + ) +--- +test: Integers +dump_skip: true +brief: > + An integer is a series of numbers, optionally + starting with a positive or negative sign. Integers + may also contain commas for readability. +yaml: | + zero: 0 + simple: 12 + one-thousand: 1,000 + negative one-thousand: -1,000 +php: | + array( + 'zero' => 0, + 'simple' => 12, + 'one-thousand' => 1000.0, + 'negative one-thousand' => -1000.0 + ) +--- +test: Integers as Map Keys +brief: > + An integer can be used a dictionary key. +yaml: | + 1: one + 2: two + 3: three +php: | + array( + 1 => 'one', + 2 => 'two', + 3 => 'three' + ) +--- +test: Floats +dump_skip: true +brief: > + Floats are represented by numbers with decimals, + allowing for scientific notation, as well as + positive and negative infinity and "not a number." +yaml: | + a simple float: 2.00 + larger float: 1,000.09 + scientific notation: 1.00009e+3 +php: | + array( + 'a simple float' => 2.0, + 'larger float' => 1000.09, + 'scientific notation' => 1000.09 + ) +--- +test: Time +todo: true +brief: > + You can represent timestamps by using + ISO8601 format, or a variation which + allows spaces between the date, time and + time zone. +yaml: | + iso8601: 2001-12-14t21:59:43.10-05:00 + space separated: 2001-12-14 21:59:43.10 -05:00 +php: | + array( + 'iso8601' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ), + 'space separated' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ) + ) +--- +test: Date +todo: true +brief: > + A date can be represented by its year, + month and day in ISO8601 order. +yaml: | + 1976-07-31 +php: | + date( 1976, 7, 31 ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/arrow.gif b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/arrow.gif new file mode 100644 index 000000000..443aca422 Binary files /dev/null and b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/arrow.gif differ diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml new file mode 100644 index 000000000..ec456ed09 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/embededPhp.yml @@ -0,0 +1 @@ +value: diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml new file mode 100644 index 000000000..6ca044c8d --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml @@ -0,0 +1,155 @@ +test: outside double quotes +yaml: | + \0 \ \a \b \n +php: | + "\\0 \\ \\a \\b \\n" +--- +test: null +yaml: | + "\0" +php: | + "\x00" +--- +test: bell +yaml: | + "\a" +php: | + "\x07" +--- +test: backspace +yaml: | + "\b" +php: | + "\x08" +--- +test: horizontal tab (1) +yaml: | + "\t" +php: | + "\x09" +--- +test: horizontal tab (2) +yaml: | + "\ " +php: | + "\x09" +--- +test: line feed +yaml: | + "\n" +php: | + "\x0a" +--- +test: vertical tab +yaml: | + "\v" +php: | + "\x0b" +--- +test: form feed +yaml: | + "\f" +php: | + "\x0c" +--- +test: carriage return +yaml: | + "\r" +php: | + "\x0d" +--- +test: escape +yaml: | + "\e" +php: | + "\x1b" +--- +test: space +yaml: | + "\ " +php: | + "\x20" +--- +test: slash +yaml: | + "\/" +php: | + "\x2f" +--- +test: backslash +yaml: | + "\\" +php: | + "\\" +--- +test: Unicode next line +yaml: | + "\N" +php: | + "\xc2\x85" +--- +test: Unicode non-breaking space +yaml: | + "\_" +php: | + "\xc2\xa0" +--- +test: Unicode line separator +yaml: | + "\L" +php: | + "\xe2\x80\xa8" +--- +test: Unicode paragraph separator +yaml: | + "\P" +php: | + "\xe2\x80\xa9" +--- +test: Escaped 8-bit Unicode +yaml: | + "\x42" +php: | + "B" +--- +test: Escaped 16-bit Unicode +yaml: | + "\u20ac" +php: | + "\xe2\x82\xac" +--- +test: Escaped 32-bit Unicode +yaml: | + "\U00000043" +php: | + "C" +--- +test: Example 5.13 Escaped Characters +note: | + Currently throws an error parsing first line. Maybe Symfony Yaml doesn't support + continuation of string across multiple lines? Keeping test here but disabled. +todo: true +yaml: | + "Fun with \\ + \" \a \b \e \f \ + \n \r \t \v \0 \ + \ \_ \N \L \P \ + \x41 \u0041 \U00000041" +php: | + "Fun with \x5C\n\x22 \x07 \x08 \x1B \x0C\n\x0A \x0D \x09 \x0B \x00\n\x20 \xA0 \x85 \xe2\x80\xa8 \xe2\x80\xa9\nA A A" +--- +test: Double quotes with a line feed +yaml: | + { double: "some value\n \"some quoted string\" and 'some single quotes one'" } +php: | + array( + 'double' => "some value\n \"some quoted string\" and 'some single quotes one'" + ) +--- +test: Backslashes +yaml: | + { single: 'foo\Var', no-quotes: foo\Var, double: "foo\\Var" } +php: | + array( + 'single' => 'foo\Var', 'no-quotes' => 'foo\Var', 'double' => 'foo\Var' + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/index.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/index.yml new file mode 100644 index 000000000..3216a89eb --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/index.yml @@ -0,0 +1,18 @@ +- escapedCharacters +- sfComments +- sfCompact +- sfTests +- sfObjects +- sfMergeKey +- sfQuotes +- YtsAnchorAlias +- YtsBasicTests +- YtsBlockMapping +- YtsDocumentSeparator +- YtsErrorTests +- YtsFlowCollections +- YtsFoldedScalars +- YtsNullsAndEmpties +- YtsSpecificationExamples +- YtsTypeTransfers +- unindentedCollections diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml new file mode 100644 index 000000000..5994f3230 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml @@ -0,0 +1,14 @@ +data: + single_line: 'foo bar baz' + multi_line: | + foo + line with trailing spaces: + + bar + integer like line: + 123456789 + empty line: + + baz + nested_inlined_multi_line_string: + inlined_multi_line: "foo\nbar\r\nempty line:\n\nbaz" diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml new file mode 100644 index 000000000..b72a9b699 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml @@ -0,0 +1,76 @@ +--- %YAML:1.0 +test: Comments at the end of a line +brief: > + Comments at the end of a line +yaml: | + ex1: "foo # bar" + ex2: "foo # bar" # comment + ex3: 'foo # bar' # comment + ex4: foo # comment + ex5: foo # comment with tab before + ex6: foo#foo # comment here + ex7: foo # ignore me # and me +php: | + array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo', 'ex5' => 'foo', 'ex6' => 'foo#foo', 'ex7' => 'foo') +--- +test: Comments in the middle +brief: > + Comments in the middle +yaml: | + foo: + # some comment + # some comment + bar: foo + # some comment + # some comment +php: | + array('foo' => array('bar' => 'foo')) +--- +test: Comments on a hash line +brief: > + Comments on a hash line +yaml: | + foo: # a comment + foo: bar # a comment +php: | + array('foo' => array('foo' => 'bar')) +--- +test: 'Value starting with a #' +brief: > + 'Value starting with a #' +yaml: | + foo: '#bar' +php: | + array('foo' => '#bar') +--- +test: Document starting with a comment and a separator +brief: > + Commenting before document start is allowed +yaml: | + # document comment + --- + foo: bar # a comment +php: | + array('foo' => 'bar') +--- +test: Comment containing a colon on a hash line +brief: > + Comment containing a colon on a scalar line +yaml: 'foo # comment: this is also part of the comment' +php: | + 'foo' +--- +test: 'Hash key containing a #' +brief: > + 'Hash key containing a #' +yaml: 'foo#bar: baz' +php: | + array('foo#bar' => 'baz') +--- +test: 'Hash key ending with a space and a #' +brief: > + 'Hash key ending with a space and a #' +yaml: | + 'foo #': baz +php: | + array('foo #' => 'baz') diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml new file mode 100644 index 000000000..1339d23a6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml @@ -0,0 +1,159 @@ +--- %YAML:1.0 +test: Compact notation +brief: | + Compact notation for sets of mappings with single element +yaml: | + --- + # products purchased + - item : Super Hoop + - item : Basketball + quantity: 1 + - item: + name: Big Shoes + nick: Biggies + quantity: 1 +php: | + array ( + array ( + 'item' => 'Super Hoop', + ), + array ( + 'item' => 'Basketball', + 'quantity' => 1, + ), + array ( + 'item' => array( + 'name' => 'Big Shoes', + 'nick' => 'Biggies' + ), + 'quantity' => 1 + ) + ) +--- +test: Compact notation combined with inline notation +brief: | + Combinations of compact and inline notation are allowed +yaml: | + --- + items: + - { item: Super Hoop, quantity: 1 } + - [ Basketball, Big Shoes ] +php: | + array ( + 'items' => array ( + array ( + 'item' => 'Super Hoop', + 'quantity' => 1, + ), + array ( + 'Basketball', + 'Big Shoes' + ) + ) + ) +--- %YAML:1.0 +test: Compact notation +brief: | + Compact notation for sets of mappings with single element +yaml: | + --- + # products purchased + - item : Super Hoop + - item : Basketball + quantity: 1 + - item: + name: Big Shoes + nick: Biggies + quantity: 1 +php: | + array ( + array ( + 'item' => 'Super Hoop', + ), + array ( + 'item' => 'Basketball', + 'quantity' => 1, + ), + array ( + 'item' => array( + 'name' => 'Big Shoes', + 'nick' => 'Biggies' + ), + 'quantity' => 1 + ) + ) +--- +test: Compact notation combined with inline notation +brief: | + Combinations of compact and inline notation are allowed +yaml: | + --- + items: + - { item: Super Hoop, quantity: 1 } + - [ Basketball, Big Shoes ] +php: | + array ( + 'items' => array ( + array ( + 'item' => 'Super Hoop', + 'quantity' => 1, + ), + array ( + 'Basketball', + 'Big Shoes' + ) + ) + ) +--- %YAML:1.0 +test: Compact notation +brief: | + Compact notation for sets of mappings with single element +yaml: | + --- + # products purchased + - item : Super Hoop + - item : Basketball + quantity: 1 + - item: + name: Big Shoes + nick: Biggies + quantity: 1 +php: | + array ( + array ( + 'item' => 'Super Hoop', + ), + array ( + 'item' => 'Basketball', + 'quantity' => 1, + ), + array ( + 'item' => array( + 'name' => 'Big Shoes', + 'nick' => 'Biggies' + ), + 'quantity' => 1 + ) + ) +--- +test: Compact notation combined with inline notation +brief: | + Combinations of compact and inline notation are allowed +yaml: | + --- + items: + - { item: Super Hoop, quantity: 1 } + - [ Basketball, Big Shoes ] +php: | + array ( + 'items' => array ( + array ( + 'item' => 'Super Hoop', + 'quantity' => 1, + ), + array ( + 'Basketball', + 'Big Shoes' + ) + ) + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml new file mode 100644 index 000000000..4b67d3410 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml @@ -0,0 +1,58 @@ +--- %YAML:1.0 +test: Simple In Place Substitution +brief: > + If you want to reuse an entire alias, only overwriting what is different + you can use a << in place substitution. This is not part of the official + YAML spec, but a widely implemented extension. See the following URL for + details: http://yaml.org/type/merge.html +yaml: | + foo: &foo + a: Steve + b: Clark + c: Brian + bar: + a: before + d: other + <<: *foo + b: new + x: Oren + c: + foo: bar + foo: ignore + bar: foo + duplicate: + foo: bar + foo: ignore + foo2: &foo2 + a: Ballmer + ding: &dong [ fi, fei, fo, fam] + check: + <<: + - *foo + - *dong + isit: tested + head: + <<: [ *foo , *dong , *foo2 ] + taz: &taz + a: Steve + w: + p: 1234 + nested: + <<: *taz + d: Doug + w: &nestedref + p: 12345 + z: + <<: *nestedref +php: | + array( + 'foo' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian'), + 'bar' => array('a' => 'before', 'd' => 'other', 'b' => 'new', 'c' => array('foo' => 'bar', 'bar' => 'foo'), 'x' => 'Oren'), + 'duplicate' => array('foo' => 'bar'), + 'foo2' => array('a' => 'Ballmer'), + 'ding' => array('fi', 'fei', 'fo', 'fam'), + 'check' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'fi', 'fei', 'fo', 'fam', 'isit' => 'tested'), + 'head' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'fi', 'fei', 'fo', 'fam'), + 'taz' => array('a' => 'Steve', 'w' => array('p' => 1234)), + 'nested' => array('a' => 'Steve', 'w' => array('p' => 12345), 'd' => 'Doug', 'z' => array('p' => 12345)) + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml new file mode 100644 index 000000000..ee124b244 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml @@ -0,0 +1,11 @@ +--- %YAML:1.0 +test: Objects +brief: > + Comments at the end of a line +yaml: | + ex1: "foo # bar" + ex2: "foo # bar" # comment + ex3: 'foo # bar' # comment + ex4: foo # comment +php: | + array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo') diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml new file mode 100644 index 000000000..7c60baec9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml @@ -0,0 +1,33 @@ +--- %YAML:1.0 +test: Some characters at the beginning of a string must be escaped +brief: > + Some characters at the beginning of a string must be escaped +yaml: | + foo: '| bar' +php: | + array('foo' => '| bar') +--- +test: A key can be a quoted string +brief: > + A key can be a quoted string +yaml: | + "foo1": bar + 'foo2': bar + "foo \" bar": bar + 'foo '' bar': bar + 'foo3: ': bar + "foo4: ": bar + foo5: { "foo \" bar: ": bar, 'foo '' bar: ': bar } +php: | + array( + 'foo1' => 'bar', + 'foo2' => 'bar', + 'foo " bar' => 'bar', + 'foo \' bar' => 'bar', + 'foo3: ' => 'bar', + 'foo4: ' => 'bar', + 'foo5' => array( + 'foo " bar: ' => 'bar', + 'foo \' bar: ' => 'bar', + ), + ) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml new file mode 100644 index 000000000..a427be1c8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml @@ -0,0 +1,149 @@ +--- %YAML:1.0 +test: Multiple quoted string on one line +brief: > + Multiple quoted string on one line +yaml: | + stripped_title: { name: "foo bar", help: "bar foo" } +php: | + array('stripped_title' => array('name' => 'foo bar', 'help' => 'bar foo')) +--- +test: Empty sequence +yaml: | + foo: [ ] +php: | + array('foo' => array()) +--- +test: Empty value +yaml: | + foo: +php: | + array('foo' => null) +--- +test: Inline string parsing +brief: > + Inline string parsing +yaml: | + test: ['complex: string', 'another [string]'] +php: | + array('test' => array('complex: string', 'another [string]')) +--- +test: Boolean +brief: > + Boolean +yaml: | + - false + - true + - null + - ~ + - 'false' + - 'true' + - 'null' + - '~' +php: | + array( + false, + true, + null, + null, + 'false', + 'true', + 'null', + '~', + ) +--- +test: Empty lines in literal blocks +brief: > + Empty lines in literal blocks +yaml: | + foo: + bar: | + foo + + + + bar +php: | + array('foo' => array('bar' => "foo\n\n\n \nbar\n")) +--- +test: Empty lines in folded blocks +brief: > + Empty lines in folded blocks +yaml: | + foo: + bar: > + + foo + + + bar +php: | + array('foo' => array('bar' => "\nfoo\n\nbar\n")) +--- +test: IP addresses +brief: > + IP addresses +yaml: | + foo: 10.0.0.2 +php: | + array('foo' => '10.0.0.2') +--- +test: A sequence with an embedded mapping +brief: > + A sequence with an embedded mapping +yaml: | + - foo + - bar: { bar: foo } +php: | + array('foo', array('bar' => array('bar' => 'foo'))) +--- +test: A sequence with an unordered array +brief: > + A sequence with an unordered array +yaml: | + 1: foo + 0: bar +php: | + array(1 => 'foo', 0 => 'bar') +--- +test: Octal +brief: as in spec example 2.19, octal value is converted +yaml: | + foo: 0123 +php: | + array('foo' => 83) +--- +test: Octal strings +brief: Octal notation in a string must remain a string +yaml: | + foo: "0123" +php: | + array('foo' => '0123') +--- +test: Octal strings +brief: Octal notation in a string must remain a string +yaml: | + foo: '0123' +php: | + array('foo' => '0123') +--- +test: Octal strings +brief: Octal notation in a string must remain a string +yaml: | + foo: | + 0123 +php: | + array('foo' => "0123\n") +--- +test: Document as a simple hash +brief: Document as a simple hash +yaml: | + { foo: bar } +php: | + array('foo' => 'bar') +--- +test: Document as a simple array +brief: Document as a simple array +yaml: | + [ foo, bar ] +php: | + array('foo', 'bar') diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml new file mode 100644 index 000000000..0c96108e9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml @@ -0,0 +1,82 @@ +--- %YAML:1.0 +test: Unindented collection +brief: > + Unindented collection +yaml: | + collection: + - item1 + - item2 + - item3 +php: | + array('collection' => array('item1', 'item2', 'item3')) +--- +test: Nested unindented collection (two levels) +brief: > + Nested unindented collection +yaml: | + collection: + key: + - a + - b + - c +php: | + array('collection' => array('key' => array('a', 'b', 'c'))) +--- +test: Nested unindented collection (three levels) +brief: > + Nested unindented collection +yaml: | + collection: + key: + subkey: + - one + - two + - three +php: | + array('collection' => array('key' => array('subkey' => array('one', 'two', 'three')))) +--- +test: Key/value after unindented collection (1) +brief: > + Key/value after unindented collection (1) +yaml: | + collection: + key: + - a + - b + - c + foo: bar +php: | + array('collection' => array('key' => array('a', 'b', 'c')), 'foo' => 'bar') +--- +test: Key/value after unindented collection (at the same level) +brief: > + Key/value after unindented collection +yaml: | + collection: + key: + - a + - b + - c + foo: bar +php: | + array('collection' => array('key' => array('a', 'b', 'c'), 'foo' => 'bar')) +--- +test: Shortcut Key after unindented collection +brief: > + Key/value after unindented collection +yaml: | + collection: + - key: foo + foo: bar +php: | + array('collection' => array(array('key' => 'foo', 'foo' => 'bar'))) +--- +test: Shortcut Key after unindented collection with custom spaces +brief: > + Key/value after unindented collection +yaml: | + collection: + - key: foo + foo: bar +php: | + array('collection' => array(array('key' => 'foo', 'foo' => 'bar'))) diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/InlineTest.php b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/InlineTest.php new file mode 100644 index 000000000..859a03e80 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/InlineTest.php @@ -0,0 +1,601 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Tests; + +use Symfony\Bridge\PhpUnit\ErrorAssert; +use Symfony\Component\Yaml\Inline; +use Symfony\Component\Yaml\Yaml; + +class InlineTest extends \PHPUnit_Framework_TestCase +{ + /** + * @dataProvider getTestsForParse + */ + public function testParse($yaml, $value) + { + $this->assertSame($value, Inline::parse($yaml), sprintf('::parse() converts an inline YAML to a PHP structure (%s)', $yaml)); + } + + /** + * @dataProvider getTestsForParseWithMapObjects + */ + public function testParseWithMapObjects($yaml, $value) + { + $actual = Inline::parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP); + + $this->assertSame(serialize($value), serialize($actual)); + } + + /** + * @group legacy + * @dataProvider getTestsForParseWithMapObjects + */ + public function testParseWithMapObjectsPassingTrue($yaml, $value) + { + $actual = Inline::parse($yaml, false, false, true); + + $this->assertSame(serialize($value), serialize($actual)); + } + + /** + * @dataProvider getTestsForDump + */ + public function testDump($yaml, $value) + { + $this->assertEquals($yaml, Inline::dump($value), sprintf('::dump() converts a PHP structure to an inline YAML (%s)', $yaml)); + + $this->assertSame($value, Inline::parse(Inline::dump($value)), 'check consistency'); + } + + public function testDumpNumericValueWithLocale() + { + $locale = setlocale(LC_NUMERIC, 0); + if (false === $locale) { + $this->markTestSkipped('Your platform does not support locales.'); + } + + try { + $requiredLocales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252'); + if (false === setlocale(LC_NUMERIC, $requiredLocales)) { + $this->markTestSkipped('Could not set any of required locales: '.implode(', ', $requiredLocales)); + } + + $this->assertEquals('1.2', Inline::dump(1.2)); + $this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0))); + } finally { + setlocale(LC_NUMERIC, $locale); + } + } + + public function testHashStringsResemblingExponentialNumericsShouldNotBeChangedToINF() + { + $value = '686e444'; + + $this->assertSame($value, Inline::parse(Inline::dump($value))); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage Found unknown escape character "\V". + */ + public function testParseScalarWithNonEscapedBlackslashShouldThrowException() + { + Inline::parse('"Foo\Var"'); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testParseScalarWithNonEscapedBlackslashAtTheEndShouldThrowException() + { + Inline::parse('"Foo\\"'); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testParseScalarWithIncorrectlyQuotedStringShouldThrowException() + { + $value = "'don't do somthin' like that'"; + Inline::parse($value); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testParseScalarWithIncorrectlyDoubleQuotedStringShouldThrowException() + { + $value = '"don"t do somthin" like that"'; + Inline::parse($value); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testParseInvalidMappingKeyShouldThrowException() + { + $value = '{ "foo " bar": "bar" }'; + Inline::parse($value); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testParseInvalidMappingShouldThrowException() + { + Inline::parse('[foo] bar'); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testParseInvalidSequenceShouldThrowException() + { + Inline::parse('{ foo: bar } bar'); + } + + public function testParseScalarWithCorrectlyQuotedStringShouldReturnString() + { + $value = "'don''t do somthin'' like that'"; + $expect = "don't do somthin' like that"; + + $this->assertSame($expect, Inline::parseScalar($value)); + } + + /** + * @dataProvider getDataForParseReferences + */ + public function testParseReferences($yaml, $expected) + { + $this->assertSame($expected, Inline::parse($yaml, 0, array('var' => 'var-value'))); + } + + /** + * @group legacy + * @dataProvider getDataForParseReferences + */ + public function testParseReferencesAsFifthArgument($yaml, $expected) + { + $this->assertSame($expected, Inline::parse($yaml, false, false, false, array('var' => 'var-value'))); + } + + public function getDataForParseReferences() + { + return array( + 'scalar' => array('*var', 'var-value'), + 'list' => array('[ *var ]', array('var-value')), + 'list-in-list' => array('[[ *var ]]', array(array('var-value'))), + 'map-in-list' => array('[ { key: *var } ]', array(array('key' => 'var-value'))), + 'embedded-mapping-in-list' => array('[ key: *var ]', array(array('key' => 'var-value'))), + 'map' => array('{ key: *var }', array('key' => 'var-value')), + 'list-in-map' => array('{ key: [*var] }', array('key' => array('var-value'))), + 'map-in-map' => array('{ foo: { bar: *var } }', array('foo' => array('bar' => 'var-value'))), + ); + } + + public function testParseMapReferenceInSequence() + { + $foo = array( + 'a' => 'Steve', + 'b' => 'Clark', + 'c' => 'Brian', + ); + $this->assertSame(array($foo), Inline::parse('[*foo]', 0, array('foo' => $foo))); + } + + /** + * @group legacy + */ + public function testParseMapReferenceInSequenceAsFifthArgument() + { + $foo = array( + 'a' => 'Steve', + 'b' => 'Clark', + 'c' => 'Brian', + ); + $this->assertSame(array($foo), Inline::parse('[*foo]', false, false, false, array('foo' => $foo))); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage A reference must contain at least one character. + */ + public function testParseUnquotedAsterisk() + { + Inline::parse('{ foo: * }'); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage A reference must contain at least one character. + */ + public function testParseUnquotedAsteriskFollowedByAComment() + { + Inline::parse('{ foo: * #foo }'); + } + + /** + * @dataProvider getReservedIndicators + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage cannot start a plain scalar; you need to quote the scalar. + */ + public function testParseUnquotedScalarStartingWithReservedIndicator($indicator) + { + Inline::parse(sprintf('{ foo: %sfoo }', $indicator)); + } + + public function getReservedIndicators() + { + return array(array('@'), array('`')); + } + + /** + * @dataProvider getScalarIndicators + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage cannot start a plain scalar; you need to quote the scalar. + */ + public function testParseUnquotedScalarStartingWithScalarIndicator($indicator) + { + Inline::parse(sprintf('{ foo: %sfoo }', $indicator)); + } + + public function getScalarIndicators() + { + return array(array('|'), array('>')); + } + + /** + * @group legacy + * @requires function Symfony\Bridge\PhpUnit\ErrorAssert::assertDeprecationsAreTriggered + * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0 + */ + public function testParseUnquotedScalarStartingWithPercentCharacter() + { + ErrorAssert::assertDeprecationsAreTriggered('Not quoting the scalar "%foo " starting with the "%" indicator character is deprecated since Symfony 3.1 and will throw a ParseException in 4.0.', function () { + Inline::parse('{ foo: %foo }'); + }); + } + + /** + * @dataProvider getDataForIsHash + */ + public function testIsHash($array, $expected) + { + $this->assertSame($expected, Inline::isHash($array)); + } + + public function getDataForIsHash() + { + return array( + array(array(), false), + array(array(1, 2, 3), false), + array(array(2 => 1, 1 => 2, 0 => 3), true), + array(array('foo' => 1, 'bar' => 2), true), + ); + } + + public function getTestsForParse() + { + return array( + array('', ''), + array('null', null), + array('false', false), + array('true', true), + array('12', 12), + array('-12', -12), + array('"quoted string"', 'quoted string'), + array("'quoted string'", 'quoted string'), + array('12.30e+02', 12.30e+02), + array('0x4D2', 0x4D2), + array('02333', 02333), + array('.Inf', -log(0)), + array('-.Inf', log(0)), + array("'686e444'", '686e444'), + array('686e444', 646e444), + array('123456789123456789123456789123456789', '123456789123456789123456789123456789'), + array('"foo\r\nbar"', "foo\r\nbar"), + array("'foo#bar'", 'foo#bar'), + array("'foo # bar'", 'foo # bar'), + array("'#cfcfcf'", '#cfcfcf'), + array('::form_base.html.twig', '::form_base.html.twig'), + + // Pre-YAML-1.2 booleans + array("'y'", 'y'), + array("'n'", 'n'), + array("'yes'", 'yes'), + array("'no'", 'no'), + array("'on'", 'on'), + array("'off'", 'off'), + + array('2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)), + array('2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)), + array('2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)), + array('1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)), + array('1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)), + + array('"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''), + array("'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''), + + // sequences + // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon + array('[foo, http://urls.are/no/mappings, false, null, 12]', array('foo', 'http://urls.are/no/mappings', false, null, 12)), + array('[ foo , bar , false , null , 12 ]', array('foo', 'bar', false, null, 12)), + array('[\'foo,bar\', \'foo bar\']', array('foo,bar', 'foo bar')), + + // mappings + array('{foo:bar,bar:foo,false:false,null:null,integer:12}', array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12)), + array('{ foo : bar, bar : foo, false : false, null : null, integer : 12 }', array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12)), + array('{foo: \'bar\', bar: \'foo: bar\'}', array('foo' => 'bar', 'bar' => 'foo: bar')), + array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', array('foo' => 'bar', 'bar' => 'foo: bar')), + array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', array('foo\'' => 'bar', 'bar"' => 'foo: bar')), + array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', array('foo: ' => 'bar', 'bar: ' => 'foo: bar')), + + // nested sequences and mappings + array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))), + array('[foo, {bar: foo}]', array('foo', array('bar' => 'foo'))), + array('{ foo: {bar: foo} }', array('foo' => array('bar' => 'foo'))), + array('{ foo: [bar, foo] }', array('foo' => array('bar', 'foo'))), + + array('[ foo, [ bar, foo ] ]', array('foo', array('bar', 'foo'))), + + array('[{ foo: {bar: foo} }]', array(array('foo' => array('bar' => 'foo')))), + + array('[foo, [bar, [foo, [bar, foo]], foo]]', array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo'))), + + array('[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo')))), + + array('[foo, bar: { foo: bar }]', array('foo', '1' => array('bar' => array('foo' => 'bar')))), + array('[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, '@service_container')), + ); + } + + public function getTestsForParseWithMapObjects() + { + return array( + array('', ''), + array('null', null), + array('false', false), + array('true', true), + array('12', 12), + array('-12', -12), + array('"quoted string"', 'quoted string'), + array("'quoted string'", 'quoted string'), + array('12.30e+02', 12.30e+02), + array('0x4D2', 0x4D2), + array('02333', 02333), + array('.Inf', -log(0)), + array('-.Inf', log(0)), + array("'686e444'", '686e444'), + array('686e444', 646e444), + array('123456789123456789123456789123456789', '123456789123456789123456789123456789'), + array('"foo\r\nbar"', "foo\r\nbar"), + array("'foo#bar'", 'foo#bar'), + array("'foo # bar'", 'foo # bar'), + array("'#cfcfcf'", '#cfcfcf'), + array('::form_base.html.twig', '::form_base.html.twig'), + + array('2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)), + array('2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)), + array('2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)), + array('1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)), + array('1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)), + + array('"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''), + array("'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''), + + // sequences + // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon + array('[foo, http://urls.are/no/mappings, false, null, 12]', array('foo', 'http://urls.are/no/mappings', false, null, 12)), + array('[ foo , bar , false , null , 12 ]', array('foo', 'bar', false, null, 12)), + array('[\'foo,bar\', \'foo bar\']', array('foo,bar', 'foo bar')), + + // mappings + array('{foo:bar,bar:foo,false:false,null:null,integer:12}', (object) array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12)), + array('{ foo : bar, bar : foo, false : false, null : null, integer : 12 }', (object) array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12)), + array('{foo: \'bar\', bar: \'foo: bar\'}', (object) array('foo' => 'bar', 'bar' => 'foo: bar')), + array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', (object) array('foo' => 'bar', 'bar' => 'foo: bar')), + array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', (object) array('foo\'' => 'bar', 'bar"' => 'foo: bar')), + array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', (object) array('foo: ' => 'bar', 'bar: ' => 'foo: bar')), + + // nested sequences and mappings + array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))), + array('[foo, {bar: foo}]', array('foo', (object) array('bar' => 'foo'))), + array('{ foo: {bar: foo} }', (object) array('foo' => (object) array('bar' => 'foo'))), + array('{ foo: [bar, foo] }', (object) array('foo' => array('bar', 'foo'))), + + array('[ foo, [ bar, foo ] ]', array('foo', array('bar', 'foo'))), + + array('[{ foo: {bar: foo} }]', array((object) array('foo' => (object) array('bar' => 'foo')))), + + array('[foo, [bar, [foo, [bar, foo]], foo]]', array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo'))), + + array('[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', array('foo', (object) array('bar' => 'foo', 'foo' => array('foo', (object) array('bar' => 'foo'))), array('foo', (object) array('bar' => 'foo')))), + + array('[foo, bar: { foo: bar }]', array('foo', '1' => (object) array('bar' => (object) array('foo' => 'bar')))), + array('[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', array('foo', '@foo.baz', (object) array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, '@service_container')), + + array('{}', new \stdClass()), + array('{ foo : bar, bar : {} }', (object) array('foo' => 'bar', 'bar' => new \stdClass())), + array('{ foo : [], bar : {} }', (object) array('foo' => array(), 'bar' => new \stdClass())), + array('{foo: \'bar\', bar: {} }', (object) array('foo' => 'bar', 'bar' => new \stdClass())), + array('{\'foo\': \'bar\', "bar": {}}', (object) array('foo' => 'bar', 'bar' => new \stdClass())), + array('{\'foo\': \'bar\', "bar": \'{}\'}', (object) array('foo' => 'bar', 'bar' => '{}')), + + array('[foo, [{}, {}]]', array('foo', array(new \stdClass(), new \stdClass()))), + array('[foo, [[], {}]]', array('foo', array(array(), new \stdClass()))), + array('[foo, [[{}, {}], {}]]', array('foo', array(array(new \stdClass(), new \stdClass()), new \stdClass()))), + array('[foo, {bar: {}}]', array('foo', '1' => (object) array('bar' => new \stdClass()))), + ); + } + + public function getTestsForDump() + { + return array( + array('null', null), + array('false', false), + array('true', true), + array('12', 12), + array("'quoted string'", 'quoted string'), + array('!!float 1230', 12.30e+02), + array('1234', 0x4D2), + array('1243', 02333), + array('.Inf', -log(0)), + array('-.Inf', log(0)), + array("'686e444'", '686e444'), + array('"foo\r\nbar"', "foo\r\nbar"), + array("'foo#bar'", 'foo#bar'), + array("'foo # bar'", 'foo # bar'), + array("'#cfcfcf'", '#cfcfcf'), + + array("'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''), + + array("'-dash'", '-dash'), + array("'-'", '-'), + + // Pre-YAML-1.2 booleans + array("'y'", 'y'), + array("'n'", 'n'), + array("'yes'", 'yes'), + array("'no'", 'no'), + array("'on'", 'on'), + array("'off'", 'off'), + + // sequences + array('[foo, bar, false, null, 12]', array('foo', 'bar', false, null, 12)), + array('[\'foo,bar\', \'foo bar\']', array('foo,bar', 'foo bar')), + + // mappings + array('{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }', array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12)), + array('{ foo: bar, bar: \'foo: bar\' }', array('foo' => 'bar', 'bar' => 'foo: bar')), + + // nested sequences and mappings + array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))), + + array('[foo, [bar, [foo, [bar, foo]], foo]]', array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo'))), + + array('{ foo: { bar: foo } }', array('foo' => array('bar' => 'foo'))), + + array('[foo, { bar: foo }]', array('foo', array('bar' => 'foo'))), + + array('[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]', array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo')))), + + array('[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, '@service_container')), + + array('{ foo: { bar: { 1: 2, baz: 3 } } }', array('foo' => array('bar' => array(1 => 2, 'baz' => 3)))), + ); + } + + /** + * @dataProvider getTimestampTests + */ + public function testParseTimestampAsUnixTimestampByDefault($yaml, $year, $month, $day, $hour, $minute, $second) + { + $this->assertSame(gmmktime($hour, $minute, $second, $month, $day, $year), Inline::parse($yaml)); + } + + /** + * @dataProvider getTimestampTests + */ + public function testParseTimestampAsDateTimeObject($yaml, $year, $month, $day, $hour, $minute, $second) + { + $expected = new \DateTime($yaml); + $expected->setTimeZone(new \DateTimeZone('UTC')); + $expected->setDate($year, $month, $day); + $expected->setTime($hour, $minute, $second); + + $this->assertEquals($expected, Inline::parse($yaml, Yaml::PARSE_DATETIME)); + } + + public function getTimestampTests() + { + return array( + 'canonical' => array('2001-12-15T02:59:43.1Z', 2001, 12, 15, 2, 59, 43), + 'ISO-8601' => array('2001-12-15t21:59:43.10-05:00', 2001, 12, 16, 2, 59, 43), + 'spaced' => array('2001-12-15 21:59:43.10 -5', 2001, 12, 16, 2, 59, 43), + 'date' => array('2001-12-15', 2001, 12, 15, 0, 0, 0), + ); + } + + /** + * @dataProvider getTimestampTests + */ + public function testParseNestedTimestampListAsDateTimeObject($yaml, $year, $month, $day, $hour, $minute, $second) + { + $expected = new \DateTime($yaml); + $expected->setTimeZone(new \DateTimeZone('UTC')); + $expected->setDate($year, $month, $day); + $expected->setTime($hour, $minute, $second); + + $expectedNested = array('nested' => array($expected)); + $yamlNested = "{nested: [$yaml]}"; + + $this->assertEquals($expectedNested, Inline::parse($yamlNested, Yaml::PARSE_DATETIME)); + } + + /** + * @dataProvider getDateTimeDumpTests + */ + public function testDumpDateTime($dateTime, $expected) + { + $this->assertSame($expected, Inline::dump($dateTime)); + } + + public function getDateTimeDumpTests() + { + $tests = array(); + + $dateTime = new \DateTime('2001-12-15 21:59:43', new \DateTimeZone('UTC')); + $tests['date-time-utc'] = array($dateTime, '2001-12-15T21:59:43+00:00'); + + $dateTime = new \DateTimeImmutable('2001-07-15 21:59:43', new \DateTimeZone('Europe/Berlin')); + $tests['immutable-date-time-europe-berlin'] = array($dateTime, '2001-07-15T21:59:43+02:00'); + + return $tests; + } + + /** + * @dataProvider getBinaryData + */ + public function testParseBinaryData($data) + { + $this->assertSame('Hello world', Inline::parse($data)); + } + + public function getBinaryData() + { + return array( + 'enclosed with double quotes' => array('!!binary "SGVsbG8gd29ybGQ="'), + 'enclosed with single quotes' => array("!!binary 'SGVsbG8gd29ybGQ='"), + 'containing spaces' => array('!!binary "SGVs bG8gd 29ybGQ="'), + ); + } + + /** + * @dataProvider getInvalidBinaryData + */ + public function testParseInvalidBinaryData($data, $expectedMessage) + { + $this->setExpectedExceptionRegExp('\Symfony\Component\Yaml\Exception\ParseException', $expectedMessage); + + Inline::parse($data); + } + + public function getInvalidBinaryData() + { + return array( + 'length not a multiple of four' => array('!!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'), + 'invalid characters' => array('!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'), + 'too many equals characters' => array('!!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'), + 'misplaced equals character' => array('!!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/ParseExceptionTest.php b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/ParseExceptionTest.php new file mode 100644 index 000000000..7286d45a0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/ParseExceptionTest.php @@ -0,0 +1,33 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Tests; + +use Symfony\Component\Yaml\Exception\ParseException; + +class ParseExceptionTest extends \PHPUnit_Framework_TestCase +{ + public function testGetMessage() + { + $exception = new ParseException('Error message', 42, 'foo: bar', '/var/www/app/config.yml'); + $message = 'Error message in "/var/www/app/config.yml" at line 42 (near "foo: bar")'; + + $this->assertEquals($message, $exception->getMessage()); + } + + public function testGetMessageWithUnicodeInFilename() + { + $exception = new ParseException('Error message', 42, 'foo: bar', 'äöü.yml'); + $message = 'Error message in "äöü.yml" at line 42 (near "foo: bar")'; + + $this->assertEquals($message, $exception->getMessage()); + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Tests/ParserTest.php b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/ParserTest.php new file mode 100644 index 000000000..c2f4891d4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Tests/ParserTest.php @@ -0,0 +1,1338 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Tests; + +use Symfony\Component\Yaml\Yaml; +use Symfony\Component\Yaml\Parser; + +class ParserTest extends \PHPUnit_Framework_TestCase +{ + protected $parser; + + protected function setUp() + { + $this->parser = new Parser(); + } + + protected function tearDown() + { + $this->parser = null; + } + + /** + * @dataProvider getDataFormSpecifications + */ + public function testSpecifications($file, $expected, $yaml, $comment) + { + $this->assertEquals($expected, var_export($this->parser->parse($yaml), true), $comment); + } + + public function getDataFormSpecifications() + { + $parser = new Parser(); + $path = __DIR__.'/Fixtures'; + + $tests = array(); + $files = $parser->parse(file_get_contents($path.'/index.yml')); + foreach ($files as $file) { + $yamls = file_get_contents($path.'/'.$file.'.yml'); + + // split YAMLs documents + foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml) { + if (!$yaml) { + continue; + } + + $test = $parser->parse($yaml); + if (isset($test['todo']) && $test['todo']) { + // TODO + } else { + eval('$expected = '.trim($test['php']).';'); + + $tests[] = array($file, var_export($expected, true), $test['yaml'], $test['test']); + } + } + } + + return $tests; + } + + public function testTabsInYaml() + { + // test tabs in YAML + $yamls = array( + "foo:\n bar", + "foo:\n bar", + "foo:\n bar", + "foo:\n bar", + ); + + foreach ($yamls as $yaml) { + try { + $content = $this->parser->parse($yaml); + + $this->fail('YAML files must not contain tabs'); + } catch (\Exception $e) { + $this->assertInstanceOf('\Exception', $e, 'YAML files must not contain tabs'); + $this->assertEquals('A YAML file cannot contain tabs as indentation at line 2 (near "'.strpbrk($yaml, "\t").'").', $e->getMessage(), 'YAML files must not contain tabs'); + } + } + } + + public function testEndOfTheDocumentMarker() + { + $yaml = <<<'EOF' +--- %YAML:1.0 +foo +... +EOF; + + $this->assertEquals('foo', $this->parser->parse($yaml)); + } + + public function getBlockChompingTests() + { + $tests = array(); + + $yaml = <<<'EOF' +foo: |- + one + two +bar: |- + one + two + +EOF; + $expected = array( + 'foo' => "one\ntwo", + 'bar' => "one\ntwo", + ); + $tests['Literal block chomping strip with single trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: |- + one + two + +bar: |- + one + two + + +EOF; + $expected = array( + 'foo' => "one\ntwo", + 'bar' => "one\ntwo", + ); + $tests['Literal block chomping strip with multiple trailing newlines'] = array($expected, $yaml); + + $yaml = <<<'EOF' +{} + + +EOF; + $expected = array(); + $tests['Literal block chomping strip with multiple trailing newlines after a 1-liner'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: |- + one + two +bar: |- + one + two +EOF; + $expected = array( + 'foo' => "one\ntwo", + 'bar' => "one\ntwo", + ); + $tests['Literal block chomping strip without trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: | + one + two +bar: | + one + two + +EOF; + $expected = array( + 'foo' => "one\ntwo\n", + 'bar' => "one\ntwo\n", + ); + $tests['Literal block chomping clip with single trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: | + one + two + +bar: | + one + two + + +EOF; + $expected = array( + 'foo' => "one\ntwo\n", + 'bar' => "one\ntwo\n", + ); + $tests['Literal block chomping clip with multiple trailing newlines'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: | + one + two +bar: | + one + two +EOF; + $expected = array( + 'foo' => "one\ntwo\n", + 'bar' => "one\ntwo", + ); + $tests['Literal block chomping clip without trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: |+ + one + two +bar: |+ + one + two + +EOF; + $expected = array( + 'foo' => "one\ntwo\n", + 'bar' => "one\ntwo\n", + ); + $tests['Literal block chomping keep with single trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: |+ + one + two + +bar: |+ + one + two + + +EOF; + $expected = array( + 'foo' => "one\ntwo\n\n", + 'bar' => "one\ntwo\n\n", + ); + $tests['Literal block chomping keep with multiple trailing newlines'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: |+ + one + two +bar: |+ + one + two +EOF; + $expected = array( + 'foo' => "one\ntwo\n", + 'bar' => "one\ntwo", + ); + $tests['Literal block chomping keep without trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: >- + one + two +bar: >- + one + two + +EOF; + $expected = array( + 'foo' => 'one two', + 'bar' => 'one two', + ); + $tests['Folded block chomping strip with single trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: >- + one + two + +bar: >- + one + two + + +EOF; + $expected = array( + 'foo' => 'one two', + 'bar' => 'one two', + ); + $tests['Folded block chomping strip with multiple trailing newlines'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: >- + one + two +bar: >- + one + two +EOF; + $expected = array( + 'foo' => 'one two', + 'bar' => 'one two', + ); + $tests['Folded block chomping strip without trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: > + one + two +bar: > + one + two + +EOF; + $expected = array( + 'foo' => "one two\n", + 'bar' => "one two\n", + ); + $tests['Folded block chomping clip with single trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: > + one + two + +bar: > + one + two + + +EOF; + $expected = array( + 'foo' => "one two\n", + 'bar' => "one two\n", + ); + $tests['Folded block chomping clip with multiple trailing newlines'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: > + one + two +bar: > + one + two +EOF; + $expected = array( + 'foo' => "one two\n", + 'bar' => 'one two', + ); + $tests['Folded block chomping clip without trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: >+ + one + two +bar: >+ + one + two + +EOF; + $expected = array( + 'foo' => "one two\n", + 'bar' => "one two\n", + ); + $tests['Folded block chomping keep with single trailing newline'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: >+ + one + two + +bar: >+ + one + two + + +EOF; + $expected = array( + 'foo' => "one two\n\n", + 'bar' => "one two\n\n", + ); + $tests['Folded block chomping keep with multiple trailing newlines'] = array($expected, $yaml); + + $yaml = <<<'EOF' +foo: >+ + one + two +bar: >+ + one + two +EOF; + $expected = array( + 'foo' => "one two\n", + 'bar' => 'one two', + ); + $tests['Folded block chomping keep without trailing newline'] = array($expected, $yaml); + + return $tests; + } + + /** + * @dataProvider getBlockChompingTests + */ + public function testBlockChomping($expected, $yaml) + { + $this->assertSame($expected, $this->parser->parse($yaml)); + } + + /** + * Regression test for issue #7989. + * + * @see https://github.com/symfony/symfony/issues/7989 + */ + public function testBlockLiteralWithLeadingNewlines() + { + $yaml = <<<'EOF' +foo: |- + + + bar + +EOF; + $expected = array( + 'foo' => "\n\nbar", + ); + + $this->assertSame($expected, $this->parser->parse($yaml)); + } + + public function testObjectSupportEnabled() + { + $input = <<assertEquals(array('foo' => new B(), 'bar' => 1), $this->parser->parse($input, Yaml::PARSE_OBJECT), '->parse() is able to parse objects'); + } + + /** + * @group legacy + */ + public function testObjectSupportEnabledPassingTrue() + { + $input = <<assertEquals(array('foo' => new B(), 'bar' => 1), $this->parser->parse($input, false, true), '->parse() is able to parse objects'); + } + + /** + * @group legacy + */ + public function testObjectSupportEnabledWithDeprecatedTag() + { + $input = <<assertEquals(array('foo' => new B(), 'bar' => 1), $this->parser->parse($input, Yaml::PARSE_OBJECT), '->parse() is able to parse objects'); + } + + /** + * @dataProvider invalidDumpedObjectProvider + */ + public function testObjectSupportDisabledButNoExceptions($input) + { + $this->assertEquals(array('foo' => null, 'bar' => 1), $this->parser->parse($input), '->parse() does not parse objects'); + } + + /** + * @dataProvider getObjectForMapTests + */ + public function testObjectForMap($yaml, $expected) + { + $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP)); + } + + /** + * @group legacy + * @dataProvider getObjectForMapTests + */ + public function testObjectForMapEnabledWithMappingUsingBooleanToggles($yaml, $expected) + { + $this->assertEquals($expected, $this->parser->parse($yaml, false, false, true)); + } + + public function getObjectForMapTests() + { + $tests = array(); + + $yaml = <<foo = new \stdClass(); + $expected->foo->fiz = array('cat'); + $tests['mapping'] = array($yaml, $expected); + + $yaml = '{ "foo": "bar", "fiz": "cat" }'; + $expected = new \stdClass(); + $expected->foo = 'bar'; + $expected->fiz = 'cat'; + $tests['inline-mapping'] = array($yaml, $expected); + + $yaml = "foo: bar\nbaz: foobar"; + $expected = new \stdClass(); + $expected->foo = 'bar'; + $expected->baz = 'foobar'; + $tests['object-for-map-is-applied-after-parsing'] = array($yaml, $expected); + + $yaml = <<array = array(); + $expected->array[0] = new \stdClass(); + $expected->array[0]->key = 'one'; + $expected->array[1] = new \stdClass(); + $expected->array[1]->key = 'two'; + $tests['nest-map-and-sequence'] = array($yaml, $expected); + + $yaml = <<map = new \stdClass(); + $expected->map->{1} = 'one'; + $expected->map->{2} = 'two'; + $tests['numeric-keys'] = array($yaml, $expected); + + $yaml = <<map = new \stdClass(); + $expected->map->{0} = 'one'; + $expected->map->{1} = 'two'; + $tests['zero-indexed-numeric-keys'] = array($yaml, $expected); + + return $tests; + } + + /** + * @dataProvider invalidDumpedObjectProvider + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testObjectsSupportDisabledWithExceptions($yaml) + { + $this->parser->parse($yaml, Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE); + } + + /** + * @group legacy + * @dataProvider invalidDumpedObjectProvider + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testObjectsSupportDisabledWithExceptionsUsingBooleanToggles($yaml) + { + $this->parser->parse($yaml, true); + } + + public function invalidDumpedObjectProvider() + { + $yamlTag = << array($yamlTag), + 'local-tag' => array($localTag), + ); + } + + /** + * @requires extension iconv + */ + public function testNonUtf8Exception() + { + $yamls = array( + iconv('UTF-8', 'ISO-8859-1', "foo: 'äöüß'"), + iconv('UTF-8', 'ISO-8859-15', "euro: '€'"), + iconv('UTF-8', 'CP1252', "cp1252: '©ÉÇáñ'"), + ); + + foreach ($yamls as $yaml) { + try { + $this->parser->parse($yaml); + + $this->fail('charsets other than UTF-8 are rejected.'); + } catch (\Exception $e) { + $this->assertInstanceOf('Symfony\Component\Yaml\Exception\ParseException', $e, 'charsets other than UTF-8 are rejected.'); + } + } + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testUnindentedCollectionException() + { + $yaml = <<<'EOF' + +collection: +-item1 +-item2 +-item3 + +EOF; + + $this->parser->parse($yaml); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testShortcutKeyUnindentedCollectionException() + { + $yaml = <<<'EOF' + +collection: +- key: foo + foo: bar + +EOF; + + $this->parser->parse($yaml); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessageRegExp /^Multiple documents are not supported.+/ + */ + public function testMultipleDocumentsNotSupportedException() + { + Yaml::parse(<<<'EOL' +# Ranking of 1998 home runs +--- +- Mark McGwire +- Sammy Sosa +- Ken Griffey + +# Team ranking +--- +- Chicago Cubs +- St Louis Cardinals +EOL + ); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testSequenceInAMapping() + { + Yaml::parse(<<<'EOF' +yaml: + hash: me + - array stuff +EOF + ); + } + + public function testSequenceInMappingStartedBySingleDashLine() + { + $yaml = << array( + array( + 'b' => array( + array( + 'bar' => 'baz', + ), + ), + ), + 'foo', + ), + 'd' => 'e', + ); + + $this->assertSame($expected, $this->parser->parse($yaml)); + } + + public function testSequenceFollowedByCommentEmbeddedInMapping() + { + $yaml = << array( + 'b' => array('c'), + 'd' => 'e', + ), + ); + + $this->assertSame($expected, $this->parser->parse($yaml)); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + */ + public function testMappingInASequence() + { + Yaml::parse(<<<'EOF' +yaml: + - array stuff + hash: me +EOF + ); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage missing colon + */ + public function testScalarInSequence() + { + Yaml::parse(<< It is an error for two equal keys to appear in the same mapping node. + * > In such a case the YAML processor may continue, ignoring the second + * > `key: value` pair and issuing an appropriate warning. This strategy + * > preserves a consistent information model for one-pass and random access + * > applications. + * + * @see http://yaml.org/spec/1.2/spec.html#id2759572 + * @see http://yaml.org/spec/1.1/#id932806 + */ + public function testMappingDuplicateKeyBlock() + { + $input = << array( + 'child' => 'first', + ), + ); + $this->assertSame($expected, Yaml::parse($input)); + } + + public function testMappingDuplicateKeyFlow() + { + $input = << array( + 'child' => 'first', + ), + ); + $this->assertSame($expected, Yaml::parse($input)); + } + + public function testEmptyValue() + { + $input = <<<'EOF' +hash: +EOF; + + $this->assertEquals(array('hash' => null), Yaml::parse($input)); + } + + public function testCommentAtTheRootIndent() + { + $this->assertEquals(array( + 'services' => array( + 'app.foo_service' => array( + 'class' => 'Foo', + ), + 'app/bar_service' => array( + 'class' => 'Bar', + ), + ), + ), Yaml::parse(<<<'EOF' +# comment 1 +services: +# comment 2 + # comment 3 + app.foo_service: + class: Foo +# comment 4 + # comment 5 + app/bar_service: + class: Bar +EOF + )); + } + + public function testStringBlockWithComments() + { + $this->assertEquals(array('content' => <<<'EOT' +# comment 1 +header + + # comment 2 + +

title

+ + +footer # comment3 +EOT + ), Yaml::parse(<<<'EOF' +content: | + # comment 1 + header + + # comment 2 + +

title

+ + + footer # comment3 +EOF + )); + } + + public function testFoldedStringBlockWithComments() + { + $this->assertEquals(array(array('content' => <<<'EOT' +# comment 1 +header + + # comment 2 + +

title

+ + +footer # comment3 +EOT + )), Yaml::parse(<<<'EOF' +- + content: | + # comment 1 + header + + # comment 2 + +

title

+ + + footer # comment3 +EOF + )); + } + + public function testNestedFoldedStringBlockWithComments() + { + $this->assertEquals(array(array( + 'title' => 'some title', + 'content' => <<<'EOT' +# comment 1 +header + + # comment 2 + +

title

+ + +footer # comment3 +EOT + )), Yaml::parse(<<<'EOF' +- + title: some title + content: | + # comment 1 + header + + # comment 2 + +

title

+ + + footer # comment3 +EOF + )); + } + + public function testReferenceResolvingInInlineStrings() + { + $this->assertEquals(array( + 'var' => 'var-value', + 'scalar' => 'var-value', + 'list' => array('var-value'), + 'list_in_list' => array(array('var-value')), + 'map_in_list' => array(array('key' => 'var-value')), + 'embedded_mapping' => array(array('key' => 'var-value')), + 'map' => array('key' => 'var-value'), + 'list_in_map' => array('key' => array('var-value')), + 'map_in_map' => array('foo' => array('bar' => 'var-value')), + ), Yaml::parse(<<<'EOF' +var: &var var-value +scalar: *var +list: [ *var ] +list_in_list: [[ *var ]] +map_in_list: [ { key: *var } ] +embedded_mapping: [ key: *var ] +map: { key: *var } +list_in_map: { key: [*var] } +map_in_map: { foo: { bar: *var } } +EOF + )); + } + + public function testYamlDirective() + { + $yaml = <<<'EOF' +%YAML 1.2 +--- +foo: 1 +bar: 2 +EOF; + $this->assertEquals(array('foo' => 1, 'bar' => 2), $this->parser->parse($yaml)); + } + + public function testFloatKeys() + { + $yaml = <<<'EOF' +foo: + 1.2: "bar" + 1.3: "baz" +EOF; + + $expected = array( + 'foo' => array( + '1.2' => 'bar', + '1.3' => 'baz', + ), + ); + + $this->assertEquals($expected, $this->parser->parse($yaml)); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage A colon cannot be used in an unquoted mapping value + */ + public function testColonInMappingValueException() + { + $yaml = <<parser->parse($yaml); + } + + public function testColonInMappingValueExceptionNotTriggeredByColonInComment() + { + $yaml = <<assertSame(array('foo' => array('bar' => 'foobar')), $this->parser->parse($yaml)); + } + + /** + * @dataProvider getCommentLikeStringInScalarBlockData + */ + public function testCommentLikeStringsAreNotStrippedInBlockScalars($yaml, $expectedParserResult) + { + $this->assertSame($expectedParserResult, $this->parser->parse($yaml)); + } + + public function getCommentLikeStringInScalarBlockData() + { + $tests = array(); + + $yaml = <<<'EOT' +pages: + - + title: some title + content: | + # comment 1 + header + + # comment 2 + +

title

+ + + footer # comment3 +EOT; + $expected = array( + 'pages' => array( + array( + 'title' => 'some title', + 'content' => <<<'EOT' +# comment 1 +header + + # comment 2 + +

title

+ + +footer # comment3 +EOT + , + ), + ), + ); + $tests[] = array($yaml, $expected); + + $yaml = <<<'EOT' +test: | + foo + # bar + baz +collection: + - one: | + foo + # bar + baz + - two: | + foo + # bar + baz +EOT; + $expected = array( + 'test' => <<<'EOT' +foo +# bar +baz + +EOT + , + 'collection' => array( + array( + 'one' => <<<'EOT' +foo +# bar +baz + +EOT + , + ), + array( + 'two' => <<<'EOT' +foo +# bar +baz +EOT + , + ), + ), + ); + $tests[] = array($yaml, $expected); + + $yaml = << + line1 + line2> + baz: +# comment + foobar: ~ +EOT; + $expected = array( + 'foo' => array( + 'bar' => array( + 'scalar-block' => "line1 line2>\n", + ), + 'baz' => array( + 'foobar' => null, + ), + ), + ); + $tests[] = array($yaml, $expected); + + $yaml = <<<'EOT' +a: + b: hello +# c: | +# first row +# second row + d: hello +EOT; + $expected = array( + 'a' => array( + 'b' => 'hello', + 'd' => 'hello', + ), + ); + $tests[] = array($yaml, $expected); + + return $tests; + } + + public function testBlankLinesAreParsedAsNewLinesInFoldedBlocks() + { + $yaml = << +

A heading

+ +
    +
  • a list
  • +
  • may be a good example
  • +
+EOT; + + $this->assertSame( + array( + 'test' => <<A heading +
  • a list
  • may be a good example
+EOT + , + ), + $this->parser->parse($yaml) + ); + } + + public function testAdditionallyIndentedLinesAreParsedAsNewLinesInFoldedBlocks() + { + $yaml = << +

A heading

+ +
    +
  • a list
  • +
  • may be a good example
  • +
+EOT; + + $this->assertSame( + array( + 'test' => <<A heading +
    +
  • a list
  • +
  • may be a good example
  • +
+EOT + , + ), + $this->parser->parse($yaml) + ); + } + + /** + * @dataProvider getBinaryData + */ + public function testParseBinaryData($data) + { + $this->assertSame(array('data' => 'Hello world'), $this->parser->parse($data)); + } + + public function getBinaryData() + { + return array( + 'enclosed with double quotes' => array('data: !!binary "SGVsbG8gd29ybGQ="'), + 'enclosed with single quotes' => array("data: !!binary 'SGVsbG8gd29ybGQ='"), + 'containing spaces' => array('data: !!binary "SGVs bG8gd 29ybGQ="'), + 'in block scalar' => array( + << array( + <<setExpectedExceptionRegExp('\Symfony\Component\Yaml\Exception\ParseException', $expectedMessage); + + $this->parser->parse($data); + } + + public function getInvalidBinaryData() + { + return array( + 'length not a multiple of four' => array('data: !!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'), + 'invalid characters' => array('!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'), + 'too many equals characters' => array('data: !!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'), + 'misplaced equals character' => array('data: !!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'), + 'length not a multiple of four in block scalar' => array( + << array( + << array( + << array( + <<setTimeZone(new \DateTimeZone('UTC')); + $expectedDate->setDate(2002, 12, 14); + $expectedDate->setTime(0, 0, 0); + + $this->assertEquals(array('date' => $expectedDate), $this->parser->parse($yaml, Yaml::PARSE_DATETIME)); + } + + /** + * @param $lineNumber + * @param $yaml + * @dataProvider parserThrowsExceptionWithCorrectLineNumberProvider + */ + public function testParserThrowsExceptionWithCorrectLineNumber($lineNumber, $yaml) + { + $this->setExpectedException( + '\Symfony\Component\Yaml\Exception\ParseException', + sprintf('Unexpected characters near "," at line %d (near "bar: "123",").', $lineNumber) + ); + + $this->parser->parse($yaml); + } + + public function parserThrowsExceptionWithCorrectLineNumberProvider() + { + return array( + array( + 4, + << + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Tests; + +use Symfony\Component\Yaml\Yaml; + +class YamlTest extends \PHPUnit_Framework_TestCase +{ + public function testParseAndDump() + { + $data = array('lorem' => 'ipsum', 'dolor' => 'sit'); + $yml = Yaml::dump($data); + $parsed = Yaml::parse($yml); + $this->assertEquals($data, $parsed); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testZeroIndentationThrowsException() + { + Yaml::dump(array('lorem' => 'ipsum', 'dolor' => 'sit'), 2, 0); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testNegativeIndentationThrowsException() + { + Yaml::dump(array('lorem' => 'ipsum', 'dolor' => 'sit'), 2, -4); + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Unescaper.php b/dkan/.ahoy/site/vendor/symfony/yaml/Unescaper.php new file mode 100644 index 000000000..6e863e12f --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Unescaper.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\ParseException; + +/** + * Unescaper encapsulates unescaping rules for single and double-quoted + * YAML strings. + * + * @author Matthew Lewinski + * + * @internal + */ +class Unescaper +{ + /** + * Regex fragment that matches an escaped character in a double quoted string. + */ + const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)'; + + /** + * Unescapes a single quoted string. + * + * @param string $value A single quoted string + * + * @return string The unescaped string + */ + public function unescapeSingleQuotedString($value) + { + return str_replace('\'\'', '\'', $value); + } + + /** + * Unescapes a double quoted string. + * + * @param string $value A double quoted string + * + * @return string The unescaped string + */ + public function unescapeDoubleQuotedString($value) + { + $callback = function ($match) { + return $this->unescapeCharacter($match[0]); + }; + + // evaluate the string + return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value); + } + + /** + * Unescapes a character that was found in a double-quoted string. + * + * @param string $value An escaped character + * + * @return string The unescaped character + */ + private function unescapeCharacter($value) + { + switch ($value[1]) { + case '0': + return "\x0"; + case 'a': + return "\x7"; + case 'b': + return "\x8"; + case 't': + return "\t"; + case "\t": + return "\t"; + case 'n': + return "\n"; + case 'v': + return "\xB"; + case 'f': + return "\xC"; + case 'r': + return "\r"; + case 'e': + return "\x1B"; + case ' ': + return ' '; + case '"': + return '"'; + case '/': + return '/'; + case '\\': + return '\\'; + case 'N': + // U+0085 NEXT LINE + return "\xC2\x85"; + case '_': + // U+00A0 NO-BREAK SPACE + return "\xC2\xA0"; + case 'L': + // U+2028 LINE SEPARATOR + return "\xE2\x80\xA8"; + case 'P': + // U+2029 PARAGRAPH SEPARATOR + return "\xE2\x80\xA9"; + case 'x': + return self::utf8chr(hexdec(substr($value, 2, 2))); + case 'u': + return self::utf8chr(hexdec(substr($value, 2, 4))); + case 'U': + return self::utf8chr(hexdec(substr($value, 2, 8))); + default: + throw new ParseException(sprintf('Found unknown escape character "%s".', $value)); + } + } + + /** + * Get the UTF-8 character for the given code point. + * + * @param int $c The unicode code point + * + * @return string The corresponding UTF-8 character + */ + private static function utf8chr($c) + { + if (0x80 > $c %= 0x200000) { + return chr($c); + } + if (0x800 > $c) { + return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F); + } + if (0x10000 > $c) { + return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F); + } + + return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F); + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/Yaml.php b/dkan/.ahoy/site/vendor/symfony/yaml/Yaml.php new file mode 100644 index 000000000..2271480ff --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/Yaml.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\ParseException; + +/** + * Yaml offers convenience methods to load and dump YAML. + * + * @author Fabien Potencier + */ +class Yaml +{ + const DUMP_OBJECT = 1; + const PARSE_EXCEPTION_ON_INVALID_TYPE = 2; + const PARSE_OBJECT = 4; + const PARSE_OBJECT_FOR_MAP = 8; + const DUMP_EXCEPTION_ON_INVALID_TYPE = 16; + const PARSE_DATETIME = 32; + const DUMP_OBJECT_AS_MAP = 64; + const DUMP_MULTI_LINE_LITERAL_BLOCK = 128; + + /** + * Parses YAML into a PHP value. + * + * Usage: + * + * $array = Yaml::parse(file_get_contents('config.yml')); + * print_r($array); + * + * + * @param string $input A string containing YAML + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @return mixed The YAML converted to a PHP value + * + * @throws ParseException If the YAML is not valid + */ + public static function parse($input, $flags = 0) + { + if (is_bool($flags)) { + @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED); + + if ($flags) { + $flags = self::PARSE_EXCEPTION_ON_INVALID_TYPE; + } else { + $flags = 0; + } + } + + if (func_num_args() >= 3) { + @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the PARSE_OBJECT flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(2)) { + $flags |= self::PARSE_OBJECT; + } + } + + if (func_num_args() >= 4) { + @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(3)) { + $flags |= self::PARSE_OBJECT_FOR_MAP; + } + } + + $yaml = new Parser(); + + return $yaml->parse($input, $flags); + } + + /** + * Dumps a PHP value to a YAML string. + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. + * + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The amount of spaces to use for indentation of nested nodes + * @param int $flags A bit field of DUMP_* constants to customize the dumped YAML string + * + * @return string A YAML string representing the original PHP value + */ + public static function dump($input, $inline = 2, $indent = 4, $flags = 0) + { + if (is_bool($flags)) { + @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED); + + if ($flags) { + $flags = self::DUMP_EXCEPTION_ON_INVALID_TYPE; + } else { + $flags = 0; + } + } + + if (func_num_args() >= 5) { + @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the DUMP_OBJECT flag instead.', E_USER_DEPRECATED); + + if (func_get_arg(4)) { + $flags |= self::DUMP_OBJECT; + } + } + + $yaml = new Dumper($indent); + + return $yaml->dump($input, $inline, 0, $flags); + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/composer.json b/dkan/.ahoy/site/vendor/symfony/yaml/composer.json new file mode 100644 index 000000000..b835655f6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/composer.json @@ -0,0 +1,33 @@ +{ + "name": "symfony/yaml", + "type": "library", + "description": "Symfony Yaml Component", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.5.9" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Yaml\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + } +} diff --git a/dkan/.ahoy/site/vendor/symfony/yaml/phpunit.xml.dist b/dkan/.ahoy/site/vendor/symfony/yaml/phpunit.xml.dist new file mode 100644 index 000000000..6bdbea16e --- /dev/null +++ b/dkan/.ahoy/site/vendor/symfony/yaml/phpunit.xml.dist @@ -0,0 +1,28 @@ + + + + + + + + + + ./Tests/ + + + + + + ./ + + ./Tests + ./vendor + + + + diff --git a/dkan/.ahoy/site/vendor/twig/twig/.editorconfig b/dkan/.ahoy/site/vendor/twig/twig/.editorconfig new file mode 100644 index 000000000..270f1d1b7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/.editorconfig @@ -0,0 +1,18 @@ +; top-most EditorConfig file +root = true + +; Unix-style newlines +[*] +end_of_line = LF + +[*.php] +indent_style = space +indent_size = 4 + +[*.test] +indent_style = space +indent_size = 4 + +[*.rst] +indent_style = space +indent_size = 4 diff --git a/dkan/.ahoy/site/vendor/twig/twig/.travis.yml b/dkan/.ahoy/site/vendor/twig/twig/.travis.yml new file mode 100644 index 000000000..37262da2f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/.travis.yml @@ -0,0 +1,39 @@ +language: php + +sudo: false + +cache: + directories: + - vendor + - $HOME/.composer/cache + +php: + - 5.2 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - hhvm + +env: + - TWIG_EXT=no + - TWIG_EXT=yes + +install: + # Composer is not available on PHP 5.2 + - if [ ${TRAVIS_PHP_VERSION:0:3} != "5.2" ]; then travis_retry composer install; fi + +before_script: + - if [ "$TWIG_EXT" == "yes" ]; then sh -c "cd ext/twig && phpize && ./configure --enable-twig && make && make install"; fi + - if [ "$TWIG_EXT" == "yes" ]; then echo "extension=twig.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi + - if [ ${TRAVIS_PHP_VERSION:0:3} == "5.2" ]; then sed -i.bak "s|vendor/autoload.php|test/bootstrap.php|" phpunit.xml.dist; fi + +matrix: + fast_finish: true + exclude: + - php: hhvm + env: TWIG_EXT=yes + allow_failures: + - php: 7.0 + env: TWIG_EXT=yes diff --git a/dkan/.ahoy/site/vendor/twig/twig/CHANGELOG b/dkan/.ahoy/site/vendor/twig/twig/CHANGELOG new file mode 100644 index 000000000..933eb3708 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/CHANGELOG @@ -0,0 +1,866 @@ +* 1.26.1 (2016-10-05) + + * fixed default implementation of Twig_Template::getDebugInfo() for better BC + * fixed regression on static calls for functions/filters/tests + +* 1.26.0 (2016-10-02) + + * added template cache invalidation based on more environment options + * added a missing deprecation notice + * fixed template paths when a template is stored in a PHAR file + * allowed filters/functions/tests implementation to use a different class than the extension they belong to + * deprecated Twig_ExtensionInterface::getName() + +* 1.25.0 (2016-09-21) + + * changed the way we store template source in template classes + * removed usage of realpath in cache keys + * fixed Twig cache sharing when used with different versions of PHP + * removed embed parent workaround for simple use cases + * deprecated the ability to store non Node instances in Node::$nodes + * deprecated Twig_Environment::getLexer(), Twig_Environment::getParser(), Twig_Environment::getCompiler() + * deprecated Twig_Compiler::getFilename() + +* 1.24.2 (2016-09-01) + + * fixed static callables + * fixed a potential PHP warning when loading the cache + * fixed a case where the autoescaping does not work as expected + +* 1.24.1 (2016-05-30) + + * fixed reserved keywords (forbids true, false, null and none keywords for variables names) + * fixed support for PHP7 (Throwable support) + * marked the following methods as being internals on Twig_Environment: + getFunctions(), getFilters(), getTests(), getFunction(), getFilter(), getTest(), + getTokenParsers(), getTags(), getNodeVisitors(), getUnaryOperators(), getBinaryOperators(), + getFunctions(), getFilters(), getGlobals(), initGlobals(), initExtensions(), and initExtension() + +* 1.24.0 (2016-01-25) + + * adding support for the ?? operator + * fixed the defined test when used on a constant, a map, or a sequence + * undeprecated _self (should only be used to get the template name, not the template instance) + * fixed parsing on PHP7 + +* 1.23.3 (2016-01-11) + + * fixed typo + +* 1.23.2 (2015-01-11) + + * added versions in deprecated messages + * made file cache tolerant for trailing (back)slashes on directory configuration + * deprecated unused Twig_Node_Expression_ExtensionReference class + +* 1.23.1 (2015-11-05) + + * fixed some exception messages which triggered PHP warnings + * fixed BC on Twig_Test_NodeTestCase + +* 1.23.0 (2015-10-29) + + * deprecated the possibility to override an extension by registering another one with the same name + * deprecated Twig_ExtensionInterface::getGlobals() (added Twig_Extension_GlobalsInterface for BC) + * deprecated Twig_ExtensionInterface::initRuntime() (added Twig_Extension_InitRuntimeInterface for BC) + * deprecated Twig_Environment::computeAlternatives() + +* 1.22.3 (2015-10-13) + + * fixed regression when using null as a cache strategy + * improved performance when checking template freshness + * fixed warnings when loaded templates do not exist + * fixed template class name generation to prevent possible collisions + * fixed logic for custom escapers to call them even on integers and null values + * changed template cache names to take into account the Twig C extension + +* 1.22.2 (2015-09-22) + + * fixed a race condition in template loading + +* 1.22.1 (2015-09-15) + + * fixed regression in template_from_string + +* 1.22.0 (2015-09-13) + + * made Twig_Test_IntegrationTestCase more flexible + * added an option to force PHP bytecode invalidation when writing a compiled template into the cache + * fixed the profiler duration for the root node + * changed template cache names to take into account enabled extensions + * deprecated Twig_Environment::clearCacheFiles(), Twig_Environment::getCacheFilename(), + Twig_Environment::writeCacheFile(), and Twig_Environment::getTemplateClassPrefix() + * added a way to override the filesystem template cache system + * added a way to get the original template source from Twig_Template + +* 1.21.2 (2015-09-09) + + * fixed variable names for the deprecation triggering code + * fixed escaping strategy detection based on filename + * added Traversable support for replace, merge, and sort + * deprecated support for character by character replacement for the "replace" filter + +* 1.21.1 (2015-08-26) + + * fixed regression when using the deprecated Twig_Test_* classes + +* 1.21.0 (2015-08-24) + + * added deprecation notices for deprecated features + * added a deprecation "framework" for filters/functions/tests and test fixtures + +* 1.20.0 (2015-08-12) + + * forbid access to the Twig environment from templates and internal parts of Twig_Template + * fixed limited RCEs when in sandbox mode + * deprecated Twig_Template::getEnvironment() + * deprecated the _self variable for usage outside of the from and import tags + * added Twig_BaseNodeVisitor to ease the compatibility of node visitors + between 1.x and 2.x + +* 1.19.0 (2015-07-31) + + * fixed wrong error message when including an undefined template in a child template + * added support for variadic filters, functions, and tests + * added support for extra positional arguments in macros + * added ignore_missing flag to the source function + * fixed batch filter with zero items + * deprecated Twig_Environment::clearTemplateCache() + * fixed sandbox disabling when using the include function + +* 1.18.2 (2015-06-06) + + * fixed template/line guessing in exceptions for nested templates + * optimized the number of inodes and the size of realpath cache when using the cache + +* 1.18.1 (2015-04-19) + + * fixed memory leaks in the C extension + * deprecated Twig_Loader_String + * fixed the slice filter when used with a SimpleXMLElement object + * fixed filesystem loader when trying to load non-files (like directories) + +* 1.18.0 (2015-01-25) + + * fixed some error messages where the line was wrong (unknown variables or argument names) + * added a new way to customize the main Module node (via empty nodes) + * added Twig_Environment::createTemplate() to create a template from a string + * added a profiler + * fixed filesystem loader cache when different file paths are used for the same template + +* 1.17.0 (2015-01-14) + + * added a 'filename' autoescaping strategy, which dynamically chooses the + autoescaping strategy for a template based on template file extension. + +* 1.16.3 (2014-12-25) + + * fixed regression for dynamic parent templates + * fixed cache management with statcache + * fixed a regression in the slice filter + +* 1.16.2 (2014-10-17) + + * fixed timezone on dates as strings + * fixed 2-words test names when a custom node class is not used + * fixed macros when using an argument named like a PHP super global (like GET or POST) + * fixed date_modify when working with DateTimeImmutable + * optimized for loops + * fixed multi-byte characters handling in the split filter + * fixed a regression in the in operator + * fixed a regression in the slice filter + +* 1.16.1 (2014-10-10) + + * improved error reporting in a sandboxed template + * fixed missing error file/line information under certain circumstances + * fixed wrong error line number in some error messages + * fixed the in operator to use strict comparisons + * sped up the slice filter + * fixed for mb function overload mb_substr acting different + * fixed the attribute() function when passing a variable for the arguments + +* 1.16.0 (2014-07-05) + + * changed url_encode to always encode according to RFC 3986 + * fixed inheritance in a 'use'-hierarchy + * removed the __toString policy check when the sandbox is disabled + * fixed recursively calling blocks in templates with inheritance + +* 1.15.1 (2014-02-13) + + * fixed the conversion of the special '0000-00-00 00:00' date + * added an error message when trying to import an undefined block from a trait + * fixed a C extension crash when accessing defined but uninitialized property. + +* 1.15.0 (2013-12-06) + + * made ignoreStrictCheck in Template::getAttribute() works with __call() methods throwing BadMethodCallException + * added min and max functions + * added the round filter + * fixed a bug that prevented the optimizers to be enabled/disabled selectively + * fixed first and last filters for UTF-8 strings + * added a source function to include the content of a template without rendering it + * fixed the C extension sandbox behavior when get or set is prepend to method name + +* 1.14.2 (2013-10-30) + + * fixed error filename/line when an error occurs in an included file + * allowed operators that contain whitespaces to have more than one whitespace + * allowed tests to be made of 1 or 2 words (like "same as" or "divisible by") + +* 1.14.1 (2013-10-15) + + * made it possible to use named operators as variables + * fixed the possibility to have a variable named 'matches' + * added support for PHP 5.5 DateTimeInterface + +* 1.14.0 (2013-10-03) + + * fixed usage of the html_attr escaping strategy to avoid double-escaping with the html strategy + * added new operators: ends with, starts with, and matches + * fixed some compatibility issues with HHVM + * added a way to add custom escaping strategies + * fixed the C extension compilation on Windows + * fixed the batch filter when using a fill argument with an exact match of elements to batch + * fixed the filesystem loader cache when a template name exists in several namespaces + * fixed template_from_string when the template includes or extends other ones + * fixed a crash of the C extension on an edge case + +* 1.13.2 (2013-08-03) + + * fixed the error line number for an error occurs in and embedded template + * fixed crashes of the C extension on some edge cases + +* 1.13.1 (2013-06-06) + + * added the possibility to ignore the filesystem constructor argument in Twig_Loader_Filesystem + * fixed Twig_Loader_Chain::exists() for a loader which implements Twig_ExistsLoaderInterface + * adjusted backtrace call to reduce memory usage when an error occurs + * added support for object instances as the second argument of the constant test + * fixed the include function when used in an assignment + +* 1.13.0 (2013-05-10) + + * fixed getting a numeric-like item on a variable ('09' for instance) + * fixed getting a boolean or float key on an array, so it is consistent with PHP's array access: + `{{ array[false] }}` behaves the same as `echo $array[false];` (equals `$array[0]`) + * made the escape filter 20% faster for happy path (escaping string for html with UTF-8) + * changed ☃ to § in tests + * enforced usage of named arguments after positional ones + +* 1.12.3 (2013-04-08) + + * fixed a security issue in the filesystem loader where it was possible to include a template one + level above the configured path + * fixed fatal error that should be an exception when adding a filter/function/test too late + * added a batch filter + * added support for encoding an array as query string in the url_encode filter + +* 1.12.2 (2013-02-09) + + * fixed the timezone used by the date filter and function when the given date contains a timezone (like 2010-01-28T15:00:00+02:00) + * fixed globals when getGlobals is called early on + * added the first and last filter + +* 1.12.1 (2013-01-15) + + * added support for object instances as the second argument of the constant function + * relaxed globals management to avoid a BC break + * added support for {{ some_string[:2] }} + +* 1.12.0 (2013-01-08) + + * added verbatim as an alias for the raw tag to avoid confusion with the raw filter + * fixed registration of tests and functions as anonymous functions + * fixed globals management + +* 1.12.0-RC1 (2012-12-29) + + * added an include function (does the same as the include tag but in a more flexible way) + * added the ability to use any PHP callable to define filters, functions, and tests + * added a syntax error when using a loop variable that is not defined + * added the ability to set default values for macro arguments + * added support for named arguments for filters, tests, and functions + * moved filters/functions/tests syntax errors to the parser + * added support for extended ternary operator syntaxes + +* 1.11.1 (2012-11-11) + + * fixed debug info line numbering (was off by 2) + * fixed escaping when calling a macro inside another one (regression introduced in 1.9.1) + * optimized variable access on PHP 5.4 + * fixed a crash of the C extension when an exception was thrown from a macro called without being imported (using _self.XXX) + +* 1.11.0 (2012-11-07) + + * fixed macro compilation when a variable name is a PHP reserved keyword + * changed the date filter behavior to always apply the default timezone, except if false is passed as the timezone + * fixed bitwise operator precedences + * added the template_from_string function + * fixed default timezone usage for the date function + * optimized the way Twig exceptions are managed (to make them faster) + * added Twig_ExistsLoaderInterface (implementing this interface in your loader make the chain loader much faster) + +* 1.10.3 (2012-10-19) + + * fixed wrong template location in some error messages + * reverted a BC break introduced in 1.10.2 + * added a split filter + +* 1.10.2 (2012-10-15) + + * fixed macro calls on PHP 5.4 + +* 1.10.1 (2012-10-15) + + * made a speed optimization to macro calls when imported via the "import" tag + * fixed C extension compilation on Windows + * fixed a segfault in the C extension when using DateTime objects + +* 1.10.0 (2012-09-28) + + * extracted functional tests framework to make it reusable for third-party extensions + * added namespaced templates support in Twig_Loader_Filesystem + * added Twig_Loader_Filesystem::prependPath() + * fixed an error when a token parser pass a closure as a test to the subparse() method + +* 1.9.2 (2012-08-25) + + * fixed the in operator for objects that contain circular references + * fixed the C extension when accessing a public property of an object implementing the \ArrayAccess interface + +* 1.9.1 (2012-07-22) + + * optimized macro calls when auto-escaping is on + * fixed wrong parent class for Twig_Function_Node + * made Twig_Loader_Chain more explicit about problems + +* 1.9.0 (2012-07-13) + + * made the parsing independent of the template loaders + * fixed exception trace when an error occurs when rendering a child template + * added escaping strategies for CSS, URL, and HTML attributes + * fixed nested embed tag calls + * added the date_modify filter + +* 1.8.3 (2012-06-17) + + * fixed paths in the filesystem loader when passing a path that ends with a slash or a backslash + * fixed escaping when a project defines a function named html or js + * fixed chmod mode to apply the umask correctly + +* 1.8.2 (2012-05-30) + + * added the abs filter + * fixed a regression when using a number in template attributes + * fixed compiler when mbstring.func_overload is set to 2 + * fixed DateTimeZone support in date filter + +* 1.8.1 (2012-05-17) + + * fixed a regression when dealing with SimpleXMLElement instances in templates + * fixed "is_safe" value for the "dump" function when "html_errors" is not defined in php.ini + * switched to use mbstring whenever possible instead of iconv (you might need to update your encoding as mbstring and iconv encoding names sometimes differ) + +* 1.8.0 (2012-05-08) + + * enforced interface when adding tests, filters, functions, and node visitors from extensions + * fixed a side-effect of the date filter where the timezone might be changed + * simplified usage of the autoescape tag; the only (optional) argument is now the escaping strategy or false (with a BC layer) + * added a way to dynamically change the auto-escaping strategy according to the template "filename" + * changed the autoescape option to also accept a supported escaping strategy (for BC, true is equivalent to html) + * added an embed tag + +* 1.7.0 (2012-04-24) + + * fixed a PHP warning when using CIFS + * fixed template line number in some exceptions + * added an iterable test + * added an error when defining two blocks with the same name in a template + * added the preserves_safety option for filters + * fixed a PHP notice when trying to access a key on a non-object/array variable + * enhanced error reporting when the template file is an instance of SplFileInfo + * added Twig_Environment::mergeGlobals() + * added compilation checks to avoid misuses of the sandbox tag + * fixed filesystem loader freshness logic for high traffic websites + * fixed random function when charset is null + +* 1.6.5 (2012-04-11) + + * fixed a regression when a template only extends another one without defining any blocks + +* 1.6.4 (2012-04-02) + + * fixed PHP notice in Twig_Error::guessTemplateLine() introduced in 1.6.3 + * fixed performance when compiling large files + * optimized parent template creation when the template does not use dynamic inheritance + +* 1.6.3 (2012-03-22) + + * fixed usage of Z_ADDREF_P for PHP 5.2 in the C extension + * fixed compilation of numeric values used in templates when using a locale where the decimal separator is not a dot + * made the strategy used to guess the real template file name and line number in exception messages much faster and more accurate + +* 1.6.2 (2012-03-18) + + * fixed sandbox mode when used with inheritance + * added preserveKeys support for the slice filter + * fixed the date filter when a DateTime instance is passed with a specific timezone + * added a trim filter + +* 1.6.1 (2012-02-29) + + * fixed Twig C extension + * removed the creation of Twig_Markup instances when not needed + * added a way to set the default global timezone for dates + * fixed the slice filter on strings when the length is not specified + * fixed the creation of the cache directory in case of a race condition + +* 1.6.0 (2012-02-04) + + * fixed raw blocks when used with the whitespace trim option + * made a speed optimization to macro calls when imported via the "from" tag + * fixed globals, parsers, visitors, filters, tests, and functions management in Twig_Environment when a new one or new extension is added + * fixed the attribute function when passing arguments + * added slice notation support for the [] operator (syntactic sugar for the slice operator) + * added a slice filter + * added string support for the reverse filter + * fixed the empty test and the length filter for Twig_Markup instances + * added a date function to ease date comparison + * fixed unary operators precedence + * added recursive parsing support in the parser + * added string and integer handling for the random function + +* 1.5.1 (2012-01-05) + + * fixed a regression when parsing strings + +* 1.5.0 (2012-01-04) + + * added Traversable objects support for the join filter + +* 1.5.0-RC2 (2011-12-30) + + * added a way to set the default global date interval format + * fixed the date filter for DateInterval instances (setTimezone() does not exist for them) + * refactored Twig_Template::display() to ease its extension + * added a number_format filter + +* 1.5.0-RC1 (2011-12-26) + + * removed the need to quote hash keys + * allowed hash keys to be any expression + * added a do tag + * added a flush tag + * added support for dynamically named filters and functions + * added a dump function to help debugging templates + * added a nl2br filter + * added a random function + * added a way to change the default format for the date filter + * fixed the lexer when an operator ending with a letter ends a line + * added string interpolation support + * enhanced exceptions for unknown filters, functions, tests, and tags + +* 1.4.0 (2011-12-07) + + * fixed lexer when using big numbers (> PHP_INT_MAX) + * added missing preserveKeys argument to the reverse filter + * fixed macros containing filter tag calls + +* 1.4.0-RC2 (2011-11-27) + + * removed usage of Reflection in Twig_Template::getAttribute() + * added a C extension that can optionally replace Twig_Template::getAttribute() + * added negative timestamp support to the date filter + +* 1.4.0-RC1 (2011-11-20) + + * optimized variable access when using PHP 5.4 + * changed the precedence of the .. operator to be more consistent with languages that implements such a feature like Ruby + * added an Exception to Twig_Loader_Array::isFresh() method when the template does not exist to be consistent with other loaders + * added Twig_Function_Node to allow more complex functions to have their own Node class + * added Twig_Filter_Node to allow more complex filters to have their own Node class + * added Twig_Test_Node to allow more complex tests to have their own Node class + * added a better error message when a template is empty but contain a BOM + * fixed "in" operator for empty strings + * fixed the "defined" test and the "default" filter (now works with more than one call (foo.bar.foo) and for both values of the strict_variables option) + * changed the way extensions are loaded (addFilter/addFunction/addGlobal/addTest/addNodeVisitor/addTokenParser/addExtension can now be called in any order) + * added Twig_Environment::display() + * made the escape filter smarter when the encoding is not supported by PHP + * added a convert_encoding filter + * moved all node manipulations outside the compile() Node method + * made several speed optimizations + +* 1.3.0 (2011-10-08) + +no changes + +* 1.3.0-RC1 (2011-10-04) + + * added an optimization for the parent() function + * added cache reloading when auto_reload is true and an extension has been modified + * added the possibility to force the escaping of a string already marked as safe (instance of Twig_Markup) + * allowed empty templates to be used as traits + * added traits support for the "parent" function + +* 1.2.0 (2011-09-13) + +no changes + +* 1.2.0-RC1 (2011-09-10) + + * enhanced the exception when a tag remains unclosed + * added support for empty Countable objects for the "empty" test + * fixed algorithm that determines if a template using inheritance is valid (no output between block definitions) + * added better support for encoding problems when escaping a string (available as of PHP 5.4) + * added a way to ignore a missing template when using the "include" tag ({% include "foo" ignore missing %}) + * added support for an array of templates to the "include" and "extends" tags ({% include ['foo', 'bar'] %}) + * added support for bitwise operators in expressions + * added the "attribute" function to allow getting dynamic attributes on variables + * added Twig_Loader_Chain + * added Twig_Loader_Array::setTemplate() + * added an optimization for the set tag when used to capture a large chunk of static text + * changed name regex to match PHP one "[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*" (works for blocks, tags, functions, filters, and macros) + * removed the possibility to use the "extends" tag from a block + * added "if" modifier support to "for" loops + +* 1.1.2 (2011-07-30) + + * fixed json_encode filter on PHP 5.2 + * fixed regression introduced in 1.1.1 ({{ block(foo|lower) }}) + * fixed inheritance when using conditional parents + * fixed compilation of templates when the body of a child template is not empty + * fixed output when a macro throws an exception + * fixed a parsing problem when a large chunk of text is enclosed in a comment tag + * added PHPDoc for all Token parsers and Core extension functions + +* 1.1.1 (2011-07-17) + + * added a performance optimization in the Optimizer (also helps to lower the number of nested level calls) + * made some performance improvement for some edge cases + +* 1.1.0 (2011-06-28) + + * fixed json_encode filter + +* 1.1.0-RC3 (2011-06-24) + + * fixed method case-sensitivity when using the sandbox mode + * added timezone support for the date filter + * fixed possible security problems with NUL bytes + +* 1.1.0-RC2 (2011-06-16) + + * added an exception when the template passed to "use" is not a string + * made 'a.b is defined' not throw an exception if a is not defined (in strict mode) + * added {% line \d+ %} directive + +* 1.1.0-RC1 (2011-05-28) + +Flush your cache after upgrading. + + * fixed date filter when using a timestamp + * fixed the defined test for some cases + * fixed a parsing problem when a large chunk of text is enclosed in a raw tag + * added support for horizontal reuse of template blocks (see docs for more information) + * added whitespace control modifier to all tags (see docs for more information) + * added null as an alias for none (the null test is also an alias for the none test now) + * made TRUE, FALSE, NONE equivalent to their lowercase counterparts + * wrapped all compilation and runtime exceptions with Twig_Error_Runtime and added logic to guess the template name and line + * moved display() method to Twig_Template (generated templates should now use doDisplay() instead) + +* 1.0.0 (2011-03-27) + + * fixed output when using mbstring + * fixed duplicate call of methods when using the sandbox + * made the charset configurable for the escape filter + +* 1.0.0-RC2 (2011-02-21) + + * changed the way {% set %} works when capturing (the content is now marked as safe) + * added support for macro name in the endmacro tag + * make Twig_Error compatible with PHP 5.3.0 > + * fixed an infinite loop on some Windows configurations + * fixed the "length" filter for numbers + * fixed Template::getAttribute() as properties in PHP are case sensitive + * removed coupling between Twig_Node and Twig_Template + * fixed the ternary operator precedence rule + +* 1.0.0-RC1 (2011-01-09) + +Backward incompatibilities: + + * the "items" filter, which has been deprecated for quite a long time now, has been removed + * the "range" filter has been converted to a function: 0|range(10) -> range(0, 10) + * the "constant" filter has been converted to a function: {{ some_date|date('DATE_W3C'|constant) }} -> {{ some_date|date(constant('DATE_W3C')) }} + * the "cycle" filter has been converted to a function: {{ ['odd', 'even']|cycle(i) }} -> {{ cycle(['odd', 'even'], i) }} + * the "for" tag does not support "joined by" anymore + * the "autoescape" first argument is now "true"/"false" (instead of "on"/"off") + * the "parent" tag has been replaced by a "parent" function ({{ parent() }} instead of {% parent %}) + * the "display" tag has been replaced by a "block" function ({{ block('title') }} instead of {% display title %}) + * removed the grammar and simple token parser (moved to the Twig Extensions repository) + +Changes: + + * added "needs_context" option for filters and functions (the context is then passed as a first argument) + * added global variables support + * made macros return their value instead of echoing directly (fixes calling a macro in sandbox mode) + * added the "from" tag to import macros as functions + * added support for functions (a function is just syntactic sugar for a getAttribute() call) + * made macros callable when sandbox mode is enabled + * added an exception when a macro uses a reserved name + * the "default" filter now uses the "empty" test instead of just checking for null + * added the "empty" test + +* 0.9.10 (2010-12-16) + +Backward incompatibilities: + + * The Escaper extension is enabled by default, which means that all displayed + variables are now automatically escaped. You can revert to the previous + behavior by removing the extension via $env->removeExtension('escaper') + or just set the 'autoescape' option to 'false'. + * removed the "without loop" attribute for the "for" tag (not needed anymore + as the Optimizer take care of that for most cases) + * arrays and hashes have now a different syntax + * arrays keep the same syntax with square brackets: [1, 2] + * hashes now use curly braces (["a": "b"] should now be written as {"a": "b"}) + * support for "arrays with keys" and "hashes without keys" is not supported anymore ([1, "foo": "bar"] or {"foo": "bar", 1}) + * the i18n extension is now part of the Twig Extensions repository + +Changes: + + * added the merge filter + * removed 'is_escaper' option for filters (a left over from the previous version) -- you must use 'is_safe' now instead + * fixed usage of operators as method names (like is, in, and not) + * changed the order of execution for node visitors + * fixed default() filter behavior when used with strict_variables set to on + * fixed filesystem loader compatibility with PHAR files + * enhanced error messages when an unexpected token is parsed in an expression + * fixed filename not being added to syntax error messages + * added the autoescape option to enable/disable autoescaping + * removed the newline after a comment (mimics PHP behavior) + * added a syntax error exception when parent block is used on a template that does not extend another one + * made the Escaper extension enabled by default + * fixed sandbox extension when used with auto output escaping + * fixed escaper when wrapping a Twig_Node_Print (the original class must be preserved) + * added an Optimizer extension (enabled by default; optimizes "for" loops and "raw" filters) + * added priority to node visitors + +* 0.9.9 (2010-11-28) + +Backward incompatibilities: + * the self special variable has been renamed to _self + * the odd and even filters are now tests: + {{ foo|odd }} must now be written {{ foo is odd }} + * the "safe" filter has been renamed to "raw" + * in Node classes, + sub-nodes are now accessed via getNode() (instead of property access) + attributes via getAttribute() (instead of array access) + * the urlencode filter had been renamed to url_encode + * the include tag now merges the passed variables with the current context by default + (the old behavior is still possible by adding the "only" keyword) + * moved Exceptions to Twig_Error_* (Twig_SyntaxError/Twig_RuntimeError are now Twig_Error_Syntax/Twig_Error_Runtime) + * removed support for {{ 1 < i < 3 }} (use {{ i > 1 and i < 3 }} instead) + * the "in" filter has been removed ({{ a|in(b) }} should now be written {{ a in b }}) + +Changes: + * added file and line to Twig_Error_Runtime exceptions thrown from Twig_Template + * changed trans tag to accept any variable for the plural count + * fixed sandbox mode (__toString() method check was not enforced if called implicitly from complex statements) + * added the ** (power) operator + * changed the algorithm used for parsing expressions + * added the spaceless tag + * removed trim_blocks option + * added support for is*() methods for attributes (foo.bar now looks for foo->getBar() or foo->isBar()) + * changed all exceptions to extend Twig_Error + * fixed unary expressions ({{ not(1 or 0) }}) + * fixed child templates (with an extend tag) that uses one or more imports + * added support for {{ 1 not in [2, 3] }} (more readable than the current {{ not (1 in [2, 3]) }}) + * escaping has been rewritten + * the implementation of template inheritance has been rewritten + (blocks can now be called individually and still work with inheritance) + * fixed error handling for if tag when a syntax error occurs within a subparse process + * added a way to implement custom logic for resolving token parsers given a tag name + * fixed js escaper to be stricter (now uses a whilelist-based js escaper) + * added the following filers: "constant", "trans", "replace", "json_encode" + * added a "constant" test + * fixed objects with __toString() not being autoescaped + * fixed subscript expressions when calling __call() (methods now keep the case) + * added "test" feature (accessible via the "is" operator) + * removed the debug tag (should be done in an extension) + * fixed trans tag when no vars are used in plural form + * fixed race condition when writing template cache + * added the special _charset variable to reference the current charset + * added the special _context variable to reference the current context + * renamed self to _self (to avoid conflict) + * fixed Twig_Template::getAttribute() for protected properties + +* 0.9.8 (2010-06-28) + +Backward incompatibilities: + * the trans tag plural count is now attached to the plural tag: + old: `{% trans count %}...{% plural %}...{% endtrans %}` + new: `{% trans %}...{% plural count %}...{% endtrans %}` + + * added a way to translate strings coming from a variable ({% trans var %}) + * fixed trans tag when used with the Escaper extension + * fixed default cache umask + * removed Twig_Template instances from the debug tag output + * fixed objects with __isset() defined + * fixed set tag when used with a capture + * fixed type hinting for Twig_Environment::addFilter() method + +* 0.9.7 (2010-06-12) + +Backward incompatibilities: + * changed 'as' to '=' for the set tag ({% set title as "Title" %} must now be {% set title = "Title" %}) + * removed the sandboxed attribute of the include tag (use the new sandbox tag instead) + * refactored the Node system (if you have custom nodes, you will have to update them to use the new API) + + * added self as a special variable that refers to the current template (useful for importing macros from the current template) + * added Twig_Template instance support to the include tag + * added support for dynamic and conditional inheritance ({% extends some_var %} and {% extends standalone ? "minimum" : "base" %}) + * added a grammar sub-framework to ease the creation of custom tags + * fixed the for tag for large arrays (some loop variables are now only available for arrays and objects that implement the Countable interface) + * removed the Twig_Resource::resolveMissingFilter() method + * fixed the filter tag which did not apply filtering to included files + * added a bunch of unit tests + * added a bunch of phpdoc + * added a sandbox tag in the sandbox extension + * changed the date filter to support any date format supported by DateTime + * added strict_variable setting to throw an exception when an invalid variable is used in a template (disabled by default) + * added the lexer, parser, and compiler as arguments to the Twig_Environment constructor + * changed the cache option to only accepts an explicit path to a cache directory or false + * added a way to add token parsers, filters, and visitors without creating an extension + * added three interfaces: Twig_NodeInterface, Twig_TokenParserInterface, and Twig_FilterInterface + * changed the generated code to match the new coding standards + * fixed sandbox mode (__toString() method check was not enforced if called implicitly from a simple statement like {{ article }}) + * added an exception when a child template has a non-empty body (as it is always ignored when rendering) + +* 0.9.6 (2010-05-12) + + * fixed variables defined outside a loop and for which the value changes in a for loop + * fixed the test suite for PHP 5.2 and older versions of PHPUnit + * added support for __call() in expression resolution + * fixed node visiting for macros (macros are now visited by visitors as any other node) + * fixed nested block definitions with a parent call (rarely useful but nonetheless supported now) + * added the cycle filter + * fixed the Lexer when mbstring.func_overload is used with an mbstring.internal_encoding different from ASCII + * added a long-syntax for the set tag ({% set foo %}...{% endset %}) + * unit tests are now powered by PHPUnit + * added support for gettext via the `i18n` extension + * fixed twig_capitalize_string_filter() and fixed twig_length_filter() when used with UTF-8 values + * added a more useful exception if an if tag is not closed properly + * added support for escaping strategy in the autoescape tag + * fixed lexer when a template has a big chunk of text between/in a block + +* 0.9.5 (2010-01-20) + +As for any new release, don't forget to remove all cached templates after +upgrading. + +If you have defined custom filters, you MUST upgrade them for this release. To +upgrade, replace "array" with "new Twig_Filter_Function", and replace the +environment constant by the "needs_environment" option: + + // before + 'even' => array('twig_is_even_filter', false), + 'escape' => array('twig_escape_filter', true), + + // after + 'even' => new Twig_Filter_Function('twig_is_even_filter'), + 'escape' => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true)), + +If you have created NodeTransformer classes, you will need to upgrade them to +the new interface (please note that the interface is not yet considered +stable). + + * fixed list nodes that did not extend the Twig_NodeListInterface + * added the "without loop" option to the for tag (it disables the generation of the loop variable) + * refactored node transformers to node visitors + * fixed automatic-escaping for blocks + * added a way to specify variables to pass to an included template + * changed the automatic-escaping rules to be more sensible and more configurable in custom filters (the documentation lists all the rules) + * improved the filter system to allow object methods to be used as filters + * changed the Array and String loaders to actually make use of the cache mechanism + * included the default filter function definitions in the extension class files directly (Core, Escaper) + * added the // operator (like the floor() PHP function) + * added the .. operator (as a syntactic sugar for the range filter when the step is 1) + * added the in operator (as a syntactic sugar for the in filter) + * added the following filters in the Core extension: in, range + * added support for arrays (same behavior as in PHP, a mix between lists and dictionaries, arrays and hashes) + * enhanced some error messages to provide better feedback in case of parsing errors + +* 0.9.4 (2009-12-02) + +If you have custom loaders, you MUST upgrade them for this release: The +Twig_Loader base class has been removed, and the Twig_LoaderInterface has also +been changed (see the source code for more information or the documentation). + + * added support for DateTime instances for the date filter + * fixed loop.last when the array only has one item + * made it possible to insert newlines in tag and variable blocks + * fixed a bug when a literal '\n' were present in a template text + * fixed bug when the filename of a template contains */ + * refactored loaders + +* 0.9.3 (2009-11-11) + +This release is NOT backward compatible with the previous releases. + + The loaders do not take the cache and autoReload arguments anymore. Instead, + the Twig_Environment class has two new options: cache and auto_reload. + Upgrading your code means changing this kind of code: + + $loader = new Twig_Loader_Filesystem('/path/to/templates', '/path/to/compilation_cache', true); + $twig = new Twig_Environment($loader); + + to something like this: + + $loader = new Twig_Loader_Filesystem('/path/to/templates'); + $twig = new Twig_Environment($loader, array( + 'cache' => '/path/to/compilation_cache', + 'auto_reload' => true, + )); + + * deprecated the "items" filter as it is not needed anymore + * made cache and auto_reload options of Twig_Environment instead of arguments of Twig_Loader + * optimized template loading speed + * removed output when an error occurs in a template and render() is used + * made major speed improvements for loops (up to 300% on even the smallest loops) + * added properties as part of the sandbox mode + * added public properties support (obj.item can now be the item property on the obj object) + * extended set tag to support expression as value ({% set foo as 'foo' ~ 'bar' %} ) + * fixed bug when \ was used in HTML + +* 0.9.2 (2009-10-29) + + * made some speed optimizations + * changed the cache extension to .php + * added a js escaping strategy + * added support for short block tag + * changed the filter tag to allow chained filters + * made lexer more flexible as you can now change the default delimiters + * added set tag + * changed default directory permission when cache dir does not exist (more secure) + * added macro support + * changed filters first optional argument to be a Twig_Environment instance instead of a Twig_Template instance + * made Twig_Autoloader::autoload() a static method + * avoid writing template file if an error occurs + * added $ escaping when outputting raw strings + * enhanced some error messages to ease debugging + * fixed empty cache files when the template contains an error + +* 0.9.1 (2009-10-14) + + * fixed a bug in PHP 5.2.6 + * fixed numbers with one than one decimal + * added support for method calls with arguments ({{ foo.bar('a', 43) }}) + * made small speed optimizations + * made minor tweaks to allow better extensibility and flexibility + +* 0.9.0 (2009-10-12) + + * Initial release diff --git a/dkan/.ahoy/site/vendor/twig/twig/LICENSE b/dkan/.ahoy/site/vendor/twig/twig/LICENSE new file mode 100644 index 000000000..cc74f810e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2009-2016 by the Twig Team. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/dkan/.ahoy/site/vendor/twig/twig/README.rst b/dkan/.ahoy/site/vendor/twig/twig/README.rst new file mode 100644 index 000000000..81737b0b2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/README.rst @@ -0,0 +1,15 @@ +Twig, the flexible, fast, and secure template language for PHP +============================================================== + +Twig is a template language for PHP, released under the new BSD license (code +and documentation). + +Twig uses a syntax similar to the Django and Jinja template languages which +inspired the Twig runtime environment. + +More Information +---------------- + +Read the `documentation`_ for more information. + +.. _documentation: http://twig.sensiolabs.org/documentation diff --git a/dkan/.ahoy/site/vendor/twig/twig/composer.json b/dkan/.ahoy/site/vendor/twig/twig/composer.json new file mode 100644 index 000000000..350381cdc --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/composer.json @@ -0,0 +1,46 @@ +{ + "name": "twig/twig", + "type": "library", + "description": "Twig, the flexible, fast, and secure template language for PHP", + "keywords": ["templating"], + "homepage": "http://twig.sensiolabs.org", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "homepage": "http://twig.sensiolabs.org/contributors", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "support": { + "forum": "https://groups.google.com/forum/#!forum/twig-users" + }, + "require": { + "php": ">=5.2.7" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7", + "symfony/debug": "~2.7" + }, + "autoload": { + "psr-0" : { + "Twig_" : "lib/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.26-dev" + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/advanced.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/advanced.rst new file mode 100644 index 000000000..441450b01 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/advanced.rst @@ -0,0 +1,959 @@ +Extending Twig +============== + +.. caution:: + + This section describes how to extend Twig as of **Twig 1.12**. If you are + using an older version, read the :doc:`legacy` chapter + instead. + +Twig can be extended in many ways; you can add extra tags, filters, tests, +operators, global variables, and functions. You can even extend the parser +itself with node visitors. + +.. note:: + + The first section of this chapter describes how to extend Twig easily. If + you want to reuse your changes in different projects or if you want to + share them with others, you should then create an extension as described + in the following section. + +.. caution:: + + When extending Twig without creating an extension, Twig won't be able to + recompile your templates when the PHP code is updated. To see your changes + in real-time, either disable template caching or package your code into an + extension (see the next section of this chapter). + +Before extending Twig, you must understand the differences between all the +different possible extension points and when to use them. + +First, remember that Twig has two main language constructs: + +* ``{{ }}``: used to print the result of an expression evaluation; + +* ``{% %}``: used to execute statements. + +To understand why Twig exposes so many extension points, let's see how to +implement a *Lorem ipsum* generator (it needs to know the number of words to +generate). + +You can use a ``lipsum`` *tag*: + +.. code-block:: jinja + + {% lipsum 40 %} + +That works, but using a tag for ``lipsum`` is not a good idea for at least +three main reasons: + +* ``lipsum`` is not a language construct; +* The tag outputs something; +* The tag is not flexible as you cannot use it in an expression: + + .. code-block:: jinja + + {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }} + +In fact, you rarely need to create tags; and that's good news because tags are +the most complex extension point of Twig. + +Now, let's use a ``lipsum`` *filter*: + +.. code-block:: jinja + + {{ 40|lipsum }} + +Again, it works, but it looks weird. A filter transforms the passed value to +something else but here we use the value to indicate the number of words to +generate (so, ``40`` is an argument of the filter, not the value we want to +transform). + +Next, let's use a ``lipsum`` *function*: + +.. code-block:: jinja + + {{ lipsum(40) }} + +Here we go. For this specific example, the creation of a function is the +extension point to use. And you can use it anywhere an expression is accepted: + +.. code-block:: jinja + + {{ 'some text' ~ lipsum(40) ~ 'some more text' }} + + {% set lipsum = lipsum(40) %} + +Last but not the least, you can also use a *global* object with a method able +to generate lorem ipsum text: + +.. code-block:: jinja + + {{ text.lipsum(40) }} + +As a rule of thumb, use functions for frequently used features and global +objects for everything else. + +Keep in mind the following when you want to extend Twig: + +========== ========================== ========== ========================= +What? Implementation difficulty? How often? When? +========== ========================== ========== ========================= +*macro* trivial frequent Content generation +*global* trivial frequent Helper object +*function* trivial frequent Content generation +*filter* trivial frequent Value transformation +*tag* complex rare DSL language construct +*test* trivial rare Boolean decision +*operator* trivial rare Values transformation +========== ========================== ========== ========================= + +Globals +------- + +A global variable is like any other template variable, except that it's +available in all templates and macros:: + + $twig = new Twig_Environment($loader); + $twig->addGlobal('text', new Text()); + +You can then use the ``text`` variable anywhere in a template: + +.. code-block:: jinja + + {{ text.lipsum(40) }} + +Filters +------- + +Creating a filter is as simple as associating a name with a PHP callable:: + + // an anonymous function + $filter = new Twig_SimpleFilter('rot13', function ($string) { + return str_rot13($string); + }); + + // or a simple PHP function + $filter = new Twig_SimpleFilter('rot13', 'str_rot13'); + + // or a class static method + $filter = new Twig_SimpleFilter('rot13', array('SomeClass', 'rot13Filter')); + $filter = new Twig_SimpleFilter('rot13', 'SomeClass::rot13Filter'); + + // or a class method + $filter = new Twig_SimpleFilter('rot13', array($this, 'rot13Filter')); + // the one below needs a runtime implementation (see below for more information) + $filter = new Twig_SimpleFilter('rot13', array('SomeClass', 'rot13Filter')); + +The first argument passed to the ``Twig_SimpleFilter`` constructor is the name +of the filter you will use in templates and the second one is the PHP callable +to associate with it. + +Then, add the filter to your Twig environment:: + + $twig = new Twig_Environment($loader); + $twig->addFilter($filter); + +And here is how to use it in a template: + +.. code-block:: jinja + + {{ 'Twig'|rot13 }} + + {# will output Gjvt #} + +When called by Twig, the PHP callable receives the left side of the filter +(before the pipe ``|``) as the first argument and the extra arguments passed +to the filter (within parentheses ``()``) as extra arguments. + +For instance, the following code: + +.. code-block:: jinja + + {{ 'TWIG'|lower }} + {{ now|date('d/m/Y') }} + +is compiled to something like the following:: + + + + +The ``Twig_SimpleFilter`` class takes an array of options as its last +argument:: + + $filter = new Twig_SimpleFilter('rot13', 'str_rot13', $options); + +Environment-aware Filters +~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you want to access the current environment instance in your filter, set the +``needs_environment`` option to ``true``; Twig will pass the current +environment as the first argument to the filter call:: + + $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $string) { + // get the current charset for instance + $charset = $env->getCharset(); + + return str_rot13($string); + }, array('needs_environment' => true)); + +Context-aware Filters +~~~~~~~~~~~~~~~~~~~~~ + +If you want to access the current context in your filter, set the +``needs_context`` option to ``true``; Twig will pass the current context as +the first argument to the filter call (or the second one if +``needs_environment`` is also set to ``true``):: + + $filter = new Twig_SimpleFilter('rot13', function ($context, $string) { + // ... + }, array('needs_context' => true)); + + $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $context, $string) { + // ... + }, array('needs_context' => true, 'needs_environment' => true)); + +Automatic Escaping +~~~~~~~~~~~~~~~~~~ + +If automatic escaping is enabled, the output of the filter may be escaped +before printing. If your filter acts as an escaper (or explicitly outputs HTML +or JavaScript code), you will want the raw output to be printed. In such a +case, set the ``is_safe`` option:: + + $filter = new Twig_SimpleFilter('nl2br', 'nl2br', array('is_safe' => array('html'))); + +Some filters may need to work on input that is already escaped or safe, for +example when adding (safe) HTML tags to originally unsafe output. In such a +case, set the ``pre_escape`` option to escape the input data before it is run +through your filter:: + + $filter = new Twig_SimpleFilter('somefilter', 'somefilter', array('pre_escape' => 'html', 'is_safe' => array('html'))); + +Variadic Filters +~~~~~~~~~~~~~~~~ + +.. versionadded:: 1.19 + Support for variadic filters was added in Twig 1.19. + +When a filter should accept an arbitrary number of arguments, set the +``is_variadic`` option to ``true``; Twig will pass the extra arguments as the +last argument to the filter call as an array:: + + $filter = new Twig_SimpleFilter('thumbnail', function ($file, array $options = array()) { + // ... + }, array('is_variadic' => true)); + +Be warned that named arguments passed to a variadic filter cannot be checked +for validity as they will automatically end up in the option array. + +Dynamic Filters +~~~~~~~~~~~~~~~ + +A filter name containing the special ``*`` character is a dynamic filter as +the ``*`` can be any string:: + + $filter = new Twig_SimpleFilter('*_path', function ($name, $arguments) { + // ... + }); + +The following filters will be matched by the above defined dynamic filter: + +* ``product_path`` +* ``category_path`` + +A dynamic filter can define more than one dynamic parts:: + + $filter = new Twig_SimpleFilter('*_path_*', function ($name, $suffix, $arguments) { + // ... + }); + +The filter will receive all dynamic part values before the normal filter +arguments, but after the environment and the context. For instance, a call to +``'foo'|a_path_b()`` will result in the following arguments to be passed to +the filter: ``('a', 'b', 'foo')``. + +Deprecated Filters +~~~~~~~~~~~~~~~~~~ + +.. versionadded:: 1.21 + Support for deprecated filters was added in Twig 1.21. + +You can mark a filter as being deprecated by setting the ``deprecated`` option +to ``true``. You can also give an alternative filter that replaces the +deprecated one when that makes sense:: + + $filter = new Twig_SimpleFilter('obsolete', function () { + // ... + }, array('deprecated' => true, 'alternative' => 'new_one')); + +When a filter is deprecated, Twig emits a deprecation notice when compiling a +template using it. See :ref:`deprecation-notices` for more information. + +Functions +--------- + +Functions are defined in the exact same way as filters, but you need to create +an instance of ``Twig_SimpleFunction``:: + + $twig = new Twig_Environment($loader); + $function = new Twig_SimpleFunction('function_name', function () { + // ... + }); + $twig->addFunction($function); + +Functions support the same features as filters, except for the ``pre_escape`` +and ``preserves_safety`` options. + +Tests +----- + +Tests are defined in the exact same way as filters and functions, but you need +to create an instance of ``Twig_SimpleTest``:: + + $twig = new Twig_Environment($loader); + $test = new Twig_SimpleTest('test_name', function () { + // ... + }); + $twig->addTest($test); + +Tests allow you to create custom application specific logic for evaluating +boolean conditions. As a simple example, let's create a Twig test that checks if +objects are 'red':: + + $twig = new Twig_Environment($loader); + $test = new Twig_SimpleTest('red', function ($value) { + if (isset($value->color) && $value->color == 'red') { + return true; + } + if (isset($value->paint) && $value->paint == 'red') { + return true; + } + return false; + }); + $twig->addTest($test); + +Test functions should always return true/false. + +When creating tests you can use the ``node_class`` option to provide custom test +compilation. This is useful if your test can be compiled into PHP primitives. +This is used by many of the tests built into Twig:: + + $twig = new Twig_Environment($loader); + $test = new Twig_SimpleTest( + 'odd', + null, + array('node_class' => 'Twig_Node_Expression_Test_Odd')); + $twig->addTest($test); + + class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test + { + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' % 2 == 1') + ->raw(')') + ; + } + } + +The above example shows how you can create tests that use a node class. The +node class has access to one sub-node called 'node'. This sub-node contains the +value that is being tested. When the ``odd`` filter is used in code such as: + +.. code-block:: jinja + + {% if my_value is odd %} + +The ``node`` sub-node will contain an expression of ``my_value``. Node-based +tests also have access to the ``arguments`` node. This node will contain the +various other arguments that have been provided to your test. + +If you want to pass a variable number of positional or named arguments to the +test, set the ``is_variadic`` option to ``true``. Tests also support dynamic +name feature as filters and functions. + +Tags +---- + +One of the most exciting features of a template engine like Twig is the +possibility to define new language constructs. This is also the most complex +feature as you need to understand how Twig's internals work. + +Let's create a simple ``set`` tag that allows the definition of simple +variables from within a template. The tag can be used like follows: + +.. code-block:: jinja + + {% set name = "value" %} + + {{ name }} + + {# should output value #} + +.. note:: + + The ``set`` tag is part of the Core extension and as such is always + available. The built-in version is slightly more powerful and supports + multiple assignments by default (cf. the template designers chapter for + more information). + +Three steps are needed to define a new tag: + +* Defining a Token Parser class (responsible for parsing the template code); + +* Defining a Node class (responsible for converting the parsed code to PHP); + +* Registering the tag. + +Registering a new tag +~~~~~~~~~~~~~~~~~~~~~ + +Adding a tag is as simple as calling the ``addTokenParser`` method on the +``Twig_Environment`` instance:: + + $twig = new Twig_Environment($loader); + $twig->addTokenParser(new Project_Set_TokenParser()); + +Defining a Token Parser +~~~~~~~~~~~~~~~~~~~~~~~ + +Now, let's see the actual code of this class:: + + class Project_Set_TokenParser extends Twig_TokenParser + { + public function parse(Twig_Token $token) + { + $parser = $this->parser; + $stream = $parser->getStream(); + + $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + $stream->expect(Twig_Token::OPERATOR_TYPE, '='); + $value = $parser->getExpressionParser()->parseExpression(); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + return new Project_Set_Node($name, $value, $token->getLine(), $this->getTag()); + } + + public function getTag() + { + return 'set'; + } + } + +The ``getTag()`` method must return the tag we want to parse, here ``set``. + +The ``parse()`` method is invoked whenever the parser encounters a ``set`` +tag. It should return a ``Twig_Node`` instance that represents the node (the +``Project_Set_Node`` calls creating is explained in the next section). + +The parsing process is simplified thanks to a bunch of methods you can call +from the token stream (``$this->parser->getStream()``): + +* ``getCurrent()``: Gets the current token in the stream. + +* ``next()``: Moves to the next token in the stream, *but returns the old one*. + +* ``test($type)``, ``test($value)`` or ``test($type, $value)``: Determines whether + the current token is of a particular type or value (or both). The value may be an + array of several possible values. + +* ``expect($type[, $value[, $message]])``: If the current token isn't of the given + type/value a syntax error is thrown. Otherwise, if the type and value are correct, + the token is returned and the stream moves to the next token. + +* ``look()``: Looks a the next token without consuming it. + +Parsing expressions is done by calling the ``parseExpression()`` like we did for +the ``set`` tag. + +.. tip:: + + Reading the existing ``TokenParser`` classes is the best way to learn all + the nitty-gritty details of the parsing process. + +Defining a Node +~~~~~~~~~~~~~~~ + +The ``Project_Set_Node`` class itself is rather simple:: + + class Project_Set_Node extends Twig_Node + { + public function __construct($name, Twig_Node_Expression $value, $line, $tag = null) + { + parent::__construct(array('value' => $value), array('name' => $name), $line, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('$context[\''.$this->getAttribute('name').'\'] = ') + ->subcompile($this->getNode('value')) + ->raw(";\n") + ; + } + } + +The compiler implements a fluid interface and provides methods that helps the +developer generate beautiful and readable PHP code: + +* ``subcompile()``: Compiles a node. + +* ``raw()``: Writes the given string as is. + +* ``write()``: Writes the given string by adding indentation at the beginning + of each line. + +* ``string()``: Writes a quoted string. + +* ``repr()``: Writes a PHP representation of a given value (see + ``Twig_Node_For`` for a usage example). + +* ``addDebugInfo()``: Adds the line of the original template file related to + the current node as a comment. + +* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a + usage example). + +* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a + usage example). + +.. _creating_extensions: + +Creating an Extension +--------------------- + +The main motivation for writing an extension is to move often used code into a +reusable class like adding support for internationalization. An extension can +define tags, filters, tests, operators, global variables, functions, and node +visitors. + +Most of the time, it is useful to create a single extension for your project, +to host all the specific tags and filters you want to add to Twig. + +.. tip:: + + When packaging your code into an extension, Twig is smart enough to + recompile your templates whenever you make a change to it (when + ``auto_reload`` is enabled). + +.. note:: + + Before writing your own extensions, have a look at the Twig official + extension repository: http://github.com/twigphp/Twig-extensions. + +An extension is a class that implements the following interface:: + + interface Twig_ExtensionInterface + { + /** + * Initializes the runtime environment. + * + * This is where you can load some file that contains filter functions for instance. + * + * @param Twig_Environment $environment The current Twig_Environment instance + * + * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead + */ + function initRuntime(Twig_Environment $environment); + + /** + * Returns the token parser instances to add to the existing list. + * + * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances + */ + function getTokenParsers(); + + /** + * Returns the node visitor instances to add to the existing list. + * + * @return array An array of Twig_NodeVisitorInterface instances + */ + function getNodeVisitors(); + + /** + * Returns a list of filters to add to the existing list. + * + * @return array An array of filters + */ + function getFilters(); + + /** + * Returns a list of tests to add to the existing list. + * + * @return array An array of tests + */ + function getTests(); + + /** + * Returns a list of functions to add to the existing list. + * + * @return array An array of functions + */ + function getFunctions(); + + /** + * Returns a list of operators to add to the existing list. + * + * @return array An array of operators + */ + function getOperators(); + + /** + * Returns a list of global variables to add to the existing list. + * + * @return array An array of global variables + * + * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead + */ + function getGlobals(); + + /** + * Returns the name of the extension. + * + * @return string The extension name + * + * @deprecated since 1.26 (to be removed in 2.0), not used anymore internally + */ + function getName(); + } + +To keep your extension class clean and lean, inherit from the built-in +``Twig_Extension`` class instead of implementing the interface as it provides +empty implementations for all methods: + + class Project_Twig_Extension extends Twig_Extension + { + } + +Of course, this extension does nothing for now. We will customize it in the +next sections. + +.. note:: + + Prior to Twig 1.26, you must implement the ``getName()`` method which must + return a unique identifier for the extension. + +Twig does not care where you save your extension on the filesystem, as all +extensions must be registered explicitly to be available in your templates. + +You can register an extension by using the ``addExtension()`` method on your +main ``Environment`` object:: + + $twig = new Twig_Environment($loader); + $twig->addExtension(new Project_Twig_Extension()); + +.. tip:: + + The Twig core extensions are great examples of how extensions work. + +Globals +~~~~~~~ + +Global variables can be registered in an extension via the ``getGlobals()`` +method:: + + class Project_Twig_Extension extends Twig_Extension implements Twig_Extension_GlobalsInterface + { + public function getGlobals() + { + return array( + 'text' => new Text(), + ); + } + + // ... + } + +Functions +~~~~~~~~~ + +Functions can be registered in an extension via the ``getFunctions()`` +method:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getFunctions() + { + return array( + new Twig_SimpleFunction('lipsum', 'generate_lipsum'), + ); + } + + // ... + } + +Filters +~~~~~~~ + +To add a filter to an extension, you need to override the ``getFilters()`` +method. This method must return an array of filters to add to the Twig +environment:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getFilters() + { + return array( + new Twig_SimpleFilter('rot13', 'str_rot13'), + ); + } + + // ... + } + +Tags +~~~~ + +Adding a tag in an extension can be done by overriding the +``getTokenParsers()`` method. This method must return an array of tags to add +to the Twig environment:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getTokenParsers() + { + return array(new Project_Set_TokenParser()); + } + + // ... + } + +In the above code, we have added a single new tag, defined by the +``Project_Set_TokenParser`` class. The ``Project_Set_TokenParser`` class is +responsible for parsing the tag and compiling it to PHP. + +Operators +~~~~~~~~~ + +The ``getOperators()`` methods lets you add new operators. Here is how to add +``!``, ``||``, and ``&&`` operators:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getOperators() + { + return array( + array( + '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'), + ), + array( + '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + ), + ); + } + + // ... + } + +Tests +~~~~~ + +The ``getTests()`` method lets you add new test functions:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getTests() + { + return array( + new Twig_SimpleTest('even', 'twig_test_even'), + ); + } + + // ... + } + +Definition vs Runtime +~~~~~~~~~~~~~~~~~~~~~ + +Twig filters, functions, and tests runtime implementations can be defined as +any valid PHP callable: + +* **functions/static methods**: Simple to implement and fast (used by all Twig + core extensions); but it is hard for the runtime to depend on external + objects; + +* **closures**: Simple to implement; + +* **object methods**: More flexible and required if your runtime code depends + on external objects. + +The simplest way to use methods is to define them on the extension itself:: + + class Project_Twig_Extension extends Twig_Extension + { + private $rot13Provider; + + public function __construct($rot13Provider) + { + $this->rot13Provider = $rot13Provider; + } + + public function getFunctions() + { + return array( + new Twig_SimpleFunction('rot13', array($this, 'rot13')), + ); + } + + public function rot13($value) + { + return $rot13Provider->rot13($value); + } + } + +This is very convenient but not recommended as it makes template compilation +depend on runtime dependencies even if they are not needed (think for instance +as a dependency that connects to a database engine). + +As of Twig 1.26, you can easily decouple the extension definitions from their +runtime implementations by registering a ``Twig_RuntimeLoaderInterface`` +instance on the environment that knows how to instantiate such runtime classes +(runtime classes must be autoload-able):: + + class RuntimeLoader implements Twig_RuntimeLoaderInterface + { + public function load($class) + { + // implement the logic to create an instance of $class + // and inject its dependencies + // most of the time, it means using your dependency injection container + if ('Project_Twig_RuntimeExtension' === $class) { + return new $class(new Rot13Provider()); + } else { + // ... + } + } + } + + $twig->addRuntimeLoader(new RuntimeLoader()); + +It is now possible to move the runtime logic to a new +``Project_Twig_RuntimeExtension`` class and use it directly in the extension:: + + class Project_Twig_RuntimeExtension extends Twig_Extension + { + private $rot13Provider; + + public function __construct($rot13Provider) + { + $this->rot13Provider = $rot13Provider; + } + + public function rot13($value) + { + return $rot13Provider->rot13($value); + } + } + + class Project_Twig_Extension extends Twig_Extension + { + public function getFunctions() + { + return array( + new Twig_SimpleFunction('rot13', array('Project_Twig_RuntimeExtension', 'rot13')), + // or + new Twig_SimpleFunction('rot13', 'Project_Twig_RuntimeExtension::rot13'), + ); + } + } + +Overloading +----------- + +To overload an already defined filter, test, operator, global variable, or +function, re-define it in an extension and register it **as late as +possible** (order matters):: + + class MyCoreExtension extends Twig_Extension + { + public function getFilters() + { + return array( + new Twig_SimpleFilter('date', array($this, 'dateFilter')), + ); + } + + public function dateFilter($timestamp, $format = 'F j, Y H:i') + { + // do something different from the built-in date filter + } + } + + $twig = new Twig_Environment($loader); + $twig->addExtension(new MyCoreExtension()); + +Here, we have overloaded the built-in ``date`` filter with a custom one. + +If you do the same on the ``Twig_Environment`` itself, beware that it takes +precedence over any other registered extensions:: + + $twig = new Twig_Environment($loader); + $twig->addFilter(new Twig_SimpleFilter('date', function ($timestamp, $format = 'F j, Y H:i') { + // do something different from the built-in date filter + })); + // the date filter will come from the above registration, not + // from the registered extension below + $twig->addExtension(new MyCoreExtension()); + +.. caution:: + + Note that overloading the built-in Twig elements is not recommended as it + might be confusing. + +Testing an Extension +-------------------- + +Functional Tests +~~~~~~~~~~~~~~~~ + +You can create functional tests for extensions simply by creating the +following file structure in your test directory:: + + Fixtures/ + filters/ + foo.test + bar.test + functions/ + foo.test + bar.test + tags/ + foo.test + bar.test + IntegrationTest.php + +The ``IntegrationTest.php`` file should look like this:: + + class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase + { + public function getExtensions() + { + return array( + new Project_Twig_Extension1(), + new Project_Twig_Extension2(), + ); + } + + public function getFixturesDir() + { + return dirname(__FILE__).'/Fixtures/'; + } + } + +Fixtures examples can be found within the Twig repository +`tests/Twig/Fixtures`_ directory. + +Node Tests +~~~~~~~~~~ + +Testing the node visitors can be complex, so extend your test cases from +``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository +`tests/Twig/Node`_ directory. + +.. _`rot13`: http://www.php.net/manual/en/function.str-rot13.php +.. _`tests/Twig/Fixtures`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures +.. _`tests/Twig/Node`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/advanced_legacy.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/advanced_legacy.rst new file mode 100644 index 000000000..2ef6bfde8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/advanced_legacy.rst @@ -0,0 +1,887 @@ +Extending Twig +============== + +.. caution:: + + This section describes how to extends Twig for versions **older than + 1.12**. If you are using a newer version, read the :doc:`newer` + chapter instead. + +Twig can be extended in many ways; you can add extra tags, filters, tests, +operators, global variables, and functions. You can even extend the parser +itself with node visitors. + +.. note:: + + The first section of this chapter describes how to extend Twig easily. If + you want to reuse your changes in different projects or if you want to + share them with others, you should then create an extension as described + in the following section. + +.. caution:: + + When extending Twig by calling methods on the Twig environment instance, + Twig won't be able to recompile your templates when the PHP code is + updated. To see your changes in real-time, either disable template caching + or package your code into an extension (see the next section of this + chapter). + +Before extending Twig, you must understand the differences between all the +different possible extension points and when to use them. + +First, remember that Twig has two main language constructs: + +* ``{{ }}``: used to print the result of an expression evaluation; + +* ``{% %}``: used to execute statements. + +To understand why Twig exposes so many extension points, let's see how to +implement a *Lorem ipsum* generator (it needs to know the number of words to +generate). + +You can use a ``lipsum`` *tag*: + +.. code-block:: jinja + + {% lipsum 40 %} + +That works, but using a tag for ``lipsum`` is not a good idea for at least +three main reasons: + +* ``lipsum`` is not a language construct; +* The tag outputs something; +* The tag is not flexible as you cannot use it in an expression: + + .. code-block:: jinja + + {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }} + +In fact, you rarely need to create tags; and that's good news because tags are +the most complex extension point of Twig. + +Now, let's use a ``lipsum`` *filter*: + +.. code-block:: jinja + + {{ 40|lipsum }} + +Again, it works, but it looks weird. A filter transforms the passed value to +something else but here we use the value to indicate the number of words to +generate (so, ``40`` is an argument of the filter, not the value we want to +transform). + +Next, let's use a ``lipsum`` *function*: + +.. code-block:: jinja + + {{ lipsum(40) }} + +Here we go. For this specific example, the creation of a function is the +extension point to use. And you can use it anywhere an expression is accepted: + +.. code-block:: jinja + + {{ 'some text' ~ ipsum(40) ~ 'some more text' }} + + {% set ipsum = ipsum(40) %} + +Last but not the least, you can also use a *global* object with a method able +to generate lorem ipsum text: + +.. code-block:: jinja + + {{ text.lipsum(40) }} + +As a rule of thumb, use functions for frequently used features and global +objects for everything else. + +Keep in mind the following when you want to extend Twig: + +========== ========================== ========== ========================= +What? Implementation difficulty? How often? When? +========== ========================== ========== ========================= +*macro* trivial frequent Content generation +*global* trivial frequent Helper object +*function* trivial frequent Content generation +*filter* trivial frequent Value transformation +*tag* complex rare DSL language construct +*test* trivial rare Boolean decision +*operator* trivial rare Values transformation +========== ========================== ========== ========================= + +Globals +------- + +A global variable is like any other template variable, except that it's +available in all templates and macros:: + + $twig = new Twig_Environment($loader); + $twig->addGlobal('text', new Text()); + +You can then use the ``text`` variable anywhere in a template: + +.. code-block:: jinja + + {{ text.lipsum(40) }} + +Filters +------- + +A filter is a regular PHP function or an object method that takes the left +side of the filter (before the pipe ``|``) as first argument and the extra +arguments passed to the filter (within parentheses ``()``) as extra arguments. + +Defining a filter is as easy as associating the filter name with a PHP +callable. For instance, let's say you have the following code in a template: + +.. code-block:: jinja + + {{ 'TWIG'|lower }} + +When compiling this template to PHP, Twig looks for the PHP callable +associated with the ``lower`` filter. The ``lower`` filter is a built-in Twig +filter, and it is simply mapped to the PHP ``strtolower()`` function. After +compilation, the generated PHP code is roughly equivalent to: + +.. code-block:: html+php + + + +As you can see, the ``'TWIG'`` string is passed as a first argument to the PHP +function. + +A filter can also take extra arguments like in the following example: + +.. code-block:: jinja + + {{ now|date('d/m/Y') }} + +In this case, the extra arguments are passed to the function after the main +argument, and the compiled code is equivalent to: + +.. code-block:: html+php + + + +Let's see how to create a new filter. + +In this section, we will create a ``rot13`` filter, which should return the +`rot13`_ transformation of a string. Here is an example of its usage and the +expected output: + +.. code-block:: jinja + + {{ "Twig"|rot13 }} + + {# should displays Gjvt #} + +Adding a filter is as simple as calling the ``addFilter()`` method on the +``Twig_Environment`` instance:: + + $twig = new Twig_Environment($loader); + $twig->addFilter('rot13', new Twig_Filter_Function('str_rot13')); + +The second argument of ``addFilter()`` is an instance of ``Twig_Filter``. +Here, we use ``Twig_Filter_Function`` as the filter is a PHP function. The +first argument passed to the ``Twig_Filter_Function`` constructor is the name +of the PHP function to call, here ``str_rot13``, a native PHP function. + +Let's say I now want to be able to add a prefix before the converted string: + +.. code-block:: jinja + + {{ "Twig"|rot13('prefix_') }} + + {# should displays prefix_Gjvt #} + +As the PHP ``str_rot13()`` function does not support this requirement, let's +create a new PHP function:: + + function project_compute_rot13($string, $prefix = '') + { + return $prefix.str_rot13($string); + } + +As you can see, the ``prefix`` argument of the filter is passed as an extra +argument to the ``project_compute_rot13()`` function. + +Adding this filter is as easy as before:: + + $twig->addFilter('rot13', new Twig_Filter_Function('project_compute_rot13')); + +For better encapsulation, a filter can also be defined as a static method of a +class. The ``Twig_Filter_Function`` class can also be used to register such +static methods as filters:: + + $twig->addFilter('rot13', new Twig_Filter_Function('SomeClass::rot13Filter')); + +.. tip:: + + In an extension, you can also define a filter as a static method of the + extension class. + +Environment aware Filters +~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``Twig_Filter`` classes take options as their last argument. For instance, +if you want access to the current environment instance in your filter, set the +``needs_environment`` option to ``true``:: + + $filter = new Twig_Filter_Function('str_rot13', array('needs_environment' => true)); + +Twig will then pass the current environment as the first argument to the +filter call:: + + function twig_compute_rot13(Twig_Environment $env, $string) + { + // get the current charset for instance + $charset = $env->getCharset(); + + return str_rot13($string); + } + +Automatic Escaping +~~~~~~~~~~~~~~~~~~ + +If automatic escaping is enabled, the output of the filter may be escaped +before printing. If your filter acts as an escaper (or explicitly outputs HTML +or JavaScript code), you will want the raw output to be printed. In such a +case, set the ``is_safe`` option:: + + $filter = new Twig_Filter_Function('nl2br', array('is_safe' => array('html'))); + +Some filters may need to work on input that is already escaped or safe, for +example when adding (safe) HTML tags to originally unsafe output. In such a +case, set the ``pre_escape`` option to escape the input data before it is run +through your filter:: + + $filter = new Twig_Filter_Function('somefilter', array('pre_escape' => 'html', 'is_safe' => array('html'))); + +Dynamic Filters +~~~~~~~~~~~~~~~ + +.. versionadded:: 1.5 + Dynamic filters support was added in Twig 1.5. + +A filter name containing the special ``*`` character is a dynamic filter as +the ``*`` can be any string:: + + $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path')); + + function twig_path($name, $arguments) + { + // ... + } + +The following filters will be matched by the above defined dynamic filter: + +* ``product_path`` +* ``category_path`` + +A dynamic filter can define more than one dynamic parts:: + + $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path')); + + function twig_path($name, $suffix, $arguments) + { + // ... + } + +The filter will receive all dynamic part values before the normal filters +arguments. For instance, a call to ``'foo'|a_path_b()`` will result in the +following PHP call: ``twig_path('a', 'b', 'foo')``. + +Functions +--------- + +A function is a regular PHP function or an object method that can be called from +templates. + +.. code-block:: jinja + + {{ constant("DATE_W3C") }} + +When compiling this template to PHP, Twig looks for the PHP callable +associated with the ``constant`` function. The ``constant`` function is a built-in Twig +function, and it is simply mapped to the PHP ``constant()`` function. After +compilation, the generated PHP code is roughly equivalent to: + +.. code-block:: html+php + + + +Adding a function is similar to adding a filter. This can be done by calling the +``addFunction()`` method on the ``Twig_Environment`` instance:: + + $twig = new Twig_Environment($loader); + $twig->addFunction('functionName', new Twig_Function_Function('someFunction')); + +You can also expose extension methods as functions in your templates:: + + // $this is an object that implements Twig_ExtensionInterface. + $twig = new Twig_Environment($loader); + $twig->addFunction('otherFunction', new Twig_Function_Method($this, 'someMethod')); + +Functions also support ``needs_environment`` and ``is_safe`` parameters. + +Dynamic Functions +~~~~~~~~~~~~~~~~~ + +.. versionadded:: 1.5 + Dynamic functions support was added in Twig 1.5. + +A function name containing the special ``*`` character is a dynamic function +as the ``*`` can be any string:: + + $twig->addFunction('*_path', new Twig_Function_Function('twig_path')); + + function twig_path($name, $arguments) + { + // ... + } + +The following functions will be matched by the above defined dynamic function: + +* ``product_path`` +* ``category_path`` + +A dynamic function can define more than one dynamic parts:: + + $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path')); + + function twig_path($name, $suffix, $arguments) + { + // ... + } + +The function will receive all dynamic part values before the normal functions +arguments. For instance, a call to ``a_path_b('foo')`` will result in the +following PHP call: ``twig_path('a', 'b', 'foo')``. + +Tags +---- + +One of the most exciting feature of a template engine like Twig is the +possibility to define new language constructs. This is also the most complex +feature as you need to understand how Twig's internals work. + +Let's create a simple ``set`` tag that allows the definition of simple +variables from within a template. The tag can be used like follows: + +.. code-block:: jinja + + {% set name = "value" %} + + {{ name }} + + {# should output value #} + +.. note:: + + The ``set`` tag is part of the Core extension and as such is always + available. The built-in version is slightly more powerful and supports + multiple assignments by default (cf. the template designers chapter for + more information). + +Three steps are needed to define a new tag: + +* Defining a Token Parser class (responsible for parsing the template code); + +* Defining a Node class (responsible for converting the parsed code to PHP); + +* Registering the tag. + +Registering a new tag +~~~~~~~~~~~~~~~~~~~~~ + +Adding a tag is as simple as calling the ``addTokenParser`` method on the +``Twig_Environment`` instance:: + + $twig = new Twig_Environment($loader); + $twig->addTokenParser(new Project_Set_TokenParser()); + +Defining a Token Parser +~~~~~~~~~~~~~~~~~~~~~~~ + +Now, let's see the actual code of this class:: + + class Project_Set_TokenParser extends Twig_TokenParser + { + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $name = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue(); + $this->parser->getStream()->expect(Twig_Token::OPERATOR_TYPE, '='); + $value = $this->parser->getExpressionParser()->parseExpression(); + + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return new Project_Set_Node($name, $value, $lineno, $this->getTag()); + } + + public function getTag() + { + return 'set'; + } + } + +The ``getTag()`` method must return the tag we want to parse, here ``set``. + +The ``parse()`` method is invoked whenever the parser encounters a ``set`` +tag. It should return a ``Twig_Node`` instance that represents the node (the +``Project_Set_Node`` calls creating is explained in the next section). + +The parsing process is simplified thanks to a bunch of methods you can call +from the token stream (``$this->parser->getStream()``): + +* ``getCurrent()``: Gets the current token in the stream. + +* ``next()``: Moves to the next token in the stream, *but returns the old one*. + +* ``test($type)``, ``test($value)`` or ``test($type, $value)``: Determines whether + the current token is of a particular type or value (or both). The value may be an + array of several possible values. + +* ``expect($type[, $value[, $message]])``: If the current token isn't of the given + type/value a syntax error is thrown. Otherwise, if the type and value are correct, + the token is returned and the stream moves to the next token. + +* ``look()``: Looks a the next token without consuming it. + +Parsing expressions is done by calling the ``parseExpression()`` like we did for +the ``set`` tag. + +.. tip:: + + Reading the existing ``TokenParser`` classes is the best way to learn all + the nitty-gritty details of the parsing process. + +Defining a Node +~~~~~~~~~~~~~~~ + +The ``Project_Set_Node`` class itself is rather simple:: + + class Project_Set_Node extends Twig_Node + { + public function __construct($name, Twig_Node_Expression $value, $lineno, $tag = null) + { + parent::__construct(array('value' => $value), array('name' => $name), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('$context[\''.$this->getAttribute('name').'\'] = ') + ->subcompile($this->getNode('value')) + ->raw(";\n") + ; + } + } + +The compiler implements a fluid interface and provides methods that helps the +developer generate beautiful and readable PHP code: + +* ``subcompile()``: Compiles a node. + +* ``raw()``: Writes the given string as is. + +* ``write()``: Writes the given string by adding indentation at the beginning + of each line. + +* ``string()``: Writes a quoted string. + +* ``repr()``: Writes a PHP representation of a given value (see + ``Twig_Node_For`` for a usage example). + +* ``addDebugInfo()``: Adds the line of the original template file related to + the current node as a comment. + +* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a + usage example). + +* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a + usage example). + +.. _creating_extensions: + +Creating an Extension +--------------------- + +The main motivation for writing an extension is to move often used code into a +reusable class like adding support for internationalization. An extension can +define tags, filters, tests, operators, global variables, functions, and node +visitors. + +Creating an extension also makes for a better separation of code that is +executed at compilation time and code needed at runtime. As such, it makes +your code faster. + +Most of the time, it is useful to create a single extension for your project, +to host all the specific tags and filters you want to add to Twig. + +.. tip:: + + When packaging your code into an extension, Twig is smart enough to + recompile your templates whenever you make a change to it (when the + ``auto_reload`` is enabled). + +.. note:: + + Before writing your own extensions, have a look at the Twig official + extension repository: http://github.com/twigphp/Twig-extensions. + +An extension is a class that implements the following interface:: + + interface Twig_ExtensionInterface + { + /** + * Initializes the runtime environment. + * + * This is where you can load some file that contains filter functions for instance. + * + * @param Twig_Environment $environment The current Twig_Environment instance + */ + function initRuntime(Twig_Environment $environment); + + /** + * Returns the token parser instances to add to the existing list. + * + * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances + */ + function getTokenParsers(); + + /** + * Returns the node visitor instances to add to the existing list. + * + * @return array An array of Twig_NodeVisitorInterface instances + */ + function getNodeVisitors(); + + /** + * Returns a list of filters to add to the existing list. + * + * @return array An array of filters + */ + function getFilters(); + + /** + * Returns a list of tests to add to the existing list. + * + * @return array An array of tests + */ + function getTests(); + + /** + * Returns a list of functions to add to the existing list. + * + * @return array An array of functions + */ + function getFunctions(); + + /** + * Returns a list of operators to add to the existing list. + * + * @return array An array of operators + */ + function getOperators(); + + /** + * Returns a list of global variables to add to the existing list. + * + * @return array An array of global variables + */ + function getGlobals(); + + /** + * Returns the name of the extension. + * + * @return string The extension name + */ + function getName(); + } + +To keep your extension class clean and lean, it can inherit from the built-in +``Twig_Extension`` class instead of implementing the whole interface. That +way, you just need to implement the ``getName()`` method as the +``Twig_Extension`` provides empty implementations for all other methods. + +The ``getName()`` method must return a unique identifier for your extension. + +Now, with this information in mind, let's create the most basic extension +possible:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getName() + { + return 'project'; + } + } + +.. note:: + + Of course, this extension does nothing for now. We will customize it in + the next sections. + +Twig does not care where you save your extension on the filesystem, as all +extensions must be registered explicitly to be available in your templates. + +You can register an extension by using the ``addExtension()`` method on your +main ``Environment`` object:: + + $twig = new Twig_Environment($loader); + $twig->addExtension(new Project_Twig_Extension()); + +Of course, you need to first load the extension file by either using +``require_once()`` or by using an autoloader (see `spl_autoload_register()`_). + +.. tip:: + + The bundled extensions are great examples of how extensions work. + +Globals +~~~~~~~ + +Global variables can be registered in an extension via the ``getGlobals()`` +method:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getGlobals() + { + return array( + 'text' => new Text(), + ); + } + + // ... + } + +Functions +~~~~~~~~~ + +Functions can be registered in an extension via the ``getFunctions()`` +method:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getFunctions() + { + return array( + 'lipsum' => new Twig_Function_Function('generate_lipsum'), + ); + } + + // ... + } + +Filters +~~~~~~~ + +To add a filter to an extension, you need to override the ``getFilters()`` +method. This method must return an array of filters to add to the Twig +environment:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getFilters() + { + return array( + 'rot13' => new Twig_Filter_Function('str_rot13'), + ); + } + + // ... + } + +As you can see in the above code, the ``getFilters()`` method returns an array +where keys are the name of the filters (``rot13``) and the values the +definition of the filter (``new Twig_Filter_Function('str_rot13')``). + +As seen in the previous chapter, you can also define filters as static methods +on the extension class:: + +$twig->addFilter('rot13', new Twig_Filter_Function('Project_Twig_Extension::rot13Filter')); + +You can also use ``Twig_Filter_Method`` instead of ``Twig_Filter_Function`` +when defining a filter to use a method:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getFilters() + { + return array( + 'rot13' => new Twig_Filter_Method($this, 'rot13Filter'), + ); + } + + public function rot13Filter($string) + { + return str_rot13($string); + } + + // ... + } + +The first argument of the ``Twig_Filter_Method`` constructor is always +``$this``, the current extension object. The second one is the name of the +method to call. + +Using methods for filters is a great way to package your filter without +polluting the global namespace. This also gives the developer more flexibility +at the cost of a small overhead. + +Overriding default Filters +.......................... + +If some default core filters do not suit your needs, you can easily override +them by creating your own extension. Just use the same names as the one you +want to override:: + + class MyCoreExtension extends Twig_Extension + { + public function getFilters() + { + return array( + 'date' => new Twig_Filter_Method($this, 'dateFilter'), + // ... + ); + } + + public function dateFilter($timestamp, $format = 'F j, Y H:i') + { + return '...'.twig_date_format_filter($timestamp, $format); + } + + public function getName() + { + return 'project'; + } + } + +Here, we override the ``date`` filter with a custom one. Using this extension +is as simple as registering the ``MyCoreExtension`` extension by calling the +``addExtension()`` method on the environment instance:: + + $twig = new Twig_Environment($loader); + $twig->addExtension(new MyCoreExtension()); + +Tags +~~~~ + +Adding a tag in an extension can be done by overriding the +``getTokenParsers()`` method. This method must return an array of tags to add +to the Twig environment:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getTokenParsers() + { + return array(new Project_Set_TokenParser()); + } + + // ... + } + +In the above code, we have added a single new tag, defined by the +``Project_Set_TokenParser`` class. The ``Project_Set_TokenParser`` class is +responsible for parsing the tag and compiling it to PHP. + +Operators +~~~~~~~~~ + +The ``getOperators()`` methods allows to add new operators. Here is how to add +``!``, ``||``, and ``&&`` operators:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getOperators() + { + return array( + array( + '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'), + ), + array( + '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + ), + ); + } + + // ... + } + +Tests +~~~~~ + +The ``getTests()`` methods allows to add new test functions:: + + class Project_Twig_Extension extends Twig_Extension + { + public function getTests() + { + return array( + 'even' => new Twig_Test_Function('twig_test_even'), + ); + } + + // ... + } + +Testing an Extension +-------------------- + +.. versionadded:: 1.10 + Support for functional tests was added in Twig 1.10. + +Functional Tests +~~~~~~~~~~~~~~~~ + +You can create functional tests for extensions simply by creating the +following file structure in your test directory:: + + Fixtures/ + filters/ + foo.test + bar.test + functions/ + foo.test + bar.test + tags/ + foo.test + bar.test + IntegrationTest.php + +The ``IntegrationTest.php`` file should look like this:: + + class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase + { + public function getExtensions() + { + return array( + new Project_Twig_Extension1(), + new Project_Twig_Extension2(), + ); + } + + public function getFixturesDir() + { + return dirname(__FILE__).'/Fixtures/'; + } + } + +Fixtures examples can be found within the Twig repository +`tests/Twig/Fixtures`_ directory. + +Node Tests +~~~~~~~~~~ + +Testing the node visitors can be complex, so extend your test cases from +``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository +`tests/Twig/Node`_ directory. + +.. _`spl_autoload_register()`: http://www.php.net/spl_autoload_register +.. _`rot13`: http://www.php.net/manual/en/function.str-rot13.php +.. _`tests/Twig/Fixtures`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures +.. _`tests/Twig/Node`: https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/api.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/api.rst new file mode 100644 index 000000000..09029045f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/api.rst @@ -0,0 +1,552 @@ +Twig for Developers +=================== + +This chapter describes the API to Twig and not the template language. It will +be most useful as reference to those implementing the template interface to +the application and not those who are creating Twig templates. + +Basics +------ + +Twig uses a central object called the **environment** (of class +``Twig_Environment``). Instances of this class are used to store the +configuration and extensions, and are used to load templates from the file +system or other locations. + +Most applications will create one ``Twig_Environment`` object on application +initialization and use that to load templates. In some cases it's however +useful to have multiple environments side by side, if different configurations +are in use. + +The simplest way to configure Twig to load templates for your application +looks roughly like this:: + + require_once '/path/to/lib/Twig/Autoloader.php'; + Twig_Autoloader::register(); + + $loader = new Twig_Loader_Filesystem('/path/to/templates'); + $twig = new Twig_Environment($loader, array( + 'cache' => '/path/to/compilation_cache', + )); + +This will create a template environment with the default settings and a loader +that looks up the templates in the ``/path/to/templates/`` folder. Different +loaders are available and you can also write your own if you want to load +templates from a database or other resources. + +.. note:: + + Notice that the second argument of the environment is an array of options. + The ``cache`` option is a compilation cache directory, where Twig caches + the compiled templates to avoid the parsing phase for sub-sequent + requests. It is very different from the cache you might want to add for + the evaluated templates. For such a need, you can use any available PHP + cache library. + +To load a template from this environment you just have to call the +``loadTemplate()`` method which then returns a ``Twig_Template`` instance:: + + $template = $twig->loadTemplate('index.html'); + +To render the template with some variables, call the ``render()`` method:: + + echo $template->render(array('the' => 'variables', 'go' => 'here')); + +.. note:: + + The ``display()`` method is a shortcut to output the template directly. + +You can also load and render the template in one fell swoop:: + + echo $twig->render('index.html', array('the' => 'variables', 'go' => 'here')); + +.. _environment_options: + +Environment Options +------------------- + +When creating a new ``Twig_Environment`` instance, you can pass an array of +options as the constructor second argument:: + + $twig = new Twig_Environment($loader, array('debug' => true)); + +The following options are available: + +* ``debug`` *boolean* + + When set to ``true``, the generated templates have a + ``__toString()`` method that you can use to display the generated nodes + (default to ``false``). + +* ``charset`` *string* (defaults to ``utf-8``) + + The charset used by the templates. + +* ``base_template_class`` *string* (defaults to ``Twig_Template``) + + The base template class to use for generated + templates. + +* ``cache`` *string* or ``false`` + + An absolute path where to store the compiled templates, or + ``false`` to disable caching (which is the default). + +* ``auto_reload`` *boolean* + + When developing with Twig, it's useful to recompile the + template whenever the source code changes. If you don't provide a value for + the ``auto_reload`` option, it will be determined automatically based on the + ``debug`` value. + +* ``strict_variables`` *boolean* + + If set to ``false``, Twig will silently ignore invalid + variables (variables and or attributes/methods that do not exist) and + replace them with a ``null`` value. When set to ``true``, Twig throws an + exception instead (default to ``false``). + +* ``autoescape`` *string* or *boolean* + + If set to ``true``, HTML auto-escaping will be enabled by + default for all templates (default to ``true``). + + As of Twig 1.8, you can set the escaping strategy to use (``html``, ``js``, + ``false`` to disable). + + As of Twig 1.9, you can set the escaping strategy to use (``css``, ``url``, + ``html_attr``, or a PHP callback that takes the template "filename" and must + return the escaping strategy to use -- the callback cannot be a function name + to avoid collision with built-in escaping strategies). + + As of Twig 1.17, the ``filename`` escaping strategy determines the escaping + strategy to use for a template based on the template filename extension (this + strategy does not incur any overhead at runtime as auto-escaping is done at + compilation time.) + +* ``optimizations`` *integer* + + A flag that indicates which optimizations to apply + (default to ``-1`` -- all optimizations are enabled; set it to ``0`` to + disable). + +Loaders +------- + +Loaders are responsible for loading templates from a resource such as the file +system. + +Compilation Cache +~~~~~~~~~~~~~~~~~ + +All template loaders can cache the compiled templates on the filesystem for +future reuse. It speeds up Twig a lot as templates are only compiled once; and +the performance boost is even larger if you use a PHP accelerator such as APC. +See the ``cache`` and ``auto_reload`` options of ``Twig_Environment`` above +for more information. + +Built-in Loaders +~~~~~~~~~~~~~~~~ + +Here is a list of the built-in loaders Twig provides: + +``Twig_Loader_Filesystem`` +.......................... + +.. versionadded:: 1.10 + The ``prependPath()`` and support for namespaces were added in Twig 1.10. + +``Twig_Loader_Filesystem`` loads templates from the file system. This loader +can find templates in folders on the file system and is the preferred way to +load them:: + + $loader = new Twig_Loader_Filesystem($templateDir); + +It can also look for templates in an array of directories:: + + $loader = new Twig_Loader_Filesystem(array($templateDir1, $templateDir2)); + +With such a configuration, Twig will first look for templates in +``$templateDir1`` and if they do not exist, it will fallback to look for them +in the ``$templateDir2``. + +You can add or prepend paths via the ``addPath()`` and ``prependPath()`` +methods:: + + $loader->addPath($templateDir3); + $loader->prependPath($templateDir4); + +The filesystem loader also supports namespaced templates. This allows to group +your templates under different namespaces which have their own template paths. + +When using the ``setPaths()``, ``addPath()``, and ``prependPath()`` methods, +specify the namespace as the second argument (when not specified, these +methods act on the "main" namespace):: + + $loader->addPath($templateDir, 'admin'); + +Namespaced templates can be accessed via the special +``@namespace_name/template_path`` notation:: + + $twig->render('@admin/index.html', array()); + +``Twig_Loader_Array`` +..................... + +``Twig_Loader_Array`` loads a template from a PHP array. It's passed an array +of strings bound to template names:: + + $loader = new Twig_Loader_Array(array( + 'index.html' => 'Hello {{ name }}!', + )); + $twig = new Twig_Environment($loader); + + echo $twig->render('index.html', array('name' => 'Fabien')); + +This loader is very useful for unit testing. It can also be used for small +projects where storing all templates in a single PHP file might make sense. + +.. tip:: + + When using the ``Array`` or ``String`` loaders with a cache mechanism, you + should know that a new cache key is generated each time a template content + "changes" (the cache key being the source code of the template). If you + don't want to see your cache grows out of control, you need to take care + of clearing the old cache file by yourself. + +``Twig_Loader_Chain`` +..................... + +``Twig_Loader_Chain`` delegates the loading of templates to other loaders:: + + $loader1 = new Twig_Loader_Array(array( + 'base.html' => '{% block content %}{% endblock %}', + )); + $loader2 = new Twig_Loader_Array(array( + 'index.html' => '{% extends "base.html" %}{% block content %}Hello {{ name }}{% endblock %}', + 'base.html' => 'Will never be loaded', + )); + + $loader = new Twig_Loader_Chain(array($loader1, $loader2)); + + $twig = new Twig_Environment($loader); + +When looking for a template, Twig will try each loader in turn and it will +return as soon as the template is found. When rendering the ``index.html`` +template from the above example, Twig will load it with ``$loader2`` but the +``base.html`` template will be loaded from ``$loader1``. + +``Twig_Loader_Chain`` accepts any loader that implements +``Twig_LoaderInterface``. + +.. note:: + + You can also add loaders via the ``addLoader()`` method. + +Create your own Loader +~~~~~~~~~~~~~~~~~~~~~~ + +All loaders implement the ``Twig_LoaderInterface``:: + + interface Twig_LoaderInterface + { + /** + * Gets the source code of a template, given its name. + * + * @param string $name string The name of the template to load + * + * @return string The template source code + */ + function getSource($name); + + /** + * Gets the cache key to use for the cache for a given template name. + * + * @param string $name string The name of the template to load + * + * @return string The cache key + */ + function getCacheKey($name); + + /** + * Returns true if the template is still fresh. + * + * @param string $name The template name + * @param timestamp $time The last modification time of the cached template + */ + function isFresh($name, $time); + } + +The ``isFresh()`` method must return ``true`` if the current cached template +is still fresh, given the last modification time, or ``false`` otherwise. + +.. tip:: + + As of Twig 1.11.0, you can also implement ``Twig_ExistsLoaderInterface`` + to make your loader faster when used with the chain loader. + +Using Extensions +---------------- + +Twig extensions are packages that add new features to Twig. Using an +extension is as simple as using the ``addExtension()`` method:: + + $twig->addExtension(new Twig_Extension_Sandbox()); + +Twig comes bundled with the following extensions: + +* *Twig_Extension_Core*: Defines all the core features of Twig. + +* *Twig_Extension_Escaper*: Adds automatic output-escaping and the possibility + to escape/unescape blocks of code. + +* *Twig_Extension_Sandbox*: Adds a sandbox mode to the default Twig + environment, making it safe to evaluate untrusted code. + +* *Twig_Extension_Profiler*: Enabled the built-in Twig profiler (as of Twig + 1.18). + +* *Twig_Extension_Optimizer*: Optimizes the node tree before compilation. + +The core, escaper, and optimizer extensions do not need to be added to the +Twig environment, as they are registered by default. + +Built-in Extensions +------------------- + +This section describes the features added by the built-in extensions. + +.. tip:: + + Read the chapter about extending Twig to learn how to create your own + extensions. + +Core Extension +~~~~~~~~~~~~~~ + +The ``core`` extension defines all the core features of Twig: + +* :doc:`Tags `; +* :doc:`Filters `; +* :doc:`Functions `; +* :doc:`Tests `. + +Escaper Extension +~~~~~~~~~~~~~~~~~ + +The ``escaper`` extension adds automatic output escaping to Twig. It defines a +tag, ``autoescape``, and a filter, ``raw``. + +When creating the escaper extension, you can switch on or off the global +output escaping strategy:: + + $escaper = new Twig_Extension_Escaper('html'); + $twig->addExtension($escaper); + +If set to ``html``, all variables in templates are escaped (using the ``html`` +escaping strategy), except those using the ``raw`` filter: + +.. code-block:: jinja + + {{ article.to_html|raw }} + +You can also change the escaping mode locally by using the ``autoescape`` tag +(see the :doc:`autoescape` doc for the syntax used before +Twig 1.8): + +.. code-block:: jinja + + {% autoescape 'html' %} + {{ var }} + {{ var|raw }} {# var won't be escaped #} + {{ var|escape }} {# var won't be double-escaped #} + {% endautoescape %} + +.. warning:: + + The ``autoescape`` tag has no effect on included files. + +The escaping rules are implemented as follows: + +* Literals (integers, booleans, arrays, ...) used in the template directly as + variables or filter arguments are never automatically escaped: + + .. code-block:: jinja + + {{ "Twig
" }} {# won't be escaped #} + + {% set text = "Twig
" %} + {{ text }} {# will be escaped #} + +* Expressions which the result is always a literal or a variable marked safe + are never automatically escaped: + + .. code-block:: jinja + + {{ foo ? "Twig
" : "
Twig" }} {# won't be escaped #} + + {% set text = "Twig
" %} + {{ foo ? text : "
Twig" }} {# will be escaped #} + + {% set text = "Twig
" %} + {{ foo ? text|raw : "
Twig" }} {# won't be escaped #} + + {% set text = "Twig
" %} + {{ foo ? text|escape : "
Twig" }} {# the result of the expression won't be escaped #} + +* Escaping is applied before printing, after any other filter is applied: + + .. code-block:: jinja + + {{ var|upper }} {# is equivalent to {{ var|upper|escape }} #} + +* The `raw` filter should only be used at the end of the filter chain: + + .. code-block:: jinja + + {{ var|raw|upper }} {# will be escaped #} + + {{ var|upper|raw }} {# won't be escaped #} + +* Automatic escaping is not applied if the last filter in the chain is marked + safe for the current context (e.g. ``html`` or ``js``). ``escape`` and + ``escape('html')`` are marked safe for HTML, ``escape('js')`` is marked + safe for JavaScript, ``raw`` is marked safe for everything. + + .. code-block:: jinja + + {% autoescape 'js' %} + {{ var|escape('html') }} {# will be escaped for HTML and JavaScript #} + {{ var }} {# will be escaped for JavaScript #} + {{ var|escape('js') }} {# won't be double-escaped #} + {% endautoescape %} + +.. note:: + + Note that autoescaping has some limitations as escaping is applied on + expressions after evaluation. For instance, when working with + concatenation, ``{{ foo|raw ~ bar }}`` won't give the expected result as + escaping is applied on the result of the concatenation, not on the + individual variables (so, the ``raw`` filter won't have any effect here). + +Sandbox Extension +~~~~~~~~~~~~~~~~~ + +The ``sandbox`` extension can be used to evaluate untrusted code. Access to +unsafe attributes and methods is prohibited. The sandbox security is managed +by a policy instance. By default, Twig comes with one policy class: +``Twig_Sandbox_SecurityPolicy``. This class allows you to white-list some +tags, filters, properties, and methods:: + + $tags = array('if'); + $filters = array('upper'); + $methods = array( + 'Article' => array('getTitle', 'getBody'), + ); + $properties = array( + 'Article' => array('title', 'body'), + ); + $functions = array('range'); + $policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions); + +With the previous configuration, the security policy will only allow usage of +the ``if`` tag, and the ``upper`` filter. Moreover, the templates will only be +able to call the ``getTitle()`` and ``getBody()`` methods on ``Article`` +objects, and the ``title`` and ``body`` public properties. Everything else +won't be allowed and will generate a ``Twig_Sandbox_SecurityError`` exception. + +The policy object is the first argument of the sandbox constructor:: + + $sandbox = new Twig_Extension_Sandbox($policy); + $twig->addExtension($sandbox); + +By default, the sandbox mode is disabled and should be enabled when including +untrusted template code by using the ``sandbox`` tag: + +.. code-block:: jinja + + {% sandbox %} + {% include 'user.html' %} + {% endsandbox %} + +You can sandbox all templates by passing ``true`` as the second argument of +the extension constructor:: + + $sandbox = new Twig_Extension_Sandbox($policy, true); + +Profiler Extension +~~~~~~~~~~~~~~~~~~ + +.. versionadded:: 1.18 + The Profile extension was added in Twig 1.18. + +The ``profiler`` extension enables a profiler for Twig templates; it should +only be used on your development machines as it adds some overhead:: + + $profile = new Twig_Profiler_Profile(); + $twig->addExtension(new Twig_Extension_Profiler($profile)); + + $dumper = new Twig_Profiler_Dumper_Text(); + echo $dumper->dump($profile); + +A profile contains information about time and memory consumption for template, +block, and macro executions. + +You can also dump the data in a `Blackfire.io `_ +compatible format:: + + $dumper = new Twig_Profiler_Dumper_Blackfire(); + file_put_contents('/path/to/profile.prof', $dumper->dump($profile)); + +Upload the profile to visualize it (create a `free account +`_ first): + +.. code-block:: sh + + blackfire --slot=7 upload /path/to/profile.prof + +Optimizer Extension +~~~~~~~~~~~~~~~~~~~ + +The ``optimizer`` extension optimizes the node tree before compilation:: + + $twig->addExtension(new Twig_Extension_Optimizer()); + +By default, all optimizations are turned on. You can select the ones you want +to enable by passing them to the constructor:: + + $optimizer = new Twig_Extension_Optimizer(Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR); + + $twig->addExtension($optimizer); + +Twig supports the following optimizations: + +* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_ALL``, enables all optimizations + (this is the default value). +* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_NONE``, disables all optimizations. + This reduces the compilation time, but it can increase the execution time + and the consumed memory. +* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR``, optimizes the ``for`` tag by + removing the ``loop`` variable creation whenever possible. +* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_RAW_FILTER``, removes the ``raw`` + filter whenever possible. +* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_VAR_ACCESS``, simplifies the creation + and access of variables in the compiled templates whenever possible. + +Exceptions +---------- + +Twig can throw exceptions: + +* ``Twig_Error``: The base exception for all errors. + +* ``Twig_Error_Syntax``: Thrown to tell the user that there is a problem with + the template syntax. + +* ``Twig_Error_Runtime``: Thrown when an error occurs at runtime (when a filter + does not exist for instance). + +* ``Twig_Error_Loader``: Thrown when an error occurs during template loading. + +* ``Twig_Sandbox_SecurityError``: Thrown when an unallowed tag, filter, or + method is called in a sandboxed template. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/coding_standards.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/coding_standards.rst new file mode 100644 index 000000000..bf8ea91a4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/coding_standards.rst @@ -0,0 +1,101 @@ +Coding Standards +================ + +When writing Twig templates, we recommend you to follow these official coding +standards: + +* Put one (and only one) space after the start of a delimiter (``{{``, ``{%``, + and ``{#``) and before the end of a delimiter (``}}``, ``%}``, and ``#}``): + + .. code-block:: jinja + + {{ foo }} + {# comment #} + {% if foo %}{% endif %} + + When using the whitespace control character, do not put any spaces between + it and the delimiter: + + .. code-block:: jinja + + {{- foo -}} + {#- comment -#} + {%- if foo -%}{%- endif -%} + +* Put one (and only one) space before and after the following operators: + comparison operators (``==``, ``!=``, ``<``, ``>``, ``>=``, ``<=``), math + operators (``+``, ``-``, ``/``, ``*``, ``%``, ``//``, ``**``), logic + operators (``not``, ``and``, ``or``), ``~``, ``is``, ``in``, and the ternary + operator (``?:``): + + .. code-block:: jinja + + {{ 1 + 2 }} + {{ foo ~ bar }} + {{ true ? true : false }} + +* Put one (and only one) space after the ``:`` sign in hashes and ``,`` in + arrays and hashes: + + .. code-block:: jinja + + {{ [1, 2, 3] }} + {{ {'foo': 'bar'} }} + +* Do not put any spaces after an opening parenthesis and before a closing + parenthesis in expressions: + + .. code-block:: jinja + + {{ 1 + (2 * 3) }} + +* Do not put any spaces before and after string delimiters: + + .. code-block:: jinja + + {{ 'foo' }} + {{ "foo" }} + +* Do not put any spaces before and after the following operators: ``|``, + ``.``, ``..``, ``[]``: + + .. code-block:: jinja + + {{ foo|upper|lower }} + {{ user.name }} + {{ user[name] }} + {% for i in 1..12 %}{% endfor %} + +* Do not put any spaces before and after the parenthesis used for filter and + function calls: + + .. code-block:: jinja + + {{ foo|default('foo') }} + {{ range(1..10) }} + +* Do not put any spaces before and after the opening and the closing of arrays + and hashes: + + .. code-block:: jinja + + {{ [1, 2, 3] }} + {{ {'foo': 'bar'} }} + +* Use lower cased and underscored variable names: + + .. code-block:: jinja + + {% set foo = 'foo' %} + {% set foo_bar = 'foo' %} + +* Indent your code inside tags (use the same indentation as the one used for + the target language of the rendered template): + + .. code-block:: jinja + + {% block foo %} + {% if true %} + true + {% endif %} + {% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/deprecated.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/deprecated.rst new file mode 100644 index 000000000..801228da7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/deprecated.rst @@ -0,0 +1,179 @@ +Deprecated Features +=================== + +This document lists all deprecated features in Twig. Deprecated features are +kept for backward compatibility and removed in the next major release (a +feature that was deprecated in Twig 1.x is removed in Twig 2.0). + +Deprecation Notices +------------------- + +As of Twig 1.21, Twig generates deprecation notices when a template uses +deprecated features. See :ref:`deprecation-notices` for more information. + +Token Parsers +------------- + +* As of Twig 1.x, the token parser broker sub-system is deprecated. The + following class and interface will be removed in 2.0: + + * ``Twig_TokenParserBrokerInterface`` + * ``Twig_TokenParserBroker`` + +Extensions +---------- + +* As of Twig 1.x, the ability to remove an extension is deprecated and the + ``Twig_Environment::removeExtension()`` method will be removed in 2.0. + +* As of Twig 1.23, the ``Twig_ExtensionInterface::initRuntime()`` method is + deprecated. You have two options to avoid the deprecation notice: if you + implement this method to store the environment for your custom filters, + functions, or tests, use the ``needs_environment`` option instead; if you + have more complex needs, explicitly implement + ``Twig_Extension_InitRuntimeInterface`` (not recommended). + +* As of Twig 1.23, the ``Twig_ExtensionInterface::getGlobals()`` method is + deprecated. Implement ``Twig_Extension_GlobalsInterface`` to avoid + deprecation notices. + +* As of Twig 1.26, the ``Twig_ExtensionInterface::getName()`` method is + deprecated and it is not used internally anymore. + +PEAR +---- + +PEAR support has been discontinued in Twig 1.15.1, and no PEAR packages are +provided anymore. Use Composer instead. + +Filters +------- + +* As of Twig 1.x, use ``Twig_SimpleFilter`` to add a filter. The following + classes and interfaces will be removed in 2.0: + + * ``Twig_FilterInterface`` + * ``Twig_FilterCallableInterface`` + * ``Twig_Filter`` + * ``Twig_Filter_Function`` + * ``Twig_Filter_Method`` + * ``Twig_Filter_Node`` + +* As of Twig 2.x, the ``Twig_SimpleFilter`` class is deprecated and will be + removed in Twig 3.x (use ``Twig_Filter`` instead). In Twig 2.x, + ``Twig_SimpleFilter`` is just an alias for ``Twig_Filter``. + +Functions +--------- + +* As of Twig 1.x, use ``Twig_SimpleFunction`` to add a function. The following + classes and interfaces will be removed in 2.0: + + * ``Twig_FunctionInterface`` + * ``Twig_FunctionCallableInterface`` + * ``Twig_Function`` + * ``Twig_Function_Function`` + * ``Twig_Function_Method`` + * ``Twig_Function_Node`` + +* As of Twig 2.x, the ``Twig_SimpleFunction`` class is deprecated and will be + removed in Twig 3.x (use ``Twig_Function`` instead). In Twig 2.x, + ``Twig_SimpleFunction`` is just an alias for ``Twig_Function``. + +Tests +----- + +* As of Twig 1.x, use ``Twig_SimpleTest`` to add a test. The following classes + and interfaces will be removed in 2.0: + + * ``Twig_TestInterface`` + * ``Twig_TestCallableInterface`` + * ``Twig_Test`` + * ``Twig_Test_Function`` + * ``Twig_Test_Method`` + * ``Twig_Test_Node`` + +* As of Twig 2.x, the ``Twig_SimpleTest`` class is deprecated and will be + removed in Twig 3.x (use ``Twig_Test`` instead). In Twig 2.x, + ``Twig_SimpleTest`` is just an alias for ``Twig_Test``. + +* The ``sameas`` and ``divisibleby`` tests are deprecated in favor of ``same + as`` and ``divisible by`` respectively. + +Tags +---- + +* As of Twig 1.x, the ``raw`` tag is deprecated. You should use ``verbatim`` + instead. + +Nodes +----- + +* As of Twig 1.x, ``Node::toXml()`` is deprecated and will be removed in Twig + 2.0. + +* As of Twig 1.26, ``Node::$nodes`` should only contains ``Twig_Node`` + instances, storing a ``null`` value is deprecated and won't be possible in + Twig 2.x. + +Interfaces +---------- + +* As of Twig 2.x, the following interfaces are deprecated and empty (they will + be removed in Twig 3.0): + +* ``Twig_CompilerInterface`` (use ``Twig_Compiler`` instead) +* ``Twig_LexerInterface`` (use ``Twig_Lexer`` instead) +* ``Twig_NodeInterface`` (use ``Twig_Node`` instead) +* ``Twig_ParserInterface`` (use ``Twig_Parser`` instead) +* ``Twig_ExistsLoaderInterface`` (merged with ``Twig_LoaderInterface``) +* ``Twig_TemplateInterface`` (use ``Twig_Template`` instead, and use + those constants Twig_Template::ANY_CALL, Twig_Template::ARRAY_CALL, + Twig_Template::METHOD_CALL) + +Compiler +-------- + +* As of Twig 1.26, the ``Twig_Compiler::getFilename()`` has been deprecated. + You should not use it anyway as its values is not reliable. + +Loaders +------- + +* As of Twig 1.x, ``Twig_Loader_String`` is deprecated and will be removed in + 2.0. You can render a string via ``Twig_Environment::createTemplate()``. + +Node Visitors +------------- + +* Because of the removal of ``Twig_NodeInterface`` in 2.0, you need to extend + ``Twig_BaseNodeVisitor`` instead of implementing ``Twig_NodeVisitorInterface`` + directly to make your node visitors compatible with both Twig 1.x and 2.x. + +Globals +------- + +* As of Twig 2.x, the ability to register a global variable after the runtime + or the extensions have been initialized is not possible anymore (but + changing the value of an already registered global is possible). + +* As of Twig 1.x, using the ``_self`` global variable to get access to the + current ``Twig_Template`` instance is deprecated; most usages only need the + current template name, which will continue to work in Twig 2.0. In Twig 2.0, + ``_self`` returns the current template name instead of the current + ``Twig_Template`` instance. + +Miscellaneous +------------- + +* As of Twig 1.x, ``Twig_Environment::clearTemplateCache()``, + ``Twig_Environment::writeCacheFile()``, + ``Twig_Environment::clearCacheFiles()``, + ``Twig_Environment::getCacheFilename()``, + ``Twig_Environment::getTemplateClassPrefix()``, + ``Twig_Environment::getLexer()``, ``Twig_Environment::getParser()``, and + ``Twig_Environment::getCompiler()`` are deprecated and will be removed in 2.0. + +* As of Twig 1.x, ``Twig_Template::getEnvironment()`` and + ``Twig_TemplateInterface::getEnvironment()`` are deprecated and will be + removed in 2.0. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/abs.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/abs.rst new file mode 100644 index 000000000..22fa59d03 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/abs.rst @@ -0,0 +1,18 @@ +``abs`` +======= + +The ``abs`` filter returns the absolute value. + +.. code-block:: jinja + + {# number = -5 #} + + {{ number|abs }} + + {# outputs 5 #} + +.. note:: + + Internally, Twig uses the PHP `abs`_ function. + +.. _`abs`: http://php.net/abs diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/batch.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/batch.rst new file mode 100644 index 000000000..f8b6fa9d4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/batch.rst @@ -0,0 +1,51 @@ +``batch`` +========= + +.. versionadded:: 1.12.3 + The ``batch`` filter was added in Twig 1.12.3. + +The ``batch`` filter "batches" items by returning a list of lists with the +given number of items. A second parameter can be provided and used to fill in +missing items: + +.. code-block:: jinja + + {% set items = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] %} + + + {% for row in items|batch(3, 'No item') %} + + {% for column in row %} + + {% endfor %} + + {% endfor %} +
{{ column }}
+ +The above example will be rendered as: + +.. code-block:: jinja + + + + + + + + + + + + + + + + + +
abc
def
gNo itemNo item
+ +Arguments +--------- + +* ``size``: The size of the batch; fractional numbers will be rounded up +* ``fill``: Used to fill in missing items diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/capitalize.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/capitalize.rst new file mode 100644 index 000000000..10546a1f3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/capitalize.rst @@ -0,0 +1,11 @@ +``capitalize`` +============== + +The ``capitalize`` filter capitalizes a value. The first character will be +uppercase, all others lowercase: + +.. code-block:: jinja + + {{ 'my first car'|capitalize }} + + {# outputs 'My first car' #} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/convert_encoding.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/convert_encoding.rst new file mode 100644 index 000000000..f4ebe5807 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/convert_encoding.rst @@ -0,0 +1,28 @@ +``convert_encoding`` +==================== + +.. versionadded:: 1.4 + The ``convert_encoding`` filter was added in Twig 1.4. + +The ``convert_encoding`` filter converts a string from one encoding to +another. The first argument is the expected output charset and the second one +is the input charset: + +.. code-block:: jinja + + {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }} + +.. note:: + + This filter relies on the `iconv`_ or `mbstring`_ extension, so one of + them must be installed. In case both are installed, `mbstring`_ is used by + default (Twig before 1.8.1 uses `iconv`_ by default). + +Arguments +--------- + +* ``to``: The output charset +* ``from``: The input charset + +.. _`iconv`: http://php.net/iconv +.. _`mbstring`: http://php.net/mbstring diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/date.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/date.rst new file mode 100644 index 000000000..99a17ab75 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/date.rst @@ -0,0 +1,100 @@ +``date`` +======== + +.. versionadded:: 1.1 + The timezone support has been added in Twig 1.1. + +.. versionadded:: 1.5 + The default date format support has been added in Twig 1.5. + +.. versionadded:: 1.6.1 + The default timezone support has been added in Twig 1.6.1. + +.. versionadded:: 1.11.0 + The introduction of the false value for the timezone was introduced in Twig 1.11.0 + +The ``date`` filter formats a date to a given format: + +.. code-block:: jinja + + {{ post.published_at|date("m/d/Y") }} + +The format specifier is the same as supported by `date`_, +except when the filtered data is of type `DateInterval`_, when the format must conform to +`DateInterval::format`_ instead. + +The ``date`` filter accepts strings (it must be in a format supported by the +`strtotime`_ function), `DateTime`_ instances, or `DateInterval`_ instances. For +instance, to display the current date, filter the word "now": + +.. code-block:: jinja + + {{ "now"|date("m/d/Y") }} + +To escape words and characters in the date format use ``\\`` in front of each +character: + +.. code-block:: jinja + + {{ post.published_at|date("F jS \\a\\t g:ia") }} + +If the value passed to the ``date`` filter is ``null``, it will return the +current date by default. If an empty string is desired instead of the current +date, use a ternary operator: + +.. code-block:: jinja + + {{ post.published_at is empty ? "" : post.published_at|date("m/d/Y") }} + +If no format is provided, Twig will use the default one: ``F j, Y H:i``. This +default can be easily changed by calling the ``setDateFormat()`` method on the +``core`` extension instance. The first argument is the default format for +dates and the second one is the default format for date intervals: + +.. code-block:: php + + $twig = new Twig_Environment($loader); + $twig->getExtension('Twig_Extension_Core')->setDateFormat('d/m/Y', '%d days'); + + // before Twig 1.26 + $twig->getExtension('core')->setDateFormat('d/m/Y', '%d days'); + +Timezone +-------- + +By default, the date is displayed by applying the default timezone (the one +specified in php.ini or declared in Twig -- see below), but you can override +it by explicitly specifying a timezone: + +.. code-block:: jinja + + {{ post.published_at|date("m/d/Y", "Europe/Paris") }} + +If the date is already a DateTime object, and if you want to keep its current +timezone, pass ``false`` as the timezone value: + +.. code-block:: jinja + + {{ post.published_at|date("m/d/Y", false) }} + +The default timezone can also be set globally by calling ``setTimezone()``: + +.. code-block:: php + + $twig = new Twig_Environment($loader); + $twig->getExtension('Twig_Extension_Core')->setTimezone('Europe/Paris'); + + // before Twig 1.26 + $twig->getExtension('core')->setTimezone('Europe/Paris'); + +Arguments +--------- + +* ``format``: The date format +* ``timezone``: The date timezone + +.. _`strtotime`: http://www.php.net/strtotime +.. _`DateTime`: http://www.php.net/DateTime +.. _`DateInterval`: http://www.php.net/DateInterval +.. _`date`: http://www.php.net/date +.. _`DateInterval::format`: http://www.php.net/DateInterval.format diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/date_modify.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/date_modify.rst new file mode 100644 index 000000000..add40b56b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/date_modify.rst @@ -0,0 +1,23 @@ +``date_modify`` +=============== + +.. versionadded:: 1.9.0 + The date_modify filter has been added in Twig 1.9.0. + +The ``date_modify`` filter modifies a date with a given modifier string: + +.. code-block:: jinja + + {{ post.published_at|date_modify("+1 day")|date("m/d/Y") }} + +The ``date_modify`` filter accepts strings (it must be in a format supported +by the `strtotime`_ function) or `DateTime`_ instances. You can easily combine +it with the :doc:`date` filter for formatting. + +Arguments +--------- + +* ``modifier``: The modifier + +.. _`strtotime`: http://www.php.net/strtotime +.. _`DateTime`: http://www.php.net/DateTime diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/default.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/default.rst new file mode 100644 index 000000000..641ac6e75 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/default.rst @@ -0,0 +1,33 @@ +``default`` +=========== + +The ``default`` filter returns the passed default value if the value is +undefined or empty, otherwise the value of the variable: + +.. code-block:: jinja + + {{ var|default('var is not defined') }} + + {{ var.foo|default('foo item on var is not defined') }} + + {{ var['foo']|default('foo item on var is not defined') }} + + {{ ''|default('passed var is empty') }} + +When using the ``default`` filter on an expression that uses variables in some +method calls, be sure to use the ``default`` filter whenever a variable can be +undefined: + +.. code-block:: jinja + + {{ var.method(foo|default('foo'))|default('foo') }} + +.. note:: + + Read the documentation for the :doc:`defined<../tests/defined>` and + :doc:`empty<../tests/empty>` tests to learn more about their semantics. + +Arguments +--------- + +* ``default``: The default value diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/escape.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/escape.rst new file mode 100644 index 000000000..21491343b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/escape.rst @@ -0,0 +1,119 @@ +``escape`` +========== + +.. versionadded:: 1.9.0 + The ``css``, ``url``, and ``html_attr`` strategies were added in Twig + 1.9.0. + +.. versionadded:: 1.14.0 + The ability to define custom escapers was added in Twig 1.14.0. + +The ``escape`` filter escapes a string for safe insertion into the final +output. It supports different escaping strategies depending on the template +context. + +By default, it uses the HTML escaping strategy: + +.. code-block:: jinja + + {{ user.username|escape }} + +For convenience, the ``e`` filter is defined as an alias: + +.. code-block:: jinja + + {{ user.username|e }} + +The ``escape`` filter can also be used in other contexts than HTML thanks to +an optional argument which defines the escaping strategy to use: + +.. code-block:: jinja + + {{ user.username|e }} + {# is equivalent to #} + {{ user.username|e('html') }} + +And here is how to escape variables included in JavaScript code: + +.. code-block:: jinja + + {{ user.username|escape('js') }} + {{ user.username|e('js') }} + +The ``escape`` filter supports the following escaping strategies: + +* ``html``: escapes a string for the **HTML body** context. + +* ``js``: escapes a string for the **JavaScript context**. + +* ``css``: escapes a string for the **CSS context**. CSS escaping can be + applied to any string being inserted into CSS and escapes everything except + alphanumerics. + +* ``url``: escapes a string for the **URI or parameter contexts**. This should + not be used to escape an entire URI; only a subcomponent being inserted. + +* ``html_attr``: escapes a string for the **HTML attribute** context. + +.. note:: + + Internally, ``escape`` uses the PHP native `htmlspecialchars`_ function + for the HTML escaping strategy. + +.. caution:: + + When using automatic escaping, Twig tries to not double-escape a variable + when the automatic escaping strategy is the same as the one applied by the + escape filter; but that does not work when using a variable as the + escaping strategy: + + .. code-block:: jinja + + {% set strategy = 'html' %} + + {% autoescape 'html' %} + {{ var|escape('html') }} {# won't be double-escaped #} + {{ var|escape(strategy) }} {# will be double-escaped #} + {% endautoescape %} + + When using a variable as the escaping strategy, you should disable + automatic escaping: + + .. code-block:: jinja + + {% set strategy = 'html' %} + + {% autoescape 'html' %} + {{ var|escape(strategy)|raw }} {# won't be double-escaped #} + {% endautoescape %} + +Custom Escapers +--------------- + +You can define custom escapers by calling the ``setEscaper()`` method on the +``core`` extension instance. The first argument is the escaper name (to be +used in the ``escape`` call) and the second one must be a valid PHP callable: + +.. code-block:: php + + $twig = new Twig_Environment($loader); + $twig->getExtension('Twig_Extension_Core')->setEscaper('csv', 'csv_escaper'); + + // before Twig 1.26 + $twig->getExtension('core')->setEscaper('csv', 'csv_escaper'); + +When called by Twig, the callable receives the Twig environment instance, the +string to escape, and the charset. + +.. note:: + + Built-in escapers cannot be overridden mainly they should be considered as + the final implementation and also for better performance. + +Arguments +--------- + +* ``strategy``: The escaping strategy +* ``charset``: The string charset + +.. _`htmlspecialchars`: http://php.net/htmlspecialchars diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/first.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/first.rst new file mode 100644 index 000000000..674c1f9ed --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/first.rst @@ -0,0 +1,25 @@ +``first`` +========= + +.. versionadded:: 1.12.2 + The ``first`` filter was added in Twig 1.12.2. + +The ``first`` filter returns the first "element" of a sequence, a mapping, or +a string: + +.. code-block:: jinja + + {{ [1, 2, 3, 4]|first }} + {# outputs 1 #} + + {{ { a: 1, b: 2, c: 3, d: 4 }|first }} + {# outputs 1 #} + + {{ '1234'|first }} + {# outputs 1 #} + +.. note:: + + It also works with objects implementing the `Traversable`_ interface. + +.. _`Traversable`: http://php.net/manual/en/class.traversable.php diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/format.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/format.rst new file mode 100644 index 000000000..f8effd9a9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/format.rst @@ -0,0 +1,16 @@ +``format`` +========== + +The ``format`` filter formats a given string by replacing the placeholders +(placeholders follows the `sprintf`_ notation): + +.. code-block:: jinja + + {{ "I like %s and %s."|format(foo, "bar") }} + + {# outputs I like foo and bar + if the foo parameter equals to the foo string. #} + +.. _`sprintf`: http://www.php.net/sprintf + +.. seealso:: :doc:`replace` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/index.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/index.rst new file mode 100644 index 000000000..8daa96118 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/index.rst @@ -0,0 +1,37 @@ +Filters +======= + +.. toctree:: + :maxdepth: 1 + + abs + batch + capitalize + convert_encoding + date + date_modify + default + escape + first + format + join + json_encode + keys + last + length + lower + merge + nl2br + number_format + raw + replace + reverse + round + slice + sort + split + striptags + title + trim + upper + url_encode diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/join.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/join.rst new file mode 100644 index 000000000..2fab94528 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/join.rst @@ -0,0 +1,23 @@ +``join`` +======== + +The ``join`` filter returns a string which is the concatenation of the items +of a sequence: + +.. code-block:: jinja + + {{ [1, 2, 3]|join }} + {# returns 123 #} + +The separator between elements is an empty string per default, but you can +define it with the optional first parameter: + +.. code-block:: jinja + + {{ [1, 2, 3]|join('|') }} + {# outputs 1|2|3 #} + +Arguments +--------- + +* ``glue``: The separator diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/json_encode.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/json_encode.rst new file mode 100644 index 000000000..a39bb476e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/json_encode.rst @@ -0,0 +1,21 @@ +``json_encode`` +=============== + +The ``json_encode`` filter returns the JSON representation of a value: + +.. code-block:: jinja + + {{ data|json_encode() }} + +.. note:: + + Internally, Twig uses the PHP `json_encode`_ function. + +Arguments +--------- + +* ``options``: A bitmask of `json_encode options`_ (``{{ + data|json_encode(constant('JSON_PRETTY_PRINT')) }}``) + +.. _`json_encode`: http://php.net/json_encode +.. _`json_encode options`: http://www.php.net/manual/en/json.constants.php diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/keys.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/keys.rst new file mode 100644 index 000000000..e4f090c6b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/keys.rst @@ -0,0 +1,11 @@ +``keys`` +======== + +The ``keys`` filter returns the keys of an array. It is useful when you want to +iterate over the keys of an array: + +.. code-block:: jinja + + {% for key in array|keys %} + ... + {% endfor %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/last.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/last.rst new file mode 100644 index 000000000..345b6573d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/last.rst @@ -0,0 +1,25 @@ +``last`` +======== + +.. versionadded:: 1.12.2 + The ``last`` filter was added in Twig 1.12.2. + +The ``last`` filter returns the last "element" of a sequence, a mapping, or +a string: + +.. code-block:: jinja + + {{ [1, 2, 3, 4]|last }} + {# outputs 4 #} + + {{ { a: 1, b: 2, c: 3, d: 4 }|last }} + {# outputs 4 #} + + {{ '1234'|last }} + {# outputs 4 #} + +.. note:: + + It also works with objects implementing the `Traversable`_ interface. + +.. _`Traversable`: http://php.net/manual/en/class.traversable.php diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/length.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/length.rst new file mode 100644 index 000000000..1f783b3dd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/length.rst @@ -0,0 +1,11 @@ +``length`` +========== + +The ``length`` filter returns the number of items of a sequence or mapping, or +the length of a string: + +.. code-block:: jinja + + {% if users|length > 10 %} + ... + {% endif %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/lower.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/lower.rst new file mode 100644 index 000000000..ef9faa90a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/lower.rst @@ -0,0 +1,10 @@ +``lower`` +========= + +The ``lower`` filter converts a value to lowercase: + +.. code-block:: jinja + + {{ 'WELCOME'|lower }} + + {# outputs 'welcome' #} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/merge.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/merge.rst new file mode 100644 index 000000000..88780dd6f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/merge.rst @@ -0,0 +1,48 @@ +``merge`` +========= + +The ``merge`` filter merges an array with another array: + +.. code-block:: jinja + + {% set values = [1, 2] %} + + {% set values = values|merge(['apple', 'orange']) %} + + {# values now contains [1, 2, 'apple', 'orange'] #} + +New values are added at the end of the existing ones. + +The ``merge`` filter also works on hashes: + +.. code-block:: jinja + + {% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %} + + {% set items = items|merge({ 'peugeot': 'car', 'renault': 'car' }) %} + + {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car', 'renault': 'car' } #} + +For hashes, the merging process occurs on the keys: if the key does not +already exist, it is added but if the key already exists, its value is +overridden. + +.. tip:: + + If you want to ensure that some values are defined in an array (by given + default values), reverse the two elements in the call: + + .. code-block:: jinja + + {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %} + + {% set items = { 'apple': 'unknown' }|merge(items) %} + + {# items now contains { 'apple': 'fruit', 'orange': 'fruit' } #} + +.. note:: + + Internally, Twig uses the PHP `array_merge`_ function. It supports + Traversable objects by transforming those to arrays. + +.. _`array_merge`: http://php.net/array_merge diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/nl2br.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/nl2br.rst new file mode 100644 index 000000000..5c923e143 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/nl2br.rst @@ -0,0 +1,22 @@ +``nl2br`` +========= + +.. versionadded:: 1.5 + The ``nl2br`` filter was added in Twig 1.5. + +The ``nl2br`` filter inserts HTML line breaks before all newlines in a string: + +.. code-block:: jinja + + {{ "I like Twig.\nYou will like it too."|nl2br }} + {# outputs + + I like Twig.
+ You will like it too. + + #} + +.. note:: + + The ``nl2br`` filter pre-escapes the input before applying the + transformation. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/number_format.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/number_format.rst new file mode 100644 index 000000000..f42ede142 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/number_format.rst @@ -0,0 +1,48 @@ +``number_format`` +================= + +.. versionadded:: 1.5 + The ``number_format`` filter was added in Twig 1.5 + +The ``number_format`` filter formats numbers. It is a wrapper around PHP's +`number_format`_ function: + +.. code-block:: jinja + + {{ 200.35|number_format }} + +You can control the number of decimal places, decimal point, and thousands +separator using the additional arguments: + +.. code-block:: jinja + + {{ 9800.333|number_format(2, '.', ',') }} + +If no formatting options are provided then Twig will use the default formatting +options of: + +* 0 decimal places. +* ``.`` as the decimal point. +* ``,`` as the thousands separator. + +These defaults can be easily changed through the core extension: + +.. code-block:: php + + $twig = new Twig_Environment($loader); + $twig->getExtension('Twig_Extension_Core')->setNumberFormat(3, '.', ','); + + // before Twig 1.26 + $twig->getExtension('core')->setNumberFormat(3, '.', ','); + +The defaults set for ``number_format`` can be over-ridden upon each call using the +additional parameters. + +Arguments +--------- + +* ``decimal``: The number of decimal points to display +* ``decimal_point``: The character(s) to use for the decimal point +* ``thousand_sep``: The character(s) to use for the thousands separator + +.. _`number_format`: http://php.net/number_format diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/raw.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/raw.rst new file mode 100644 index 000000000..e5e5b12ec --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/raw.rst @@ -0,0 +1,36 @@ +``raw`` +======= + +The ``raw`` filter marks the value as being "safe", which means that in an +environment with automatic escaping enabled this variable will not be escaped +if ``raw`` is the last filter applied to it: + +.. code-block:: jinja + + {% autoescape %} + {{ var|raw }} {# var won't be escaped #} + {% endautoescape %} + +.. note:: + + Be careful when using the ``raw`` filter inside expressions: + + .. code-block:: jinja + + {% autoescape %} + {% set hello = 'Hello' %} + {% set hola = 'Hola' %} + + {{ false ? 'Hola' : hello|raw }} + does not render the same as + {{ false ? hola : hello|raw }} + but renders the same as + {{ (false ? hola : hello)|raw }} + {% endautoescape %} + + The first ternary statement is not escaped: ``hello`` is marked as being + safe and Twig does not escape static values (see + :doc:`escape<../tags/autoescape>`). In the second ternary statement, even + if ``hello`` is marked as safe, ``hola`` remains unsafe and so is the whole + expression. The third ternary statement is marked as safe and the result is + not escaped. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/replace.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/replace.rst new file mode 100644 index 000000000..1227957b9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/replace.rst @@ -0,0 +1,19 @@ +``replace`` +=========== + +The ``replace`` filter formats a given string by replacing the placeholders +(placeholders are free-form): + +.. code-block:: jinja + + {{ "I like %this% and %that%."|replace({'%this%': foo, '%that%': "bar"}) }} + + {# outputs I like foo and bar + if the foo parameter equals to the foo string. #} + +Arguments +--------- + +* ``replace_pairs``: The placeholder values + +.. seealso:: :doc:`format` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/reverse.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/reverse.rst new file mode 100644 index 000000000..76fd2c1ab --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/reverse.rst @@ -0,0 +1,47 @@ +``reverse`` +=========== + +.. versionadded:: 1.6 + Support for strings has been added in Twig 1.6. + +The ``reverse`` filter reverses a sequence, a mapping, or a string: + +.. code-block:: jinja + + {% for user in users|reverse %} + ... + {% endfor %} + + {{ '1234'|reverse }} + + {# outputs 4321 #} + +.. tip:: + + For sequences and mappings, numeric keys are not preserved. To reverse + them as well, pass ``true`` as an argument to the ``reverse`` filter: + + .. code-block:: jinja + + {% for key, value in {1: "a", 2: "b", 3: "c"}|reverse %} + {{ key }}: {{ value }} + {%- endfor %} + + {# output: 0: c 1: b 2: a #} + + {% for key, value in {1: "a", 2: "b", 3: "c"}|reverse(true) %} + {{ key }}: {{ value }} + {%- endfor %} + + {# output: 3: c 2: b 1: a #} + +.. note:: + + It also works with objects implementing the `Traversable`_ interface. + +Arguments +--------- + +* ``preserve_keys``: Preserve keys when reversing a mapping or a sequence. + +.. _`Traversable`: http://php.net/Traversable diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/round.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/round.rst new file mode 100644 index 000000000..2521cf16a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/round.rst @@ -0,0 +1,37 @@ +``round`` +========= + +.. versionadded:: 1.15.0 + The ``round`` filter was added in Twig 1.15.0. + +The ``round`` filter rounds a number to a given precision: + +.. code-block:: jinja + + {{ 42.55|round }} + {# outputs 43 #} + + {{ 42.55|round(1, 'floor') }} + {# outputs 42.5 #} + +The ``round`` filter takes two optional arguments; the first one specifies the +precision (default is ``0``) and the second the rounding method (default is +``common``): + +* ``common`` rounds either up or down (rounds the value up to precision decimal + places away from zero, when it is half way there -- making 1.5 into 2 and + -1.5 into -2); + +* ``ceil`` always rounds up; + +* ``floor`` always rounds down. + +.. note:: + + The ``//`` operator is equivalent to ``|round(0, 'floor')``. + +Arguments +--------- + +* ``precision``: The rounding precision +* ``method``: The rounding method diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/slice.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/slice.rst new file mode 100644 index 000000000..70bf139e6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/slice.rst @@ -0,0 +1,71 @@ +``slice`` +=========== + +.. versionadded:: 1.6 + The ``slice`` filter was added in Twig 1.6. + +The ``slice`` filter extracts a slice of a sequence, a mapping, or a string: + +.. code-block:: jinja + + {% for i in [1, 2, 3, 4, 5]|slice(1, 2) %} + {# will iterate over 2 and 3 #} + {% endfor %} + + {{ '12345'|slice(1, 2) }} + + {# outputs 23 #} + +You can use any valid expression for both the start and the length: + +.. code-block:: jinja + + {% for i in [1, 2, 3, 4, 5]|slice(start, length) %} + {# ... #} + {% endfor %} + +As syntactic sugar, you can also use the ``[]`` notation: + +.. code-block:: jinja + + {% for i in [1, 2, 3, 4, 5][start:length] %} + {# ... #} + {% endfor %} + + {{ '12345'[1:2] }} {# will display "23" #} + + {# you can omit the first argument -- which is the same as 0 #} + {{ '12345'[:2] }} {# will display "12" #} + + {# you can omit the last argument -- which will select everything till the end #} + {{ '12345'[2:] }} {# will display "345" #} + +The ``slice`` filter works as the `array_slice`_ PHP function for arrays and +`mb_substr`_ for strings with a fallback to `substr`_. + +If the start is non-negative, the sequence will start at that start in the +variable. If start is negative, the sequence will start that far from the end +of the variable. + +If length is given and is positive, then the sequence will have up to that +many elements in it. If the variable is shorter than the length, then only the +available variable elements will be present. If length is given and is +negative then the sequence will stop that many elements from the end of the +variable. If it is omitted, then the sequence will have everything from offset +up until the end of the variable. + +.. note:: + + It also works with objects implementing the `Traversable`_ interface. + +Arguments +--------- + +* ``start``: The start of the slice +* ``length``: The size of the slice +* ``preserve_keys``: Whether to preserve key or not (when the input is an array) + +.. _`Traversable`: http://php.net/manual/en/class.traversable.php +.. _`array_slice`: http://php.net/array_slice +.. _`mb_substr` : http://php.net/mb-substr +.. _`substr`: http://php.net/substr diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/sort.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/sort.rst new file mode 100644 index 000000000..350207f8e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/sort.rst @@ -0,0 +1,18 @@ +``sort`` +======== + +The ``sort`` filter sorts an array: + +.. code-block:: jinja + + {% for user in users|sort %} + ... + {% endfor %} + +.. note:: + + Internally, Twig uses the PHP `asort`_ function to maintain index + association. It supports Traversable objects by transforming + those to arrays. + +.. _`asort`: http://php.net/asort diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/split.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/split.rst new file mode 100644 index 000000000..bbc6d798f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/split.rst @@ -0,0 +1,53 @@ +``split`` +========= + +.. versionadded:: 1.10.3 + The ``split`` filter was added in Twig 1.10.3. + +The ``split`` filter splits a string by the given delimiter and returns a list +of strings: + +.. code-block:: jinja + + {% set foo = "one,two,three"|split(',') %} + {# foo contains ['one', 'two', 'three'] #} + +You can also pass a ``limit`` argument: + + * If ``limit`` is positive, the returned array will contain a maximum of + limit elements with the last element containing the rest of string; + + * If ``limit`` is negative, all components except the last -limit are + returned; + + * If ``limit`` is zero, then this is treated as 1. + +.. code-block:: jinja + + {% set foo = "one,two,three,four,five"|split(',', 3) %} + {# foo contains ['one', 'two', 'three,four,five'] #} + +If the ``delimiter`` is an empty string, then value will be split by equal +chunks. Length is set by the ``limit`` argument (one character by default). + +.. code-block:: jinja + + {% set foo = "123"|split('') %} + {# foo contains ['1', '2', '3'] #} + + {% set bar = "aabbcc"|split('', 2) %} + {# bar contains ['aa', 'bb', 'cc'] #} + +.. note:: + + Internally, Twig uses the PHP `explode`_ or `str_split`_ (if delimiter is + empty) functions for string splitting. + +Arguments +--------- + +* ``delimiter``: The delimiter +* ``limit``: The limit argument + +.. _`explode`: http://php.net/explode +.. _`str_split`: http://php.net/str_split diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/striptags.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/striptags.rst new file mode 100644 index 000000000..72c6f252f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/striptags.rst @@ -0,0 +1,15 @@ +``striptags`` +============= + +The ``striptags`` filter strips SGML/XML tags and replace adjacent whitespace +by one space: + +.. code-block:: jinja + + {{ some_html|striptags }} + +.. note:: + + Internally, Twig uses the PHP `strip_tags`_ function. + +.. _`strip_tags`: http://php.net/strip_tags diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/title.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/title.rst new file mode 100644 index 000000000..c5a318e85 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/title.rst @@ -0,0 +1,11 @@ +``title`` +========= + +The ``title`` filter returns a titlecased version of the value. Words will +start with uppercase letters, all remaining characters are lowercase: + +.. code-block:: jinja + + {{ 'my first car'|title }} + + {# outputs 'My First Car' #} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/trim.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/trim.rst new file mode 100644 index 000000000..4ddb2083b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/trim.rst @@ -0,0 +1,29 @@ +``trim`` +======== + +.. versionadded:: 1.6.2 + The ``trim`` filter was added in Twig 1.6.2. + +The ``trim`` filter strips whitespace (or other characters) from the beginning +and end of a string: + +.. code-block:: jinja + + {{ ' I like Twig. '|trim }} + + {# outputs 'I like Twig.' #} + + {{ ' I like Twig.'|trim('.') }} + + {# outputs ' I like Twig' #} + +.. note:: + + Internally, Twig uses the PHP `trim`_ function. + +Arguments +--------- + +* ``character_mask``: The characters to strip + +.. _`trim`: http://php.net/trim diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/upper.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/upper.rst new file mode 100644 index 000000000..561cebe33 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/upper.rst @@ -0,0 +1,10 @@ +``upper`` +========= + +The ``upper`` filter converts a value to uppercase: + +.. code-block:: jinja + + {{ 'welcome'|upper }} + + {# outputs 'WELCOME' #} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/filters/url_encode.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/url_encode.rst new file mode 100644 index 000000000..5944e59cd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/filters/url_encode.rst @@ -0,0 +1,34 @@ +``url_encode`` +============== + +.. versionadded:: 1.12.3 + Support for encoding an array as query string was added in Twig 1.12.3. + +.. versionadded:: 1.16.0 + The ``raw`` argument was removed in Twig 1.16.0. Twig now always encodes + according to RFC 3986. + +The ``url_encode`` filter percent encodes a given string as URL segment +or an array as query string: + +.. code-block:: jinja + + {{ "path-seg*ment"|url_encode }} + {# outputs "path-seg%2Ament" #} + + {{ "string with spaces"|url_encode }} + {# outputs "string%20with%20spaces" #} + + {{ {'param': 'value', 'foo': 'bar'}|url_encode }} + {# outputs "param=value&foo=bar" #} + +.. note:: + + Internally, Twig uses the PHP `urlencode`_ (or `rawurlencode`_ if you pass + ``true`` as the first parameter) or the `http_build_query`_ function. Note + that as of Twig 1.16.0, ``urlencode`` **always** uses ``rawurlencode`` (the + ``raw`` argument was removed.) + +.. _`urlencode`: http://php.net/urlencode +.. _`rawurlencode`: http://php.net/rawurlencode +.. _`http_build_query`: http://php.net/http_build_query diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/attribute.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/attribute.rst new file mode 100644 index 000000000..ceba96b05 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/attribute.rst @@ -0,0 +1,26 @@ +``attribute`` +============= + +.. versionadded:: 1.2 + The ``attribute`` function was added in Twig 1.2. + +The ``attribute`` function can be used to access a "dynamic" attribute of a +variable: + +.. code-block:: jinja + + {{ attribute(object, method) }} + {{ attribute(object, method, arguments) }} + {{ attribute(array, item) }} + +In addition, the ``defined`` test can check for the existence of a dynamic +attribute: + +.. code-block:: jinja + + {{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }} + +.. note:: + + The resolution algorithm is the same as the one used for the ``.`` + notation, except that the item can be any valid expression. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/block.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/block.rst new file mode 100644 index 000000000..fd571efbc --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/block.rst @@ -0,0 +1,15 @@ +``block`` +========= + +When a template uses inheritance and if you want to print a block multiple +times, use the ``block`` function: + +.. code-block:: jinja + + {% block title %}{% endblock %} + +

{{ block('title') }}

+ + {% block body %}{% endblock %} + +.. seealso:: :doc:`extends<../tags/extends>`, :doc:`parent<../functions/parent>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/constant.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/constant.rst new file mode 100644 index 000000000..bea0e9fc0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/constant.rst @@ -0,0 +1,18 @@ +``constant`` +============ + +.. versionadded: 1.12.1 + constant now accepts object instances as the second argument. + +``constant`` returns the constant value for a given string: + +.. code-block:: jinja + + {{ some_date|date(constant('DATE_W3C')) }} + {{ constant('Namespace\\Classname::CONSTANT_NAME') }} + +As of 1.12.1 you can read constants from object instances as well: + +.. code-block:: jinja + + {{ constant('RSS', date) }} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/cycle.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/cycle.rst new file mode 100644 index 000000000..e34349323 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/cycle.rst @@ -0,0 +1,28 @@ +``cycle`` +========= + +The ``cycle`` function cycles on an array of values: + +.. code-block:: jinja + + {% set start_year = date() | date('Y') %} + {% set end_year = start_year + 5 %} + + {% for year in start_year..end_year %} + {{ cycle(['odd', 'even'], loop.index0) }} + {% endfor %} + +The array can contain any number of values: + +.. code-block:: jinja + + {% set fruits = ['apple', 'orange', 'citrus'] %} + + {% for i in 0..10 %} + {{ cycle(fruits, i) }} + {% endfor %} + +Arguments +--------- + +* ``position``: The cycle position diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/date.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/date.rst new file mode 100644 index 000000000..158dd6a65 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/date.rst @@ -0,0 +1,55 @@ +``date`` +======== + +.. versionadded:: 1.6 + The date function has been added in Twig 1.6. + +.. versionadded:: 1.6.1 + The default timezone support has been added in Twig 1.6.1. + +Converts an argument to a date to allow date comparison: + +.. code-block:: jinja + + {% if date(user.created_at) < date('-2days') %} + {# do something #} + {% endif %} + +The argument must be in one of PHP’s supported `date and time formats`_. + +You can pass a timezone as the second argument: + +.. code-block:: jinja + + {% if date(user.created_at) < date('-2days', 'Europe/Paris') %} + {# do something #} + {% endif %} + +If no argument is passed, the function returns the current date: + +.. code-block:: jinja + + {% if date(user.created_at) < date() %} + {# always! #} + {% endif %} + +.. note:: + + You can set the default timezone globally by calling ``setTimezone()`` on + the ``core`` extension instance: + + .. code-block:: php + + $twig = new Twig_Environment($loader); + $twig->getExtension('Twig_Extension_Core')->setTimezone('Europe/Paris'); + + // before Twig 1.26 + $twig->getExtension('core')->setTimezone('Europe/Paris'); + +Arguments +--------- + +* ``date``: The date +* ``timezone``: The timezone + +.. _`date and time formats`: http://php.net/manual/en/datetime.formats.php diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/dump.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/dump.rst new file mode 100644 index 000000000..a231f089e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/dump.rst @@ -0,0 +1,69 @@ +``dump`` +======== + +.. versionadded:: 1.5 + The ``dump`` function was added in Twig 1.5. + +The ``dump`` function dumps information about a template variable. This is +mostly useful to debug a template that does not behave as expected by +introspecting its variables: + +.. code-block:: jinja + + {{ dump(user) }} + +.. note:: + + The ``dump`` function is not available by default. You must add the + ``Twig_Extension_Debug`` extension explicitly when creating your Twig + environment:: + + $twig = new Twig_Environment($loader, array( + 'debug' => true, + // ... + )); + $twig->addExtension(new Twig_Extension_Debug()); + + Even when enabled, the ``dump`` function won't display anything if the + ``debug`` option on the environment is not enabled (to avoid leaking debug + information on a production server). + +In an HTML context, wrap the output with a ``pre`` tag to make it easier to +read: + +.. code-block:: jinja + +
+        {{ dump(user) }}
+    
+ +.. tip:: + + Using a ``pre`` tag is not needed when `XDebug`_ is enabled and + ``html_errors`` is ``on``; as a bonus, the output is also nicer with + XDebug enabled. + +You can debug several variables by passing them as additional arguments: + +.. code-block:: jinja + + {{ dump(user, categories) }} + +If you don't pass any value, all variables from the current context are +dumped: + +.. code-block:: jinja + + {{ dump() }} + +.. note:: + + Internally, Twig uses the PHP `var_dump`_ function. + +Arguments +--------- + +* ``context``: The context to dump + +.. _`XDebug`: http://xdebug.org/docs/display +.. _`var_dump`: http://php.net/var_dump diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/include.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/include.rst new file mode 100644 index 000000000..33bd56d11 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/include.rst @@ -0,0 +1,80 @@ +``include`` +=========== + +.. versionadded:: 1.12 + The ``include`` function was added in Twig 1.12. + +The ``include`` function returns the rendered content of a template: + +.. code-block:: jinja + + {{ include('template.html') }} + {{ include(some_var) }} + +Included templates have access to the variables of the active context. + +If you are using the filesystem loader, the templates are looked for in the +paths defined by it. + +The context is passed by default to the template but you can also pass +additional variables: + +.. code-block:: jinja + + {# template.html will have access to the variables from the current context and the additional ones provided #} + {{ include('template.html', {foo: 'bar'}) }} + +You can disable access to the context by setting ``with_context`` to +``false``: + +.. code-block:: jinja + + {# only the foo variable will be accessible #} + {{ include('template.html', {foo: 'bar'}, with_context = false) }} + +.. code-block:: jinja + + {# no variables will be accessible #} + {{ include('template.html', with_context = false) }} + +And if the expression evaluates to a ``Twig_Template`` object, Twig will use it +directly:: + + // {{ include(template) }} + + $template = $twig->loadTemplate('some_template.twig'); + + $twig->loadTemplate('template.twig')->display(array('template' => $template)); + +When you set the ``ignore_missing`` flag, Twig will return an empty string if +the template does not exist: + +.. code-block:: jinja + + {{ include('sidebar.html', ignore_missing = true) }} + +You can also provide a list of templates that are checked for existence before +inclusion. The first template that exists will be rendered: + +.. code-block:: jinja + + {{ include(['page_detailed.html', 'page.html']) }} + +If ``ignore_missing`` is set, it will fall back to rendering nothing if none +of the templates exist, otherwise it will throw an exception. + +When including a template created by an end user, you should consider +sandboxing it: + +.. code-block:: jinja + + {{ include('page.html', sandboxed = true) }} + +Arguments +--------- + +* ``template``: The template to render +* ``variables``: The variables to pass to the template +* ``with_context``: Whether to pass the current context variables or not +* ``ignore_missing``: Whether to ignore missing templates or not +* ``sandboxed``: Whether to sandbox the template or not diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/index.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/index.rst new file mode 100644 index 000000000..07214a76c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/index.rst @@ -0,0 +1,20 @@ +Functions +========= + +.. toctree:: + :maxdepth: 1 + + attribute + block + constant + cycle + date + dump + include + max + min + parent + random + range + source + template_from_string diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/max.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/max.rst new file mode 100644 index 000000000..6f3cfc535 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/max.rst @@ -0,0 +1,20 @@ +``max`` +======= + +.. versionadded:: 1.15 + The ``max`` function was added in Twig 1.15. + +``max`` returns the biggest value of a sequence or a set of values: + +.. code-block:: jinja + + {{ max(1, 3, 2) }} + {{ max([1, 3, 2]) }} + +When called with a mapping, max ignores keys and only compares values: + +.. code-block:: jinja + + {{ max({2: "e", 1: "a", 3: "b", 5: "d", 4: "c"}) }} + {# returns "e" #} + diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/min.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/min.rst new file mode 100644 index 000000000..7b6a65e10 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/min.rst @@ -0,0 +1,20 @@ +``min`` +======= + +.. versionadded:: 1.15 + The ``min`` function was added in Twig 1.15. + +``min`` returns the lowest value of a sequence or a set of values: + +.. code-block:: jinja + + {{ min(1, 3, 2) }} + {{ min([1, 3, 2]) }} + +When called with a mapping, min ignores keys and only compares values: + +.. code-block:: jinja + + {{ min({2: "e", 3: "a", 1: "b", 5: "d", 4: "c"}) }} + {# returns "a" #} + diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/parent.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/parent.rst new file mode 100644 index 000000000..f5bd20010 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/parent.rst @@ -0,0 +1,20 @@ +``parent`` +========== + +When a template uses inheritance, it's possible to render the contents of the +parent block when overriding a block by using the ``parent`` function: + +.. code-block:: jinja + + {% extends "base.html" %} + + {% block sidebar %} +

Table Of Contents

+ ... + {{ parent() }} + {% endblock %} + +The ``parent()`` call will return the content of the ``sidebar`` block as +defined in the ``base.html`` template. + +.. seealso:: :doc:`extends<../tags/extends>`, :doc:`block<../functions/block>`, :doc:`block<../tags/block>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/random.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/random.rst new file mode 100644 index 000000000..168e74f8f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/random.rst @@ -0,0 +1,29 @@ +``random`` +========== + +.. versionadded:: 1.5 + The ``random`` function was added in Twig 1.5. + +.. versionadded:: 1.6 + String and integer handling was added in Twig 1.6. + +The ``random`` function returns a random value depending on the supplied +parameter type: + +* a random item from a sequence; +* a random character from a string; +* a random integer between 0 and the integer parameter (inclusive). + +.. code-block:: jinja + + {{ random(['apple', 'orange', 'citrus']) }} {# example output: orange #} + {{ random('ABC') }} {# example output: C #} + {{ random() }} {# example output: 15386094 (works as the native PHP mt_rand function) #} + {{ random(5) }} {# example output: 3 #} + +Arguments +--------- + +* ``values``: The values + +.. _`mt_rand`: http://php.net/mt_rand diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/range.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/range.rst new file mode 100644 index 000000000..b7cd01116 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/range.rst @@ -0,0 +1,45 @@ +``range`` +========= + +Returns a list containing an arithmetic progression of integers: + +.. code-block:: jinja + + {% for i in range(0, 3) %} + {{ i }}, + {% endfor %} + + {# outputs 0, 1, 2, 3, #} + +When step is given (as the third parameter), it specifies the increment (or +decrement): + +.. code-block:: jinja + + {% for i in range(0, 6, 2) %} + {{ i }}, + {% endfor %} + + {# outputs 0, 2, 4, 6, #} + +The Twig built-in ``..`` operator is just syntactic sugar for the ``range`` +function (with a step of 1): + +.. code-block:: jinja + + {% for i in 0..3 %} + {{ i }}, + {% endfor %} + +.. tip:: + + The ``range`` function works as the native PHP `range`_ function. + +Arguments +--------- + +* ``low``: The first value of the sequence. +* ``high``: The highest possible value of the sequence. +* ``step``: The increment between elements of the sequence. + +.. _`range`: http://php.net/range diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/source.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/source.rst new file mode 100644 index 000000000..3c921b1cf --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/source.rst @@ -0,0 +1,32 @@ +``source`` +========== + +.. versionadded:: 1.15 + The ``source`` function was added in Twig 1.15. + +.. versionadded:: 1.18.3 + The ``ignore_missing`` flag was added in Twig 1.18.3. + +The ``source`` function returns the content of a template without rendering it: + +.. code-block:: jinja + + {{ source('template.html') }} + {{ source(some_var) }} + +When you set the ``ignore_missing`` flag, Twig will return an empty string if +the template does not exist: + +.. code-block:: jinja + + {{ source('template.html', ignore_missing = true) }} + +The function uses the same template loaders as the ones used to include +templates. So, if you are using the filesystem loader, the templates are looked +for in the paths defined by it. + +Arguments +--------- + +* ``name``: The name of the template to read +* ``ignore_missing``: Whether to ignore missing templates or not diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/functions/template_from_string.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/template_from_string.rst new file mode 100644 index 000000000..ce6a60dc0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/functions/template_from_string.rst @@ -0,0 +1,32 @@ +``template_from_string`` +======================== + +.. versionadded:: 1.11 + The ``template_from_string`` function was added in Twig 1.11. + +The ``template_from_string`` function loads a template from a string: + +.. code-block:: jinja + + {{ include(template_from_string("Hello {{ name }}")) }} + {{ include(template_from_string(page.template)) }} + +.. note:: + + The ``template_from_string`` function is not available by default. You + must add the ``Twig_Extension_StringLoader`` extension explicitly when + creating your Twig environment:: + + $twig = new Twig_Environment(...); + $twig->addExtension(new Twig_Extension_StringLoader()); + +.. note:: + + Even if you will probably always use the ``template_from_string`` function + with the ``include`` function, you can use it with any tag or function that + takes a template as an argument (like the ``embed`` or ``extends`` tags). + +Arguments +--------- + +* ``template``: The template diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/index.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/index.rst new file mode 100644 index 000000000..358bd738e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/index.rst @@ -0,0 +1,19 @@ +Twig +==== + +.. toctree:: + :maxdepth: 2 + + intro + installation + templates + api + advanced + internals + deprecated + recipes + coding_standards + tags/index + filters/index + functions/index + tests/index diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/installation.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/installation.rst new file mode 100644 index 000000000..afdcf1659 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/installation.rst @@ -0,0 +1,116 @@ +Installation +============ + +You have multiple ways to install Twig. + +Installing the Twig PHP package +------------------------------- + +Installing via Composer (recommended) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Install `Composer`_ and run the following command to get the latest version: + +.. code-block:: bash + + composer require twig/twig:~1.0 + +Installing from the tarball release +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1. Download the most recent tarball from the `download page`_ +2. Verify the integrity of the tarball http://fabien.potencier.org/article/73/signing-project-releases +3. Unpack the tarball +4. Move the files somewhere in your project + +Installing the development version +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: bash + + git clone git://github.com/twigphp/Twig.git + +Installing the PEAR package +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + + Using PEAR for installing Twig is deprecated and Twig 1.15.1 was the last + version published on the PEAR channel; use Composer instead. + +.. code-block:: bash + + pear channel-discover pear.twig-project.org + pear install twig/Twig + +Installing the C extension +-------------------------- + +.. versionadded:: 1.4 + The C extension was added in Twig 1.4. + +.. note:: + + The C extension is **optional** but it brings some nice performance + improvements. Note that the extension is not a replacement for the PHP + code; it only implements a small part of the PHP code to improve the + performance at runtime; you must still install the regular PHP code. + +Twig comes with a C extension that enhances the performance of the Twig +runtime engine; install it like any other PHP extensions: + +.. code-block:: bash + + cd ext/twig + phpize + ./configure + make + make install + +.. note:: + + You can also install the C extension via PEAR (note that this method is + deprecated and newer versions of Twig are not available on the PEAR + channel): + + .. code-block:: bash + + pear channel-discover pear.twig-project.org + pear install twig/CTwig + +For Windows: + +1. Setup the build environment following the `PHP documentation`_ +2. Put Twig's C extension source code into ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\ext\twig`` +3. Use the ``configure --disable-all --enable-cli --enable-twig=shared`` command instead of step 14 +4. ``nmake`` +5. Copy the ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\Release_TS\php_twig.dll`` file to your PHP setup. + +.. tip:: + + For Windows ZendServer, ZTS is not enabled as mentioned in `Zend Server + FAQ`_. + + You have to use ``configure --disable-all --disable-zts --enable-cli + --enable-twig=shared`` to be able to build the twig C extension for + ZendServer. + + The built DLL will be available in + ``C:\\php-sdk\\phpdev\\vcXX\\x86\\php-source-directory\\Release`` + +Finally, enable the extension in your ``php.ini`` configuration file: + +.. code-block:: ini + + extension=twig.so #For Unix systems + extension=php_twig.dll #For Windows systems + +And from now on, Twig will automatically compile your templates to take +advantage of the C extension. Note that this extension does not replace the +PHP code but only provides an optimized version of the +``Twig_Template::getAttribute()`` method. + +.. _`download page`: https://github.com/twigphp/Twig/tags +.. _`Composer`: https://getcomposer.org/download/ +.. _`PHP documentation`: https://wiki.php.net/internals/windows/stepbystepbuild +.. _`Zend Server FAQ`: http://www.zend.com/en/products/server/faq#faqD6 diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/internals.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/internals.rst new file mode 100644 index 000000000..ef1174dd9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/internals.rst @@ -0,0 +1,138 @@ +Twig Internals +============== + +Twig is very extensible and you can easily hack it. Keep in mind that you +should probably try to create an extension before hacking the core, as most +features and enhancements can be handled with extensions. This chapter is also +useful for people who want to understand how Twig works under the hood. + +How does Twig work? +------------------- + +The rendering of a Twig template can be summarized into four key steps: + +* **Load** the template: If the template is already compiled, load it and go + to the *evaluation* step, otherwise: + + * First, the **lexer** tokenizes the template source code into small pieces + for easier processing; + * Then, the **parser** converts the token stream into a meaningful tree + of nodes (the Abstract Syntax Tree); + * Eventually, the *compiler* transforms the AST into PHP code. + +* **Evaluate** the template: It basically means calling the ``display()`` + method of the compiled template and passing it the context. + +The Lexer +--------- + +The lexer tokenizes a template source code into a token stream (each token is +an instance of ``Twig_Token``, and the stream is an instance of +``Twig_TokenStream``). The default lexer recognizes 13 different token types: + +* ``Twig_Token::BLOCK_START_TYPE``, ``Twig_Token::BLOCK_END_TYPE``: Delimiters for blocks (``{% %}``) +* ``Twig_Token::VAR_START_TYPE``, ``Twig_Token::VAR_END_TYPE``: Delimiters for variables (``{{ }}``) +* ``Twig_Token::TEXT_TYPE``: A text outside an expression; +* ``Twig_Token::NAME_TYPE``: A name in an expression; +* ``Twig_Token::NUMBER_TYPE``: A number in an expression; +* ``Twig_Token::STRING_TYPE``: A string in an expression; +* ``Twig_Token::OPERATOR_TYPE``: An operator; +* ``Twig_Token::PUNCTUATION_TYPE``: A punctuation sign; +* ``Twig_Token::INTERPOLATION_START_TYPE``, ``Twig_Token::INTERPOLATION_END_TYPE`` (as of Twig 1.5): Delimiters for string interpolation; +* ``Twig_Token::EOF_TYPE``: Ends of template. + +You can manually convert a source code into a token stream by calling the +``tokenize()`` method of an environment:: + + $stream = $twig->tokenize($source, $identifier); + +As the stream has a ``__toString()`` method, you can have a textual +representation of it by echoing the object:: + + echo $stream."\n"; + +Here is the output for the ``Hello {{ name }}`` template: + +.. code-block:: text + + TEXT_TYPE(Hello ) + VAR_START_TYPE() + NAME_TYPE(name) + VAR_END_TYPE() + EOF_TYPE() + +.. note:: + + The default lexer (``Twig_Lexer``) can be changed by calling + the ``setLexer()`` method:: + + $twig->setLexer($lexer); + +The Parser +---------- + +The parser converts the token stream into an AST (Abstract Syntax Tree), or a +node tree (an instance of ``Twig_Node_Module``). The core extension defines +the basic nodes like: ``for``, ``if``, ... and the expression nodes. + +You can manually convert a token stream into a node tree by calling the +``parse()`` method of an environment:: + + $nodes = $twig->parse($stream); + +Echoing the node object gives you a nice representation of the tree:: + + echo $nodes."\n"; + +Here is the output for the ``Hello {{ name }}`` template: + +.. code-block:: text + + Twig_Node_Module( + Twig_Node_Text(Hello ) + Twig_Node_Print( + Twig_Node_Expression_Name(name) + ) + ) + +.. note:: + + The default parser (``Twig_TokenParser``) can be changed by calling the + ``setParser()`` method:: + + $twig->setParser($parser); + +The Compiler +------------ + +The last step is done by the compiler. It takes a node tree as an input and +generates PHP code usable for runtime execution of the template. + +You can manually compile a node tree to PHP code with the ``compile()`` method +of an environment:: + + $php = $twig->compile($nodes); + +The generated template for a ``Hello {{ name }}`` template reads as follows +(the actual output can differ depending on the version of Twig you are +using):: + + /* Hello {{ name }} */ + class __TwigTemplate_1121b6f109fe93ebe8c6e22e3712bceb extends Twig_Template + { + protected function doDisplay(array $context, array $blocks = array()) + { + // line 1 + echo "Hello "; + echo twig_escape_filter($this->env, isset($context["name"]) ? $context["name"] : null), "html", null, true); + } + + // some more code + } + +.. note:: + + The default compiler (``Twig_Compiler``) can be changed by calling the + ``setCompiler()`` method:: + + $twig->setCompiler($compiler); diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/intro.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/intro.rst new file mode 100644 index 000000000..352286927 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/intro.rst @@ -0,0 +1,85 @@ +Introduction +============ + +This is the documentation for Twig, the flexible, fast, and secure template +engine for PHP. + +If you have any exposure to other text-based template languages, such as +Smarty, Django, or Jinja, you should feel right at home with Twig. It's both +designer and developer friendly by sticking to PHP's principles and adding +functionality useful for templating environments. + +The key-features are... + +* *Fast*: Twig compiles templates down to plain optimized PHP code. The + overhead compared to regular PHP code was reduced to the very minimum. + +* *Secure*: Twig has a sandbox mode to evaluate untrusted template code. This + allows Twig to be used as a template language for applications where users + may modify the template design. + +* *Flexible*: Twig is powered by a flexible lexer and parser. This allows the + developer to define their own custom tags and filters, and to create their own DSL. + +Twig is used by many Open-Source projects like Symfony, Drupal8, eZPublish, +phpBB, Piwik, OroCRM; and many frameworks have support for it as well like +Slim, Yii, Laravel, Codeigniter and Kohana — just to name a few. + +Prerequisites +------------- + +Twig needs at least **PHP 5.2.7** to run. + +Installation +------------ + +The recommended way to install Twig is via Composer: + +.. code-block:: bash + + composer require "twig/twig:~1.0" + +.. note:: + + To learn more about the other installation methods, read the + :doc:`installation` chapter; it also explains how to install + the Twig C extension. + +Basic API Usage +--------------- + +This section gives you a brief introduction to the PHP API for Twig. + +.. code-block:: php + + require_once '/path/to/vendor/autoload.php'; + + $loader = new Twig_Loader_Array(array( + 'index' => 'Hello {{ name }}!', + )); + $twig = new Twig_Environment($loader); + + echo $twig->render('index', array('name' => 'Fabien')); + +Twig uses a loader (``Twig_Loader_Array``) to locate templates, and an +environment (``Twig_Environment``) to store the configuration. + +The ``render()`` method loads the template passed as a first argument and +renders it with the variables passed as a second argument. + +As templates are generally stored on the filesystem, Twig also comes with a +filesystem loader:: + + $loader = new Twig_Loader_Filesystem('/path/to/templates'); + $twig = new Twig_Environment($loader, array( + 'cache' => '/path/to/compilation_cache', + )); + + echo $twig->render('index.html', array('name' => 'Fabien')); + +.. tip:: + + If you are not using Composer, use the Twig built-in autoloader:: + + require_once '/path/to/lib/Twig/Autoloader.php'; + Twig_Autoloader::register(); diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/recipes.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/recipes.rst new file mode 100644 index 000000000..fd39550e1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/recipes.rst @@ -0,0 +1,554 @@ +Recipes +======= + +.. _deprecation-notices: + +Displaying Deprecation Notices +------------------------------ + +.. versionadded:: 1.21 + This works as of Twig 1.21. + +Deprecated features generate deprecation notices (via a call to the +``trigger_error()`` PHP function). By default, they are silenced and never +displayed nor logged. + +To easily remove all deprecated feature usages from your templates, write and +run a script along the lines of the following:: + + require_once __DIR__.'/vendor/autoload.php'; + + $twig = create_your_twig_env(); + + $deprecations = new Twig_Util_DeprecationCollector($twig); + + print_r($deprecations->collectDir(__DIR__.'/templates')); + +The ``collectDir()`` method compiles all templates found in a directory, +catches deprecation notices, and return them. + +.. tip:: + + If your templates are not stored on the filesystem, use the ``collect()`` + method instead which takes an ``Iterator``; the iterator must return + template names as keys and template contents as values (as done by + ``Twig_Util_TemplateDirIterator``). + +However, this code won't find all deprecations (like using deprecated some Twig +classes). To catch all notices, register a custom error handler like the one +below:: + + $deprecations = array(); + set_error_handler(function ($type, $msg) use (&$deprecations) { + if (E_USER_DEPRECATED === $type) { + $deprecations[] = $msg; + } + }); + + // run your application + + print_r($deprecations); + +Note that most deprecation notices are triggered during **compilation**, so +they won't be generated when templates are already cached. + +.. tip:: + + If you want to manage the deprecation notices from your PHPUnit tests, have + a look at the `symfony/phpunit-bridge + `_ package, which eases the + process a lot. + +Making a Layout conditional +--------------------------- + +Working with Ajax means that the same content is sometimes displayed as is, +and sometimes decorated with a layout. As Twig layout template names can be +any valid expression, you can pass a variable that evaluates to ``true`` when +the request is made via Ajax and choose the layout accordingly: + +.. code-block:: jinja + + {% extends request.ajax ? "base_ajax.html" : "base.html" %} + + {% block content %} + This is the content to be displayed. + {% endblock %} + +Making an Include dynamic +------------------------- + +When including a template, its name does not need to be a string. For +instance, the name can depend on the value of a variable: + +.. code-block:: jinja + + {% include var ~ '_foo.html' %} + +If ``var`` evaluates to ``index``, the ``index_foo.html`` template will be +rendered. + +As a matter of fact, the template name can be any valid expression, such as +the following: + +.. code-block:: jinja + + {% include var|default('index') ~ '_foo.html' %} + +Overriding a Template that also extends itself +---------------------------------------------- + +A template can be customized in two different ways: + +* *Inheritance*: A template *extends* a parent template and overrides some + blocks; + +* *Replacement*: If you use the filesystem loader, Twig loads the first + template it finds in a list of configured directories; a template found in a + directory *replaces* another one from a directory further in the list. + +But how do you combine both: *replace* a template that also extends itself +(aka a template in a directory further in the list)? + +Let's say that your templates are loaded from both ``.../templates/mysite`` +and ``.../templates/default`` in this order. The ``page.twig`` template, +stored in ``.../templates/default`` reads as follows: + +.. code-block:: jinja + + {# page.twig #} + {% extends "layout.twig" %} + + {% block content %} + {% endblock %} + +You can replace this template by putting a file with the same name in +``.../templates/mysite``. And if you want to extend the original template, you +might be tempted to write the following: + +.. code-block:: jinja + + {# page.twig in .../templates/mysite #} + {% extends "page.twig" %} {# from .../templates/default #} + +Of course, this will not work as Twig will always load the template from +``.../templates/mysite``. + +It turns out it is possible to get this to work, by adding a directory right +at the end of your template directories, which is the parent of all of the +other directories: ``.../templates`` in our case. This has the effect of +making every template file within our system uniquely addressable. Most of the +time you will use the "normal" paths, but in the special case of wanting to +extend a template with an overriding version of itself we can reference its +parent's full, unambiguous template path in the extends tag: + +.. code-block:: jinja + + {# page.twig in .../templates/mysite #} + {% extends "default/page.twig" %} {# from .../templates #} + +.. note:: + + This recipe was inspired by the following Django wiki page: + http://code.djangoproject.com/wiki/ExtendingTemplates + +Customizing the Syntax +---------------------- + +Twig allows some syntax customization for the block delimiters. It's not +recommended to use this feature as templates will be tied with your custom +syntax. But for specific projects, it can make sense to change the defaults. + +To change the block delimiters, you need to create your own lexer object:: + + $twig = new Twig_Environment(); + + $lexer = new Twig_Lexer($twig, array( + 'tag_comment' => array('{#', '#}'), + 'tag_block' => array('{%', '%}'), + 'tag_variable' => array('{{', '}}'), + 'interpolation' => array('#{', '}'), + )); + $twig->setLexer($lexer); + +Here are some configuration example that simulates some other template engines +syntax:: + + // Ruby erb syntax + $lexer = new Twig_Lexer($twig, array( + 'tag_comment' => array('<%#', '%>'), + 'tag_block' => array('<%', '%>'), + 'tag_variable' => array('<%=', '%>'), + )); + + // SGML Comment Syntax + $lexer = new Twig_Lexer($twig, array( + 'tag_comment' => array(''), + 'tag_block' => array(''), + 'tag_variable' => array('${', '}'), + )); + + // Smarty like + $lexer = new Twig_Lexer($twig, array( + 'tag_comment' => array('{*', '*}'), + 'tag_block' => array('{', '}'), + 'tag_variable' => array('{$', '}'), + )); + +Using dynamic Object Properties +------------------------------- + +When Twig encounters a variable like ``article.title``, it tries to find a +``title`` public property in the ``article`` object. + +It also works if the property does not exist but is rather defined dynamically +thanks to the magic ``__get()`` method; you just need to also implement the +``__isset()`` magic method like shown in the following snippet of code:: + + class Article + { + public function __get($name) + { + if ('title' == $name) { + return 'The title'; + } + + // throw some kind of error + } + + public function __isset($name) + { + if ('title' == $name) { + return true; + } + + return false; + } + } + +Accessing the parent Context in Nested Loops +-------------------------------------------- + +Sometimes, when using nested loops, you need to access the parent context. The +parent context is always accessible via the ``loop.parent`` variable. For +instance, if you have the following template data:: + + $data = array( + 'topics' => array( + 'topic1' => array('Message 1 of topic 1', 'Message 2 of topic 1'), + 'topic2' => array('Message 1 of topic 2', 'Message 2 of topic 2'), + ), + ); + +And the following template to display all messages in all topics: + +.. code-block:: jinja + + {% for topic, messages in topics %} + * {{ loop.index }}: {{ topic }} + {% for message in messages %} + - {{ loop.parent.loop.index }}.{{ loop.index }}: {{ message }} + {% endfor %} + {% endfor %} + +The output will be similar to: + +.. code-block:: text + + * 1: topic1 + - 1.1: The message 1 of topic 1 + - 1.2: The message 2 of topic 1 + * 2: topic2 + - 2.1: The message 1 of topic 2 + - 2.2: The message 2 of topic 2 + +In the inner loop, the ``loop.parent`` variable is used to access the outer +context. So, the index of the current ``topic`` defined in the outer for loop +is accessible via the ``loop.parent.loop.index`` variable. + +Defining undefined Functions and Filters on the Fly +--------------------------------------------------- + +When a function (or a filter) is not defined, Twig defaults to throw a +``Twig_Error_Syntax`` exception. However, it can also call a `callback`_ (any +valid PHP callable) which should return a function (or a filter). + +For filters, register callbacks with ``registerUndefinedFilterCallback()``. +For functions, use ``registerUndefinedFunctionCallback()``:: + + // auto-register all native PHP functions as Twig functions + // don't try this at home as it's not secure at all! + $twig->registerUndefinedFunctionCallback(function ($name) { + if (function_exists($name)) { + return new Twig_SimpleFunction($name, $name); + } + + return false; + }); + +If the callable is not able to return a valid function (or filter), it must +return ``false``. + +If you register more than one callback, Twig will call them in turn until one +does not return ``false``. + +.. tip:: + + As the resolution of functions and filters is done during compilation, + there is no overhead when registering these callbacks. + +Validating the Template Syntax +------------------------------ + +When template code is provided by a third-party (through a web interface for +instance), it might be interesting to validate the template syntax before +saving it. If the template code is stored in a `$template` variable, here is +how you can do it:: + + try { + $twig->parse($twig->tokenize($template)); + + // the $template is valid + } catch (Twig_Error_Syntax $e) { + // $template contains one or more syntax errors + } + +If you iterate over a set of files, you can pass the filename to the +``tokenize()`` method to get the filename in the exception message:: + + foreach ($files as $file) { + try { + $twig->parse($twig->tokenize($template, $file)); + + // the $template is valid + } catch (Twig_Error_Syntax $e) { + // $template contains one or more syntax errors + } + } + +.. note:: + + This method won't catch any sandbox policy violations because the policy + is enforced during template rendering (as Twig needs the context for some + checks like allowed methods on objects). + +Refreshing modified Templates when OPcache or APC is enabled +------------------------------------------------------------ + +When using OPcache with ``opcache.validate_timestamps`` set to ``0`` or APC +with ``apc.stat`` set to ``0`` and Twig cache enabled, clearing the template +cache won't update the cache. + +To get around this, force Twig to invalidate the bytecode cache:: + + $twig = new Twig_Environment($loader, array( + 'cache' => new Twig_Cache_Filesystem('/some/cache/path', Twig_Cache_Filesystem::FORCE_BYTECODE_INVALIDATION), + // ... + )); + +.. note:: + + Before Twig 1.22, you should extend ``Twig_Environment`` instead:: + + class OpCacheAwareTwigEnvironment extends Twig_Environment + { + protected function writeCacheFile($file, $content) + { + parent::writeCacheFile($file, $content); + + // Compile cached file into bytecode cache + if (function_exists('opcache_invalidate')) { + opcache_invalidate($file, true); + } elseif (function_exists('apc_compile_file')) { + apc_compile_file($file); + } + } + } + +Reusing a stateful Node Visitor +------------------------------- + +When attaching a visitor to a ``Twig_Environment`` instance, Twig uses it to +visit *all* templates it compiles. If you need to keep some state information +around, you probably want to reset it when visiting a new template. + +This can be easily achieved with the following code:: + + protected $someTemplateState = array(); + + public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Module) { + // reset the state as we are entering a new template + $this->someTemplateState = array(); + } + + // ... + + return $node; + } + +Using a Database to store Templates +----------------------------------- + +If you are developing a CMS, templates are usually stored in a database. This +recipe gives you a simple PDO template loader you can use as a starting point +for your own. + +First, let's create a temporary in-memory SQLite3 database to work with:: + + $dbh = new PDO('sqlite::memory:'); + $dbh->exec('CREATE TABLE templates (name STRING, source STRING, last_modified INTEGER)'); + $base = '{% block content %}{% endblock %}'; + $index = ' + {% extends "base.twig" %} + {% block content %}Hello {{ name }}{% endblock %} + '; + $now = time(); + $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('base.twig', '$base', $now)"); + $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('index.twig', '$index', $now)"); + +We have created a simple ``templates`` table that hosts two templates: +``base.twig`` and ``index.twig``. + +Now, let's define a loader able to use this database:: + + class DatabaseTwigLoader implements Twig_LoaderInterface, Twig_ExistsLoaderInterface + { + protected $dbh; + + public function __construct(PDO $dbh) + { + $this->dbh = $dbh; + } + + public function getSource($name) + { + if (false === $source = $this->getValue('source', $name)) { + throw new Twig_Error_Loader(sprintf('Template "%s" does not exist.', $name)); + } + + return $source; + } + + // Twig_ExistsLoaderInterface as of Twig 1.11 + public function exists($name) + { + return $name === $this->getValue('name', $name); + } + + public function getCacheKey($name) + { + return $name; + } + + public function isFresh($name, $time) + { + if (false === $lastModified = $this->getValue('last_modified', $name)) { + return false; + } + + return $lastModified <= $time; + } + + protected function getValue($column, $name) + { + $sth = $this->dbh->prepare('SELECT '.$column.' FROM templates WHERE name = :name'); + $sth->execute(array(':name' => (string) $name)); + + return $sth->fetchColumn(); + } + } + +Finally, here is an example on how you can use it:: + + $loader = new DatabaseTwigLoader($dbh); + $twig = new Twig_Environment($loader); + + echo $twig->render('index.twig', array('name' => 'Fabien')); + +Using different Template Sources +-------------------------------- + +This recipe is the continuation of the previous one. Even if you store the +contributed templates in a database, you might want to keep the original/base +templates on the filesystem. When templates can be loaded from different +sources, you need to use the ``Twig_Loader_Chain`` loader. + +As you can see in the previous recipe, we reference the template in the exact +same way as we would have done it with a regular filesystem loader. This is +the key to be able to mix and match templates coming from the database, the +filesystem, or any other loader for that matter: the template name should be a +logical name, and not the path from the filesystem:: + + $loader1 = new DatabaseTwigLoader($dbh); + $loader2 = new Twig_Loader_Array(array( + 'base.twig' => '{% block content %}{% endblock %}', + )); + $loader = new Twig_Loader_Chain(array($loader1, $loader2)); + + $twig = new Twig_Environment($loader); + + echo $twig->render('index.twig', array('name' => 'Fabien')); + +Now that the ``base.twig`` templates is defined in an array loader, you can +remove it from the database, and everything else will still work as before. + +Loading a Template from a String +-------------------------------- + +From a template, you can easily load a template stored in a string via the +``template_from_string`` function (available as of Twig 1.11 via the +``Twig_Extension_StringLoader`` extension): + +.. code-block:: jinja + + {{ include(template_from_string("Hello {{ name }}")) }} + +From PHP, it's also possible to load a template stored in a string via +``Twig_Environment::createTemplate()`` (available as of Twig 1.18):: + + $template = $twig->createTemplate('hello {{ name }}'); + echo $template->render(array('name' => 'Fabien')); + +.. note:: + + Never use the ``Twig_Loader_String`` loader, which has severe limitations. + +Using Twig and AngularJS in the same Templates +---------------------------------------------- + +Mixing different template syntaxes in the same file is not a recommended +practice as both AngularJS and Twig use the same delimiters in their syntax: +``{{`` and ``}}``. + +Still, if you want to use AngularJS and Twig in the same template, there are +two ways to make it work depending on the amount of AngularJS you need to +include in your templates: + +* Escaping the AngularJS delimiters by wrapping AngularJS sections with the + ``{% verbatim %}`` tag or by escaping each delimiter via ``{{ '{{' }}`` and + ``{{ '}}' }}``; + +* Changing the delimiters of one of the template engines (depending on which + engine you introduced last): + + * For AngularJS, change the interpolation tags using the + ``interpolateProvider`` service, for instance at the module initialization + time: + + ```js + angular.module('myApp', []).config(function($interpolateProvider) { + $interpolateProvider.startSymbol('{[').endSymbol(']}'); + }); + ``` + + * For Twig, change the delimiters via the ``tag_variable`` Lexer option: + + ```php + $env->setLexer(new Twig_Lexer($env, array( + 'tag_variable' => array('{[', ']}'), + ))); + ``` + +.. _callback: http://www.php.net/manual/en/function.is-callable.php diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/autoescape.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/autoescape.rst new file mode 100644 index 000000000..4208d1a31 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/autoescape.rst @@ -0,0 +1,83 @@ +``autoescape`` +============== + +Whether automatic escaping is enabled or not, you can mark a section of a +template to be escaped or not by using the ``autoescape`` tag: + +.. code-block:: jinja + + {# The following syntax works as of Twig 1.8 -- see the note below for previous versions #} + + {% autoescape %} + Everything will be automatically escaped in this block + using the HTML strategy + {% endautoescape %} + + {% autoescape 'html' %} + Everything will be automatically escaped in this block + using the HTML strategy + {% endautoescape %} + + {% autoescape 'js' %} + Everything will be automatically escaped in this block + using the js escaping strategy + {% endautoescape %} + + {% autoescape false %} + Everything will be outputted as is in this block + {% endautoescape %} + +.. note:: + + Before Twig 1.8, the syntax was different: + + .. code-block:: jinja + + {% autoescape true %} + Everything will be automatically escaped in this block + using the HTML strategy + {% endautoescape %} + + {% autoescape false %} + Everything will be outputted as is in this block + {% endautoescape %} + + {% autoescape true js %} + Everything will be automatically escaped in this block + using the js escaping strategy + {% endautoescape %} + +When automatic escaping is enabled everything is escaped by default except for +values explicitly marked as safe. Those can be marked in the template by using +the :doc:`raw<../filters/raw>` filter: + +.. code-block:: jinja + + {% autoescape %} + {{ safe_value|raw }} + {% endautoescape %} + +Functions returning template data (like :doc:`macros` and +:doc:`parent<../functions/parent>`) always return safe markup. + +.. note:: + + Twig is smart enough to not escape an already escaped value by the + :doc:`escape<../filters/escape>` filter. + +.. note:: + + Twig does not escape static expressions: + + .. code-block:: jinja + + {% set hello = "Hello" %} + {{ hello }} + {{ "world" }} + + Will be rendered "Hello **world**". + +.. note:: + + The chapter :doc:`Twig for Developers<../api>` gives more information + about when and how automatic escaping is applied. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/block.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/block.rst new file mode 100644 index 000000000..e38048232 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/block.rst @@ -0,0 +1,11 @@ +``block`` +========= + +Blocks are used for inheritance and act as placeholders and replacements at +the same time. They are documented in detail in the documentation for the +:doc:`extends<../tags/extends>` tag. + +Block names should consist of alphanumeric characters, and underscores. Dashes +are not permitted. + +.. seealso:: :doc:`block<../functions/block>`, :doc:`parent<../functions/parent>`, :doc:`use<../tags/use>`, :doc:`extends<../tags/extends>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/do.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/do.rst new file mode 100644 index 000000000..1c344e302 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/do.rst @@ -0,0 +1,12 @@ +``do`` +====== + +.. versionadded:: 1.5 + The ``do`` tag was added in Twig 1.5. + +The ``do`` tag works exactly like the regular variable expression (``{{ ... +}}``) just that it doesn't print anything: + +.. code-block:: jinja + + {% do 1 + 2 %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/embed.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/embed.rst new file mode 100644 index 000000000..5a6a0299a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/embed.rst @@ -0,0 +1,178 @@ +``embed`` +========= + +.. versionadded:: 1.8 + The ``embed`` tag was added in Twig 1.8. + +The ``embed`` tag combines the behaviour of :doc:`include` and +:doc:`extends`. +It allows you to include another template's contents, just like ``include`` +does. But it also allows you to override any block defined inside the +included template, like when extending a template. + +Think of an embedded template as a "micro layout skeleton". + +.. code-block:: jinja + + {% embed "teasers_skeleton.twig" %} + {# These blocks are defined in "teasers_skeleton.twig" #} + {# and we override them right here: #} + {% block left_teaser %} + Some content for the left teaser box + {% endblock %} + {% block right_teaser %} + Some content for the right teaser box + {% endblock %} + {% endembed %} + +The ``embed`` tag takes the idea of template inheritance to the level of +content fragments. While template inheritance allows for "document skeletons", +which are filled with life by child templates, the ``embed`` tag allows you to +create "skeletons" for smaller units of content and re-use and fill them +anywhere you like. + +Since the use case may not be obvious, let's look at a simplified example. +Imagine a base template shared by multiple HTML pages, defining a single block +named "content": + +.. code-block:: text + + ┌─── page layout ─────────────────────┐ + │ │ + │ ┌── block "content" ──┐ │ + │ │ │ │ + │ │ │ │ + │ │ (child template to │ │ + │ │ put content here) │ │ + │ │ │ │ + │ │ │ │ + │ └─────────────────────┘ │ + │ │ + └─────────────────────────────────────┘ + +Some pages ("foo" and "bar") share the same content structure - +two vertically stacked boxes: + +.. code-block:: text + + ┌─── page layout ─────────────────────┐ + │ │ + │ ┌── block "content" ──┐ │ + │ │ ┌─ block "top" ───┐ │ │ + │ │ │ │ │ │ + │ │ └─────────────────┘ │ │ + │ │ ┌─ block "bottom" ┐ │ │ + │ │ │ │ │ │ + │ │ └─────────────────┘ │ │ + │ └─────────────────────┘ │ + │ │ + └─────────────────────────────────────┘ + +While other pages ("boom" and "baz") share a different content structure - +two boxes side by side: + +.. code-block:: text + + ┌─── page layout ─────────────────────┐ + │ │ + │ ┌── block "content" ──┐ │ + │ │ │ │ + │ │ ┌ block ┐ ┌ block ┐ │ │ + │ │ │"left" │ │"right"│ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ └───────┘ └───────┘ │ │ + │ └─────────────────────┘ │ + │ │ + └─────────────────────────────────────┘ + +Without the ``embed`` tag, you have two ways to design your templates: + + * Create two "intermediate" base templates that extend the master layout + template: one with vertically stacked boxes to be used by the "foo" and + "bar" pages and another one with side-by-side boxes for the "boom" and + "baz" pages. + + * Embed the markup for the top/bottom and left/right boxes into each page + template directly. + +These two solutions do not scale well because they each have a major drawback: + + * The first solution may indeed work for this simplified example. But imagine + we add a sidebar, which may again contain different, recurring structures + of content. Now we would need to create intermediate base templates for + all occurring combinations of content structure and sidebar structure... + and so on. + + * The second solution involves duplication of common code with all its negative + consequences: any change involves finding and editing all affected copies + of the structure, correctness has to be verified for each copy, copies may + go out of sync by careless modifications etc. + +In such a situation, the ``embed`` tag comes in handy. The common layout +code can live in a single base template, and the two different content structures, +let's call them "micro layouts" go into separate templates which are embedded +as necessary: + +Page template ``foo.twig``: + +.. code-block:: jinja + + {% extends "layout_skeleton.twig" %} + + {% block content %} + {% embed "vertical_boxes_skeleton.twig" %} + {% block top %} + Some content for the top box + {% endblock %} + + {% block bottom %} + Some content for the bottom box + {% endblock %} + {% endembed %} + {% endblock %} + +And here is the code for ``vertical_boxes_skeleton.twig``: + +.. code-block:: html+jinja + +
+ {% block top %} + Top box default content + {% endblock %} +
+ +
+ {% block bottom %} + Bottom box default content + {% endblock %} +
+ +The goal of the ``vertical_boxes_skeleton.twig`` template being to factor +out the HTML markup for the boxes. + +The ``embed`` tag takes the exact same arguments as the ``include`` tag: + +.. code-block:: jinja + + {% embed "base" with {'foo': 'bar'} %} + ... + {% endembed %} + + {% embed "base" with {'foo': 'bar'} only %} + ... + {% endembed %} + + {% embed "base" ignore missing %} + ... + {% endembed %} + +.. warning:: + + As embedded templates do not have "names", auto-escaping strategies based + on the template "filename" won't work as expected if you change the + context (for instance, if you embed a CSS/JavaScript template into an HTML + one). In that case, explicitly set the default auto-escaping strategy with + the ``autoescape`` tag. + +.. seealso:: :doc:`include<../tags/include>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/extends.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/extends.rst new file mode 100644 index 000000000..a31df89df --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/extends.rst @@ -0,0 +1,268 @@ +``extends`` +=========== + +The ``extends`` tag can be used to extend a template from another one. + +.. note:: + + Like PHP, Twig does not support multiple inheritance. So you can only have + one extends tag called per rendering. However, Twig supports horizontal + :doc:`reuse`. + +Let's define a base template, ``base.html``, which defines a simple HTML +skeleton document: + +.. code-block:: html+jinja + + + + + {% block head %} + + {% block title %}{% endblock %} - My Webpage + {% endblock %} + + +
{% block content %}{% endblock %}
+ + + + +In this example, the :doc:`block` tags define four blocks that child +templates can fill in. + +All the ``block`` tag does is to tell the template engine that a child +template may override those portions of the template. + +Child Template +-------------- + +A child template might look like this: + +.. code-block:: jinja + + {% extends "base.html" %} + + {% block title %}Index{% endblock %} + {% block head %} + {{ parent() }} + + {% endblock %} + {% block content %} +

Index

+

+ Welcome on my awesome homepage. +

+ {% endblock %} + +The ``extends`` tag is the key here. It tells the template engine that this +template "extends" another template. When the template system evaluates this +template, first it locates the parent. The extends tag should be the first tag +in the template. + +Note that since the child template doesn't define the ``footer`` block, the +value from the parent template is used instead. + +You can't define multiple ``block`` tags with the same name in the same +template. This limitation exists because a block tag works in "both" +directions. That is, a block tag doesn't just provide a hole to fill - it also +defines the content that fills the hole in the *parent*. If there were two +similarly-named ``block`` tags in a template, that template's parent wouldn't +know which one of the blocks' content to use. + +If you want to print a block multiple times you can however use the +``block`` function: + +.. code-block:: jinja + + {% block title %}{% endblock %} +

{{ block('title') }}

+ {% block body %}{% endblock %} + +Parent Blocks +------------- + +It's possible to render the contents of the parent block by using the +:doc:`parent<../functions/parent>` function. This gives back the results of +the parent block: + +.. code-block:: jinja + + {% block sidebar %} +

Table Of Contents

+ ... + {{ parent() }} + {% endblock %} + +Named Block End-Tags +-------------------- + +Twig allows you to put the name of the block after the end tag for better +readability: + +.. code-block:: jinja + + {% block sidebar %} + {% block inner_sidebar %} + ... + {% endblock inner_sidebar %} + {% endblock sidebar %} + +Of course, the name after the ``endblock`` word must match the block name. + +Block Nesting and Scope +----------------------- + +Blocks can be nested for more complex layouts. Per default, blocks have access +to variables from outer scopes: + +.. code-block:: jinja + + {% for item in seq %} +
  • {% block loop_item %}{{ item }}{% endblock %}
  • + {% endfor %} + +Block Shortcuts +--------------- + +For blocks with little content, it's possible to use a shortcut syntax. The +following constructs do the same thing: + +.. code-block:: jinja + + {% block title %} + {{ page_title|title }} + {% endblock %} + +.. code-block:: jinja + + {% block title page_title|title %} + +Dynamic Inheritance +------------------- + +Twig supports dynamic inheritance by using a variable as the base template: + +.. code-block:: jinja + + {% extends some_var %} + +If the variable evaluates to a ``Twig_Template`` object, Twig will use it as +the parent template:: + + // {% extends layout %} + + $layout = $twig->loadTemplate('some_layout_template.twig'); + + $twig->display('template.twig', array('layout' => $layout)); + +.. versionadded:: 1.2 + The possibility to pass an array of templates has been added in Twig 1.2. + +You can also provide a list of templates that are checked for existence. The +first template that exists will be used as a parent: + +.. code-block:: jinja + + {% extends ['layout.html', 'base_layout.html'] %} + +Conditional Inheritance +----------------------- + +As the template name for the parent can be any valid Twig expression, it's +possible to make the inheritance mechanism conditional: + +.. code-block:: jinja + + {% extends standalone ? "minimum.html" : "base.html" %} + +In this example, the template will extend the "minimum.html" layout template +if the ``standalone`` variable evaluates to ``true``, and "base.html" +otherwise. + +How do blocks work? +------------------- + +A block provides a way to change how a certain part of a template is rendered +but it does not interfere in any way with the logic around it. + +Let's take the following example to illustrate how a block works and more +importantly, how it does not work: + +.. code-block:: jinja + + {# base.twig #} + + {% for post in posts %} + {% block post %} +

    {{ post.title }}

    +

    {{ post.body }}

    + {% endblock %} + {% endfor %} + +If you render this template, the result would be exactly the same with or +without the ``block`` tag. The ``block`` inside the ``for`` loop is just a way +to make it overridable by a child template: + +.. code-block:: jinja + + {# child.twig #} + + {% extends "base.twig" %} + + {% block post %} +
    +
    {{ post.title }}
    +
    {{ post.text }}
    +
    + {% endblock %} + +Now, when rendering the child template, the loop is going to use the block +defined in the child template instead of the one defined in the base one; the +executed template is then equivalent to the following one: + +.. code-block:: jinja + + {% for post in posts %} +
    +
    {{ post.title }}
    +
    {{ post.text }}
    +
    + {% endfor %} + +Let's take another example: a block included within an ``if`` statement: + +.. code-block:: jinja + + {% if posts is empty %} + {% block head %} + {{ parent() }} + + + {% endblock head %} + {% endif %} + +Contrary to what you might think, this template does not define a block +conditionally; it just makes overridable by a child template the output of +what will be rendered when the condition is ``true``. + +If you want the output to be displayed conditionally, use the following +instead: + +.. code-block:: jinja + + {% block head %} + {{ parent() }} + + {% if posts is empty %} + + {% endif %} + {% endblock head %} + +.. seealso:: :doc:`block<../functions/block>`, :doc:`block<../tags/block>`, :doc:`parent<../functions/parent>`, :doc:`use<../tags/use>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/filter.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/filter.rst new file mode 100644 index 000000000..82ca5c62f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/filter.rst @@ -0,0 +1,21 @@ +``filter`` +========== + +Filter sections allow you to apply regular Twig filters on a block of template +data. Just wrap the code in the special ``filter`` section: + +.. code-block:: jinja + + {% filter upper %} + This text becomes uppercase + {% endfilter %} + +You can also chain filters: + +.. code-block:: jinja + + {% filter lower|escape %} + SOME TEXT + {% endfilter %} + + {# outputs "<strong>some text</strong>" #} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/flush.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/flush.rst new file mode 100644 index 000000000..55ef593a9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/flush.rst @@ -0,0 +1,17 @@ +``flush`` +========= + +.. versionadded:: 1.5 + The flush tag was added in Twig 1.5. + +The ``flush`` tag tells Twig to flush the output buffer: + +.. code-block:: jinja + + {% flush %} + +.. note:: + + Internally, Twig uses the PHP `flush`_ function. + +.. _`flush`: http://php.net/flush diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/for.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/for.rst new file mode 100644 index 000000000..0673b5511 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/for.rst @@ -0,0 +1,172 @@ +``for`` +======= + +Loop over each item in a sequence. For example, to display a list of users +provided in a variable called ``users``: + +.. code-block:: jinja + +

    Members

    +
      + {% for user in users %} +
    • {{ user.username|e }}
    • + {% endfor %} +
    + +.. note:: + + A sequence can be either an array or an object implementing the + ``Traversable`` interface. + +If you do need to iterate over a sequence of numbers, you can use the ``..`` +operator: + +.. code-block:: jinja + + {% for i in 0..10 %} + * {{ i }} + {% endfor %} + +The above snippet of code would print all numbers from 0 to 10. + +It can be also useful with letters: + +.. code-block:: jinja + + {% for letter in 'a'..'z' %} + * {{ letter }} + {% endfor %} + +The ``..`` operator can take any expression at both sides: + +.. code-block:: jinja + + {% for letter in 'a'|upper..'z'|upper %} + * {{ letter }} + {% endfor %} + +.. tip: + + If you need a step different from 1, you can use the ``range`` function + instead. + +The `loop` variable +------------------- + +Inside of a ``for`` loop block you can access some special variables: + +===================== ============================================================= +Variable Description +===================== ============================================================= +``loop.index`` The current iteration of the loop. (1 indexed) +``loop.index0`` The current iteration of the loop. (0 indexed) +``loop.revindex`` The number of iterations from the end of the loop (1 indexed) +``loop.revindex0`` The number of iterations from the end of the loop (0 indexed) +``loop.first`` True if first iteration +``loop.last`` True if last iteration +``loop.length`` The number of items in the sequence +``loop.parent`` The parent context +===================== ============================================================= + +.. code-block:: jinja + + {% for user in users %} + {{ loop.index }} - {{ user.username }} + {% endfor %} + +.. note:: + + The ``loop.length``, ``loop.revindex``, ``loop.revindex0``, and + ``loop.last`` variables are only available for PHP arrays, or objects that + implement the ``Countable`` interface. They are also not available when + looping with a condition. + +.. versionadded:: 1.2 + The ``if`` modifier support has been added in Twig 1.2. + +Adding a condition +------------------ + +Unlike in PHP, it's not possible to ``break`` or ``continue`` in a loop. You +can however filter the sequence during iteration which allows you to skip +items. The following example skips all the users which are not active: + +.. code-block:: jinja + +
      + {% for user in users if user.active %} +
    • {{ user.username|e }}
    • + {% endfor %} +
    + +The advantage is that the special loop variable will count correctly thus not +counting the users not iterated over. Keep in mind that properties like +``loop.last`` will not be defined when using loop conditions. + +.. note:: + + Using the ``loop`` variable within the condition is not recommended as it + will probably not be doing what you expect it to. For instance, adding a + condition like ``loop.index > 4`` won't work as the index is only + incremented when the condition is true (so the condition will never + match). + +The `else` Clause +----------------- + +If no iteration took place because the sequence was empty, you can render a +replacement block by using ``else``: + +.. code-block:: jinja + +
      + {% for user in users %} +
    • {{ user.username|e }}
    • + {% else %} +
    • no user found
    • + {% endfor %} +
    + +Iterating over Keys +------------------- + +By default, a loop iterates over the values of the sequence. You can iterate +on keys by using the ``keys`` filter: + +.. code-block:: jinja + +

    Members

    +
      + {% for key in users|keys %} +
    • {{ key }}
    • + {% endfor %} +
    + +Iterating over Keys and Values +------------------------------ + +You can also access both keys and values: + +.. code-block:: jinja + +

    Members

    +
      + {% for key, user in users %} +
    • {{ key }}: {{ user.username|e }}
    • + {% endfor %} +
    + +Iterating over a Subset +----------------------- + +You might want to iterate over a subset of values. This can be achieved using +the :doc:`slice <../filters/slice>` filter: + +.. code-block:: jinja + +

    Top Ten Members

    +
      + {% for user in users|slice(0, 10) %} +
    • {{ user.username|e }}
    • + {% endfor %} +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/from.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/from.rst new file mode 100644 index 000000000..39334fdde --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/from.rst @@ -0,0 +1,8 @@ +``from`` +======== + +The ``from`` tag imports :doc:`macro<../tags/macro>` names into the current +namespace. The tag is documented in detail in the documentation for the +:doc:`import<../tags/import>` tag. + +.. seealso:: :doc:`macro<../tags/macro>`, :doc:`import<../tags/import>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/if.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/if.rst new file mode 100644 index 000000000..12edf980d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/if.rst @@ -0,0 +1,76 @@ +``if`` +====== + +The ``if`` statement in Twig is comparable with the if statements of PHP. + +In the simplest form you can use it to test if an expression evaluates to +``true``: + +.. code-block:: jinja + + {% if online == false %} +

    Our website is in maintenance mode. Please, come back later.

    + {% endif %} + +You can also test if an array is not empty: + +.. code-block:: jinja + + {% if users %} +
      + {% for user in users %} +
    • {{ user.username|e }}
    • + {% endfor %} +
    + {% endif %} + +.. note:: + + If you want to test if the variable is defined, use ``if users is + defined`` instead. + +You can also use ``not`` to check for values that evaluate to ``false``: + +.. code-block:: jinja + + {% if not user.subscribed %} +

    You are not subscribed to our mailing list.

    + {% endif %} + +For multiple conditions, ``and`` and ``or`` can be used: + +.. code-block:: jinja + + {% if temperature > 18 and temperature < 27 %} +

    It's a nice day for a walk in the park.

    + {% endif %} + +For multiple branches ``elseif`` and ``else`` can be used like in PHP. You can +use more complex ``expressions`` there too: + +.. code-block:: jinja + + {% if kenny.sick %} + Kenny is sick. + {% elseif kenny.dead %} + You killed Kenny! You bastard!!! + {% else %} + Kenny looks okay --- so far + {% endif %} + +.. note:: + + The rules to determine if an expression is ``true`` or ``false`` are the + same as in PHP; here are the edge cases rules: + + ====================== ==================== + Value Boolean evaluation + ====================== ==================== + empty string false + numeric zero false + whitespace-only string true + empty array false + null false + non-empty array true + object true + ====================== ==================== diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/import.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/import.rst new file mode 100644 index 000000000..21a1e1980 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/import.rst @@ -0,0 +1,57 @@ +``import`` +========== + +Twig supports putting often used code into :doc:`macros<../tags/macro>`. These +macros can go into different templates and get imported from there. + +There are two ways to import templates. You can import the complete template +into a variable or request specific macros from it. + +Imagine we have a helper module that renders forms (called ``forms.html``): + +.. code-block:: jinja + + {% macro input(name, value, type, size) %} + + {% endmacro %} + + {% macro textarea(name, value, rows, cols) %} + + {% endmacro %} + +The easiest and most flexible is importing the whole module into a variable. +That way you can access the attributes: + +.. code-block:: jinja + + {% import 'forms.html' as forms %} + +
    +
    Username
    +
    {{ forms.input('username') }}
    +
    Password
    +
    {{ forms.input('password', null, 'password') }}
    +
    +

    {{ forms.textarea('comment') }}

    + +Alternatively you can import names from the template into the current +namespace: + +.. code-block:: jinja + + {% from 'forms.html' import input as input_field, textarea %} + +
    +
    Username
    +
    {{ input_field('username') }}
    +
    Password
    +
    {{ input_field('password', '', 'password') }}
    +
    +

    {{ textarea('comment') }}

    + +.. tip:: + + To import macros from the current file, use the special ``_self`` variable + for the source. + +.. seealso:: :doc:`macro<../tags/macro>`, :doc:`from<../tags/from>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/include.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/include.rst new file mode 100644 index 000000000..da18dc65e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/include.rst @@ -0,0 +1,86 @@ +``include`` +=========== + +The ``include`` statement includes a template and returns the rendered content +of that file into the current namespace: + +.. code-block:: jinja + + {% include 'header.html' %} + Body + {% include 'footer.html' %} + +Included templates have access to the variables of the active context. + +If you are using the filesystem loader, the templates are looked for in the +paths defined by it. + +You can add additional variables by passing them after the ``with`` keyword: + +.. code-block:: jinja + + {# template.html will have access to the variables from the current context and the additional ones provided #} + {% include 'template.html' with {'foo': 'bar'} %} + + {% set vars = {'foo': 'bar'} %} + {% include 'template.html' with vars %} + +You can disable access to the context by appending the ``only`` keyword: + +.. code-block:: jinja + + {# only the foo variable will be accessible #} + {% include 'template.html' with {'foo': 'bar'} only %} + +.. code-block:: jinja + + {# no variables will be accessible #} + {% include 'template.html' only %} + +.. tip:: + + When including a template created by an end user, you should consider + sandboxing it. More information in the :doc:`Twig for Developers<../api>` + chapter and in the :doc:`sandbox<../tags/sandbox>` tag documentation. + +The template name can be any valid Twig expression: + +.. code-block:: jinja + + {% include some_var %} + {% include ajax ? 'ajax.html' : 'not_ajax.html' %} + +And if the expression evaluates to a ``Twig_Template`` object, Twig will use it +directly:: + + // {% include template %} + + $template = $twig->loadTemplate('some_template.twig'); + + $twig->loadTemplate('template.twig')->display(array('template' => $template)); + +.. versionadded:: 1.2 + The ``ignore missing`` feature has been added in Twig 1.2. + +You can mark an include with ``ignore missing`` in which case Twig will ignore +the statement if the template to be included does not exist. It has to be +placed just after the template name. Here some valid examples: + +.. code-block:: jinja + + {% include 'sidebar.html' ignore missing %} + {% include 'sidebar.html' ignore missing with {'foo': 'bar'} %} + {% include 'sidebar.html' ignore missing only %} + +.. versionadded:: 1.2 + The possibility to pass an array of templates has been added in Twig 1.2. + +You can also provide a list of templates that are checked for existence before +inclusion. The first template that exists will be included: + +.. code-block:: jinja + + {% include ['page_detailed.html', 'page.html'] %} + +If ``ignore missing`` is given, it will fall back to rendering nothing if none +of the templates exist, otherwise it will throw an exception. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/index.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/index.rst new file mode 100644 index 000000000..e6a632b7d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/index.rst @@ -0,0 +1,24 @@ +Tags +==== + +.. toctree:: + :maxdepth: 1 + + autoescape + block + do + embed + extends + filter + flush + for + from + if + import + include + macro + sandbox + set + spaceless + use + verbatim diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/macro.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/macro.rst new file mode 100644 index 000000000..a8aa76fd9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/macro.rst @@ -0,0 +1,103 @@ +``macro`` +========= + +Macros are comparable with functions in regular programming languages. They +are useful to put often used HTML idioms into reusable elements to not repeat +yourself. + +Here is a small example of a macro that renders a form element: + +.. code-block:: jinja + + {% macro input(name, value, type, size) %} + + {% endmacro %} + +Macros differ from native PHP functions in a few ways: + +* Default argument values are defined by using the ``default`` filter in the + macro body; + +* Arguments of a macro are always optional. + +* If extra positional arguments are passed to a macro, they end up in the + special ``varargs`` variable as a list of values. + +But as with PHP functions, macros don't have access to the current template +variables. + +.. tip:: + + You can pass the whole context as an argument by using the special + ``_context`` variable. + +Import +------ + +Macros can be defined in any template, and need to be "imported" before being +used (see the documentation for the :doc:`import<../tags/import>` tag for more +information): + +.. code-block:: jinja + + {% import "forms.html" as forms %} + +The above ``import`` call imports the "forms.html" file (which can contain only +macros, or a template and some macros), and import the functions as items of +the ``forms`` variable. + +The macro can then be called at will: + +.. code-block:: jinja + +

    {{ forms.input('username') }}

    +

    {{ forms.input('password', null, 'password') }}

    + +If macros are defined and used in the same template, you can use the +special ``_self`` variable to import them: + +.. code-block:: jinja + + {% import _self as forms %} + +

    {{ forms.input('username') }}

    + +.. warning:: + + When you define a macro in the template where you are going to use it, you + might be tempted to call the macro directly via ``_self.input()`` instead + of importing it; even if seems to work, this is just a side-effect of the + current implementation and it won't work anymore in Twig 2.x. + +When you want to use a macro in another macro from the same file, you need to +import it locally: + +.. code-block:: jinja + + {% macro input(name, value, type, size) %} + + {% endmacro %} + + {% macro wrapped_input(name, value, type, size) %} + {% import _self as forms %} + +
    + {{ forms.input(name, value, type, size) }} +
    + {% endmacro %} + +Named Macro End-Tags +-------------------- + +Twig allows you to put the name of the macro after the end tag for better +readability: + +.. code-block:: jinja + + {% macro input() %} + ... + {% endmacro input %} + +Of course, the name after the ``endmacro`` word must match the macro name. + +.. seealso:: :doc:`from<../tags/from>`, :doc:`import<../tags/import>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/sandbox.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/sandbox.rst new file mode 100644 index 000000000..e186726c2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/sandbox.rst @@ -0,0 +1,30 @@ +``sandbox`` +=========== + +The ``sandbox`` tag can be used to enable the sandboxing mode for an included +template, when sandboxing is not enabled globally for the Twig environment: + +.. code-block:: jinja + + {% sandbox %} + {% include 'user.html' %} + {% endsandbox %} + +.. warning:: + + The ``sandbox`` tag is only available when the sandbox extension is + enabled (see the :doc:`Twig for Developers<../api>` chapter). + +.. note:: + + The ``sandbox`` tag can only be used to sandbox an include tag and it + cannot be used to sandbox a section of a template. The following example + won't work: + + .. code-block:: jinja + + {% sandbox %} + {% for i in 1..2 %} + {{ i }} + {% endfor %} + {% endsandbox %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/set.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/set.rst new file mode 100644 index 000000000..3eba239a9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/set.rst @@ -0,0 +1,78 @@ +``set`` +======= + +Inside code blocks you can also assign values to variables. Assignments use +the ``set`` tag and can have multiple targets. + +Here is how you can assign the ``bar`` value to the ``foo`` variable: + +.. code-block:: jinja + + {% set foo = 'bar' %} + +After the ``set`` call, the ``foo`` variable is available in the template like +any other ones: + +.. code-block:: jinja + + {# displays bar #} + {{ foo }} + +The assigned value can be any valid :ref:`Twig expressions +`: + +.. code-block:: jinja + + {% set foo = [1, 2] %} + {% set foo = {'foo': 'bar'} %} + {% set foo = 'foo' ~ 'bar' %} + +Several variables can be assigned in one block: + +.. code-block:: jinja + + {% set foo, bar = 'foo', 'bar' %} + + {# is equivalent to #} + + {% set foo = 'foo' %} + {% set bar = 'bar' %} + +The ``set`` tag can also be used to 'capture' chunks of text: + +.. code-block:: jinja + + {% set foo %} + + {% endset %} + +.. caution:: + + If you enable automatic output escaping, Twig will only consider the + content to be safe when capturing chunks of text. + +.. note:: + + Note that loops are scoped in Twig; therefore a variable declared inside a + ``for`` loop is not accessible outside the loop itself: + + .. code-block:: jinja + + {% for item in list %} + {% set foo = item %} + {% endfor %} + + {# foo is NOT available #} + + If you want to access the variable, just declare it before the loop: + + .. code-block:: jinja + + {% set foo = "" %} + {% for item in list %} + {% set foo = item %} + {% endfor %} + + {# foo is available #} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/spaceless.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/spaceless.rst new file mode 100644 index 000000000..b39cb27ef --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/spaceless.rst @@ -0,0 +1,37 @@ +``spaceless`` +============= + +Use the ``spaceless`` tag to remove whitespace *between HTML tags*, not +whitespace within HTML tags or whitespace in plain text: + +.. code-block:: jinja + + {% spaceless %} +
    + foo +
    + {% endspaceless %} + + {# output will be
    foo
    #} + +This tag is not meant to "optimize" the size of the generated HTML content but +merely to avoid extra whitespace between HTML tags to avoid browser rendering +quirks under some circumstances. + +.. tip:: + + If you want to optimize the size of the generated HTML content, gzip + compress the output instead. + +.. tip:: + + If you want to create a tag that actually removes all extra whitespace in + an HTML string, be warned that this is not as easy as it seems to be + (think of ``textarea`` or ``pre`` tags for instance). Using a third-party + library like Tidy is probably a better idea. + +.. tip:: + + For more information on whitespace control, read the + :ref:`dedicated section ` of the documentation and learn how + you can also use the whitespace control modifier on your tags. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/use.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/use.rst new file mode 100644 index 000000000..a6fdefb46 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/use.rst @@ -0,0 +1,124 @@ +``use`` +======= + +.. versionadded:: 1.1 + Horizontal reuse was added in Twig 1.1. + +.. note:: + + Horizontal reuse is an advanced Twig feature that is hardly ever needed in + regular templates. It is mainly used by projects that need to make + template blocks reusable without using inheritance. + +Template inheritance is one of the most powerful features of Twig but it is +limited to single inheritance; a template can only extend one other template. +This limitation makes template inheritance simple to understand and easy to +debug: + +.. code-block:: jinja + + {% extends "base.html" %} + + {% block title %}{% endblock %} + {% block content %}{% endblock %} + +Horizontal reuse is a way to achieve the same goal as multiple inheritance, +but without the associated complexity: + +.. code-block:: jinja + + {% extends "base.html" %} + + {% use "blocks.html" %} + + {% block title %}{% endblock %} + {% block content %}{% endblock %} + +The ``use`` statement tells Twig to import the blocks defined in +``blocks.html`` into the current template (it's like macros, but for blocks): + +.. code-block:: jinja + + {# blocks.html #} + + {% block sidebar %}{% endblock %} + +In this example, the ``use`` statement imports the ``sidebar`` block into the +main template. The code is mostly equivalent to the following one (the +imported blocks are not outputted automatically): + +.. code-block:: jinja + + {% extends "base.html" %} + + {% block sidebar %}{% endblock %} + {% block title %}{% endblock %} + {% block content %}{% endblock %} + +.. note:: + + The ``use`` tag only imports a template if it does not extend another + template, if it does not define macros, and if the body is empty. But it + can *use* other templates. + +.. note:: + + Because ``use`` statements are resolved independently of the context + passed to the template, the template reference cannot be an expression. + +The main template can also override any imported block. If the template +already defines the ``sidebar`` block, then the one defined in ``blocks.html`` +is ignored. To avoid name conflicts, you can rename imported blocks: + +.. code-block:: jinja + + {% extends "base.html" %} + + {% use "blocks.html" with sidebar as base_sidebar, title as base_title %} + + {% block sidebar %}{% endblock %} + {% block title %}{% endblock %} + {% block content %}{% endblock %} + +.. versionadded:: 1.3 + The ``parent()`` support was added in Twig 1.3. + +The ``parent()`` function automatically determines the correct inheritance +tree, so it can be used when overriding a block defined in an imported +template: + +.. code-block:: jinja + + {% extends "base.html" %} + + {% use "blocks.html" %} + + {% block sidebar %} + {{ parent() }} + {% endblock %} + + {% block title %}{% endblock %} + {% block content %}{% endblock %} + +In this example, ``parent()`` will correctly call the ``sidebar`` block from +the ``blocks.html`` template. + +.. tip:: + + In Twig 1.2, renaming allows you to simulate inheritance by calling the + "parent" block: + + .. code-block:: jinja + + {% extends "base.html" %} + + {% use "blocks.html" with sidebar as parent_sidebar %} + + {% block sidebar %} + {{ block('parent_sidebar') }} + {% endblock %} + +.. note:: + + You can use as many ``use`` statements as you want in any given template. + If two imported templates define the same block, the latest one wins. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tags/verbatim.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/verbatim.rst new file mode 100644 index 000000000..fe61ca1b0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tags/verbatim.rst @@ -0,0 +1,24 @@ +``verbatim`` +============ + +.. versionadded:: 1.12 + The ``verbatim`` tag was added in Twig 1.12 (it was named ``raw`` before). + +The ``verbatim`` tag marks sections as being raw text that should not be +parsed. For example to put Twig syntax as example into a template you can use +this snippet: + +.. code-block:: jinja + + {% verbatim %} +
      + {% for item in seq %} +
    • {{ item }}
    • + {% endfor %} +
    + {% endverbatim %} + +.. note:: + + The ``verbatim`` tag works in the exact same way as the old ``raw`` tag, + but was renamed to avoid confusion with the ``raw`` filter. \ No newline at end of file diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/templates.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/templates.rst new file mode 100644 index 000000000..b0955d7b8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/templates.rst @@ -0,0 +1,910 @@ +Twig for Template Designers +=========================== + +This document describes the syntax and semantics of the template engine and +will be most useful as reference to those creating Twig templates. + +Synopsis +-------- + +A template is simply a text file. It can generate any text-based format (HTML, +XML, CSV, LaTeX, etc.). It doesn't have a specific extension, ``.html`` or +``.xml`` are just fine. + +A template contains **variables** or **expressions**, which get replaced with +values when the template is evaluated, and **tags**, which control the logic +of the template. + +Below is a minimal template that illustrates a few basics. We will cover further +details later on: + +.. code-block:: html+jinja + + + + + My Webpage + + + + +

    My Webpage

    + {{ a_variable }} + + + +There are two kinds of delimiters: ``{% ... %}`` and ``{{ ... }}``. The first +one is used to execute statements such as for-loops, the latter prints the +result of an expression to the template. + +IDEs Integration +---------------- + +Many IDEs support syntax highlighting and auto-completion for Twig: + +* *Textmate* via the `Twig bundle`_ +* *Vim* via the `Jinja syntax plugin`_ or the `vim-twig plugin`_ +* *Netbeans* via the `Twig syntax plugin`_ (until 7.1, native as of 7.2) +* *PhpStorm* (native as of 2.1) +* *Eclipse* via the `Twig plugin`_ +* *Sublime Text* via the `Twig bundle`_ +* *GtkSourceView* via the `Twig language definition`_ (used by gedit and other projects) +* *Coda* and *SubEthaEdit* via the `Twig syntax mode`_ +* *Coda 2* via the `other Twig syntax mode`_ +* *Komodo* and *Komodo Edit* via the Twig highlight/syntax check mode +* *Notepad++* via the `Notepad++ Twig Highlighter`_ +* *Emacs* via `web-mode.el`_ +* *Atom* via the `PHP-twig for atom`_ +* *Visual Studio Code* via the `Twig pack`_ + +Also, `TwigFiddle`_ is an online service that allows you to execute Twig templates +from a browser; it supports all versions of Twig. + +Variables +--------- + +The application passes variables to the templates for manipulation in the +template. Variables may have attributes or elements you can access, +too. The visual representation of a variable depends heavily on the application providing +it. + +You can use a dot (``.``) to access attributes of a variable (methods or +properties of a PHP object, or items of a PHP array), or the so-called +"subscript" syntax (``[]``): + +.. code-block:: jinja + + {{ foo.bar }} + {{ foo['bar'] }} + +When the attribute contains special characters (like ``-`` that would be +interpreted as the minus operator), use the ``attribute`` function instead to +access the variable attribute: + +.. code-block:: jinja + + {# equivalent to the non-working foo.data-foo #} + {{ attribute(foo, 'data-foo') }} + +.. note:: + + It's important to know that the curly braces are *not* part of the + variable but the print statement. When accessing variables inside tags, + don't put the braces around them. + +If a variable or attribute does not exist, you will receive a ``null`` value +when the ``strict_variables`` option is set to ``false``; alternatively, if ``strict_variables`` +is set, Twig will throw an error (see :ref:`environment options`). + +.. sidebar:: Implementation + + For convenience's sake ``foo.bar`` does the following things on the PHP + layer: + + * check if ``foo`` is an array and ``bar`` a valid element; + * if not, and if ``foo`` is an object, check that ``bar`` is a valid property; + * if not, and if ``foo`` is an object, check that ``bar`` is a valid method + (even if ``bar`` is the constructor - use ``__construct()`` instead); + * if not, and if ``foo`` is an object, check that ``getBar`` is a valid method; + * if not, and if ``foo`` is an object, check that ``isBar`` is a valid method; + * if not, return a ``null`` value. + + ``foo['bar']`` on the other hand only works with PHP arrays: + + * check if ``foo`` is an array and ``bar`` a valid element; + * if not, return a ``null`` value. + +.. note:: + + If you want to access a dynamic attribute of a variable, use the + :doc:`attribute` function instead. + +Global Variables +~~~~~~~~~~~~~~~~ + +The following variables are always available in templates: + +* ``_self``: references the current template; +* ``_context``: references the current context; +* ``_charset``: references the current charset. + +Setting Variables +~~~~~~~~~~~~~~~~~ + +You can assign values to variables inside code blocks. Assignments use the +:doc:`set` tag: + +.. code-block:: jinja + + {% set foo = 'foo' %} + {% set foo = [1, 2] %} + {% set foo = {'foo': 'bar'} %} + +Filters +------- + +Variables can be modified by **filters**. Filters are separated from the +variable by a pipe symbol (``|``) and may have optional arguments in +parentheses. Multiple filters can be chained. The output of one filter is +applied to the next. + +The following example removes all HTML tags from the ``name`` and title-cases +it: + +.. code-block:: jinja + + {{ name|striptags|title }} + +Filters that accept arguments have parentheses around the arguments. This +example will join a list by commas: + +.. code-block:: jinja + + {{ list|join(', ') }} + +To apply a filter on a section of code, wrap it in the +:doc:`filter` tag: + +.. code-block:: jinja + + {% filter upper %} + This text becomes uppercase + {% endfilter %} + +Go to the :doc:`filters` page to learn more about built-in +filters. + +Functions +--------- + +Functions can be called to generate content. Functions are called by their +name followed by parentheses (``()``) and may have arguments. + +For instance, the ``range`` function returns a list containing an arithmetic +progression of integers: + +.. code-block:: jinja + + {% for i in range(0, 3) %} + {{ i }}, + {% endfor %} + +Go to the :doc:`functions` page to learn more about the +built-in functions. + +Named Arguments +--------------- + +.. versionadded:: 1.12 + Support for named arguments was added in Twig 1.12. + +.. code-block:: jinja + + {% for i in range(low=1, high=10, step=2) %} + {{ i }}, + {% endfor %} + +Using named arguments makes your templates more explicit about the meaning of +the values you pass as arguments: + +.. code-block:: jinja + + {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }} + + {# versus #} + + {{ data|convert_encoding(from='iso-2022-jp', to='UTF-8') }} + +Named arguments also allow you to skip some arguments for which you don't want +to change the default value: + +.. code-block:: jinja + + {# the first argument is the date format, which defaults to the global date format if null is passed #} + {{ "now"|date(null, "Europe/Paris") }} + + {# or skip the format value by using a named argument for the time zone #} + {{ "now"|date(timezone="Europe/Paris") }} + +You can also use both positional and named arguments in one call, in which +case positional arguments must always come before named arguments: + +.. code-block:: jinja + + {{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }} + +.. tip:: + + Each function and filter documentation page has a section where the names + of all arguments are listed when supported. + +Control Structure +----------------- + +A control structure refers to all those things that control the flow of a +program - conditionals (i.e. ``if``/``elseif``/``else``), ``for``-loops, as +well as things like blocks. Control structures appear inside ``{% ... %}`` +blocks. + +For example, to display a list of users provided in a variable called +``users``, use the :doc:`for` tag: + +.. code-block:: jinja + +

    Members

    +
      + {% for user in users %} +
    • {{ user.username|e }}
    • + {% endfor %} +
    + +The :doc:`if` tag can be used to test an expression: + +.. code-block:: jinja + + {% if users|length > 0 %} +
      + {% for user in users %} +
    • {{ user.username|e }}
    • + {% endfor %} +
    + {% endif %} + +Go to the :doc:`tags` page to learn more about the built-in tags. + +Comments +-------- + +To comment-out part of a line in a template, use the comment syntax ``{# ... +#}``. This is useful for debugging or to add information for other template +designers or yourself: + +.. code-block:: jinja + + {# note: disabled template because we no longer use this + {% for user in users %} + ... + {% endfor %} + #} + +Including other Templates +------------------------- + +The :doc:`include` function is useful to include a template +and return the rendered content of that template into the current one: + +.. code-block:: jinja + + {{ include('sidebar.html') }} + +By default, included templates have access to the same context as the template +which includes them. This means that any variable defined in the main template +will be available in the included template too: + +.. code-block:: jinja + + {% for box in boxes %} + {{ include('render_box.html') }} + {% endfor %} + +The included template ``render_box.html`` is able to access the ``box`` variable. + +The filename of the template depends on the template loader. For instance, the +``Twig_Loader_Filesystem`` allows you to access other templates by giving the +filename. You can access templates in subdirectories with a slash: + +.. code-block:: jinja + + {{ include('sections/articles/sidebar.html') }} + +This behavior depends on the application embedding Twig. + +Template Inheritance +-------------------- + +The most powerful part of Twig is template inheritance. Template inheritance +allows you to build a base "skeleton" template that contains all the common +elements of your site and defines **blocks** that child templates can +override. + +Sounds complicated but it is very basic. It's easier to understand it by +starting with an example. + +Let's define a base template, ``base.html``, which defines a simple HTML +skeleton document that you might use for a simple two-column page: + +.. code-block:: html+jinja + + + + + {% block head %} + + {% block title %}{% endblock %} - My Webpage + {% endblock %} + + +
    {% block content %}{% endblock %}
    + + + + +In this example, the :doc:`block` tags define four blocks that +child templates can fill in. All the ``block`` tag does is to tell the +template engine that a child template may override those portions of the +template. + +A child template might look like this: + +.. code-block:: jinja + + {% extends "base.html" %} + + {% block title %}Index{% endblock %} + {% block head %} + {{ parent() }} + + {% endblock %} + {% block content %} +

    Index

    +

    + Welcome to my awesome homepage. +

    + {% endblock %} + +The :doc:`extends` tag is the key here. It tells the template +engine that this template "extends" another template. When the template system +evaluates this template, first it locates the parent. The extends tag should +be the first tag in the template. + +Note that since the child template doesn't define the ``footer`` block, the +value from the parent template is used instead. + +It's possible to render the contents of the parent block by using the +:doc:`parent` function. This gives back the results of the +parent block: + +.. code-block:: jinja + + {% block sidebar %} +

    Table Of Contents

    + ... + {{ parent() }} + {% endblock %} + +.. tip:: + + The documentation page for the :doc:`extends` tag describes + more advanced features like block nesting, scope, dynamic inheritance, and + conditional inheritance. + +.. note:: + + Twig also supports multiple inheritance with the so called horizontal reuse + with the help of the :doc:`use` tag. This is an advanced feature + hardly ever needed in regular templates. + +HTML Escaping +------------- + +When generating HTML from templates, there's always a risk that a variable +will include characters that affect the resulting HTML. There are two +approaches: manually escaping each variable or automatically escaping +everything by default. + +Twig supports both, automatic escaping is enabled by default. + +.. note:: + + Automatic escaping is only supported if the *escaper* extension has been + enabled (which is the default). + +Working with Manual Escaping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If manual escaping is enabled, it is **your** responsibility to escape +variables if needed. What to escape? Any variable you don't trust. + +Escaping works by piping the variable through the +:doc:`escape` or ``e`` filter: + +.. code-block:: jinja + + {{ user.username|e }} + +By default, the ``escape`` filter uses the ``html`` strategy, but depending on +the escaping context, you might want to explicitly use any other available +strategies: + +.. code-block:: jinja + + {{ user.username|e('js') }} + {{ user.username|e('css') }} + {{ user.username|e('url') }} + {{ user.username|e('html_attr') }} + +Working with Automatic Escaping +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Whether automatic escaping is enabled or not, you can mark a section of a +template to be escaped or not by using the :doc:`autoescape` +tag: + +.. code-block:: jinja + + {% autoescape %} + Everything will be automatically escaped in this block (using the HTML strategy) + {% endautoescape %} + +By default, auto-escaping uses the ``html`` escaping strategy. If you output +variables in other contexts, you need to explicitly escape them with the +appropriate escaping strategy: + +.. code-block:: jinja + + {% autoescape 'js' %} + Everything will be automatically escaped in this block (using the JS strategy) + {% endautoescape %} + +Escaping +-------- + +It is sometimes desirable or even necessary to have Twig ignore parts it would +otherwise handle as variables or blocks. For example if the default syntax is +used and you want to use ``{{`` as raw string in the template and not start a +variable you have to use a trick. + +The easiest way is to output the variable delimiter (``{{``) by using a variable +expression: + +.. code-block:: jinja + + {{ '{{' }} + +For bigger sections it makes sense to mark a block +:doc:`verbatim`. + +Macros +------ + +.. versionadded:: 1.12 + Support for default argument values was added in Twig 1.12. + +Macros are comparable with functions in regular programming languages. They +are useful to reuse often used HTML fragments to not repeat yourself. + +A macro is defined via the :doc:`macro` tag. Here is a small example +(subsequently called ``forms.html``) of a macro that renders a form element: + +.. code-block:: jinja + + {% macro input(name, value, type, size) %} + + {% endmacro %} + +Macros can be defined in any template, and need to be "imported" via the +:doc:`import` tag before being used: + +.. code-block:: jinja + + {% import "forms.html" as forms %} + +

    {{ forms.input('username') }}

    + +Alternatively, you can import individual macro names from a template into the +current namespace via the :doc:`from` tag and optionally alias them: + +.. code-block:: jinja + + {% from 'forms.html' import input as input_field %} + +
    +
    Username
    +
    {{ input_field('username') }}
    +
    Password
    +
    {{ input_field('password', '', 'password') }}
    +
    + +A default value can also be defined for macro arguments when not provided in a +macro call: + +.. code-block:: jinja + + {% macro input(name, value = "", type = "text", size = 20) %} + + {% endmacro %} + +If extra positional arguments are passed to a macro call, they end up in the +special ``varargs`` variable as a list of values. + +.. _twig-expressions: + +Expressions +----------- + +Twig allows expressions everywhere. These work very similar to regular PHP and +even if you're not working with PHP you should feel comfortable with it. + +.. note:: + + The operator precedence is as follows, with the lowest-precedence + operators listed first: ``b-and``, ``b-xor``, ``b-or``, ``or``, ``and``, + ``==``, ``!=``, ``<``, ``>``, ``>=``, ``<=``, ``in``, ``matches``, + ``starts with``, ``ends with``, ``..``, ``+``, ``-``, ``~``, ``*``, ``/``, + ``//``, ``%``, ``is``, ``**``, ``|``, ``[]``, and ``.``: + + .. code-block:: jinja + + {% set greeting = 'Hello ' %} + {% set name = 'Fabien' %} + + {{ greeting ~ name|lower }} {# Hello fabien #} + + {# use parenthesis to change precedence #} + {{ (greeting ~ name)|lower }} {# hello fabien #} + +Literals +~~~~~~~~ + +.. versionadded:: 1.5 + Support for hash keys as names and expressions was added in Twig 1.5. + +The simplest form of expressions are literals. Literals are representations +for PHP types such as strings, numbers, and arrays. The following literals +exist: + +* ``"Hello World"``: Everything between two double or single quotes is a + string. They are useful whenever you need a string in the template (for + example as arguments to function calls, filters or just to extend or include + a template). A string can contain a delimiter if it is preceded by a + backslash (``\``) -- like in ``'It\'s good'``. If the string contains a + backslash (e.g. ``'c:\Program Files'``) escape it by doubling it + (e.g. ``'c:\\Program Files'``). + +* ``42`` / ``42.23``: Integers and floating point numbers are created by just + writing the number down. If a dot is present the number is a float, + otherwise an integer. + +* ``["foo", "bar"]``: Arrays are defined by a sequence of expressions + separated by a comma (``,``) and wrapped with squared brackets (``[]``). + +* ``{"foo": "bar"}``: Hashes are defined by a list of keys and values + separated by a comma (``,``) and wrapped with curly braces (``{}``): + + .. code-block:: jinja + + {# keys as string #} + { 'foo': 'foo', 'bar': 'bar' } + + {# keys as names (equivalent to the previous hash) -- as of Twig 1.5 #} + { foo: 'foo', bar: 'bar' } + + {# keys as integer #} + { 2: 'foo', 4: 'bar' } + + {# keys as expressions (the expression must be enclosed into parentheses) -- as of Twig 1.5 #} + { (1 + 1): 'foo', (a ~ 'b'): 'bar' } + +* ``true`` / ``false``: ``true`` represents the true value, ``false`` + represents the false value. + +* ``null``: ``null`` represents no specific value. This is the value returned + when a variable does not exist. ``none`` is an alias for ``null``. + +Arrays and hashes can be nested: + +.. code-block:: jinja + + {% set foo = [1, {"foo": "bar"}] %} + +.. tip:: + + Using double-quoted or single-quoted strings has no impact on performance + but string interpolation is only supported in double-quoted strings. + +Math +~~~~ + +Twig allows you to calculate with values. This is rarely useful in templates +but exists for completeness' sake. The following operators are supported: + +* ``+``: Adds two objects together (the operands are casted to numbers). ``{{ + 1 + 1 }}`` is ``2``. + +* ``-``: Subtracts the second number from the first one. ``{{ 3 - 2 }}`` is + ``1``. + +* ``/``: Divides two numbers. The returned value will be a floating point + number. ``{{ 1 / 2 }}`` is ``{{ 0.5 }}``. + +* ``%``: Calculates the remainder of an integer division. ``{{ 11 % 7 }}`` is + ``4``. + +* ``//``: Divides two numbers and returns the floored integer result. ``{{ 20 + // 7 }}`` is ``2``, ``{{ -20 // 7 }}`` is ``-3`` (this is just syntactic + sugar for the :doc:`round` filter). + +* ``*``: Multiplies the left operand with the right one. ``{{ 2 * 2 }}`` would + return ``4``. + +* ``**``: Raises the left operand to the power of the right operand. ``{{ 2 ** + 3 }}`` would return ``8``. + +Logic +~~~~~ + +You can combine multiple expressions with the following operators: + +* ``and``: Returns true if the left and the right operands are both true. + +* ``or``: Returns true if the left or the right operand is true. + +* ``not``: Negates a statement. + +* ``(expr)``: Groups an expression. + +.. note:: + + Twig also support bitwise operators (``b-and``, ``b-xor``, and ``b-or``). + +.. note:: + + Operators are case sensitive. + +Comparisons +~~~~~~~~~~~ + +The following comparison operators are supported in any expression: ``==``, +``!=``, ``<``, ``>``, ``>=``, and ``<=``. + +You can also check if a string ``starts with`` or ``ends with`` another +string: + +.. code-block:: jinja + + {% if 'Fabien' starts with 'F' %} + {% endif %} + + {% if 'Fabien' ends with 'n' %} + {% endif %} + +.. note:: + + For complex string comparisons, the ``matches`` operator allows you to use + `regular expressions`_: + + .. code-block:: jinja + + {% if phone matches '/^[\\d\\.]+$/' %} + {% endif %} + +Containment Operator +~~~~~~~~~~~~~~~~~~~~ + +The ``in`` operator performs containment test. + +It returns ``true`` if the left operand is contained in the right: + +.. code-block:: jinja + + {# returns true #} + + {{ 1 in [1, 2, 3] }} + + {{ 'cd' in 'abcde' }} + +.. tip:: + + You can use this filter to perform a containment test on strings, arrays, + or objects implementing the ``Traversable`` interface. + +To perform a negative test, use the ``not in`` operator: + +.. code-block:: jinja + + {% if 1 not in [1, 2, 3] %} + + {# is equivalent to #} + {% if not (1 in [1, 2, 3]) %} + +Test Operator +~~~~~~~~~~~~~ + +The ``is`` operator performs tests. Tests can be used to test a variable against +a common expression. The right operand is name of the test: + +.. code-block:: jinja + + {# find out if a variable is odd #} + + {{ name is odd }} + +Tests can accept arguments too: + +.. code-block:: jinja + + {% if post.status is constant('Post::PUBLISHED') %} + +Tests can be negated by using the ``is not`` operator: + +.. code-block:: jinja + + {% if post.status is not constant('Post::PUBLISHED') %} + + {# is equivalent to #} + {% if not (post.status is constant('Post::PUBLISHED')) %} + +Go to the :doc:`tests` page to learn more about the built-in +tests. + +Other Operators +~~~~~~~~~~~~~~~ + +.. versionadded:: 1.12.0 + Support for the extended ternary operator was added in Twig 1.12.0. + +The following operators don't fit into any of the other categories: + +* ``|``: Applies a filter. + +* ``..``: Creates a sequence based on the operand before and after the operator + (this is just syntactic sugar for the :doc:`range` function): + + .. code-block:: jinja + + {{ 1..5 }} + + {# equivalent to #} + {{ range(1, 5) }} + + Note that you must use parentheses when combining it with the filter operator + due to the :ref:`operator precedence rules `: + + .. code-block:: jinja + + (1..5)|join(', ') + +* ``~``: Converts all operands into strings and concatenates them. ``{{ "Hello + " ~ name ~ "!" }}`` would return (assuming ``name`` is ``'John'``) ``Hello + John!``. + +* ``.``, ``[]``: Gets an attribute of an object. + +* ``?:``: The ternary operator: + + .. code-block:: jinja + + {{ foo ? 'yes' : 'no' }} + + {# as of Twig 1.12.0 #} + {{ foo ?: 'no' }} is the same as {{ foo ? foo : 'no' }} + {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }} + +* ``??``: The null-coalescing operator: + + .. code-block:: jinja + + {# returns the value of foo if it is defined and not null, 'no' otherwise #} + {{ foo ?? 'no' }} + +String Interpolation +~~~~~~~~~~~~~~~~~~~~ + +.. versionadded:: 1.5 + String interpolation was added in Twig 1.5. + +String interpolation (``#{expression}``) allows any valid expression to appear +within a *double-quoted string*. The result of evaluating that expression is +inserted into the string: + +.. code-block:: jinja + + {{ "foo #{bar} baz" }} + {{ "foo #{1 + 2} baz" }} + +.. _templates-whitespace-control: + +Whitespace Control +------------------ + +.. versionadded:: 1.1 + Tag level whitespace control was added in Twig 1.1. + +The first newline after a template tag is removed automatically (like in PHP.) +Whitespace is not further modified by the template engine, so each whitespace +(spaces, tabs, newlines etc.) is returned unchanged. + +Use the ``spaceless`` tag to remove whitespace *between HTML tags*: + +.. code-block:: jinja + + {% spaceless %} +
    + foo bar +
    + {% endspaceless %} + + {# output will be
    foo bar
    #} + +In addition to the spaceless tag you can also control whitespace on a per tag +level. By using the whitespace control modifier on your tags, you can trim +leading and or trailing whitespace: + +.. code-block:: jinja + + {% set value = 'no spaces' %} + {#- No leading/trailing whitespace -#} + {%- if true -%} + {{- value -}} + {%- endif -%} + + {# output 'no spaces' #} + +The above sample shows the default whitespace control modifier, and how you can +use it to remove whitespace around tags. Trimming space will consume all whitespace +for that side of the tag. It is possible to use whitespace trimming on one side +of a tag: + +.. code-block:: jinja + + {% set value = 'no spaces' %} +
  • {{- value }}
  • + + {# outputs '
  • no spaces
  • ' #} + +Extensions +---------- + +Twig can be easily extended. + +If you are looking for new tags, filters, or functions, have a look at the Twig official +`extension repository`_. + +If you want to create your own, read the :ref:`Creating an +Extension` chapter. + +.. _`Twig bundle`: https://github.com/Anomareh/PHP-Twig.tmbundle +.. _`Jinja syntax plugin`: http://jinja.pocoo.org/docs/integration/#vim +.. _`vim-twig plugin`: https://github.com/evidens/vim-twig +.. _`Twig syntax plugin`: http://plugins.netbeans.org/plugin/37069/php-twig +.. _`Twig plugin`: https://github.com/pulse00/Twig-Eclipse-Plugin +.. _`Twig language definition`: https://github.com/gabrielcorpse/gedit-twig-template-language +.. _`extension repository`: http://github.com/twigphp/Twig-extensions +.. _`Twig syntax mode`: https://github.com/bobthecow/Twig-HTML.mode +.. _`other Twig syntax mode`: https://github.com/muxx/Twig-HTML.mode +.. _`Notepad++ Twig Highlighter`: https://github.com/Banane9/notepadplusplus-twig +.. _`web-mode.el`: http://web-mode.org/ +.. _`regular expressions`: http://php.net/manual/en/pcre.pattern.php +.. _`PHP-twig for atom`: https://github.com/reesef/php-twig +.. _`TwigFiddle`: http://twigfiddle.com/ +.. _`Twig pack`: https://marketplace.visualstudio.com/items?itemName=bajdzis.vscode-twig-pack diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/constant.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/constant.rst new file mode 100644 index 000000000..8d0724a80 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/constant.rst @@ -0,0 +1,22 @@ +``constant`` +============ + +.. versionadded: 1.13.1 + constant now accepts object instances as the second argument. + +``constant`` checks if a variable has the exact same value as a constant. You +can use either global constants or class constants: + +.. code-block:: jinja + + {% if post.status is constant('Post::PUBLISHED') %} + the status attribute is exactly the same as Post::PUBLISHED + {% endif %} + +You can test constants from object instances as well: + +.. code-block:: jinja + + {% if post.status is constant('PUBLISHED', post) %} + the status attribute is exactly the same as Post::PUBLISHED + {% endif %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/defined.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/defined.rst new file mode 100644 index 000000000..702ce7256 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/defined.rst @@ -0,0 +1,30 @@ +``defined`` +=========== + +``defined`` checks if a variable is defined in the current context. This is very +useful if you use the ``strict_variables`` option: + +.. code-block:: jinja + + {# defined works with variable names #} + {% if foo is defined %} + ... + {% endif %} + + {# and attributes on variables names #} + {% if foo.bar is defined %} + ... + {% endif %} + + {% if foo['bar'] is defined %} + ... + {% endif %} + +When using the ``defined`` test on an expression that uses variables in some +method calls, be sure that they are all defined first: + +.. code-block:: jinja + + {% if var is defined and foo.method(var) is defined %} + ... + {% endif %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/divisibleby.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/divisibleby.rst new file mode 100644 index 000000000..6c693b2b4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/divisibleby.rst @@ -0,0 +1,14 @@ +``divisible by`` +================ + +.. versionadded:: 1.14.2 + The ``divisible by`` test was added in Twig 1.14.2 as an alias for + ``divisibleby``. + +``divisible by`` checks if a variable is divisible by a number: + +.. code-block:: jinja + + {% if loop.index is divisible by(3) %} + ... + {% endif %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/empty.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/empty.rst new file mode 100644 index 000000000..c214d50ae --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/empty.rst @@ -0,0 +1,11 @@ +``empty`` +========= + +``empty`` checks if a variable is an empty string, an empty array, an empty +hash, exactly ``false``, or exactly ``null``: + +.. code-block:: jinja + + {% if foo is empty %} + ... + {% endif %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/even.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/even.rst new file mode 100644 index 000000000..6ab5cc39a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/even.rst @@ -0,0 +1,10 @@ +``even`` +======== + +``even`` returns ``true`` if the given number is even: + +.. code-block:: jinja + + {{ var is even }} + +.. seealso:: :doc:`odd<../tests/odd>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/index.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/index.rst new file mode 100644 index 000000000..c63208ee7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/index.rst @@ -0,0 +1,15 @@ +Tests +===== + +.. toctree:: + :maxdepth: 1 + + constant + defined + divisibleby + empty + even + iterable + null + odd + sameas diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/iterable.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/iterable.rst new file mode 100644 index 000000000..89a172f74 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/iterable.rst @@ -0,0 +1,19 @@ +``iterable`` +============ + +.. versionadded:: 1.7 + The iterable test was added in Twig 1.7. + +``iterable`` checks if a variable is an array or a traversable object: + +.. code-block:: jinja + + {# evaluates to true if the foo variable is iterable #} + {% if users is iterable %} + {% for user in users %} + Hello {{ user }}! + {% endfor %} + {% else %} + {# users is probably a string #} + Hello {{ users }}! + {% endif %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/null.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/null.rst new file mode 100644 index 000000000..44eec62e5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/null.rst @@ -0,0 +1,12 @@ +``null`` +======== + +``null`` returns ``true`` if the variable is ``null``: + +.. code-block:: jinja + + {{ var is null }} + +.. note:: + + ``none`` is an alias for ``null``. diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/odd.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/odd.rst new file mode 100644 index 000000000..9eece7776 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/odd.rst @@ -0,0 +1,10 @@ +``odd`` +======= + +``odd`` returns ``true`` if the given number is odd: + +.. code-block:: jinja + + {{ var is odd }} + +.. seealso:: :doc:`even<../tests/even>` diff --git a/dkan/.ahoy/site/vendor/twig/twig/doc/tests/sameas.rst b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/sameas.rst new file mode 100644 index 000000000..16f904d5c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/doc/tests/sameas.rst @@ -0,0 +1,14 @@ +``same as`` +=========== + +.. versionadded:: 1.14.2 + The ``same as`` test was added in Twig 1.14.2 as an alias for ``sameas``. + +``same as`` checks if a variable is the same as another variable. +This is the equivalent to ``===`` in PHP: + +.. code-block:: jinja + + {% if foo.attribute is same as(false) %} + the foo attribute really is the 'false' PHP value + {% endif %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/ext/twig/config.m4 b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/config.m4 new file mode 100644 index 000000000..83486be4c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/config.m4 @@ -0,0 +1,8 @@ +dnl config.m4 for extension twig + +PHP_ARG_ENABLE(twig, whether to enable twig support, +[ --enable-twig Enable twig support]) + +if test "$PHP_TWIG" != "no"; then + PHP_NEW_EXTENSION(twig, twig.c, $ext_shared) +fi diff --git a/dkan/.ahoy/site/vendor/twig/twig/ext/twig/config.w32 b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/config.w32 new file mode 100644 index 000000000..cb287b99b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/config.w32 @@ -0,0 +1,8 @@ +// vim:ft=javascript + +ARG_ENABLE("twig", "Twig support", "no"); + +if (PHP_TWIG != "no") { + AC_DEFINE('HAVE_TWIG', 1); + EXTENSION('twig', 'twig.c'); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/ext/twig/php_twig.h b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/php_twig.h new file mode 100644 index 000000000..5e3b5ad02 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/php_twig.h @@ -0,0 +1,35 @@ +/* + +----------------------------------------------------------------------+ + | Twig Extension | + +----------------------------------------------------------------------+ + | Copyright (c) 2011 Derick Rethans | + +----------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met (BSD-3-Clause). | + +----------------------------------------------------------------------+ + | Author: Derick Rethans | + +----------------------------------------------------------------------+ + */ + +#ifndef PHP_TWIG_H +#define PHP_TWIG_H + +#define PHP_TWIG_VERSION "1.26.1" + +#include "php.h" + +extern zend_module_entry twig_module_entry; +#define phpext_twig_ptr &twig_module_entry +#ifndef PHP_WIN32 +zend_module_entry *get_module(void); +#endif + +#ifdef ZTS +#include "TSRM.h" +#endif + +PHP_FUNCTION(twig_template_get_attributes); +PHP_RSHUTDOWN_FUNCTION(twig); + +#endif diff --git a/dkan/.ahoy/site/vendor/twig/twig/ext/twig/twig.c b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/twig.c new file mode 100644 index 000000000..08171a316 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/ext/twig/twig.c @@ -0,0 +1,1127 @@ +/* + +----------------------------------------------------------------------+ + | Twig Extension | + +----------------------------------------------------------------------+ + | Copyright (c) 2011 Derick Rethans | + +----------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met (BSD-3-Clause). | + +----------------------------------------------------------------------+ + | Author: Derick Rethans | + +----------------------------------------------------------------------+ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_twig.h" +#include "ext/standard/php_var.h" +#include "ext/standard/php_string.h" +#include "ext/standard/php_smart_str.h" +#include "ext/spl/spl_exceptions.h" + +#include "Zend/zend_object_handlers.h" +#include "Zend/zend_interfaces.h" +#include "Zend/zend_exceptions.h" + +#ifndef Z_ADDREF_P +#define Z_ADDREF_P(pz) (pz)->refcount++ +#endif + +#define FREE_DTOR(z) \ + zval_dtor(z); \ + efree(z); + +#if PHP_VERSION_ID >= 50300 + #define APPLY_TSRMLS_DC TSRMLS_DC + #define APPLY_TSRMLS_CC TSRMLS_CC + #define APPLY_TSRMLS_FETCH() +#else + #define APPLY_TSRMLS_DC + #define APPLY_TSRMLS_CC + #define APPLY_TSRMLS_FETCH() TSRMLS_FETCH() +#endif + +ZEND_BEGIN_ARG_INFO_EX(twig_template_get_attribute_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 6) + ZEND_ARG_INFO(0, template) + ZEND_ARG_INFO(0, object) + ZEND_ARG_INFO(0, item) + ZEND_ARG_INFO(0, arguments) + ZEND_ARG_INFO(0, type) + ZEND_ARG_INFO(0, isDefinedTest) +ZEND_END_ARG_INFO() + +#ifndef PHP_FE_END +#define PHP_FE_END { NULL, NULL, NULL} +#endif + +static const zend_function_entry twig_functions[] = { + PHP_FE(twig_template_get_attributes, twig_template_get_attribute_args) + PHP_FE_END +}; + +PHP_RSHUTDOWN_FUNCTION(twig) +{ +#if ZEND_DEBUG + CG(unclean_shutdown) = 0; /* get rid of PHPUnit's exit() and report memleaks */ +#endif + return SUCCESS; +} + +zend_module_entry twig_module_entry = { + STANDARD_MODULE_HEADER, + "twig", + twig_functions, + NULL, + NULL, + NULL, + PHP_RSHUTDOWN(twig), + NULL, + PHP_TWIG_VERSION, + STANDARD_MODULE_PROPERTIES +}; + + +#ifdef COMPILE_DL_TWIG +ZEND_GET_MODULE(twig) +#endif + +static int TWIG_ARRAY_KEY_EXISTS(zval *array, zval *key) +{ + if (Z_TYPE_P(array) != IS_ARRAY) { + return 0; + } + + switch (Z_TYPE_P(key)) { + case IS_NULL: + return zend_hash_exists(Z_ARRVAL_P(array), "", 1); + + case IS_BOOL: + case IS_DOUBLE: + convert_to_long(key); + case IS_LONG: + return zend_hash_index_exists(Z_ARRVAL_P(array), Z_LVAL_P(key)); + + default: + convert_to_string(key); + return zend_symtable_exists(Z_ARRVAL_P(array), Z_STRVAL_P(key), Z_STRLEN_P(key) + 1); + } +} + +static int TWIG_INSTANCE_OF(zval *object, zend_class_entry *interface TSRMLS_DC) +{ + if (Z_TYPE_P(object) != IS_OBJECT) { + return 0; + } + return instanceof_function(Z_OBJCE_P(object), interface TSRMLS_CC); +} + +static int TWIG_INSTANCE_OF_USERLAND(zval *object, char *interface TSRMLS_DC) +{ + zend_class_entry **pce; + if (Z_TYPE_P(object) != IS_OBJECT) { + return 0; + } + if (zend_lookup_class(interface, strlen(interface), &pce TSRMLS_CC) == FAILURE) { + return 0; + } + return instanceof_function(Z_OBJCE_P(object), *pce TSRMLS_CC); +} + +static zval *TWIG_GET_ARRAYOBJECT_ELEMENT(zval *object, zval *offset TSRMLS_DC) +{ + zend_class_entry *ce = Z_OBJCE_P(object); + zval *retval; + + if (Z_TYPE_P(object) == IS_OBJECT) { + SEPARATE_ARG_IF_REF(offset); + zend_call_method_with_1_params(&object, ce, NULL, "offsetget", &retval, offset); + + zval_ptr_dtor(&offset); + + if (!retval) { + if (!EG(exception)) { + zend_error(E_ERROR, "Undefined offset for object of type %s used as array.", ce->name); + } + return NULL; + } + + return retval; + } + return NULL; +} + +static int TWIG_ISSET_ARRAYOBJECT_ELEMENT(zval *object, zval *offset TSRMLS_DC) +{ + zend_class_entry *ce = Z_OBJCE_P(object); + zval *retval; + + if (Z_TYPE_P(object) == IS_OBJECT) { + SEPARATE_ARG_IF_REF(offset); + zend_call_method_with_1_params(&object, ce, NULL, "offsetexists", &retval, offset); + + zval_ptr_dtor(&offset); + + if (!retval) { + if (!EG(exception)) { + zend_error(E_ERROR, "Undefined offset for object of type %s used as array.", ce->name); + } + return 0; + } + + return (retval && Z_TYPE_P(retval) == IS_BOOL && Z_LVAL_P(retval)); + } + return 0; +} + +static char *TWIG_STRTOLOWER(const char *str, int str_len) +{ + char *item_dup; + + item_dup = estrndup(str, str_len); + php_strtolower(item_dup, str_len); + return item_dup; +} + +static zval *TWIG_CALL_USER_FUNC_ARRAY(zval *object, char *function, zval *arguments TSRMLS_DC) +{ + zend_fcall_info fci; + zval ***args = NULL; + int arg_count = 0; + HashTable *table; + HashPosition pos; + int i = 0; + zval *retval_ptr; + zval *zfunction; + + if (arguments) { + table = HASH_OF(arguments); + args = safe_emalloc(sizeof(zval **), table->nNumOfElements, 0); + + zend_hash_internal_pointer_reset_ex(table, &pos); + + while (zend_hash_get_current_data_ex(table, (void **)&args[i], &pos) == SUCCESS) { + i++; + zend_hash_move_forward_ex(table, &pos); + } + arg_count = table->nNumOfElements; + } + + MAKE_STD_ZVAL(zfunction); + ZVAL_STRING(zfunction, function, 1); + fci.size = sizeof(fci); + fci.function_table = EG(function_table); + fci.function_name = zfunction; + fci.symbol_table = NULL; +#if PHP_VERSION_ID >= 50300 + fci.object_ptr = object; +#else + fci.object_pp = &object; +#endif + fci.retval_ptr_ptr = &retval_ptr; + fci.param_count = arg_count; + fci.params = args; + fci.no_separation = 0; + + if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE) { + ALLOC_INIT_ZVAL(retval_ptr); + ZVAL_BOOL(retval_ptr, 0); + } + + if (args) { + efree(fci.params); + } + FREE_DTOR(zfunction); + return retval_ptr; +} + +static int TWIG_CALL_BOOLEAN(zval *object, char *functionName TSRMLS_DC) +{ + zval *ret; + int res; + + ret = TWIG_CALL_USER_FUNC_ARRAY(object, functionName, NULL TSRMLS_CC); + res = Z_LVAL_P(ret); + zval_ptr_dtor(&ret); + return res; +} + +static zval *TWIG_GET_STATIC_PROPERTY(zval *class, char *prop_name TSRMLS_DC) +{ + zval **tmp_zval; + zend_class_entry *ce; + + if (class == NULL || Z_TYPE_P(class) != IS_OBJECT) { + return NULL; + } + + ce = zend_get_class_entry(class TSRMLS_CC); +#if PHP_VERSION_ID >= 50400 + tmp_zval = zend_std_get_static_property(ce, prop_name, strlen(prop_name), 0, NULL TSRMLS_CC); +#else + tmp_zval = zend_std_get_static_property(ce, prop_name, strlen(prop_name), 0 TSRMLS_CC); +#endif + return *tmp_zval; +} + +static zval *TWIG_GET_ARRAY_ELEMENT_ZVAL(zval *class, zval *prop_name TSRMLS_DC) +{ + zval **tmp_zval; + + if (class == NULL || Z_TYPE_P(class) != IS_ARRAY) { + if (class != NULL && Z_TYPE_P(class) == IS_OBJECT && TWIG_INSTANCE_OF(class, zend_ce_arrayaccess TSRMLS_CC)) { + // array access object + return TWIG_GET_ARRAYOBJECT_ELEMENT(class, prop_name TSRMLS_CC); + } + return NULL; + } + + switch(Z_TYPE_P(prop_name)) { + case IS_NULL: + zend_hash_find(HASH_OF(class), "", 1, (void**) &tmp_zval); + return *tmp_zval; + + case IS_BOOL: + case IS_DOUBLE: + convert_to_long(prop_name); + case IS_LONG: + zend_hash_index_find(HASH_OF(class), Z_LVAL_P(prop_name), (void **) &tmp_zval); + return *tmp_zval; + + case IS_STRING: + zend_symtable_find(HASH_OF(class), Z_STRVAL_P(prop_name), Z_STRLEN_P(prop_name) + 1, (void**) &tmp_zval); + return *tmp_zval; + } + + return NULL; +} + +static zval *TWIG_GET_ARRAY_ELEMENT(zval *class, char *prop_name, int prop_name_length TSRMLS_DC) +{ + zval **tmp_zval; + + if (class == NULL/* || Z_TYPE_P(class) != IS_ARRAY*/) { + return NULL; + } + + if (class != NULL && Z_TYPE_P(class) == IS_OBJECT && TWIG_INSTANCE_OF(class, zend_ce_arrayaccess TSRMLS_CC)) { + // array access object + zval *tmp_name_zval; + zval *tmp_ret_zval; + + ALLOC_INIT_ZVAL(tmp_name_zval); + ZVAL_STRING(tmp_name_zval, prop_name, 1); + tmp_ret_zval = TWIG_GET_ARRAYOBJECT_ELEMENT(class, tmp_name_zval TSRMLS_CC); + FREE_DTOR(tmp_name_zval); + return tmp_ret_zval; + } + + if (zend_symtable_find(HASH_OF(class), prop_name, prop_name_length+1, (void**)&tmp_zval) == SUCCESS) { + return *tmp_zval; + } + return NULL; +} + +static zval *TWIG_PROPERTY(zval *object, zval *propname TSRMLS_DC) +{ + zval *tmp = NULL; + + if (Z_OBJ_HT_P(object)->read_property) { +#if PHP_VERSION_ID >= 50400 + tmp = Z_OBJ_HT_P(object)->read_property(object, propname, BP_VAR_IS, NULL TSRMLS_CC); +#else + tmp = Z_OBJ_HT_P(object)->read_property(object, propname, BP_VAR_IS TSRMLS_CC); +#endif + if (tmp == EG(uninitialized_zval_ptr)) { + ZVAL_NULL(tmp); + } + } + return tmp; +} + +static int TWIG_HAS_PROPERTY(zval *object, zval *propname TSRMLS_DC) +{ + if (Z_OBJ_HT_P(object)->has_property) { +#if PHP_VERSION_ID >= 50400 + return Z_OBJ_HT_P(object)->has_property(object, propname, 0, NULL TSRMLS_CC); +#else + return Z_OBJ_HT_P(object)->has_property(object, propname, 0 TSRMLS_CC); +#endif + } + return 0; +} + +static int TWIG_HAS_DYNAMIC_PROPERTY(zval *object, char *prop, int prop_len TSRMLS_DC) +{ + if (Z_OBJ_HT_P(object)->get_properties) { + return zend_hash_quick_exists( + Z_OBJ_HT_P(object)->get_properties(object TSRMLS_CC), // the properties hash + prop, // property name + prop_len + 1, // property length + zend_get_hash_value(prop, prop_len + 1) // hash value + ); + } + return 0; +} + +static zval *TWIG_PROPERTY_CHAR(zval *object, char *propname TSRMLS_DC) +{ + zval *tmp_name_zval, *tmp; + + ALLOC_INIT_ZVAL(tmp_name_zval); + ZVAL_STRING(tmp_name_zval, propname, 1); + tmp = TWIG_PROPERTY(object, tmp_name_zval TSRMLS_CC); + FREE_DTOR(tmp_name_zval); + return tmp; +} + +static zval *TWIG_CALL_S(zval *object, char *method, char *arg0 TSRMLS_DC) +{ + zend_fcall_info fci; + zval **args[1]; + zval *argument; + zval *zfunction; + zval *retval_ptr; + + MAKE_STD_ZVAL(argument); + ZVAL_STRING(argument, arg0, 1); + args[0] = &argument; + + MAKE_STD_ZVAL(zfunction); + ZVAL_STRING(zfunction, method, 1); + fci.size = sizeof(fci); + fci.function_table = EG(function_table); + fci.function_name = zfunction; + fci.symbol_table = NULL; +#if PHP_VERSION_ID >= 50300 + fci.object_ptr = object; +#else + fci.object_pp = &object; +#endif + fci.retval_ptr_ptr = &retval_ptr; + fci.param_count = 1; + fci.params = args; + fci.no_separation = 0; + + if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE) { + FREE_DTOR(zfunction); + zval_ptr_dtor(&argument); + return 0; + } + FREE_DTOR(zfunction); + zval_ptr_dtor(&argument); + return retval_ptr; +} + +static int TWIG_CALL_SB(zval *object, char *method, char *arg0 TSRMLS_DC) +{ + zval *retval_ptr; + int success; + + retval_ptr = TWIG_CALL_S(object, method, arg0 TSRMLS_CC); + success = (retval_ptr && (Z_TYPE_P(retval_ptr) == IS_BOOL) && Z_LVAL_P(retval_ptr)); + + if (retval_ptr) { + zval_ptr_dtor(&retval_ptr); + } + + return success; +} + +static int TWIG_CALL_ZZ(zval *object, char *method, zval *arg1, zval *arg2 TSRMLS_DC) +{ + zend_fcall_info fci; + zval **args[2]; + zval *zfunction; + zval *retval_ptr; + int success; + + args[0] = &arg1; + args[1] = &arg2; + + MAKE_STD_ZVAL(zfunction); + ZVAL_STRING(zfunction, method, 1); + fci.size = sizeof(fci); + fci.function_table = EG(function_table); + fci.function_name = zfunction; + fci.symbol_table = NULL; +#if PHP_VERSION_ID >= 50300 + fci.object_ptr = object; +#else + fci.object_pp = &object; +#endif + fci.retval_ptr_ptr = &retval_ptr; + fci.param_count = 2; + fci.params = args; + fci.no_separation = 0; + + if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE) { + FREE_DTOR(zfunction); + return 0; + } + + FREE_DTOR(zfunction); + + success = (retval_ptr && (Z_TYPE_P(retval_ptr) == IS_BOOL) && Z_LVAL_P(retval_ptr)); + if (retval_ptr) { + zval_ptr_dtor(&retval_ptr); + } + + return success; +} + +#ifndef Z_SET_REFCOUNT_P +# define Z_SET_REFCOUNT_P(pz, rc) pz->refcount = rc +# define Z_UNSET_ISREF_P(pz) pz->is_ref = 0 +#endif + +static void TWIG_NEW(zval *object, char *class, zval *arg0, zval *arg1 TSRMLS_DC) +{ + zend_class_entry **pce; + + if (zend_lookup_class(class, strlen(class), &pce TSRMLS_CC) == FAILURE) { + return; + } + + Z_TYPE_P(object) = IS_OBJECT; + object_init_ex(object, *pce); + Z_SET_REFCOUNT_P(object, 1); + Z_UNSET_ISREF_P(object); + + TWIG_CALL_ZZ(object, "__construct", arg0, arg1 TSRMLS_CC); +} + +static int twig_add_array_key_to_string(void *pDest APPLY_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) +{ + smart_str *buf; + char *joiner; + APPLY_TSRMLS_FETCH(); + + buf = va_arg(args, smart_str*); + joiner = va_arg(args, char*); + + if (buf->len != 0) { + smart_str_appends(buf, joiner); + } + + if (hash_key->nKeyLength == 0) { + smart_str_append_long(buf, (long) hash_key->h); + } else { + char *key, *tmp_str; + int key_len, tmp_len; + key = php_addcslashes(hash_key->arKey, hash_key->nKeyLength - 1, &key_len, 0, "'\\", 2 TSRMLS_CC); + tmp_str = php_str_to_str_ex(key, key_len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL); + + smart_str_appendl(buf, tmp_str, tmp_len); + efree(key); + efree(tmp_str); + } + + return 0; +} + +static char *TWIG_IMPLODE_ARRAY_KEYS(char *joiner, zval *array TSRMLS_DC) +{ + smart_str collector = { 0, 0, 0 }; + + smart_str_appendl(&collector, "", 0); + zend_hash_apply_with_arguments(HASH_OF(array) APPLY_TSRMLS_CC, twig_add_array_key_to_string, 2, &collector, joiner); + smart_str_0(&collector); + + return collector.c; +} + +static void TWIG_RUNTIME_ERROR(zval *template TSRMLS_DC, char *message, ...) +{ + char *buffer; + va_list args; + zend_class_entry **pce; + zval *ex; + zval *constructor; + zval *zmessage; + zval *lineno; + zval *filename_func; + zval *filename; + zval *constructor_args[3]; + zval *constructor_retval; + + if (zend_lookup_class("Twig_Error_Runtime", strlen("Twig_Error_Runtime"), &pce TSRMLS_CC) == FAILURE) { + return; + } + + va_start(args, message); + vspprintf(&buffer, 0, message, args); + va_end(args); + + MAKE_STD_ZVAL(ex); + object_init_ex(ex, *pce); + + // Call Twig_Error constructor + MAKE_STD_ZVAL(constructor); + MAKE_STD_ZVAL(zmessage); + MAKE_STD_ZVAL(lineno); + MAKE_STD_ZVAL(filename); + MAKE_STD_ZVAL(filename_func); + MAKE_STD_ZVAL(constructor_retval); + + ZVAL_STRINGL(constructor, "__construct", sizeof("__construct")-1, 1); + ZVAL_STRING(zmessage, buffer, 1); + ZVAL_LONG(lineno, -1); + + // Get template filename + ZVAL_STRINGL(filename_func, "getTemplateName", sizeof("getTemplateName")-1, 1); + call_user_function(EG(function_table), &template, filename_func, filename, 0, 0 TSRMLS_CC); + + constructor_args[0] = zmessage; + constructor_args[1] = lineno; + constructor_args[2] = filename; + call_user_function(EG(function_table), &ex, constructor, constructor_retval, 3, constructor_args TSRMLS_CC); + + zval_ptr_dtor(&constructor_retval); + zval_ptr_dtor(&zmessage); + zval_ptr_dtor(&lineno); + zval_ptr_dtor(&filename); + FREE_DTOR(constructor); + FREE_DTOR(filename_func); + efree(buffer); + + zend_throw_exception_object(ex TSRMLS_CC); +} + +static char *TWIG_GET_CLASS_NAME(zval *object TSRMLS_DC) +{ + char *class_name; + zend_uint class_name_len; + + if (Z_TYPE_P(object) != IS_OBJECT) { + return ""; + } +#if PHP_API_VERSION >= 20100412 + zend_get_object_classname(object, (const char **) &class_name, &class_name_len TSRMLS_CC); +#else + zend_get_object_classname(object, &class_name, &class_name_len TSRMLS_CC); +#endif + return class_name; +} + +static int twig_add_method_to_class(void *pDest APPLY_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) +{ + zend_class_entry *ce; + zval *retval; + char *item; + size_t item_len; + zend_function *mptr = (zend_function *) pDest; + APPLY_TSRMLS_FETCH(); + + if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC)) { + return 0; + } + + ce = *va_arg(args, zend_class_entry**); + retval = va_arg(args, zval*); + + item_len = strlen(mptr->common.function_name); + item = estrndup(mptr->common.function_name, item_len); + php_strtolower(item, item_len); + + if (strcmp("getenvironment", item) == 0) { + zend_class_entry **twig_template_ce; + if (zend_lookup_class("Twig_Template", strlen("Twig_Template"), &twig_template_ce TSRMLS_CC) == FAILURE) { + return 0; + } + if (instanceof_function(ce, *twig_template_ce TSRMLS_CC)) { + return 0; + } + } + + add_assoc_stringl_ex(retval, item, item_len+1, item, item_len, 0); + + return 0; +} + +static int twig_add_property_to_class(void *pDest APPLY_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) +{ + zend_class_entry *ce; + zval *retval; + char *class_name, *prop_name; + zend_property_info *pptr = (zend_property_info *) pDest; + APPLY_TSRMLS_FETCH(); + + if (!(pptr->flags & ZEND_ACC_PUBLIC) || (pptr->flags & ZEND_ACC_STATIC)) { + return 0; + } + + ce = *va_arg(args, zend_class_entry**); + retval = va_arg(args, zval*); + +#if PHP_API_VERSION >= 20100412 + zend_unmangle_property_name(pptr->name, pptr->name_length, (const char **) &class_name, (const char **) &prop_name); +#else + zend_unmangle_property_name(pptr->name, pptr->name_length, &class_name, &prop_name); +#endif + + add_assoc_string(retval, prop_name, prop_name, 1); + + return 0; +} + +static void twig_add_class_to_cache(zval *cache, zval *object, char *class_name TSRMLS_DC) +{ + zval *class_info, *class_methods, *class_properties; + zend_class_entry *class_ce; + + class_ce = zend_get_class_entry(object TSRMLS_CC); + + ALLOC_INIT_ZVAL(class_info); + ALLOC_INIT_ZVAL(class_methods); + ALLOC_INIT_ZVAL(class_properties); + array_init(class_info); + array_init(class_methods); + array_init(class_properties); + // add all methods to self::cache[$class]['methods'] + zend_hash_apply_with_arguments(&class_ce->function_table APPLY_TSRMLS_CC, twig_add_method_to_class, 2, &class_ce, class_methods); + zend_hash_apply_with_arguments(&class_ce->properties_info APPLY_TSRMLS_CC, twig_add_property_to_class, 2, &class_ce, class_properties); + + add_assoc_zval(class_info, "methods", class_methods); + add_assoc_zval(class_info, "properties", class_properties); + add_assoc_zval(cache, class_name, class_info); +} + +/* {{{ proto mixed twig_template_get_attributes(TwigTemplate template, mixed object, mixed item, array arguments, string type, boolean isDefinedTest, boolean ignoreStrictCheck) + A C implementation of TwigTemplate::getAttribute() */ +PHP_FUNCTION(twig_template_get_attributes) +{ + zval *template; + zval *object; + char *item; + int item_len; + zval *zitem, ztmpitem; + zval *arguments = NULL; + zval *ret = NULL; + char *type = NULL; + int type_len = 0; + zend_bool isDefinedTest = 0; + zend_bool ignoreStrictCheck = 0; + int free_ret = 0; + zval *tmp_self_cache; + char *class_name = NULL; + zval *tmp_class; + char *type_name; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ozz|asbb", &template, &object, &zitem, &arguments, &type, &type_len, &isDefinedTest, &ignoreStrictCheck) == FAILURE) { + return; + } + + // convert the item to a string + ztmpitem = *zitem; + zval_copy_ctor(&ztmpitem); + convert_to_string(&ztmpitem); + item_len = Z_STRLEN(ztmpitem); + item = estrndup(Z_STRVAL(ztmpitem), item_len); + zval_dtor(&ztmpitem); + + if (!type) { + type = "any"; + } + +/* + // array + if (Twig_Template::METHOD_CALL !== $type) { + $arrayItem = is_bool($item) || is_float($item) ? (int) $item : $item; + + if ((is_array($object) && array_key_exists($arrayItem, $object)) + || ($object instanceof ArrayAccess && isset($object[$arrayItem])) + ) { + if ($isDefinedTest) { + return true; + } + + return $object[$arrayItem]; + } +*/ + + + if (strcmp("method", type) != 0) { + if ((TWIG_ARRAY_KEY_EXISTS(object, zitem)) + || (TWIG_INSTANCE_OF(object, zend_ce_arrayaccess TSRMLS_CC) && TWIG_ISSET_ARRAYOBJECT_ELEMENT(object, zitem TSRMLS_CC)) + ) { + + if (isDefinedTest) { + efree(item); + RETURN_TRUE; + } + + ret = TWIG_GET_ARRAY_ELEMENT_ZVAL(object, zitem TSRMLS_CC); + + if (!ret) { + ret = &EG(uninitialized_zval); + } + RETVAL_ZVAL(ret, 1, 0); + if (free_ret) { + zval_ptr_dtor(&ret); + } + efree(item); + return; + } +/* + if (Twig_Template::ARRAY_CALL === $type) { + if ($isDefinedTest) { + return false; + } + if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { + return null; + } +*/ + if (strcmp("array", type) == 0 || Z_TYPE_P(object) != IS_OBJECT) { + if (isDefinedTest) { + efree(item); + RETURN_FALSE; + } + if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) { + efree(item); + return; + } +/* + if ($object instanceof ArrayAccess) { + $message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist', $arrayItem, get_class($object)); + } elseif (is_object($object)) { + $message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface', $item, get_class($object)); + } elseif (is_array($object)) { + if (empty($object)) { + $message = sprintf('Key "%s" does not exist as the array is empty', $arrayItem); + } else { + $message = sprintf('Key "%s" for array with keys "%s" does not exist', $arrayItem, implode(', ', array_keys($object))); + } + } elseif (Twig_Template::ARRAY_CALL === $type) { + if (null === $object) { + $message = sprintf('Impossible to access a key ("%s") on a null variable', $item); + } else { + $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s")', $item, gettype($object), $object); + } + } elseif (null === $object) { + $message = sprintf('Impossible to access an attribute ("%s") on a null variable', $item); + } else { + $message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s")', $item, gettype($object), $object); + } + throw new Twig_Error_Runtime($message, -1, $this->getTemplateName()); + } + } +*/ + if (TWIG_INSTANCE_OF(object, zend_ce_arrayaccess TSRMLS_CC)) { + TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Key \"%s\" in object with ArrayAccess of class \"%s\" does not exist.", item, TWIG_GET_CLASS_NAME(object TSRMLS_CC)); + } else if (Z_TYPE_P(object) == IS_OBJECT) { + TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Impossible to access a key \"%s\" on an object of class \"%s\" that does not implement ArrayAccess interface.", item, TWIG_GET_CLASS_NAME(object TSRMLS_CC)); + } else if (Z_TYPE_P(object) == IS_ARRAY) { + if (0 == zend_hash_num_elements(Z_ARRVAL_P(object))) { + TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Key \"%s\" does not exist as the array is empty.", item); + } else { + char *array_keys = TWIG_IMPLODE_ARRAY_KEYS(", ", object TSRMLS_CC); + TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Key \"%s\" for array with keys \"%s\" does not exist.", item, array_keys); + efree(array_keys); + } + } else { + char *type_name = zend_zval_type_name(object); + Z_ADDREF_P(object); + if (Z_TYPE_P(object) == IS_NULL) { + convert_to_string(object); + TWIG_RUNTIME_ERROR(template TSRMLS_CC, + (strcmp("array", type) == 0) + ? "Impossible to access a key (\"%s\") on a %s variable." + : "Impossible to access an attribute (\"%s\") on a %s variable.", + item, type_name); + } else { + convert_to_string(object); + TWIG_RUNTIME_ERROR(template TSRMLS_CC, + (strcmp("array", type) == 0) + ? "Impossible to access a key (\"%s\") on a %s variable (\"%s\")." + : "Impossible to access an attribute (\"%s\") on a %s variable (\"%s\").", + item, type_name, Z_STRVAL_P(object)); + } + zval_ptr_dtor(&object); + } + efree(item); + return; + } + } + +/* + if (!is_object($object)) { + if ($isDefinedTest) { + return false; + } +*/ + + if (Z_TYPE_P(object) != IS_OBJECT) { + if (isDefinedTest) { + efree(item); + RETURN_FALSE; + } +/* + if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { + return null; + } + + if (null === $object) { + $message = sprintf('Impossible to invoke a method ("%s") on a null variable', $item); + } else { + $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s")', $item, gettype($object), $object); + } + + throw new Twig_Error_Runtime($message, -1, $this->getTemplateName()); + } +*/ + if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) { + efree(item); + return; + } + + type_name = zend_zval_type_name(object); + Z_ADDREF_P(object); + if (Z_TYPE_P(object) == IS_NULL) { + convert_to_string_ex(&object); + + TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Impossible to invoke a method (\"%s\") on a %s variable.", item, type_name); + } else { + convert_to_string_ex(&object); + + TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Impossible to invoke a method (\"%s\") on a %s variable (\"%s\").", item, type_name, Z_STRVAL_P(object)); + } + + zval_ptr_dtor(&object); + efree(item); + return; + } +/* + $class = get_class($object); +*/ + + class_name = TWIG_GET_CLASS_NAME(object TSRMLS_CC); + tmp_self_cache = TWIG_GET_STATIC_PROPERTY(template, "cache" TSRMLS_CC); + tmp_class = TWIG_GET_ARRAY_ELEMENT(tmp_self_cache, class_name, strlen(class_name) TSRMLS_CC); + + if (!tmp_class) { + twig_add_class_to_cache(tmp_self_cache, object, class_name TSRMLS_CC); + tmp_class = TWIG_GET_ARRAY_ELEMENT(tmp_self_cache, class_name, strlen(class_name) TSRMLS_CC); + } + efree(class_name); + +/* + // object property + if (Twig_Template::METHOD_CALL !== $type && !$object instanceof Twig_Template) { + if (isset($object->$item) || array_key_exists((string) $item, $object)) { + if ($isDefinedTest) { + return true; + } + + if ($this->env->hasExtension('Twig_Extension_Sandbox')) { + $this->env->getExtension('Twig_Extension_Sandbox')->checkPropertyAllowed($object, $item); + } + + return $object->$item; + } + } +*/ + if (strcmp("method", type) != 0 && !TWIG_INSTANCE_OF_USERLAND(object, "Twig_Template" TSRMLS_CC)) { + zval *tmp_properties, *tmp_item; + + tmp_properties = TWIG_GET_ARRAY_ELEMENT(tmp_class, "properties", strlen("properties") TSRMLS_CC); + tmp_item = TWIG_GET_ARRAY_ELEMENT(tmp_properties, item, item_len TSRMLS_CC); + + if (tmp_item || TWIG_HAS_PROPERTY(object, zitem TSRMLS_CC) || TWIG_HAS_DYNAMIC_PROPERTY(object, item, item_len TSRMLS_CC)) { + if (isDefinedTest) { + efree(item); + RETURN_TRUE; + } + if (TWIG_CALL_SB(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "hasExtension", "Twig_Extension_Sandbox" TSRMLS_CC)) { + TWIG_CALL_ZZ(TWIG_CALL_S(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "getExtension", "Twig_Extension_Sandbox" TSRMLS_CC), "checkPropertyAllowed", object, zitem TSRMLS_CC); + } + if (EG(exception)) { + efree(item); + return; + } + + ret = TWIG_PROPERTY(object, zitem TSRMLS_CC); + efree(item); + RETURN_ZVAL(ret, 1, 0); + } + } +/* + // object method + if (!isset(self::$cache[$class]['methods'])) { + if ($object instanceof self) { + $ref = new ReflectionClass($class); + $methods = array(); + + foreach ($ref->getMethods(ReflectionMethod::IS_PUBLIC) as $refMethod) { + $methodName = strtolower($refMethod->name); + + // Accessing the environment from templates is forbidden to prevent untrusted changes to the environment + if ('getenvironment' !== $methodName) { + $methods[$methodName] = true; + } + } + + self::$cache[$class]['methods'] = $methods; + } else { + self::$cache[$class]['methods'] = array_change_key_case(array_flip(get_class_methods($object))); + } + } + + $call = false; + $lcItem = strtolower($item); + if (isset(self::$cache[$class]['methods'][$lcItem])) { + $method = (string) $item; + } elseif (isset(self::$cache[$class]['methods']['get'.$lcItem])) { + $method = 'get'.$item; + } elseif (isset(self::$cache[$class]['methods']['is'.$lcItem])) { + $method = 'is'.$item; + } elseif (isset(self::$cache[$class]['methods']['__call'])) { + $method = (string) $item; + $call = true; +*/ + { + int call = 0; + char *lcItem = TWIG_STRTOLOWER(item, item_len); + int lcItem_length; + char *method = NULL; + char *tmp_method_name_get; + char *tmp_method_name_is; + zval *zmethod; + zval *tmp_methods; + + lcItem_length = strlen(lcItem); + tmp_method_name_get = emalloc(4 + lcItem_length); + tmp_method_name_is = emalloc(3 + lcItem_length); + + sprintf(tmp_method_name_get, "get%s", lcItem); + sprintf(tmp_method_name_is, "is%s", lcItem); + + tmp_methods = TWIG_GET_ARRAY_ELEMENT(tmp_class, "methods", strlen("methods") TSRMLS_CC); + + if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, lcItem, lcItem_length TSRMLS_CC)) { + method = item; + } else if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, tmp_method_name_get, lcItem_length + 3 TSRMLS_CC)) { + method = tmp_method_name_get; + } else if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, tmp_method_name_is, lcItem_length + 2 TSRMLS_CC)) { + method = tmp_method_name_is; + } else if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, "__call", 6 TSRMLS_CC)) { + method = item; + call = 1; +/* + } else { + if ($isDefinedTest) { + return false; + } + + if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { + return null; + } + + throw new Twig_Error_Runtime(sprintf('Method "%s" for object "%s" does not exist.', $item, get_class($object)), -1, $this->getTemplateName()); + } + + if ($isDefinedTest) { + return true; + } +*/ + } else { + efree(tmp_method_name_get); + efree(tmp_method_name_is); + efree(lcItem); + + if (isDefinedTest) { + efree(item); + RETURN_FALSE; + } + if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) { + efree(item); + return; + } + TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Neither the property \"%s\" nor one of the methods \"%s()\", \"get%s()\"/\"is%s()\" or \"__call()\" exist and have public access in class \"%s\".", item, item, item, item, TWIG_GET_CLASS_NAME(object TSRMLS_CC)); + efree(item); + return; + } + + if (isDefinedTest) { + efree(tmp_method_name_get); + efree(tmp_method_name_is); + efree(lcItem);efree(item); + RETURN_TRUE; + } +/* + if ($this->env->hasExtension('Twig_Extension_Sandbox')) { + $this->env->getExtension('Twig_Extension_Sandbox')->checkMethodAllowed($object, $method); + } +*/ + MAKE_STD_ZVAL(zmethod); + ZVAL_STRING(zmethod, method, 1); + if (TWIG_CALL_SB(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "hasExtension", "Twig_Extension_Sandbox" TSRMLS_CC)) { + TWIG_CALL_ZZ(TWIG_CALL_S(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "getExtension", "Twig_Extension_Sandbox" TSRMLS_CC), "checkMethodAllowed", object, zmethod TSRMLS_CC); + } + zval_ptr_dtor(&zmethod); + if (EG(exception)) { + efree(tmp_method_name_get); + efree(tmp_method_name_is); + efree(lcItem);efree(item); + return; + } +/* + // Some objects throw exceptions when they have __call, and the method we try + // to call is not supported. If ignoreStrictCheck is true, we should return null. + try { + $ret = call_user_func_array(array($object, $method), $arguments); + } catch (BadMethodCallException $e) { + if ($call && ($ignoreStrictCheck || !$this->env->isStrictVariables())) { + return null; + } + throw $e; + } +*/ + ret = TWIG_CALL_USER_FUNC_ARRAY(object, method, arguments TSRMLS_CC); + if (EG(exception) && TWIG_INSTANCE_OF(EG(exception), spl_ce_BadMethodCallException TSRMLS_CC)) { + if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) { + efree(tmp_method_name_get); + efree(tmp_method_name_is); + efree(lcItem);efree(item); + zend_clear_exception(TSRMLS_C); + return; + } + } + free_ret = 1; + efree(tmp_method_name_get); + efree(tmp_method_name_is); + efree(lcItem); + } +/* + // useful when calling a template method from a template + // this is not supported but unfortunately heavily used in the Symfony profiler + if ($object instanceof Twig_TemplateInterface) { + return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset()); + } + + return $ret; +*/ + efree(item); + // ret can be null, if e.g. the called method throws an exception + if (ret) { + if (TWIG_INSTANCE_OF_USERLAND(object, "Twig_TemplateInterface" TSRMLS_CC)) { + if (Z_STRLEN_P(ret) != 0) { + zval *charset = TWIG_CALL_USER_FUNC_ARRAY(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "getCharset", NULL TSRMLS_CC); + TWIG_NEW(return_value, "Twig_Markup", ret, charset TSRMLS_CC); + zval_ptr_dtor(&charset); + if (ret) { + zval_ptr_dtor(&ret); + } + return; + } + } + + RETVAL_ZVAL(ret, 1, 0); + if (free_ret) { + zval_ptr_dtor(&ret); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Autoloader.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Autoloader.php new file mode 100644 index 000000000..14016b296 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Autoloader.php @@ -0,0 +1,54 @@ + + * + * @deprecated since 1.21 and will be removed in 2.0. Use Composer instead. 2.0. + */ +class Twig_Autoloader +{ + /** + * Registers Twig_Autoloader as an SPL autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not. + */ + public static function register($prepend = false) + { + @trigger_error('Using Twig_Autoloader is deprecated since version 1.21. Use Composer instead.', E_USER_DEPRECATED); + + if (PHP_VERSION_ID < 50300) { + spl_autoload_register(array(__CLASS__, 'autoload')); + } else { + spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend); + } + } + + /** + * Handles autoloading of classes. + * + * @param string $class A class name. + */ + public static function autoload($class) + { + if (0 !== strpos($class, 'Twig')) { + return; + } + + if (is_file($file = dirname(__FILE__).'/../'.str_replace(array('_', "\0"), array('/', ''), $class).'.php')) { + require $file; + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php new file mode 100644 index 000000000..3c6ef6626 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php @@ -0,0 +1,62 @@ + + */ +abstract class Twig_BaseNodeVisitor implements Twig_NodeVisitorInterface +{ + /** + * {@inheritdoc} + */ + final public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) + { + if (!$node instanceof Twig_Node) { + throw new LogicException('Twig_BaseNodeVisitor only supports Twig_Node instances.'); + } + + return $this->doEnterNode($node, $env); + } + + /** + * {@inheritdoc} + */ + final public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env) + { + if (!$node instanceof Twig_Node) { + throw new LogicException('Twig_BaseNodeVisitor only supports Twig_Node instances.'); + } + + return $this->doLeaveNode($node, $env); + } + + /** + * Called before child nodes are visited. + * + * @param Twig_Node $node The node to visit + * @param Twig_Environment $env The Twig environment instance + * + * @return Twig_Node The modified node + */ + abstract protected function doEnterNode(Twig_Node $node, Twig_Environment $env); + + /** + * Called after child nodes are visited. + * + * @param Twig_Node $node The node to visit + * @param Twig_Environment $env The Twig environment instance + * + * @return Twig_Node|false The modified node or false if the node must be removed + */ + abstract protected function doLeaveNode(Twig_Node $node, Twig_Environment $env); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Cache/Filesystem.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Cache/Filesystem.php new file mode 100644 index 000000000..9e70ca9e5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Cache/Filesystem.php @@ -0,0 +1,98 @@ + + */ +class Twig_Cache_Filesystem implements Twig_CacheInterface +{ + const FORCE_BYTECODE_INVALIDATION = 1; + + private $directory; + private $options; + + /** + * @param $directory string The root cache directory + * @param $options int A set of options + */ + public function __construct($directory, $options = 0) + { + $this->directory = rtrim($directory, '\/').'/'; + $this->options = $options; + } + + /** + * {@inheritdoc} + */ + public function generateKey($name, $className) + { + $hash = hash('sha256', $className); + + return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php'; + } + + /** + * {@inheritdoc} + */ + public function load($key) + { + if (file_exists($key)) { + @include_once $key; + } + } + + /** + * {@inheritdoc} + */ + public function write($key, $content) + { + $dir = dirname($key); + if (!is_dir($dir)) { + if (false === @mkdir($dir, 0777, true) && !is_dir($dir)) { + throw new RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir)); + } + } elseif (!is_writable($dir)) { + throw new RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir)); + } + + $tmpFile = tempnam($dir, basename($key)); + if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) { + @chmod($key, 0666 & ~umask()); + + if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) { + // Compile cached file into bytecode cache + if (function_exists('opcache_invalidate')) { + opcache_invalidate($key, true); + } elseif (function_exists('apc_compile_file')) { + apc_compile_file($key); + } + } + + return; + } + + throw new RuntimeException(sprintf('Failed to write cache file "%s".', $key)); + } + + /** + * {@inheritdoc} + */ + public function getTimestamp($key) + { + if (!file_exists($key)) { + return 0; + } + + return (int) @filemtime($key); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Cache/Null.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Cache/Null.php new file mode 100644 index 000000000..fde8c8082 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Cache/Null.php @@ -0,0 +1,48 @@ + + */ +class Twig_Cache_Null implements Twig_CacheInterface +{ + /** + * {@inheritdoc} + */ + public function generateKey($name, $className) + { + return ''; + } + + /** + * {@inheritdoc} + */ + public function write($key, $content) + { + } + + /** + * {@inheritdoc} + */ + public function load($key) + { + } + + /** + * {@inheritdoc} + */ + public function getTimestamp($key) + { + return 0; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/CacheInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/CacheInterface.php new file mode 100644 index 000000000..9b17e0f42 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/CacheInterface.php @@ -0,0 +1,56 @@ + + */ +interface Twig_CacheInterface +{ + /** + * Generates a cache key for the given template class name. + * + * @param string $name The template name + * @param string $className The template class name + * + * @return string + */ + public function generateKey($name, $className); + + /** + * Writes the compiled template to cache. + * + * @param string $key The cache key + * @param string $content The template representation as a PHP class + */ + public function write($key, $content); + + /** + * Loads a template from the cache. + * + * @param string $key The cache key + */ + public function load($key); + + /** + * Returns the modification timestamp of a key. + * + * @param string $key The cache key + * + * @return int + */ + public function getTimestamp($key); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Compiler.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Compiler.php new file mode 100644 index 000000000..16894b535 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Compiler.php @@ -0,0 +1,285 @@ + + */ +class Twig_Compiler implements Twig_CompilerInterface +{ + protected $lastLine; + protected $source; + protected $indentation; + protected $env; + protected $debugInfo = array(); + protected $sourceOffset; + protected $sourceLine; + protected $filename; + + /** + * Constructor. + * + * @param Twig_Environment $env The twig environment instance + */ + public function __construct(Twig_Environment $env) + { + $this->env = $env; + } + + /** + * @deprecated since 1.25 (to be removed in 2.0) + */ + public function getFilename() + { + @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED); + + return $this->filename; + } + + /** + * Returns the environment instance related to this compiler. + * + * @return Twig_Environment The environment instance + */ + public function getEnvironment() + { + return $this->env; + } + + /** + * Gets the current PHP code after compilation. + * + * @return string The PHP code + */ + public function getSource() + { + return $this->source; + } + + /** + * Compiles a node. + * + * @param Twig_NodeInterface $node The node to compile + * @param int $indentation The current indentation + * + * @return Twig_Compiler The current compiler instance + */ + public function compile(Twig_NodeInterface $node, $indentation = 0) + { + $this->lastLine = null; + $this->source = ''; + $this->debugInfo = array(); + $this->sourceOffset = 0; + // source code starts at 1 (as we then increment it when we encounter new lines) + $this->sourceLine = 1; + $this->indentation = $indentation; + + if ($node instanceof Twig_Node_Module) { + $node->setFilename($node->getAttribute('filename')); + + // to be removed in 2.0 + $this->filename = $node->getAttribute('filename'); + } + + $node->compile($this); + + return $this; + } + + public function subcompile(Twig_NodeInterface $node, $raw = true) + { + if (false === $raw) { + $this->addIndentation(); + } + + $node->compile($this); + + return $this; + } + + /** + * Adds a raw string to the compiled code. + * + * @param string $string The string + * + * @return Twig_Compiler The current compiler instance + */ + public function raw($string) + { + $this->source .= $string; + + return $this; + } + + /** + * Writes a string to the compiled code by adding indentation. + * + * @return Twig_Compiler The current compiler instance + */ + public function write() + { + $strings = func_get_args(); + foreach ($strings as $string) { + $this->addIndentation(); + $this->source .= $string; + } + + return $this; + } + + /** + * Appends an indentation to the current PHP code after compilation. + * + * @return Twig_Compiler The current compiler instance + */ + public function addIndentation() + { + $this->source .= str_repeat(' ', $this->indentation * 4); + + return $this; + } + + /** + * Adds a quoted string to the compiled code. + * + * @param string $value The string + * + * @return Twig_Compiler The current compiler instance + */ + public function string($value) + { + $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\")); + + return $this; + } + + /** + * Returns a PHP representation of a given value. + * + * @param mixed $value The value to convert + * + * @return Twig_Compiler The current compiler instance + */ + public function repr($value) + { + if (is_int($value) || is_float($value)) { + if (false !== $locale = setlocale(LC_NUMERIC, 0)) { + setlocale(LC_NUMERIC, 'C'); + } + + $this->raw($value); + + if (false !== $locale) { + setlocale(LC_NUMERIC, $locale); + } + } elseif (null === $value) { + $this->raw('null'); + } elseif (is_bool($value)) { + $this->raw($value ? 'true' : 'false'); + } elseif (is_array($value)) { + $this->raw('array('); + $first = true; + foreach ($value as $key => $v) { + if (!$first) { + $this->raw(', '); + } + $first = false; + $this->repr($key); + $this->raw(' => '); + $this->repr($v); + } + $this->raw(')'); + } else { + $this->string($value); + } + + return $this; + } + + /** + * Adds debugging information. + * + * @param Twig_NodeInterface $node The related twig node + * + * @return Twig_Compiler The current compiler instance + */ + public function addDebugInfo(Twig_NodeInterface $node) + { + if ($node->getLine() != $this->lastLine) { + $this->write(sprintf("// line %d\n", $node->getLine())); + + // when mbstring.func_overload is set to 2 + // mb_substr_count() replaces substr_count() + // but they have different signatures! + if (((int) ini_get('mbstring.func_overload')) & 2) { + // this is much slower than the "right" version + $this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "\n"); + } else { + $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset); + } + $this->sourceOffset = strlen($this->source); + $this->debugInfo[$this->sourceLine] = $node->getLine(); + + $this->lastLine = $node->getLine(); + } + + return $this; + } + + public function getDebugInfo() + { + ksort($this->debugInfo); + + return $this->debugInfo; + } + + /** + * Indents the generated code. + * + * @param int $step The number of indentation to add + * + * @return Twig_Compiler The current compiler instance + */ + public function indent($step = 1) + { + $this->indentation += $step; + + return $this; + } + + /** + * Outdents the generated code. + * + * @param int $step The number of indentation to remove + * + * @return Twig_Compiler The current compiler instance + * + * @throws LogicException When trying to outdent too much so the indentation would become negative + */ + public function outdent($step = 1) + { + // can't outdent by more steps than the current indentation level + if ($this->indentation < $step) { + throw new LogicException('Unable to call outdent() as the indentation would become negative.'); + } + + $this->indentation -= $step; + + return $this; + } + + public function getVarName() + { + return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false)); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/CompilerInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/CompilerInterface.php new file mode 100644 index 000000000..272c7672f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/CompilerInterface.php @@ -0,0 +1,36 @@ + + * + * @deprecated since 1.12 (to be removed in 3.0) + */ +interface Twig_CompilerInterface +{ + /** + * Compiles a node. + * + * @param Twig_NodeInterface $node The node to compile + * + * @return Twig_CompilerInterface The current compiler instance + */ + public function compile(Twig_NodeInterface $node); + + /** + * Gets the current PHP code after compilation. + * + * @return string The PHP code + */ + public function getSource(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Environment.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Environment.php new file mode 100644 index 000000000..562f20913 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Environment.php @@ -0,0 +1,1520 @@ + + */ +class Twig_Environment +{ + const VERSION = '1.26.1'; + + protected $charset; + protected $loader; + protected $debug; + protected $autoReload; + protected $cache; + protected $lexer; + protected $parser; + protected $compiler; + protected $baseTemplateClass; + protected $extensions; + protected $parsers; + protected $visitors; + protected $filters; + protected $tests; + protected $functions; + protected $globals; + protected $runtimeInitialized = false; + protected $extensionInitialized = false; + protected $loadedTemplates; + protected $strictVariables; + protected $unaryOperators; + protected $binaryOperators; + protected $templateClassPrefix = '__TwigTemplate_'; + protected $functionCallbacks = array(); + protected $filterCallbacks = array(); + protected $staging; + + private $originalCache; + private $bcWriteCacheFile = false; + private $bcGetCacheFilename = false; + private $lastModifiedExtension = 0; + private $legacyExtensionNames = array(); + private $runtimeLoaders = array(); + private $runtimes = array(); + private $optionsHash; + + /** + * Constructor. + * + * Available options: + * + * * debug: When set to true, it automatically set "auto_reload" to true as + * well (default to false). + * + * * charset: The charset used by the templates (default to UTF-8). + * + * * base_template_class: The base template class to use for generated + * templates (default to Twig_Template). + * + * * cache: An absolute path where to store the compiled templates, + * a Twig_Cache_Interface implementation, + * or false to disable compilation cache (default). + * + * * auto_reload: Whether to reload the template if the original source changed. + * If you don't provide the auto_reload option, it will be + * determined automatically based on the debug value. + * + * * strict_variables: Whether to ignore invalid variables in templates + * (default to false). + * + * * autoescape: Whether to enable auto-escaping (default to html): + * * false: disable auto-escaping + * * true: equivalent to html + * * html, js: set the autoescaping to one of the supported strategies + * * filename: set the autoescaping strategy based on the template filename extension + * * PHP callback: a PHP callback that returns an escaping strategy based on the template "filename" + * + * * optimizations: A flag that indicates which optimizations to apply + * (default to -1 which means that all optimizations are enabled; + * set it to 0 to disable). + * + * @param Twig_LoaderInterface $loader A Twig_LoaderInterface instance + * @param array $options An array of options + */ + public function __construct(Twig_LoaderInterface $loader = null, $options = array()) + { + if (null !== $loader) { + $this->setLoader($loader); + } else { + @trigger_error('Not passing a Twig_LoaderInterface as the first constructor argument of Twig_Environment is deprecated since version 1.21.', E_USER_DEPRECATED); + } + + $options = array_merge(array( + 'debug' => false, + 'charset' => 'UTF-8', + 'base_template_class' => 'Twig_Template', + 'strict_variables' => false, + 'autoescape' => 'html', + 'cache' => false, + 'auto_reload' => null, + 'optimizations' => -1, + ), $options); + + $this->debug = (bool) $options['debug']; + $this->charset = strtoupper($options['charset']); + $this->baseTemplateClass = $options['base_template_class']; + $this->autoReload = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload']; + $this->strictVariables = (bool) $options['strict_variables']; + $this->setCache($options['cache']); + + $this->addExtension(new Twig_Extension_Core()); + $this->addExtension(new Twig_Extension_Escaper($options['autoescape'])); + $this->addExtension(new Twig_Extension_Optimizer($options['optimizations'])); + $this->staging = new Twig_Extension_Staging(); + + // For BC + if (is_string($this->originalCache)) { + $r = new ReflectionMethod($this, 'writeCacheFile'); + if ($r->getDeclaringClass()->getName() !== __CLASS__) { + @trigger_error('The Twig_Environment::writeCacheFile method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED); + + $this->bcWriteCacheFile = true; + } + + $r = new ReflectionMethod($this, 'getCacheFilename'); + if ($r->getDeclaringClass()->getName() !== __CLASS__) { + @trigger_error('The Twig_Environment::getCacheFilename method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED); + + $this->bcGetCacheFilename = true; + } + } + } + + /** + * Gets the base template class for compiled templates. + * + * @return string The base template class name + */ + public function getBaseTemplateClass() + { + return $this->baseTemplateClass; + } + + /** + * Sets the base template class for compiled templates. + * + * @param string $class The base template class name + */ + public function setBaseTemplateClass($class) + { + $this->baseTemplateClass = $class; + $this->updateOptionsHash(); + } + + /** + * Enables debugging mode. + */ + public function enableDebug() + { + $this->debug = true; + $this->updateOptionsHash(); + } + + /** + * Disables debugging mode. + */ + public function disableDebug() + { + $this->debug = false; + $this->updateOptionsHash(); + } + + /** + * Checks if debug mode is enabled. + * + * @return bool true if debug mode is enabled, false otherwise + */ + public function isDebug() + { + return $this->debug; + } + + /** + * Enables the auto_reload option. + */ + public function enableAutoReload() + { + $this->autoReload = true; + } + + /** + * Disables the auto_reload option. + */ + public function disableAutoReload() + { + $this->autoReload = false; + } + + /** + * Checks if the auto_reload option is enabled. + * + * @return bool true if auto_reload is enabled, false otherwise + */ + public function isAutoReload() + { + return $this->autoReload; + } + + /** + * Enables the strict_variables option. + */ + public function enableStrictVariables() + { + $this->strictVariables = true; + $this->updateOptionsHash(); + } + + /** + * Disables the strict_variables option. + */ + public function disableStrictVariables() + { + $this->strictVariables = false; + $this->updateOptionsHash(); + } + + /** + * Checks if the strict_variables option is enabled. + * + * @return bool true if strict_variables is enabled, false otherwise + */ + public function isStrictVariables() + { + return $this->strictVariables; + } + + /** + * Gets the current cache implementation. + * + * @param bool $original Whether to return the original cache option or the real cache instance + * + * @return Twig_CacheInterface|string|false A Twig_CacheInterface implementation, + * an absolute path to the compiled templates, + * or false to disable cache + */ + public function getCache($original = true) + { + return $original ? $this->originalCache : $this->cache; + } + + /** + * Sets the current cache implementation. + * + * @param Twig_CacheInterface|string|false $cache A Twig_CacheInterface implementation, + * an absolute path to the compiled templates, + * or false to disable cache + */ + public function setCache($cache) + { + if (is_string($cache)) { + $this->originalCache = $cache; + $this->cache = new Twig_Cache_Filesystem($cache); + } elseif (false === $cache) { + $this->originalCache = $cache; + $this->cache = new Twig_Cache_Null(); + } elseif (null === $cache) { + @trigger_error('Using "null" as the cache strategy is deprecated since version 1.23 and will be removed in Twig 2.0.', E_USER_DEPRECATED); + $this->originalCache = false; + $this->cache = new Twig_Cache_Null(); + } elseif ($cache instanceof Twig_CacheInterface) { + $this->originalCache = $this->cache = $cache; + } else { + throw new LogicException(sprintf('Cache can only be a string, false, or a Twig_CacheInterface implementation.')); + } + } + + /** + * Gets the cache filename for a given template. + * + * @param string $name The template name + * + * @return string|false The cache file name or false when caching is disabled + * + * @deprecated since 1.22 (to be removed in 2.0) + */ + public function getCacheFilename($name) + { + @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED); + + $key = $this->cache->generateKey($name, $this->getTemplateClass($name)); + + return !$key ? false : $key; + } + + /** + * Gets the template class associated with the given string. + * + * The generated template class is based on the following parameters: + * + * * The cache key for the given template; + * * The currently enabled extensions; + * * Whether the Twig C extension is available or not; + * * PHP version; + * * Twig version; + * * Options with what environment was created. + * + * @param string $name The name for which to calculate the template class name + * @param int|null $index The index if it is an embedded template + * + * @return string The template class name + */ + public function getTemplateClass($name, $index = null) + { + $key = $this->getLoader()->getCacheKey($name).$this->optionsHash; + + return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '_'.$index); + } + + /** + * Gets the template class prefix. + * + * @return string The template class prefix + * + * @deprecated since 1.22 (to be removed in 2.0) + */ + public function getTemplateClassPrefix() + { + @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED); + + return $this->templateClassPrefix; + } + + /** + * Renders a template. + * + * @param string $name The template name + * @param array $context An array of parameters to pass to the template + * + * @return string The rendered template + * + * @throws Twig_Error_Loader When the template cannot be found + * @throws Twig_Error_Syntax When an error occurred during compilation + * @throws Twig_Error_Runtime When an error occurred during rendering + */ + public function render($name, array $context = array()) + { + return $this->loadTemplate($name)->render($context); + } + + /** + * Displays a template. + * + * @param string $name The template name + * @param array $context An array of parameters to pass to the template + * + * @throws Twig_Error_Loader When the template cannot be found + * @throws Twig_Error_Syntax When an error occurred during compilation + * @throws Twig_Error_Runtime When an error occurred during rendering + */ + public function display($name, array $context = array()) + { + $this->loadTemplate($name)->display($context); + } + + /** + * Loads a template by name. + * + * @param string $name The template name + * @param int $index The index if it is an embedded template + * + * @return Twig_TemplateInterface A template instance representing the given template name + * + * @throws Twig_Error_Loader When the template cannot be found + * @throws Twig_Error_Syntax When an error occurred during compilation + */ + public function loadTemplate($name, $index = null) + { + $cls = $this->getTemplateClass($name, $index); + + if (isset($this->loadedTemplates[$cls])) { + return $this->loadedTemplates[$cls]; + } + + if (!class_exists($cls, false)) { + if ($this->bcGetCacheFilename) { + $key = $this->getCacheFilename($name); + } else { + $key = $this->cache->generateKey($name, $cls); + } + + if (!$this->isAutoReload() || $this->isTemplateFresh($name, $this->cache->getTimestamp($key))) { + $this->cache->load($key); + } + + if (!class_exists($cls, false)) { + $content = $this->compileSource($this->getLoader()->getSource($name), $name); + if ($this->bcWriteCacheFile) { + $this->writeCacheFile($key, $content); + } else { + $this->cache->write($key, $content); + } + + eval('?>'.$content); + } + } + + if (!$this->runtimeInitialized) { + $this->initRuntime(); + } + + return $this->loadedTemplates[$cls] = new $cls($this); + } + + /** + * Creates a template from source. + * + * This method should not be used as a generic way to load templates. + * + * @param string $template The template name + * + * @return Twig_Template A template instance representing the given template name + * + * @throws Twig_Error_Loader When the template cannot be found + * @throws Twig_Error_Syntax When an error occurred during compilation + */ + public function createTemplate($template) + { + $name = sprintf('__string_template__%s', hash('sha256', uniqid(mt_rand(), true), false)); + + $loader = new Twig_Loader_Chain(array( + new Twig_Loader_Array(array($name => $template)), + $current = $this->getLoader(), + )); + + $this->setLoader($loader); + try { + $template = $this->loadTemplate($name); + } catch (Exception $e) { + $this->setLoader($current); + + throw $e; + } catch (Throwable $e) { + $this->setLoader($current); + + throw $e; + } + $this->setLoader($current); + + return $template; + } + + /** + * Returns true if the template is still fresh. + * + * Besides checking the loader for freshness information, + * this method also checks if the enabled extensions have + * not changed. + * + * @param string $name The template name + * @param int $time The last modification time of the cached template + * + * @return bool true if the template is fresh, false otherwise + */ + public function isTemplateFresh($name, $time) + { + if (0 === $this->lastModifiedExtension) { + foreach ($this->extensions as $extension) { + $r = new ReflectionObject($extension); + if (file_exists($r->getFileName()) && ($extensionTime = filemtime($r->getFileName())) > $this->lastModifiedExtension) { + $this->lastModifiedExtension = $extensionTime; + } + } + } + + return $this->lastModifiedExtension <= $time && $this->getLoader()->isFresh($name, $time); + } + + /** + * Tries to load a template consecutively from an array. + * + * Similar to loadTemplate() but it also accepts Twig_TemplateInterface instances and an array + * of templates where each is tried to be loaded. + * + * @param string|Twig_Template|array $names A template or an array of templates to try consecutively + * + * @return Twig_Template + * + * @throws Twig_Error_Loader When none of the templates can be found + * @throws Twig_Error_Syntax When an error occurred during compilation + */ + public function resolveTemplate($names) + { + if (!is_array($names)) { + $names = array($names); + } + + foreach ($names as $name) { + if ($name instanceof Twig_Template) { + return $name; + } + + try { + return $this->loadTemplate($name); + } catch (Twig_Error_Loader $e) { + } + } + + if (1 === count($names)) { + throw $e; + } + + throw new Twig_Error_Loader(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names))); + } + + /** + * Clears the internal template cache. + * + * @deprecated since 1.18.3 (to be removed in 2.0) + */ + public function clearTemplateCache() + { + @trigger_error(sprintf('The %s method is deprecated since version 1.18.3 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED); + + $this->loadedTemplates = array(); + } + + /** + * Clears the template cache files on the filesystem. + * + * @deprecated since 1.22 (to be removed in 2.0) + */ + public function clearCacheFiles() + { + @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED); + + if (is_string($this->originalCache)) { + foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->originalCache), RecursiveIteratorIterator::LEAVES_ONLY) as $file) { + if ($file->isFile()) { + @unlink($file->getPathname()); + } + } + } + } + + /** + * Gets the Lexer instance. + * + * @return Twig_LexerInterface A Twig_LexerInterface instance + * + * @deprecated since 1.25 (to be removed in 2.0) + */ + public function getLexer() + { + @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED); + + if (null === $this->lexer) { + $this->lexer = new Twig_Lexer($this); + } + + return $this->lexer; + } + + /** + * Sets the Lexer instance. + * + * @param Twig_LexerInterface $lexer A Twig_LexerInterface instance + */ + public function setLexer(Twig_LexerInterface $lexer) + { + $this->lexer = $lexer; + } + + /** + * Tokenizes a source code. + * + * @param string $source The template source code + * @param string $name The template name + * + * @return Twig_TokenStream A Twig_TokenStream instance + * + * @throws Twig_Error_Syntax When the code is syntactically wrong + */ + public function tokenize($source, $name = null) + { + if (null === $this->lexer) { + $this->lexer = new Twig_Lexer($this); + } + + return $this->lexer->tokenize($source, $name); + } + + /** + * Gets the Parser instance. + * + * @return Twig_ParserInterface A Twig_ParserInterface instance + * + * @deprecated since 1.25 (to be removed in 2.0) + */ + public function getParser() + { + @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED); + + if (null === $this->parser) { + $this->parser = new Twig_Parser($this); + } + + return $this->parser; + } + + /** + * Sets the Parser instance. + * + * @param Twig_ParserInterface $parser A Twig_ParserInterface instance + */ + public function setParser(Twig_ParserInterface $parser) + { + $this->parser = $parser; + } + + /** + * Converts a token stream to a node tree. + * + * @param Twig_TokenStream $stream A token stream instance + * + * @return Twig_Node_Module A node tree + * + * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong + */ + public function parse(Twig_TokenStream $stream) + { + if (null === $this->parser) { + $this->parser = new Twig_Parser($this); + } + + return $this->parser->parse($stream); + } + + /** + * Gets the Compiler instance. + * + * @return Twig_CompilerInterface A Twig_CompilerInterface instance + * + * @deprecated since 1.25 (to be removed in 2.0) + */ + public function getCompiler() + { + @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED); + + if (null === $this->compiler) { + $this->compiler = new Twig_Compiler($this); + } + + return $this->compiler; + } + + /** + * Sets the Compiler instance. + * + * @param Twig_CompilerInterface $compiler A Twig_CompilerInterface instance + */ + public function setCompiler(Twig_CompilerInterface $compiler) + { + $this->compiler = $compiler; + } + + /** + * Compiles a node and returns the PHP code. + * + * @param Twig_NodeInterface $node A Twig_NodeInterface instance + * + * @return string The compiled PHP source code + */ + public function compile(Twig_NodeInterface $node) + { + if (null === $this->compiler) { + $this->compiler = new Twig_Compiler($this); + } + + return $this->compiler->compile($node)->getSource(); + } + + /** + * Compiles a template source code. + * + * @param string $source The template source code + * @param string $name The template name + * + * @return string The compiled PHP source code + * + * @throws Twig_Error_Syntax When there was an error during tokenizing, parsing or compiling + */ + public function compileSource($source, $name = null) + { + try { + return $this->compile($this->parse($this->tokenize($source, $name))); + } catch (Twig_Error $e) { + $e->setTemplateFile($name); + throw $e; + } catch (Exception $e) { + throw new Twig_Error_Syntax(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $name, $e); + } + } + + /** + * Sets the Loader instance. + * + * @param Twig_LoaderInterface $loader A Twig_LoaderInterface instance + */ + public function setLoader(Twig_LoaderInterface $loader) + { + $this->loader = $loader; + } + + /** + * Gets the Loader instance. + * + * @return Twig_LoaderInterface A Twig_LoaderInterface instance + */ + public function getLoader() + { + if (null === $this->loader) { + throw new LogicException('You must set a loader first.'); + } + + return $this->loader; + } + + /** + * Sets the default template charset. + * + * @param string $charset The default charset + */ + public function setCharset($charset) + { + $this->charset = strtoupper($charset); + } + + /** + * Gets the default template charset. + * + * @return string The default charset + */ + public function getCharset() + { + return $this->charset; + } + + /** + * Initializes the runtime environment. + * + * @deprecated since 1.23 (to be removed in 2.0) + */ + public function initRuntime() + { + $this->runtimeInitialized = true; + + foreach ($this->getExtensions() as $name => $extension) { + if (!$extension instanceof Twig_Extension_InitRuntimeInterface) { + $m = new ReflectionMethod($extension, 'initRuntime'); + + if ('Twig_Extension' !== $m->getDeclaringClass()->getName()) { + @trigger_error(sprintf('Defining the initRuntime() method in the "%s" extension is deprecated since version 1.23. Use the `needs_environment` option to get the Twig_Environment instance in filters, functions, or tests; or explicitly implement Twig_Extension_InitRuntimeInterface if needed (not recommended).', $name), E_USER_DEPRECATED); + } + } + + $extension->initRuntime($this); + } + } + + /** + * Returns true if the given extension is registered. + * + * @param string $class The extension class name + * + * @return bool Whether the extension is registered or not + */ + public function hasExtension($class) + { + if (isset($this->legacyExtensionNames[$class])) { + $class = $this->legacyExtensionNames[$class]; + @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED); + } + + return isset($this->extensions[ltrim($class, '\\')]); + } + + /** + * Adds a runtime loader. + */ + public function addRuntimeLoader(Twig_RuntimeLoaderInterface $loader) + { + $this->runtimeLoaders[] = $loader; + } + + /** + * Gets an extension by class name. + * + * @param string $class The extension class name + * + * @return Twig_ExtensionInterface A Twig_ExtensionInterface instance + */ + public function getExtension($class) + { + if (isset($this->legacyExtensionNames[$class])) { + $class = $this->legacyExtensionNames[$class]; + @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED); + } + + $class = ltrim($class, '\\'); + + if (!isset($this->extensions[$class])) { + throw new Twig_Error_Runtime(sprintf('The "%s" extension is not enabled.', $class)); + } + + return $this->extensions[$class]; + } + + /** + * Returns the runtime implementation of a Twig element (filter/function/test). + * + * @param string $class A runtime class name + * + * @return object The runtime implementation + * + * @throws Twig_Error_Runtime When the template cannot be found + */ + public function getRuntime($class) + { + if (isset($this->runtimes[$class])) { + return $this->runtimes[$class]; + } + + foreach ($this->runtimeLoaders as $loader) { + if (null !== $runtime = $loader->load($class)) { + return $this->runtimes[$class] = $runtime; + } + } + + throw new Twig_Error_Runtime(sprintf('Unable to load the "%s" runtime.', $class)); + } + + /** + * Registers an extension. + * + * @param Twig_ExtensionInterface $extension A Twig_ExtensionInterface instance + */ + public function addExtension(Twig_ExtensionInterface $extension) + { + $class = get_class($extension); + + if ($this->extensionInitialized) { + throw new LogicException(sprintf('Unable to register extension "%s" as extensions have already been initialized.', $class)); + } + + $m = new ReflectionMethod($extension, 'getName'); + $legacyName = 'Twig_Extension' !== $m->getDeclaringClass()->getName() ? $extension->getName() : null; + + if (isset($this->extensions[$class]) || (null !== $legacyName && isset($this->legacyExtensionNames[$legacyName]))) { + unset($this->extensions[$this->legacyExtensionNames[$legacyName]], $this->legacyExtensionNames[$legacyName]); + @trigger_error(sprintf('The possibility to register the same extension twice ("%s") is deprecated since version 1.23 and will be removed in Twig 2.0. Use proper PHP inheritance instead.', $class), E_USER_DEPRECATED); + } + + $this->lastModifiedExtension = 0; + if ($legacyName !== $class) { + $this->legacyExtensionNames[$legacyName] = $class; + } + $this->extensions[$class] = $extension; + $this->updateOptionsHash(); + } + + /** + * Removes an extension by name. + * + * This method is deprecated and you should not use it. + * + * @param string $name The extension name + * + * @deprecated since 1.12 (to be removed in 2.0) + */ + public function removeExtension($name) + { + @trigger_error(sprintf('The %s method is deprecated since version 1.12 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED); + + if (isset($this->legacyExtensionNames[$name])) { + $name = $this->legacyExtensionNames[$name]; + @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $name), E_USER_DEPRECATED); + } + + if ($this->extensionInitialized) { + throw new LogicException(sprintf('Unable to remove extension "%s" as extensions have already been initialized.', $name)); + } + + unset($this->extensions[ltrim($name, '\\')]); + $this->updateOptionsHash(); + } + + /** + * Registers an array of extensions. + * + * @param array $extensions An array of extensions + */ + public function setExtensions(array $extensions) + { + foreach ($extensions as $extension) { + $this->addExtension($extension); + } + } + + /** + * Returns all registered extensions. + * + * @return Twig_ExtensionInterface[] An array of extensions (keys are for internal usage only and should not be relied on) + */ + public function getExtensions() + { + return $this->extensions; + } + + /** + * Registers a Token Parser. + * + * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance + */ + public function addTokenParser(Twig_TokenParserInterface $parser) + { + if ($this->extensionInitialized) { + throw new LogicException('Unable to add a token parser as extensions have already been initialized.'); + } + + $this->staging->addTokenParser($parser); + } + + /** + * Gets the registered Token Parsers. + * + * @return Twig_TokenParserBrokerInterface A broker containing token parsers + * + * @internal + */ + public function getTokenParsers() + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + return $this->parsers; + } + + /** + * Gets registered tags. + * + * Be warned that this method cannot return tags defined by Twig_TokenParserBrokerInterface classes. + * + * @return Twig_TokenParserInterface[] An array of Twig_TokenParserInterface instances + * + * @internal + */ + public function getTags() + { + $tags = array(); + foreach ($this->getTokenParsers()->getParsers() as $parser) { + if ($parser instanceof Twig_TokenParserInterface) { + $tags[$parser->getTag()] = $parser; + } + } + + return $tags; + } + + /** + * Registers a Node Visitor. + * + * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance + */ + public function addNodeVisitor(Twig_NodeVisitorInterface $visitor) + { + if ($this->extensionInitialized) { + throw new LogicException('Unable to add a node visitor as extensions have already been initialized.'); + } + + $this->staging->addNodeVisitor($visitor); + } + + /** + * Gets the registered Node Visitors. + * + * @return Twig_NodeVisitorInterface[] An array of Twig_NodeVisitorInterface instances + * + * @internal + */ + public function getNodeVisitors() + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + return $this->visitors; + } + + /** + * Registers a Filter. + * + * @param string|Twig_SimpleFilter $name The filter name or a Twig_SimpleFilter instance + * @param Twig_FilterInterface|Twig_SimpleFilter $filter A Twig_FilterInterface instance or a Twig_SimpleFilter instance + */ + public function addFilter($name, $filter = null) + { + if (!$name instanceof Twig_SimpleFilter && !($filter instanceof Twig_SimpleFilter || $filter instanceof Twig_FilterInterface)) { + throw new LogicException('A filter must be an instance of Twig_FilterInterface or Twig_SimpleFilter.'); + } + + if ($name instanceof Twig_SimpleFilter) { + $filter = $name; + $name = $filter->getName(); + } else { + @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleFilter" instead when defining filter "%s".', __METHOD__, $name), E_USER_DEPRECATED); + } + + if ($this->extensionInitialized) { + throw new LogicException(sprintf('Unable to add filter "%s" as extensions have already been initialized.', $name)); + } + + $this->staging->addFilter($name, $filter); + } + + /** + * Get a filter by name. + * + * Subclasses may override this method and load filters differently; + * so no list of filters is available. + * + * @param string $name The filter name + * + * @return Twig_Filter|false A Twig_Filter instance or false if the filter does not exist + * + * @internal + */ + public function getFilter($name) + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + if (isset($this->filters[$name])) { + return $this->filters[$name]; + } + + foreach ($this->filters as $pattern => $filter) { + $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count); + + if ($count) { + if (preg_match('#^'.$pattern.'$#', $name, $matches)) { + array_shift($matches); + $filter->setArguments($matches); + + return $filter; + } + } + } + + foreach ($this->filterCallbacks as $callback) { + if (false !== $filter = call_user_func($callback, $name)) { + return $filter; + } + } + + return false; + } + + public function registerUndefinedFilterCallback($callable) + { + $this->filterCallbacks[] = $callable; + } + + /** + * Gets the registered Filters. + * + * Be warned that this method cannot return filters defined with registerUndefinedFilterCallback. + * + * @return Twig_FilterInterface[] An array of Twig_FilterInterface instances + * + * @see registerUndefinedFilterCallback + * + * @internal + */ + public function getFilters() + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + return $this->filters; + } + + /** + * Registers a Test. + * + * @param string|Twig_SimpleTest $name The test name or a Twig_SimpleTest instance + * @param Twig_TestInterface|Twig_SimpleTest $test A Twig_TestInterface instance or a Twig_SimpleTest instance + */ + public function addTest($name, $test = null) + { + if (!$name instanceof Twig_SimpleTest && !($test instanceof Twig_SimpleTest || $test instanceof Twig_TestInterface)) { + throw new LogicException('A test must be an instance of Twig_TestInterface or Twig_SimpleTest.'); + } + + if ($name instanceof Twig_SimpleTest) { + $test = $name; + $name = $test->getName(); + } else { + @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleTest" instead when defining test "%s".', __METHOD__, $name), E_USER_DEPRECATED); + } + + if ($this->extensionInitialized) { + throw new LogicException(sprintf('Unable to add test "%s" as extensions have already been initialized.', $name)); + } + + $this->staging->addTest($name, $test); + } + + /** + * Gets the registered Tests. + * + * @return Twig_TestInterface[] An array of Twig_TestInterface instances + * + * @internal + */ + public function getTests() + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + return $this->tests; + } + + /** + * Gets a test by name. + * + * @param string $name The test name + * + * @return Twig_Test|false A Twig_Test instance or false if the test does not exist + * + * @internal + */ + public function getTest($name) + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + if (isset($this->tests[$name])) { + return $this->tests[$name]; + } + + return false; + } + + /** + * Registers a Function. + * + * @param string|Twig_SimpleFunction $name The function name or a Twig_SimpleFunction instance + * @param Twig_FunctionInterface|Twig_SimpleFunction $function A Twig_FunctionInterface instance or a Twig_SimpleFunction instance + */ + public function addFunction($name, $function = null) + { + if (!$name instanceof Twig_SimpleFunction && !($function instanceof Twig_SimpleFunction || $function instanceof Twig_FunctionInterface)) { + throw new LogicException('A function must be an instance of Twig_FunctionInterface or Twig_SimpleFunction.'); + } + + if ($name instanceof Twig_SimpleFunction) { + $function = $name; + $name = $function->getName(); + } else { + @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleFunction" instead when defining function "%s".', __METHOD__, $name), E_USER_DEPRECATED); + } + + if ($this->extensionInitialized) { + throw new LogicException(sprintf('Unable to add function "%s" as extensions have already been initialized.', $name)); + } + + $this->staging->addFunction($name, $function); + } + + /** + * Get a function by name. + * + * Subclasses may override this method and load functions differently; + * so no list of functions is available. + * + * @param string $name function name + * + * @return Twig_Function|false A Twig_Function instance or false if the function does not exist + * + * @internal + */ + public function getFunction($name) + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + if (isset($this->functions[$name])) { + return $this->functions[$name]; + } + + foreach ($this->functions as $pattern => $function) { + $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count); + + if ($count) { + if (preg_match('#^'.$pattern.'$#', $name, $matches)) { + array_shift($matches); + $function->setArguments($matches); + + return $function; + } + } + } + + foreach ($this->functionCallbacks as $callback) { + if (false !== $function = call_user_func($callback, $name)) { + return $function; + } + } + + return false; + } + + public function registerUndefinedFunctionCallback($callable) + { + $this->functionCallbacks[] = $callable; + } + + /** + * Gets registered functions. + * + * Be warned that this method cannot return functions defined with registerUndefinedFunctionCallback. + * + * @return Twig_FunctionInterface[] An array of Twig_FunctionInterface instances + * + * @see registerUndefinedFunctionCallback + * + * @internal + */ + public function getFunctions() + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + return $this->functions; + } + + /** + * Registers a Global. + * + * New globals can be added before compiling or rendering a template; + * but after, you can only update existing globals. + * + * @param string $name The global name + * @param mixed $value The global value + */ + public function addGlobal($name, $value) + { + if ($this->extensionInitialized || $this->runtimeInitialized) { + if (null === $this->globals) { + $this->globals = $this->initGlobals(); + } + + if (!array_key_exists($name, $this->globals)) { + // The deprecation notice must be turned into the following exception in Twig 2.0 + @trigger_error(sprintf('Registering global variable "%s" at runtime or when the extensions have already been initialized is deprecated since version 1.21.', $name), E_USER_DEPRECATED); + //throw new LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name)); + } + } + + if ($this->extensionInitialized || $this->runtimeInitialized) { + // update the value + $this->globals[$name] = $value; + } else { + $this->staging->addGlobal($name, $value); + } + } + + /** + * Gets the registered Globals. + * + * @return array An array of globals + * + * @internal + */ + public function getGlobals() + { + if (!$this->runtimeInitialized && !$this->extensionInitialized) { + return $this->initGlobals(); + } + + if (null === $this->globals) { + $this->globals = $this->initGlobals(); + } + + return $this->globals; + } + + /** + * Merges a context with the defined globals. + * + * @param array $context An array representing the context + * + * @return array The context merged with the globals + */ + public function mergeGlobals(array $context) + { + // we don't use array_merge as the context being generally + // bigger than globals, this code is faster. + foreach ($this->getGlobals() as $key => $value) { + if (!array_key_exists($key, $context)) { + $context[$key] = $value; + } + } + + return $context; + } + + /** + * Gets the registered unary Operators. + * + * @return array An array of unary operators + * + * @internal + */ + public function getUnaryOperators() + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + return $this->unaryOperators; + } + + /** + * Gets the registered binary Operators. + * + * @return array An array of binary operators + * + * @internal + */ + public function getBinaryOperators() + { + if (!$this->extensionInitialized) { + $this->initExtensions(); + } + + return $this->binaryOperators; + } + + /** + * @deprecated since 1.23 (to be removed in 2.0) + */ + public function computeAlternatives($name, $items) + { + @trigger_error(sprintf('The %s method is deprecated since version 1.23 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED); + + return Twig_Error_Syntax::computeAlternatives($name, $items); + } + + /** + * @internal + */ + protected function initGlobals() + { + $globals = array(); + foreach ($this->extensions as $name => $extension) { + if (!$extension instanceof Twig_Extension_GlobalsInterface) { + $m = new ReflectionMethod($extension, 'getGlobals'); + + if ('Twig_Extension' !== $m->getDeclaringClass()->getName()) { + @trigger_error(sprintf('Defining the getGlobals() method in the "%s" extension without explicitly implementing Twig_Extension_GlobalsInterface is deprecated since version 1.23.', $name), E_USER_DEPRECATED); + } + } + + $extGlob = $extension->getGlobals(); + if (!is_array($extGlob)) { + throw new UnexpectedValueException(sprintf('"%s::getGlobals()" must return an array of globals.', get_class($extension))); + } + + $globals[] = $extGlob; + } + + $globals[] = $this->staging->getGlobals(); + + return call_user_func_array('array_merge', $globals); + } + + /** + * @internal + */ + protected function initExtensions() + { + if ($this->extensionInitialized) { + return; + } + + $this->extensionInitialized = true; + $this->parsers = new Twig_TokenParserBroker(array(), array(), false); + $this->filters = array(); + $this->functions = array(); + $this->tests = array(); + $this->visitors = array(); + $this->unaryOperators = array(); + $this->binaryOperators = array(); + + foreach ($this->extensions as $extension) { + $this->initExtension($extension); + } + $this->initExtension($this->staging); + } + + /** + * @internal + */ + protected function initExtension(Twig_ExtensionInterface $extension) + { + // filters + foreach ($extension->getFilters() as $name => $filter) { + if ($filter instanceof Twig_SimpleFilter) { + $name = $filter->getName(); + } else { + @trigger_error(sprintf('Using an instance of "%s" for filter "%s" is deprecated since version 1.21. Use Twig_SimpleFilter instead.', get_class($filter), $name), E_USER_DEPRECATED); + } + + $this->filters[$name] = $filter; + } + + // functions + foreach ($extension->getFunctions() as $name => $function) { + if ($function instanceof Twig_SimpleFunction) { + $name = $function->getName(); + } else { + @trigger_error(sprintf('Using an instance of "%s" for function "%s" is deprecated since version 1.21. Use Twig_SimpleFunction instead.', get_class($function), $name), E_USER_DEPRECATED); + } + + $this->functions[$name] = $function; + } + + // tests + foreach ($extension->getTests() as $name => $test) { + if ($test instanceof Twig_SimpleTest) { + $name = $test->getName(); + } else { + @trigger_error(sprintf('Using an instance of "%s" for test "%s" is deprecated since version 1.21. Use Twig_SimpleTest instead.', get_class($test), $name), E_USER_DEPRECATED); + } + + $this->tests[$name] = $test; + } + + // token parsers + foreach ($extension->getTokenParsers() as $parser) { + if ($parser instanceof Twig_TokenParserInterface) { + $this->parsers->addTokenParser($parser); + } elseif ($parser instanceof Twig_TokenParserBrokerInterface) { + @trigger_error('Registering a Twig_TokenParserBrokerInterface instance is deprecated since version 1.21.', E_USER_DEPRECATED); + + $this->parsers->addTokenParserBroker($parser); + } else { + throw new LogicException('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances.'); + } + } + + // node visitors + foreach ($extension->getNodeVisitors() as $visitor) { + $this->visitors[] = $visitor; + } + + // operators + if ($operators = $extension->getOperators()) { + if (2 !== count($operators)) { + throw new InvalidArgumentException(sprintf('"%s::getOperators()" does not return a valid operators array.', get_class($extension))); + } + + $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]); + $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]); + } + } + + /** + * @deprecated since 1.22 (to be removed in 2.0) + */ + protected function writeCacheFile($file, $content) + { + $this->cache->write($file, $content); + } + + private function updateOptionsHash() + { + $hashParts = array_merge( + array_keys($this->extensions), + array( + (int) function_exists('twig_template_get_attributes'), + PHP_MAJOR_VERSION, + PHP_MINOR_VERSION, + self::VERSION, + (int) $this->debug, + $this->baseTemplateClass, + (int) $this->strictVariables, + ) + ); + $this->optionsHash = implode(':', $hashParts); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error.php new file mode 100644 index 000000000..37c743528 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error.php @@ -0,0 +1,272 @@ + + */ +class Twig_Error extends Exception +{ + protected $lineno; + protected $filename; + protected $rawMessage; + protected $previous; + + /** + * Constructor. + * + * Set both the line number and the filename to false to + * disable automatic guessing of the original template name + * and line number. + * + * Set the line number to -1 to enable its automatic guessing. + * Set the filename to null to enable its automatic guessing. + * + * By default, automatic guessing is enabled. + * + * @param string $message The error message + * @param int $lineno The template line where the error occurred + * @param string $filename The template file name where the error occurred + * @param Exception $previous The previous exception + */ + public function __construct($message, $lineno = -1, $filename = null, Exception $previous = null) + { + if (PHP_VERSION_ID < 50300) { + $this->previous = $previous; + parent::__construct(''); + } else { + parent::__construct('', 0, $previous); + } + + $this->lineno = $lineno; + $this->filename = $filename; + + if (-1 === $this->lineno || null === $this->filename) { + $this->guessTemplateInfo(); + } + + $this->rawMessage = $message; + + $this->updateRepr(); + } + + /** + * Gets the raw message. + * + * @return string The raw message + */ + public function getRawMessage() + { + return $this->rawMessage; + } + + /** + * Gets the filename where the error occurred. + * + * @return string The filename + */ + public function getTemplateFile() + { + return $this->filename; + } + + /** + * Sets the filename where the error occurred. + * + * @param string $filename The filename + */ + public function setTemplateFile($filename) + { + $this->filename = $filename; + + $this->updateRepr(); + } + + /** + * Gets the template line where the error occurred. + * + * @return int The template line + */ + public function getTemplateLine() + { + return $this->lineno; + } + + /** + * Sets the template line where the error occurred. + * + * @param int $lineno The template line + */ + public function setTemplateLine($lineno) + { + $this->lineno = $lineno; + + $this->updateRepr(); + } + + public function guess() + { + $this->guessTemplateInfo(); + $this->updateRepr(); + } + + /** + * For PHP < 5.3.0, provides access to the getPrevious() method. + * + * @param string $method The method name + * @param array $arguments The parameters to be passed to the method + * + * @return Exception The previous exception or null + * + * @throws BadMethodCallException + */ + public function __call($method, $arguments) + { + if ('getprevious' == strtolower($method)) { + return $this->previous; + } + + throw new BadMethodCallException(sprintf('Method "Twig_Error::%s()" does not exist.', $method)); + } + + public function appendMessage($rawMessage) + { + $this->rawMessage .= $rawMessage; + $this->updateRepr(); + } + + /** + * @internal + */ + protected function updateRepr() + { + $this->message = $this->rawMessage; + + $dot = false; + if ('.' === substr($this->message, -1)) { + $this->message = substr($this->message, 0, -1); + $dot = true; + } + + $questionMark = false; + if ('?' === substr($this->message, -1)) { + $this->message = substr($this->message, 0, -1); + $questionMark = true; + } + + if ($this->filename) { + if (is_string($this->filename) || (is_object($this->filename) && method_exists($this->filename, '__toString'))) { + $filename = sprintf('"%s"', $this->filename); + } else { + $filename = json_encode($this->filename); + } + $this->message .= sprintf(' in %s', $filename); + } + + if ($this->lineno && $this->lineno >= 0) { + $this->message .= sprintf(' at line %d', $this->lineno); + } + + if ($dot) { + $this->message .= '.'; + } + + if ($questionMark) { + $this->message .= '?'; + } + } + + /** + * @internal + */ + protected function guessTemplateInfo() + { + $template = null; + $templateClass = null; + + if (PHP_VERSION_ID >= 50306) { + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT); + } else { + $backtrace = debug_backtrace(); + } + + foreach ($backtrace as $trace) { + if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) { + $currentClass = get_class($trace['object']); + $isEmbedContainer = 0 === strpos($templateClass, $currentClass); + if (null === $this->filename || ($this->filename == $trace['object']->getTemplateName() && !$isEmbedContainer)) { + $template = $trace['object']; + $templateClass = get_class($trace['object']); + } + } + } + + // update template filename + if (null !== $template && null === $this->filename) { + $this->filename = $template->getTemplateName(); + } + + if (null === $template || $this->lineno > -1) { + return; + } + + $r = new ReflectionObject($template); + $file = $r->getFileName(); + + // hhvm has a bug where eval'ed files comes out as the current directory + if (is_dir($file)) { + $file = ''; + } + + $exceptions = array($e = $this); + while (($e instanceof self || method_exists($e, 'getPrevious')) && $e = $e->getPrevious()) { + $exceptions[] = $e; + } + + while ($e = array_pop($exceptions)) { + $traces = $e->getTrace(); + array_unshift($traces, array('file' => $e->getFile(), 'line' => $e->getLine())); + + while ($trace = array_shift($traces)) { + if (!isset($trace['file']) || !isset($trace['line']) || $file != $trace['file']) { + continue; + } + + foreach ($template->getDebugInfo() as $codeLine => $templateLine) { + if ($codeLine <= $trace['line']) { + // update template line + $this->lineno = $templateLine; + + return; + } + } + } + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Loader.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Loader.php new file mode 100644 index 000000000..68efb574a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Loader.php @@ -0,0 +1,31 @@ + + */ +class Twig_Error_Loader extends Twig_Error +{ + public function __construct($message, $lineno = -1, $filename = null, Exception $previous = null) + { + parent::__construct($message, false, false, $previous); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Runtime.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Runtime.php new file mode 100644 index 000000000..8b6ceddb9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Runtime.php @@ -0,0 +1,20 @@ + + */ +class Twig_Error_Runtime extends Twig_Error +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Syntax.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Syntax.php new file mode 100644 index 000000000..f73730a1a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Error/Syntax.php @@ -0,0 +1,53 @@ + + */ +class Twig_Error_Syntax extends Twig_Error +{ + /** + * Tweaks the error message to include suggestions. + * + * @param string $name The original name of the item that does not exist + * @param array $items An array of possible items + */ + public function addSuggestions($name, array $items) + { + if (!$alternatives = self::computeAlternatives($name, $items)) { + return; + } + + $this->appendMessage(sprintf(' Did you mean "%s"?', implode('", "', $alternatives))); + } + + /** + * @internal + * + * To be merged with the addSuggestions() method in 2.0. + */ + public static function computeAlternatives($name, $items) + { + $alternatives = array(); + foreach ($items as $item) { + $lev = levenshtein($name, $item); + if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) { + $alternatives[$item] = $lev; + } + } + asort($alternatives); + + return array_keys($alternatives); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php new file mode 100644 index 000000000..b168c3c35 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php @@ -0,0 +1,29 @@ + + * + * @deprecated since 1.12 (to be removed in 3.0) + */ +interface Twig_ExistsLoaderInterface +{ + /** + * Check if we have the source code of a template, given its name. + * + * @param string $name The name of the template to check if we can load + * + * @return bool If the template source code is handled by this loader or not + */ + public function exists($name); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExpressionParser.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExpressionParser.php new file mode 100644 index 000000000..d128e7241 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExpressionParser.php @@ -0,0 +1,648 @@ + + */ +class Twig_ExpressionParser +{ + const OPERATOR_LEFT = 1; + const OPERATOR_RIGHT = 2; + + protected $parser; + protected $unaryOperators; + protected $binaryOperators; + + public function __construct(Twig_Parser $parser, array $unaryOperators, array $binaryOperators) + { + $this->parser = $parser; + $this->unaryOperators = $unaryOperators; + $this->binaryOperators = $binaryOperators; + } + + public function parseExpression($precedence = 0) + { + $expr = $this->getPrimary(); + $token = $this->parser->getCurrentToken(); + while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) { + $op = $this->binaryOperators[$token->getValue()]; + $this->parser->getStream()->next(); + + if (isset($op['callable'])) { + $expr = call_user_func($op['callable'], $this->parser, $expr); + } else { + $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']); + $class = $op['class']; + $expr = new $class($expr, $expr1, $token->getLine()); + } + + $token = $this->parser->getCurrentToken(); + } + + if (0 === $precedence) { + return $this->parseConditionalExpression($expr); + } + + return $expr; + } + + protected function getPrimary() + { + $token = $this->parser->getCurrentToken(); + + if ($this->isUnary($token)) { + $operator = $this->unaryOperators[$token->getValue()]; + $this->parser->getStream()->next(); + $expr = $this->parseExpression($operator['precedence']); + $class = $operator['class']; + + return $this->parsePostfixExpression(new $class($expr, $token->getLine())); + } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '(')) { + $this->parser->getStream()->next(); + $expr = $this->parseExpression(); + $this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'An opened parenthesis is not properly closed'); + + return $this->parsePostfixExpression($expr); + } + + return $this->parsePrimaryExpression(); + } + + protected function parseConditionalExpression($expr) + { + while ($this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, '?')) { + if (!$this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) { + $expr2 = $this->parseExpression(); + if ($this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) { + $expr3 = $this->parseExpression(); + } else { + $expr3 = new Twig_Node_Expression_Constant('', $this->parser->getCurrentToken()->getLine()); + } + } else { + $expr2 = $expr; + $expr3 = $this->parseExpression(); + } + + $expr = new Twig_Node_Expression_Conditional($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine()); + } + + return $expr; + } + + protected function isUnary(Twig_Token $token) + { + return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->unaryOperators[$token->getValue()]); + } + + protected function isBinary(Twig_Token $token) + { + return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->binaryOperators[$token->getValue()]); + } + + public function parsePrimaryExpression() + { + $token = $this->parser->getCurrentToken(); + switch ($token->getType()) { + case Twig_Token::NAME_TYPE: + $this->parser->getStream()->next(); + switch ($token->getValue()) { + case 'true': + case 'TRUE': + $node = new Twig_Node_Expression_Constant(true, $token->getLine()); + break; + + case 'false': + case 'FALSE': + $node = new Twig_Node_Expression_Constant(false, $token->getLine()); + break; + + case 'none': + case 'NONE': + case 'null': + case 'NULL': + $node = new Twig_Node_Expression_Constant(null, $token->getLine()); + break; + + default: + if ('(' === $this->parser->getCurrentToken()->getValue()) { + $node = $this->getFunctionNode($token->getValue(), $token->getLine()); + } else { + $node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine()); + } + } + break; + + case Twig_Token::NUMBER_TYPE: + $this->parser->getStream()->next(); + $node = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine()); + break; + + case Twig_Token::STRING_TYPE: + case Twig_Token::INTERPOLATION_START_TYPE: + $node = $this->parseStringExpression(); + break; + + case Twig_Token::OPERATOR_TYPE: + if (preg_match(Twig_Lexer::REGEX_NAME, $token->getValue(), $matches) && $matches[0] == $token->getValue()) { + // in this context, string operators are variable names + $this->parser->getStream()->next(); + $node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine()); + break; + } elseif (isset($this->unaryOperators[$token->getValue()])) { + $class = $this->unaryOperators[$token->getValue()]['class']; + + $ref = new ReflectionClass($class); + $negClass = 'Twig_Node_Expression_Unary_Neg'; + $posClass = 'Twig_Node_Expression_Unary_Pos'; + if (!(in_array($ref->getName(), array($negClass, $posClass)) || $ref->isSubclassOf($negClass) || $ref->isSubclassOf($posClass))) { + throw new Twig_Error_Syntax(sprintf('Unexpected unary operator "%s".', $token->getValue()), $token->getLine(), $this->parser->getFilename()); + } + + $this->parser->getStream()->next(); + $expr = $this->parsePrimaryExpression(); + + $node = new $class($expr, $token->getLine()); + break; + } + + default: + if ($token->test(Twig_Token::PUNCTUATION_TYPE, '[')) { + $node = $this->parseArrayExpression(); + } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '{')) { + $node = $this->parseHashExpression(); + } else { + throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getFilename()); + } + } + + return $this->parsePostfixExpression($node); + } + + public function parseStringExpression() + { + $stream = $this->parser->getStream(); + + $nodes = array(); + // a string cannot be followed by another string in a single expression + $nextCanBeString = true; + while (true) { + if ($nextCanBeString && $token = $stream->nextIf(Twig_Token::STRING_TYPE)) { + $nodes[] = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine()); + $nextCanBeString = false; + } elseif ($stream->nextIf(Twig_Token::INTERPOLATION_START_TYPE)) { + $nodes[] = $this->parseExpression(); + $stream->expect(Twig_Token::INTERPOLATION_END_TYPE); + $nextCanBeString = true; + } else { + break; + } + } + + $expr = array_shift($nodes); + foreach ($nodes as $node) { + $expr = new Twig_Node_Expression_Binary_Concat($expr, $node, $node->getLine()); + } + + return $expr; + } + + public function parseArrayExpression() + { + $stream = $this->parser->getStream(); + $stream->expect(Twig_Token::PUNCTUATION_TYPE, '[', 'An array element was expected'); + + $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine()); + $first = true; + while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) { + if (!$first) { + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'An array element must be followed by a comma'); + + // trailing ,? + if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) { + break; + } + } + $first = false; + + $node->addElement($this->parseExpression()); + } + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']', 'An opened array is not properly closed'); + + return $node; + } + + public function parseHashExpression() + { + $stream = $this->parser->getStream(); + $stream->expect(Twig_Token::PUNCTUATION_TYPE, '{', 'A hash element was expected'); + + $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine()); + $first = true; + while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) { + if (!$first) { + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'A hash value must be followed by a comma'); + + // trailing ,? + if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) { + break; + } + } + $first = false; + + // a hash key can be: + // + // * a number -- 12 + // * a string -- 'a' + // * a name, which is equivalent to a string -- a + // * an expression, which must be enclosed in parentheses -- (1 + 2) + if (($token = $stream->nextIf(Twig_Token::STRING_TYPE)) || ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) || $token = $stream->nextIf(Twig_Token::NUMBER_TYPE)) { + $key = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine()); + } elseif ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) { + $key = $this->parseExpression(); + } else { + $current = $stream->getCurrent(); + + throw new Twig_Error_Syntax(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($current->getType()), $current->getValue()), $current->getLine(), $this->parser->getFilename()); + } + + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ':', 'A hash key must be followed by a colon (:)'); + $value = $this->parseExpression(); + + $node->addElement($value, $key); + } + $stream->expect(Twig_Token::PUNCTUATION_TYPE, '}', 'An opened hash is not properly closed'); + + return $node; + } + + public function parsePostfixExpression($node) + { + while (true) { + $token = $this->parser->getCurrentToken(); + if ($token->getType() == Twig_Token::PUNCTUATION_TYPE) { + if ('.' == $token->getValue() || '[' == $token->getValue()) { + $node = $this->parseSubscriptExpression($node); + } elseif ('|' == $token->getValue()) { + $node = $this->parseFilterExpression($node); + } else { + break; + } + } else { + break; + } + } + + return $node; + } + + public function getFunctionNode($name, $line) + { + switch ($name) { + case 'parent': + $this->parseArguments(); + if (!count($this->parser->getBlockStack())) { + throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden.', $line, $this->parser->getFilename()); + } + + if (!$this->parser->getParent() && !$this->parser->hasTraits()) { + throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend nor "use" another template is forbidden.', $line, $this->parser->getFilename()); + } + + return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $line); + case 'block': + return new Twig_Node_Expression_BlockReference($this->parseArguments()->getNode(0), false, $line); + case 'attribute': + $args = $this->parseArguments(); + if (count($args) < 2) { + throw new Twig_Error_Syntax('The "attribute" function takes at least two arguments (the variable and the attributes).', $line, $this->parser->getFilename()); + } + + return new Twig_Node_Expression_GetAttr($args->getNode(0), $args->getNode(1), count($args) > 2 ? $args->getNode(2) : null, Twig_Template::ANY_CALL, $line); + default: + if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) { + $arguments = new Twig_Node_Expression_Array(array(), $line); + foreach ($this->parseArguments() as $n) { + $arguments->addElement($n); + } + + $node = new Twig_Node_Expression_MethodCall($alias['node'], $alias['name'], $arguments, $line); + $node->setAttribute('safe', true); + + return $node; + } + + $args = $this->parseArguments(true); + $class = $this->getFunctionNodeClass($name, $line); + + return new $class($name, $args, $line); + } + } + + public function parseSubscriptExpression($node) + { + $stream = $this->parser->getStream(); + $token = $stream->next(); + $lineno = $token->getLine(); + $arguments = new Twig_Node_Expression_Array(array(), $lineno); + $type = Twig_Template::ANY_CALL; + if ($token->getValue() == '.') { + $token = $stream->next(); + if ( + $token->getType() == Twig_Token::NAME_TYPE + || + $token->getType() == Twig_Token::NUMBER_TYPE + || + ($token->getType() == Twig_Token::OPERATOR_TYPE && preg_match(Twig_Lexer::REGEX_NAME, $token->getValue())) + ) { + $arg = new Twig_Node_Expression_Constant($token->getValue(), $lineno); + + if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) { + $type = Twig_Template::METHOD_CALL; + foreach ($this->parseArguments() as $n) { + $arguments->addElement($n); + } + } + } else { + throw new Twig_Error_Syntax('Expected name or number.', $lineno, $this->parser->getFilename()); + } + + if ($node instanceof Twig_Node_Expression_Name && null !== $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) { + if (!$arg instanceof Twig_Node_Expression_Constant) { + throw new Twig_Error_Syntax(sprintf('Dynamic macro names are not supported (called on "%s").', $node->getAttribute('name')), $token->getLine(), $this->parser->getFilename()); + } + + $name = $arg->getAttribute('value'); + + if ($this->parser->isReservedMacroName($name)) { + throw new Twig_Error_Syntax(sprintf('"%s" cannot be called as macro as it is a reserved keyword.', $name), $token->getLine(), $this->parser->getFilename()); + } + + $node = new Twig_Node_Expression_MethodCall($node, 'get'.$name, $arguments, $lineno); + $node->setAttribute('safe', true); + + return $node; + } + } else { + $type = Twig_Template::ARRAY_CALL; + + // slice? + $slice = false; + if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) { + $slice = true; + $arg = new Twig_Node_Expression_Constant(0, $token->getLine()); + } else { + $arg = $this->parseExpression(); + } + + if ($stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) { + $slice = true; + } + + if ($slice) { + if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) { + $length = new Twig_Node_Expression_Constant(null, $token->getLine()); + } else { + $length = $this->parseExpression(); + } + + $class = $this->getFilterNodeClass('slice', $token->getLine()); + $arguments = new Twig_Node(array($arg, $length)); + $filter = new $class($node, new Twig_Node_Expression_Constant('slice', $token->getLine()), $arguments, $token->getLine()); + + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']'); + + return $filter; + } + + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']'); + } + + return new Twig_Node_Expression_GetAttr($node, $arg, $arguments, $type, $lineno); + } + + public function parseFilterExpression($node) + { + $this->parser->getStream()->next(); + + return $this->parseFilterExpressionRaw($node); + } + + public function parseFilterExpressionRaw($node, $tag = null) + { + while (true) { + $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE); + + $name = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine()); + if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '(')) { + $arguments = new Twig_Node(); + } else { + $arguments = $this->parseArguments(true); + } + + $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine()); + + $node = new $class($node, $name, $arguments, $token->getLine(), $tag); + + if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '|')) { + break; + } + + $this->parser->getStream()->next(); + } + + return $node; + } + + /** + * Parses arguments. + * + * @param bool $namedArguments Whether to allow named arguments or not + * @param bool $definition Whether we are parsing arguments for a function definition + * + * @return Twig_Node + * + * @throws Twig_Error_Syntax + */ + public function parseArguments($namedArguments = false, $definition = false) + { + $args = array(); + $stream = $this->parser->getStream(); + + $stream->expect(Twig_Token::PUNCTUATION_TYPE, '(', 'A list of arguments must begin with an opening parenthesis'); + while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ')')) { + if (!empty($args)) { + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma'); + } + + if ($definition) { + $token = $stream->expect(Twig_Token::NAME_TYPE, null, 'An argument must be a name'); + $value = new Twig_Node_Expression_Name($token->getValue(), $this->parser->getCurrentToken()->getLine()); + } else { + $value = $this->parseExpression(); + } + + $name = null; + if ($namedArguments && $token = $stream->nextIf(Twig_Token::OPERATOR_TYPE, '=')) { + if (!$value instanceof Twig_Node_Expression_Name) { + throw new Twig_Error_Syntax(sprintf('A parameter name must be a string, "%s" given.', get_class($value)), $token->getLine(), $this->parser->getFilename()); + } + $name = $value->getAttribute('name'); + + if ($definition) { + $value = $this->parsePrimaryExpression(); + + if (!$this->checkConstantExpression($value)) { + throw new Twig_Error_Syntax(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $this->parser->getFilename()); + } + } else { + $value = $this->parseExpression(); + } + } + + if ($definition) { + if (null === $name) { + $name = $value->getAttribute('name'); + $value = new Twig_Node_Expression_Constant(null, $this->parser->getCurrentToken()->getLine()); + } + $args[$name] = $value; + } else { + if (null === $name) { + $args[] = $value; + } else { + $args[$name] = $value; + } + } + } + $stream->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'A list of arguments must be closed by a parenthesis'); + + return new Twig_Node($args); + } + + public function parseAssignmentExpression() + { + $targets = array(); + while (true) { + $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, null, 'Only variables can be assigned to'); + $value = $token->getValue(); + if (in_array(strtolower($value), array('true', 'false', 'none', 'null'))) { + throw new Twig_Error_Syntax(sprintf('You cannot assign a value to "%s".', $value), $token->getLine(), $this->parser->getFilename()); + } + $targets[] = new Twig_Node_Expression_AssignName($value, $token->getLine()); + + if (!$this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) { + break; + } + } + + return new Twig_Node($targets); + } + + public function parseMultitargetExpression() + { + $targets = array(); + while (true) { + $targets[] = $this->parseExpression(); + if (!$this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) { + break; + } + } + + return new Twig_Node($targets); + } + + protected function getFunctionNodeClass($name, $line) + { + $env = $this->parser->getEnvironment(); + + if (false === $function = $env->getFunction($name)) { + $e = new Twig_Error_Syntax(sprintf('Unknown "%s" function.', $name), $line, $this->parser->getFilename()); + $e->addSuggestions($name, array_keys($env->getFunctions())); + + throw $e; + } + + if ($function instanceof Twig_SimpleFunction && $function->isDeprecated()) { + $message = sprintf('Twig Function "%s" is deprecated', $function->getName()); + if (!is_bool($function->getDeprecatedVersion())) { + $message .= sprintf(' since version %s', $function->getDeprecatedVersion()); + } + if ($function->getAlternative()) { + $message .= sprintf('. Use "%s" instead', $function->getAlternative()); + } + $message .= sprintf(' in %s at line %d.', $this->parser->getFilename(), $line); + + @trigger_error($message, E_USER_DEPRECATED); + } + + if ($function instanceof Twig_SimpleFunction) { + return $function->getNodeClass(); + } + + return $function instanceof Twig_Function_Node ? $function->getClass() : 'Twig_Node_Expression_Function'; + } + + protected function getFilterNodeClass($name, $line) + { + $env = $this->parser->getEnvironment(); + + if (false === $filter = $env->getFilter($name)) { + $e = new Twig_Error_Syntax(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getFilename()); + $e->addSuggestions($name, array_keys($env->getFilters())); + + throw $e; + } + + if ($filter instanceof Twig_SimpleFilter && $filter->isDeprecated()) { + $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName()); + if (!is_bool($filter->getDeprecatedVersion())) { + $message .= sprintf(' since version %s', $filter->getDeprecatedVersion()); + } + if ($filter->getAlternative()) { + $message .= sprintf('. Use "%s" instead', $filter->getAlternative()); + } + $message .= sprintf(' in %s at line %d.', $this->parser->getFilename(), $line); + + @trigger_error($message, E_USER_DEPRECATED); + } + + if ($filter instanceof Twig_SimpleFilter) { + return $filter->getNodeClass(); + } + + return $filter instanceof Twig_Filter_Node ? $filter->getClass() : 'Twig_Node_Expression_Filter'; + } + + // checks that the node only contains "constant" elements + protected function checkConstantExpression(Twig_NodeInterface $node) + { + if (!($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array + || $node instanceof Twig_Node_Expression_Unary_Neg || $node instanceof Twig_Node_Expression_Unary_Pos + )) { + return false; + } + + foreach ($node as $n) { + if (!$this->checkConstantExpression($n)) { + return false; + } + } + + return true; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension.php new file mode 100644 index 000000000..fd674ee10 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension.php @@ -0,0 +1,89 @@ +escapers[$strategy] = $callable; + } + + /** + * Gets all defined escapers. + * + * @return array An array of escapers + */ + public function getEscapers() + { + return $this->escapers; + } + + /** + * Sets the default format to be used by the date filter. + * + * @param string $format The default date format string + * @param string $dateIntervalFormat The default date interval format string + */ + public function setDateFormat($format = null, $dateIntervalFormat = null) + { + if (null !== $format) { + $this->dateFormats[0] = $format; + } + + if (null !== $dateIntervalFormat) { + $this->dateFormats[1] = $dateIntervalFormat; + } + } + + /** + * Gets the default format to be used by the date filter. + * + * @return array The default date format string and the default date interval format string + */ + public function getDateFormat() + { + return $this->dateFormats; + } + + /** + * Sets the default timezone to be used by the date filter. + * + * @param DateTimeZone|string $timezone The default timezone string or a DateTimeZone object + */ + public function setTimezone($timezone) + { + $this->timezone = $timezone instanceof DateTimeZone ? $timezone : new DateTimeZone($timezone); + } + + /** + * Gets the default timezone to be used by the date filter. + * + * @return DateTimeZone The default timezone currently in use + */ + public function getTimezone() + { + if (null === $this->timezone) { + $this->timezone = new DateTimeZone(date_default_timezone_get()); + } + + return $this->timezone; + } + + /** + * Sets the default format to be used by the number_format filter. + * + * @param int $decimal The number of decimal places to use. + * @param string $decimalPoint The character(s) to use for the decimal point. + * @param string $thousandSep The character(s) to use for the thousands separator. + */ + public function setNumberFormat($decimal, $decimalPoint, $thousandSep) + { + $this->numberFormat = array($decimal, $decimalPoint, $thousandSep); + } + + /** + * Get the default format used by the number_format filter. + * + * @return array The arguments for number_format() + */ + public function getNumberFormat() + { + return $this->numberFormat; + } + + public function getTokenParsers() + { + return array( + new Twig_TokenParser_For(), + new Twig_TokenParser_If(), + new Twig_TokenParser_Extends(), + new Twig_TokenParser_Include(), + new Twig_TokenParser_Block(), + new Twig_TokenParser_Use(), + new Twig_TokenParser_Filter(), + new Twig_TokenParser_Macro(), + new Twig_TokenParser_Import(), + new Twig_TokenParser_From(), + new Twig_TokenParser_Set(), + new Twig_TokenParser_Spaceless(), + new Twig_TokenParser_Flush(), + new Twig_TokenParser_Do(), + new Twig_TokenParser_Embed(), + ); + } + + public function getFilters() + { + $filters = array( + // formatting filters + new Twig_SimpleFilter('date', 'twig_date_format_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('date_modify', 'twig_date_modify_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('format', 'sprintf'), + new Twig_SimpleFilter('replace', 'twig_replace_filter'), + new Twig_SimpleFilter('number_format', 'twig_number_format_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('abs', 'abs'), + new Twig_SimpleFilter('round', 'twig_round'), + + // encoding + new Twig_SimpleFilter('url_encode', 'twig_urlencode_filter'), + new Twig_SimpleFilter('json_encode', 'twig_jsonencode_filter'), + new Twig_SimpleFilter('convert_encoding', 'twig_convert_encoding'), + + // string filters + new Twig_SimpleFilter('title', 'twig_title_string_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('capitalize', 'twig_capitalize_string_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('upper', 'strtoupper'), + new Twig_SimpleFilter('lower', 'strtolower'), + new Twig_SimpleFilter('striptags', 'strip_tags'), + new Twig_SimpleFilter('trim', 'trim'), + new Twig_SimpleFilter('nl2br', 'nl2br', array('pre_escape' => 'html', 'is_safe' => array('html'))), + + // array helpers + new Twig_SimpleFilter('join', 'twig_join_filter'), + new Twig_SimpleFilter('split', 'twig_split_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('sort', 'twig_sort_filter'), + new Twig_SimpleFilter('merge', 'twig_array_merge'), + new Twig_SimpleFilter('batch', 'twig_array_batch'), + + // string/array filters + new Twig_SimpleFilter('reverse', 'twig_reverse_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('length', 'twig_length_filter', array('needs_environment' => true)), + new Twig_SimpleFilter('slice', 'twig_slice', array('needs_environment' => true)), + new Twig_SimpleFilter('first', 'twig_first', array('needs_environment' => true)), + new Twig_SimpleFilter('last', 'twig_last', array('needs_environment' => true)), + + // iteration and runtime + new Twig_SimpleFilter('default', '_twig_default_filter', array('node_class' => 'Twig_Node_Expression_Filter_Default')), + new Twig_SimpleFilter('keys', 'twig_get_array_keys_filter'), + + // escaping + new Twig_SimpleFilter('escape', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')), + new Twig_SimpleFilter('e', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')), + ); + + if (function_exists('mb_get_info')) { + $filters[] = new Twig_SimpleFilter('upper', 'twig_upper_filter', array('needs_environment' => true)); + $filters[] = new Twig_SimpleFilter('lower', 'twig_lower_filter', array('needs_environment' => true)); + } + + return $filters; + } + + public function getFunctions() + { + return array( + new Twig_SimpleFunction('max', 'max'), + new Twig_SimpleFunction('min', 'min'), + new Twig_SimpleFunction('range', 'range'), + new Twig_SimpleFunction('constant', 'twig_constant'), + new Twig_SimpleFunction('cycle', 'twig_cycle'), + new Twig_SimpleFunction('random', 'twig_random', array('needs_environment' => true)), + new Twig_SimpleFunction('date', 'twig_date_converter', array('needs_environment' => true)), + new Twig_SimpleFunction('include', 'twig_include', array('needs_environment' => true, 'needs_context' => true, 'is_safe' => array('all'))), + new Twig_SimpleFunction('source', 'twig_source', array('needs_environment' => true, 'is_safe' => array('all'))), + ); + } + + public function getTests() + { + return array( + new Twig_SimpleTest('even', null, array('node_class' => 'Twig_Node_Expression_Test_Even')), + new Twig_SimpleTest('odd', null, array('node_class' => 'Twig_Node_Expression_Test_Odd')), + new Twig_SimpleTest('defined', null, array('node_class' => 'Twig_Node_Expression_Test_Defined')), + new Twig_SimpleTest('sameas', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas', 'deprecated' => '1.21', 'alternative' => 'same as')), + new Twig_SimpleTest('same as', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas')), + new Twig_SimpleTest('none', null, array('node_class' => 'Twig_Node_Expression_Test_Null')), + new Twig_SimpleTest('null', null, array('node_class' => 'Twig_Node_Expression_Test_Null')), + new Twig_SimpleTest('divisibleby', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby', 'deprecated' => '1.21', 'alternative' => 'divisible by')), + new Twig_SimpleTest('divisible by', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby')), + new Twig_SimpleTest('constant', null, array('node_class' => 'Twig_Node_Expression_Test_Constant')), + new Twig_SimpleTest('empty', 'twig_test_empty'), + new Twig_SimpleTest('iterable', 'twig_test_iterable'), + ); + } + + public function getOperators() + { + return array( + array( + 'not' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'), + '-' => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Neg'), + '+' => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Pos'), + ), + array( + 'or' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'and' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'b-or' => array('precedence' => 16, 'class' => 'Twig_Node_Expression_Binary_BitwiseOr', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'b-xor' => array('precedence' => 17, 'class' => 'Twig_Node_Expression_Binary_BitwiseXor', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'b-and' => array('precedence' => 18, 'class' => 'Twig_Node_Expression_Binary_BitwiseAnd', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '==' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Equal', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '!=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '<' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Less', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '>' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Greater', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '>=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_GreaterEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '<=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_LessEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'not in' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotIn', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'in' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_In', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'matches' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Matches', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'starts with' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_StartsWith', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'ends with' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_EndsWith', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '..' => array('precedence' => 25, 'class' => 'Twig_Node_Expression_Binary_Range', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '+' => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Add', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '-' => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Sub', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '~' => array('precedence' => 40, 'class' => 'Twig_Node_Expression_Binary_Concat', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '*' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mul', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '/' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Div', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '//' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_FloorDiv', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '%' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mod', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'is' => array('precedence' => 100, 'callable' => array($this, 'parseTestExpression'), 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + 'is not' => array('precedence' => 100, 'callable' => array($this, 'parseNotTestExpression'), 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), + '**' => array('precedence' => 200, 'class' => 'Twig_Node_Expression_Binary_Power', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT), + '??' => array('precedence' => 300, 'class' => 'Twig_Node_Expression_NullCoalesce', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT), + ), + ); + } + + public function parseNotTestExpression(Twig_Parser $parser, Twig_NodeInterface $node) + { + return new Twig_Node_Expression_Unary_Not($this->parseTestExpression($parser, $node), $parser->getCurrentToken()->getLine()); + } + + public function parseTestExpression(Twig_Parser $parser, Twig_NodeInterface $node) + { + $stream = $parser->getStream(); + list($name, $test) = $this->getTest($parser, $node->getLine()); + + if ($test instanceof Twig_SimpleTest && $test->isDeprecated()) { + $message = sprintf('Twig Test "%s" is deprecated', $name); + if (!is_bool($test->getDeprecatedVersion())) { + $message .= sprintf(' since version %s', $test->getDeprecatedVersion()); + } + if ($test->getAlternative()) { + $message .= sprintf('. Use "%s" instead', $test->getAlternative()); + } + $message .= sprintf(' in %s at line %d.', $stream->getFilename(), $stream->getCurrent()->getLine()); + + @trigger_error($message, E_USER_DEPRECATED); + } + + $class = $this->getTestNodeClass($parser, $test); + $arguments = null; + if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) { + $arguments = $parser->getExpressionParser()->parseArguments(true); + } + + return new $class($node, $name, $arguments, $parser->getCurrentToken()->getLine()); + } + + protected function getTest(Twig_Parser $parser, $line) + { + $stream = $parser->getStream(); + $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + $env = $parser->getEnvironment(); + + if ($test = $env->getTest($name)) { + return array($name, $test); + } + + if ($stream->test(Twig_Token::NAME_TYPE)) { + // try 2-words tests + $name = $name.' '.$parser->getCurrentToken()->getValue(); + + if ($test = $env->getTest($name)) { + $parser->getStream()->next(); + + return array($name, $test); + } + } + + $e = new Twig_Error_Syntax(sprintf('Unknown "%s" test.', $name), $line, $parser->getFilename()); + $e->addSuggestions($name, array_keys($env->getTests())); + + throw $e; + } + + protected function getTestNodeClass(Twig_Parser $parser, $test) + { + if ($test instanceof Twig_SimpleTest) { + return $test->getNodeClass(); + } + + return $test instanceof Twig_Test_Node ? $test->getClass() : 'Twig_Node_Expression_Test'; + } + + public function getName() + { + return 'core'; + } +} + +/** + * Cycles over a value. + * + * @param ArrayAccess|array $values An array or an ArrayAccess instance + * @param int $position The cycle position + * + * @return string The next value in the cycle + */ +function twig_cycle($values, $position) +{ + if (!is_array($values) && !$values instanceof ArrayAccess) { + return $values; + } + + return $values[$position % count($values)]; +} + +/** + * Returns a random value depending on the supplied parameter type: + * - a random item from a Traversable or array + * - a random character from a string + * - a random integer between 0 and the integer parameter. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param Traversable|array|int|string $values The values to pick a random item from + * + * @throws Twig_Error_Runtime When $values is an empty array (does not apply to an empty string which is returned as is). + * + * @return mixed A random value from the given sequence + */ +function twig_random(Twig_Environment $env, $values = null) +{ + if (null === $values) { + return mt_rand(); + } + + if (is_int($values) || is_float($values)) { + return $values < 0 ? mt_rand($values, 0) : mt_rand(0, $values); + } + + if ($values instanceof Traversable) { + $values = iterator_to_array($values); + } elseif (is_string($values)) { + if ('' === $values) { + return ''; + } + if (null !== $charset = $env->getCharset()) { + if ('UTF-8' !== $charset) { + $values = twig_convert_encoding($values, 'UTF-8', $charset); + } + + // unicode version of str_split() + // split at all positions, but not after the start and not before the end + $values = preg_split('/(? $value) { + $values[$i] = twig_convert_encoding($value, $charset, 'UTF-8'); + } + } + } else { + return $values[mt_rand(0, strlen($values) - 1)]; + } + } + + if (!is_array($values)) { + return $values; + } + + if (0 === count($values)) { + throw new Twig_Error_Runtime('The random function cannot pick from an empty array.'); + } + + return $values[array_rand($values, 1)]; +} + +/** + * Converts a date to the given format. + * + *
    + *   {{ post.published_at|date("m/d/Y") }}
    + * 
    + * + * @param Twig_Environment $env A Twig_Environment instance + * @param DateTime|DateTimeInterface|DateInterval|string $date A date + * @param string|null $format The target format, null to use the default + * @param DateTimeZone|string|null|false $timezone The target timezone, null to use the default, false to leave unchanged + * + * @return string The formatted date + */ +function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $timezone = null) +{ + if (null === $format) { + $formats = $env->getExtension('Twig_Extension_Core')->getDateFormat(); + $format = $date instanceof DateInterval ? $formats[1] : $formats[0]; + } + + if ($date instanceof DateInterval) { + return $date->format($format); + } + + return twig_date_converter($env, $date, $timezone)->format($format); +} + +/** + * Returns a new date object modified. + * + *
    + *   {{ post.published_at|date_modify("-1day")|date("m/d/Y") }}
    + * 
    + * + * @param Twig_Environment $env A Twig_Environment instance + * @param DateTime|string $date A date + * @param string $modifier A modifier string + * + * @return DateTime A new date object + */ +function twig_date_modify_filter(Twig_Environment $env, $date, $modifier) +{ + $date = twig_date_converter($env, $date, false); + $resultDate = $date->modify($modifier); + + // This is a hack to ensure PHP 5.2 support and support for DateTimeImmutable + // DateTime::modify does not return the modified DateTime object < 5.3.0 + // and DateTimeImmutable does not modify $date. + return null === $resultDate ? $date : $resultDate; +} + +/** + * Converts an input to a DateTime instance. + * + *
    + *    {% if date(user.created_at) < date('+2days') %}
    + *      {# do something #}
    + *    {% endif %}
    + * 
    + * + * @param Twig_Environment $env A Twig_Environment instance + * @param DateTime|DateTimeInterface|string|null $date A date + * @param DateTimeZone|string|null|false $timezone The target timezone, null to use the default, false to leave unchanged + * + * @return DateTime A DateTime instance + */ +function twig_date_converter(Twig_Environment $env, $date = null, $timezone = null) +{ + // determine the timezone + if (false !== $timezone) { + if (null === $timezone) { + $timezone = $env->getExtension('Twig_Extension_Core')->getTimezone(); + } elseif (!$timezone instanceof DateTimeZone) { + $timezone = new DateTimeZone($timezone); + } + } + + // immutable dates + if ($date instanceof DateTimeImmutable) { + return false !== $timezone ? $date->setTimezone($timezone) : $date; + } + + if ($date instanceof DateTime || $date instanceof DateTimeInterface) { + $date = clone $date; + if (false !== $timezone) { + $date->setTimezone($timezone); + } + + return $date; + } + + if (null === $date || 'now' === $date) { + return new DateTime($date, false !== $timezone ? $timezone : $env->getExtension('Twig_Extension_Core')->getTimezone()); + } + + $asString = (string) $date; + if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) { + $date = new DateTime('@'.$date); + } else { + $date = new DateTime($date, $env->getExtension('Twig_Extension_Core')->getTimezone()); + } + + if (false !== $timezone) { + $date->setTimezone($timezone); + } + + return $date; +} + +/** + * Replaces strings within a string. + * + * @param string $str String to replace in + * @param array|Traversable $from Replace values + * @param string|null $to Replace to, deprecated (@see http://php.net/manual/en/function.strtr.php) + * + * @return string + */ +function twig_replace_filter($str, $from, $to = null) +{ + if ($from instanceof Traversable) { + $from = iterator_to_array($from); + } elseif (is_string($from) && is_string($to)) { + @trigger_error('Using "replace" with character by character replacement is deprecated since version 1.22 and will be removed in Twig 2.0', E_USER_DEPRECATED); + + return strtr($str, $from, $to); + } elseif (!is_array($from)) { + throw new Twig_Error_Runtime(sprintf('The "replace" filter expects an array or "Traversable" as replace values, got "%s".', is_object($from) ? get_class($from) : gettype($from))); + } + + return strtr($str, $from); +} + +/** + * Rounds a number. + * + * @param int|float $value The value to round + * @param int|float $precision The rounding precision + * @param string $method The method to use for rounding + * + * @return int|float The rounded number + */ +function twig_round($value, $precision = 0, $method = 'common') +{ + if ('common' == $method) { + return round($value, $precision); + } + + if ('ceil' != $method && 'floor' != $method) { + throw new Twig_Error_Runtime('The round filter only supports the "common", "ceil", and "floor" methods.'); + } + + return $method($value * pow(10, $precision)) / pow(10, $precision); +} + +/** + * Number format filter. + * + * All of the formatting options can be left null, in that case the defaults will + * be used. Supplying any of the parameters will override the defaults set in the + * environment object. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param mixed $number A float/int/string of the number to format + * @param int $decimal The number of decimal points to display. + * @param string $decimalPoint The character(s) to use for the decimal point. + * @param string $thousandSep The character(s) to use for the thousands separator. + * + * @return string The formatted number + */ +function twig_number_format_filter(Twig_Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null) +{ + $defaults = $env->getExtension('Twig_Extension_Core')->getNumberFormat(); + if (null === $decimal) { + $decimal = $defaults[0]; + } + + if (null === $decimalPoint) { + $decimalPoint = $defaults[1]; + } + + if (null === $thousandSep) { + $thousandSep = $defaults[2]; + } + + return number_format((float) $number, $decimal, $decimalPoint, $thousandSep); +} + +/** + * URL encodes (RFC 3986) a string as a path segment or an array as a query string. + * + * @param string|array $url A URL or an array of query parameters + * + * @return string The URL encoded value + */ +function twig_urlencode_filter($url) +{ + if (is_array($url)) { + if (defined('PHP_QUERY_RFC3986')) { + return http_build_query($url, '', '&', PHP_QUERY_RFC3986); + } + + return http_build_query($url, '', '&'); + } + + return rawurlencode($url); +} + +if (PHP_VERSION_ID < 50300) { + /** + * JSON encodes a variable. + * + * @param mixed $value The value to encode. + * @param int $options Not used on PHP 5.2.x + * + * @return mixed The JSON encoded value + */ + function twig_jsonencode_filter($value, $options = 0) + { + if ($value instanceof Twig_Markup) { + $value = (string) $value; + } elseif (is_array($value)) { + array_walk_recursive($value, '_twig_markup2string'); + } + + return json_encode($value); + } +} else { + /** + * JSON encodes a variable. + * + * @param mixed $value The value to encode. + * @param int $options Bitmask consisting of JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT + * + * @return mixed The JSON encoded value + */ + function twig_jsonencode_filter($value, $options = 0) + { + if ($value instanceof Twig_Markup) { + $value = (string) $value; + } elseif (is_array($value)) { + array_walk_recursive($value, '_twig_markup2string'); + } + + return json_encode($value, $options); + } +} + +function _twig_markup2string(&$value) +{ + if ($value instanceof Twig_Markup) { + $value = (string) $value; + } +} + +/** + * Merges an array with another one. + * + *
    + *  {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
    + *
    + *  {% set items = items|merge({ 'peugeot': 'car' }) %}
    + *
    + *  {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car' } #}
    + * 
    + * + * @param array|Traversable $arr1 An array + * @param array|Traversable $arr2 An array + * + * @return array The merged array + */ +function twig_array_merge($arr1, $arr2) +{ + if ($arr1 instanceof Traversable) { + $arr1 = iterator_to_array($arr1); + } elseif (!is_array($arr1)) { + throw new Twig_Error_Runtime(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as first argument.', gettype($arr1))); + } + + if ($arr2 instanceof Traversable) { + $arr2 = iterator_to_array($arr2); + } elseif (!is_array($arr2)) { + throw new Twig_Error_Runtime(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as second argument.', gettype($arr2))); + } + + return array_merge($arr1, $arr2); +} + +/** + * Slices a variable. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param mixed $item A variable + * @param int $start Start of the slice + * @param int $length Size of the slice + * @param bool $preserveKeys Whether to preserve key or not (when the input is an array) + * + * @return mixed The sliced variable + */ +function twig_slice(Twig_Environment $env, $item, $start, $length = null, $preserveKeys = false) +{ + if ($item instanceof Traversable) { + if ($item instanceof IteratorAggregate) { + $item = $item->getIterator(); + } + + if ($start >= 0 && $length >= 0 && $item instanceof Iterator) { + try { + return iterator_to_array(new LimitIterator($item, $start, $length === null ? -1 : $length), $preserveKeys); + } catch (OutOfBoundsException $exception) { + return array(); + } + } + + $item = iterator_to_array($item, $preserveKeys); + } + + if (is_array($item)) { + return array_slice($item, $start, $length, $preserveKeys); + } + + $item = (string) $item; + + if (function_exists('mb_get_info') && null !== $charset = $env->getCharset()) { + return (string) mb_substr($item, $start, null === $length ? mb_strlen($item, $charset) - $start : $length, $charset); + } + + return (string) (null === $length ? substr($item, $start) : substr($item, $start, $length)); +} + +/** + * Returns the first element of the item. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param mixed $item A variable + * + * @return mixed The first element of the item + */ +function twig_first(Twig_Environment $env, $item) +{ + $elements = twig_slice($env, $item, 0, 1, false); + + return is_string($elements) ? $elements : current($elements); +} + +/** + * Returns the last element of the item. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param mixed $item A variable + * + * @return mixed The last element of the item + */ +function twig_last(Twig_Environment $env, $item) +{ + $elements = twig_slice($env, $item, -1, 1, false); + + return is_string($elements) ? $elements : current($elements); +} + +/** + * Joins the values to a string. + * + * The separator between elements is an empty string per default, you can define it with the optional parameter. + * + *
    + *  {{ [1, 2, 3]|join('|') }}
    + *  {# returns 1|2|3 #}
    + *
    + *  {{ [1, 2, 3]|join }}
    + *  {# returns 123 #}
    + * 
    + * + * @param array $value An array + * @param string $glue The separator + * + * @return string The concatenated string + */ +function twig_join_filter($value, $glue = '') +{ + if ($value instanceof Traversable) { + $value = iterator_to_array($value, false); + } + + return implode($glue, (array) $value); +} + +/** + * Splits the string into an array. + * + *
    + *  {{ "one,two,three"|split(',') }}
    + *  {# returns [one, two, three] #}
    + *
    + *  {{ "one,two,three,four,five"|split(',', 3) }}
    + *  {# returns [one, two, "three,four,five"] #}
    + *
    + *  {{ "123"|split('') }}
    + *  {# returns [1, 2, 3] #}
    + *
    + *  {{ "aabbcc"|split('', 2) }}
    + *  {# returns [aa, bb, cc] #}
    + * 
    + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $value A string + * @param string $delimiter The delimiter + * @param int $limit The limit + * + * @return array The split string as an array + */ +function twig_split_filter(Twig_Environment $env, $value, $delimiter, $limit = null) +{ + if (!empty($delimiter)) { + return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit); + } + + if (!function_exists('mb_get_info') || null === $charset = $env->getCharset()) { + return str_split($value, null === $limit ? 1 : $limit); + } + + if ($limit <= 1) { + return preg_split('/(? + * {% for key in array|keys %} + * {# ... #} + * {% endfor %} + * + * + * @param array $array An array + * + * @return array The keys + */ +function twig_get_array_keys_filter($array) +{ + if ($array instanceof Traversable) { + return array_keys(iterator_to_array($array)); + } + + if (!is_array($array)) { + return array(); + } + + return array_keys($array); +} + +/** + * Reverses a variable. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param array|Traversable|string $item An array, a Traversable instance, or a string + * @param bool $preserveKeys Whether to preserve key or not + * + * @return mixed The reversed input + */ +function twig_reverse_filter(Twig_Environment $env, $item, $preserveKeys = false) +{ + if ($item instanceof Traversable) { + return array_reverse(iterator_to_array($item), $preserveKeys); + } + + if (is_array($item)) { + return array_reverse($item, $preserveKeys); + } + + if (null !== $charset = $env->getCharset()) { + $string = (string) $item; + + if ('UTF-8' !== $charset) { + $item = twig_convert_encoding($string, 'UTF-8', $charset); + } + + preg_match_all('/./us', $item, $matches); + + $string = implode('', array_reverse($matches[0])); + + if ('UTF-8' !== $charset) { + $string = twig_convert_encoding($string, $charset, 'UTF-8'); + } + + return $string; + } + + return strrev((string) $item); +} + +/** + * Sorts an array. + * + * @param array|Traversable $array + * + * @return array + */ +function twig_sort_filter($array) +{ + if ($array instanceof Traversable) { + $array = iterator_to_array($array); + } elseif (!is_array($array)) { + throw new Twig_Error_Runtime(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', gettype($array))); + } + + asort($array); + + return $array; +} + +/** + * @internal + */ +function twig_in_filter($value, $compare) +{ + if (is_array($compare)) { + return in_array($value, $compare, is_object($value) || is_resource($value)); + } elseif (is_string($compare) && (is_string($value) || is_int($value) || is_float($value))) { + return '' === $value || false !== strpos($compare, (string) $value); + } elseif ($compare instanceof Traversable) { + return in_array($value, iterator_to_array($compare, false), is_object($value) || is_resource($value)); + } + + return false; +} + +/** + * Escapes a string. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param mixed $string The value to be escaped + * @param string $strategy The escaping strategy + * @param string $charset The charset + * @param bool $autoescape Whether the function is called by the auto-escaping feature (true) or by the developer (false) + * + * @return string + */ +function twig_escape_filter(Twig_Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false) +{ + if ($autoescape && $string instanceof Twig_Markup) { + return $string; + } + + if (!is_string($string)) { + if (is_object($string) && method_exists($string, '__toString')) { + $string = (string) $string; + } elseif (in_array($strategy, array('html', 'js', 'css', 'html_attr', 'url'))) { + return $string; + } + } + + if (null === $charset) { + $charset = $env->getCharset(); + } + + switch ($strategy) { + case 'html': + // see http://php.net/htmlspecialchars + + // Using a static variable to avoid initializing the array + // each time the function is called. Moving the declaration on the + // top of the function slow downs other escaping strategies. + static $htmlspecialcharsCharsets; + + if (null === $htmlspecialcharsCharsets) { + if (defined('HHVM_VERSION')) { + $htmlspecialcharsCharsets = array('utf-8' => true, 'UTF-8' => true); + } else { + $htmlspecialcharsCharsets = array( + 'ISO-8859-1' => true, 'ISO8859-1' => true, + 'ISO-8859-15' => true, 'ISO8859-15' => true, + 'utf-8' => true, 'UTF-8' => true, + 'CP866' => true, 'IBM866' => true, '866' => true, + 'CP1251' => true, 'WINDOWS-1251' => true, 'WIN-1251' => true, + '1251' => true, + 'CP1252' => true, 'WINDOWS-1252' => true, '1252' => true, + 'KOI8-R' => true, 'KOI8-RU' => true, 'KOI8R' => true, + 'BIG5' => true, '950' => true, + 'GB2312' => true, '936' => true, + 'BIG5-HKSCS' => true, + 'SHIFT_JIS' => true, 'SJIS' => true, '932' => true, + 'EUC-JP' => true, 'EUCJP' => true, + 'ISO8859-5' => true, 'ISO-8859-5' => true, 'MACROMAN' => true, + ); + } + } + + if (isset($htmlspecialcharsCharsets[$charset])) { + return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset); + } + + if (isset($htmlspecialcharsCharsets[strtoupper($charset)])) { + // cache the lowercase variant for future iterations + $htmlspecialcharsCharsets[$charset] = true; + + return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset); + } + + $string = twig_convert_encoding($string, 'UTF-8', $charset); + $string = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + + return twig_convert_encoding($string, $charset, 'UTF-8'); + + case 'js': + // escape all non-alphanumeric characters + // into their \xHH or \uHHHH representations + if ('UTF-8' !== $charset) { + $string = twig_convert_encoding($string, 'UTF-8', $charset); + } + + if (0 == strlen($string) ? false : (1 == preg_match('/^./su', $string) ? false : true)) { + throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.'); + } + + $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', '_twig_escape_js_callback', $string); + + if ('UTF-8' !== $charset) { + $string = twig_convert_encoding($string, $charset, 'UTF-8'); + } + + return $string; + + case 'css': + if ('UTF-8' !== $charset) { + $string = twig_convert_encoding($string, 'UTF-8', $charset); + } + + if (0 == strlen($string) ? false : (1 == preg_match('/^./su', $string) ? false : true)) { + throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.'); + } + + $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', '_twig_escape_css_callback', $string); + + if ('UTF-8' !== $charset) { + $string = twig_convert_encoding($string, $charset, 'UTF-8'); + } + + return $string; + + case 'html_attr': + if ('UTF-8' !== $charset) { + $string = twig_convert_encoding($string, 'UTF-8', $charset); + } + + if (0 == strlen($string) ? false : (1 == preg_match('/^./su', $string) ? false : true)) { + throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.'); + } + + $string = preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su', '_twig_escape_html_attr_callback', $string); + + if ('UTF-8' !== $charset) { + $string = twig_convert_encoding($string, $charset, 'UTF-8'); + } + + return $string; + + case 'url': + if (PHP_VERSION_ID < 50300) { + return str_replace('%7E', '~', rawurlencode($string)); + } + + return rawurlencode($string); + + default: + static $escapers; + + if (null === $escapers) { + $escapers = $env->getExtension('Twig_Extension_Core')->getEscapers(); + } + + if (isset($escapers[$strategy])) { + return call_user_func($escapers[$strategy], $env, $string, $charset); + } + + $validStrategies = implode(', ', array_merge(array('html', 'js', 'url', 'css', 'html_attr'), array_keys($escapers))); + + throw new Twig_Error_Runtime(sprintf('Invalid escaping strategy "%s" (valid ones: %s).', $strategy, $validStrategies)); + } +} + +/** + * @internal + */ +function twig_escape_filter_is_safe(Twig_Node $filterArgs) +{ + foreach ($filterArgs as $arg) { + if ($arg instanceof Twig_Node_Expression_Constant) { + return array($arg->getAttribute('value')); + } + + return array(); + } + + return array('html'); +} + +if (function_exists('mb_convert_encoding')) { + function twig_convert_encoding($string, $to, $from) + { + return mb_convert_encoding($string, $to, $from); + } +} elseif (function_exists('iconv')) { + function twig_convert_encoding($string, $to, $from) + { + return iconv($from, $to, $string); + } +} else { + function twig_convert_encoding($string, $to, $from) + { + throw new Twig_Error_Runtime('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).'); + } +} + +function _twig_escape_js_callback($matches) +{ + $char = $matches[0]; + + // \xHH + if (!isset($char[1])) { + return '\\x'.strtoupper(substr('00'.bin2hex($char), -2)); + } + + // \uHHHH + $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8'); + + return '\\u'.strtoupper(substr('0000'.bin2hex($char), -4)); +} + +function _twig_escape_css_callback($matches) +{ + $char = $matches[0]; + + // \xHH + if (!isset($char[1])) { + $hex = ltrim(strtoupper(bin2hex($char)), '0'); + if (0 === strlen($hex)) { + $hex = '0'; + } + + return '\\'.$hex.' '; + } + + // \uHHHH + $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8'); + + return '\\'.ltrim(strtoupper(bin2hex($char)), '0').' '; +} + +/** + * This function is adapted from code coming from Zend Framework. + * + * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ +function _twig_escape_html_attr_callback($matches) +{ + /* + * While HTML supports far more named entities, the lowest common denominator + * has become HTML5's XML Serialisation which is restricted to the those named + * entities that XML supports. Using HTML entities would result in this error: + * XML Parsing Error: undefined entity + */ + static $entityMap = array( + 34 => 'quot', /* quotation mark */ + 38 => 'amp', /* ampersand */ + 60 => 'lt', /* less-than sign */ + 62 => 'gt', /* greater-than sign */ + ); + + $chr = $matches[0]; + $ord = ord($chr); + + /* + * The following replaces characters undefined in HTML with the + * hex entity for the Unicode replacement character. + */ + if (($ord <= 0x1f && $chr != "\t" && $chr != "\n" && $chr != "\r") || ($ord >= 0x7f && $ord <= 0x9f)) { + return '�'; + } + + /* + * Check if the current character to escape has a name entity we should + * replace it with while grabbing the hex value of the character. + */ + if (strlen($chr) == 1) { + $hex = strtoupper(substr('00'.bin2hex($chr), -2)); + } else { + $chr = twig_convert_encoding($chr, 'UTF-16BE', 'UTF-8'); + $hex = strtoupper(substr('0000'.bin2hex($chr), -4)); + } + + $int = hexdec($hex); + if (array_key_exists($int, $entityMap)) { + return sprintf('&%s;', $entityMap[$int]); + } + + /* + * Per OWASP recommendations, we'll use hex entities for any other + * characters where a named entity does not exist. + */ + return sprintf('&#x%s;', $hex); +} + +// add multibyte extensions if possible +if (function_exists('mb_get_info')) { + /** + * Returns the length of a variable. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param mixed $thing A variable + * + * @return int The length of the value + */ + function twig_length_filter(Twig_Environment $env, $thing) + { + return is_scalar($thing) ? mb_strlen($thing, $env->getCharset()) : count($thing); + } + + /** + * Converts a string to uppercase. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $string A string + * + * @return string The uppercased string + */ + function twig_upper_filter(Twig_Environment $env, $string) + { + if (null !== $charset = $env->getCharset()) { + return mb_strtoupper($string, $charset); + } + + return strtoupper($string); + } + + /** + * Converts a string to lowercase. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $string A string + * + * @return string The lowercased string + */ + function twig_lower_filter(Twig_Environment $env, $string) + { + if (null !== $charset = $env->getCharset()) { + return mb_strtolower($string, $charset); + } + + return strtolower($string); + } + + /** + * Returns a titlecased string. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $string A string + * + * @return string The titlecased string + */ + function twig_title_string_filter(Twig_Environment $env, $string) + { + if (null !== $charset = $env->getCharset()) { + return mb_convert_case($string, MB_CASE_TITLE, $charset); + } + + return ucwords(strtolower($string)); + } + + /** + * Returns a capitalized string. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $string A string + * + * @return string The capitalized string + */ + function twig_capitalize_string_filter(Twig_Environment $env, $string) + { + if (null !== $charset = $env->getCharset()) { + return mb_strtoupper(mb_substr($string, 0, 1, $charset), $charset).mb_strtolower(mb_substr($string, 1, mb_strlen($string, $charset), $charset), $charset); + } + + return ucfirst(strtolower($string)); + } +} +// and byte fallback +else { + /** + * Returns the length of a variable. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param mixed $thing A variable + * + * @return int The length of the value + */ + function twig_length_filter(Twig_Environment $env, $thing) + { + return is_scalar($thing) ? strlen($thing) : count($thing); + } + + /** + * Returns a titlecased string. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $string A string + * + * @return string The titlecased string + */ + function twig_title_string_filter(Twig_Environment $env, $string) + { + return ucwords(strtolower($string)); + } + + /** + * Returns a capitalized string. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $string A string + * + * @return string The capitalized string + */ + function twig_capitalize_string_filter(Twig_Environment $env, $string) + { + return ucfirst(strtolower($string)); + } +} + +/** + * @internal + */ +function twig_ensure_traversable($seq) +{ + if ($seq instanceof Traversable || is_array($seq)) { + return $seq; + } + + return array(); +} + +/** + * Checks if a variable is empty. + * + *
    + * {# evaluates to true if the foo variable is null, false, or the empty string #}
    + * {% if foo is empty %}
    + *     {# ... #}
    + * {% endif %}
    + * 
    + * + * @param mixed $value A variable + * + * @return bool true if the value is empty, false otherwise + */ +function twig_test_empty($value) +{ + if ($value instanceof Countable) { + return 0 == count($value); + } + + return '' === $value || false === $value || null === $value || array() === $value; +} + +/** + * Checks if a variable is traversable. + * + *
    + * {# evaluates to true if the foo variable is an array or a traversable object #}
    + * {% if foo is traversable %}
    + *     {# ... #}
    + * {% endif %}
    + * 
    + * + * @param mixed $value A variable + * + * @return bool true if the value is traversable + */ +function twig_test_iterable($value) +{ + return $value instanceof Traversable || is_array($value); +} + +/** + * Renders a template. + * + * @param Twig_Environment $env + * @param array $context + * @param string|array $template The template to render or an array of templates to try consecutively + * @param array $variables The variables to pass to the template + * @param bool $withContext + * @param bool $ignoreMissing Whether to ignore missing templates or not + * @param bool $sandboxed Whether to sandbox the template or not + * + * @return string The rendered template + */ +function twig_include(Twig_Environment $env, $context, $template, $variables = array(), $withContext = true, $ignoreMissing = false, $sandboxed = false) +{ + $alreadySandboxed = false; + $sandbox = null; + if ($withContext) { + $variables = array_merge($context, $variables); + } + + if ($isSandboxed = $sandboxed && $env->hasExtension('Twig_Extension_Sandbox')) { + $sandbox = $env->getExtension('Twig_Extension_Sandbox'); + if (!$alreadySandboxed = $sandbox->isSandboxed()) { + $sandbox->enableSandbox(); + } + } + + $result = null; + try { + $result = $env->resolveTemplate($template)->render($variables); + } catch (Twig_Error_Loader $e) { + if (!$ignoreMissing) { + if ($isSandboxed && !$alreadySandboxed) { + $sandbox->disableSandbox(); + } + + throw $e; + } + } + + if ($isSandboxed && !$alreadySandboxed) { + $sandbox->disableSandbox(); + } + + return $result; +} + +/** + * Returns a template content without rendering it. + * + * @param Twig_Environment $env + * @param string $name The template name + * @param bool $ignoreMissing Whether to ignore missing templates or not + * + * @return string The template source + */ +function twig_source(Twig_Environment $env, $name, $ignoreMissing = false) +{ + try { + return $env->getLoader()->getSource($name); + } catch (Twig_Error_Loader $e) { + if (!$ignoreMissing) { + throw $e; + } + } +} + +/** + * Provides the ability to get constants from instances as well as class/global constants. + * + * @param string $constant The name of the constant + * @param null|object $object The object to get the constant from + * + * @return string + */ +function twig_constant($constant, $object = null) +{ + if (null !== $object) { + $constant = get_class($object).'::'.$constant; + } + + return constant($constant); +} + +/** + * Batches item. + * + * @param array $items An array of items + * @param int $size The size of the batch + * @param mixed $fill A value used to fill missing items + * + * @return array + */ +function twig_array_batch($items, $size, $fill = null) +{ + if ($items instanceof Traversable) { + $items = iterator_to_array($items, false); + } + + $size = ceil($size); + + $result = array_chunk($items, $size, true); + + if (null !== $fill && !empty($result)) { + $last = count($result) - 1; + if ($fillCount = $size - count($result[$last])) { + $result[$last] = array_merge( + $result[$last], + array_fill(0, $fillCount, $fill) + ); + } + } + + return $result; +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Debug.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Debug.php new file mode 100644 index 000000000..42fdb1e30 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Debug.php @@ -0,0 +1,61 @@ + $isDumpOutputHtmlSafe ? array('html') : array(), 'needs_context' => true, 'needs_environment' => true)), + ); + } + + public function getName() + { + return 'debug'; + } +} + +function twig_var_dump(Twig_Environment $env, $context) +{ + if (!$env->isDebug()) { + return; + } + + ob_start(); + + $count = func_num_args(); + if (2 === $count) { + $vars = array(); + foreach ($context as $key => $value) { + if (!$value instanceof Twig_Template) { + $vars[$key] = $value; + } + } + + var_dump($vars); + } else { + for ($i = 2; $i < $count; ++$i) { + var_dump(func_get_arg($i)); + } + } + + return ob_get_clean(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Escaper.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Escaper.php new file mode 100644 index 000000000..0be721d5b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Escaper.php @@ -0,0 +1,102 @@ +setDefaultStrategy($defaultStrategy); + } + + public function getTokenParsers() + { + return array(new Twig_TokenParser_AutoEscape()); + } + + public function getNodeVisitors() + { + return array(new Twig_NodeVisitor_Escaper()); + } + + public function getFilters() + { + return array( + new Twig_SimpleFilter('raw', 'twig_raw_filter', array('is_safe' => array('all'))), + ); + } + + /** + * Sets the default strategy to use when not defined by the user. + * + * The strategy can be a valid PHP callback that takes the template + * "filename" as an argument and returns the strategy to use. + * + * @param string|false|callable $defaultStrategy An escaping strategy + */ + public function setDefaultStrategy($defaultStrategy) + { + // for BC + if (true === $defaultStrategy) { + @trigger_error('Using "true" as the default strategy is deprecated since version 1.21. Use "html" instead.', E_USER_DEPRECATED); + + $defaultStrategy = 'html'; + } + + if ('filename' === $defaultStrategy) { + $defaultStrategy = array('Twig_FileExtensionEscapingStrategy', 'guess'); + } + + $this->defaultStrategy = $defaultStrategy; + } + + /** + * Gets the default strategy to use when not defined by the user. + * + * @param string $filename The template "filename" + * + * @return string|false The default strategy to use for the template + */ + public function getDefaultStrategy($filename) + { + // disable string callables to avoid calling a function named html or js, + // or any other upcoming escaping strategy + if (!is_string($this->defaultStrategy) && false !== $this->defaultStrategy) { + return call_user_func($this->defaultStrategy, $filename); + } + + return $this->defaultStrategy; + } + + public function getName() + { + return 'escaper'; + } +} + +/** + * Marks a variable as being safe. + * + * @param string $string A PHP variable + * + * @return string + */ +function twig_raw_filter($string) +{ + return $string; +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php new file mode 100644 index 000000000..5370b8e2a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php @@ -0,0 +1,22 @@ + + */ +interface Twig_Extension_GlobalsInterface +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php new file mode 100644 index 000000000..7a075822f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php @@ -0,0 +1,22 @@ + + */ +interface Twig_Extension_InitRuntimeInterface +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Optimizer.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Optimizer.php new file mode 100644 index 000000000..5a64a1a4e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Optimizer.php @@ -0,0 +1,29 @@ +optimizers = $optimizers; + } + + public function getNodeVisitors() + { + return array(new Twig_NodeVisitor_Optimizer($this->optimizers)); + } + + public function getName() + { + return 'optimizer'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Profiler.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Profiler.php new file mode 100644 index 000000000..643632b24 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Profiler.php @@ -0,0 +1,46 @@ +actives[] = $profile; + } + + public function enter(Twig_Profiler_Profile $profile) + { + $this->actives[0]->addProfile($profile); + array_unshift($this->actives, $profile); + } + + public function leave(Twig_Profiler_Profile $profile) + { + $profile->leave(); + array_shift($this->actives); + + if (1 === count($this->actives)) { + $this->actives[0]->leave(); + } + } + + public function getNodeVisitors() + { + return array(new Twig_Profiler_NodeVisitor_Profiler(get_class($this))); + } + + public function getName() + { + return 'profiler'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Sandbox.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Sandbox.php new file mode 100644 index 000000000..760d12382 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Sandbox.php @@ -0,0 +1,97 @@ +policy = $policy; + $this->sandboxedGlobally = $sandboxed; + } + + public function getTokenParsers() + { + return array(new Twig_TokenParser_Sandbox()); + } + + public function getNodeVisitors() + { + return array(new Twig_NodeVisitor_Sandbox()); + } + + public function enableSandbox() + { + $this->sandboxed = true; + } + + public function disableSandbox() + { + $this->sandboxed = false; + } + + public function isSandboxed() + { + return $this->sandboxedGlobally || $this->sandboxed; + } + + public function isSandboxedGlobally() + { + return $this->sandboxedGlobally; + } + + public function setSecurityPolicy(Twig_Sandbox_SecurityPolicyInterface $policy) + { + $this->policy = $policy; + } + + public function getSecurityPolicy() + { + return $this->policy; + } + + public function checkSecurity($tags, $filters, $functions) + { + if ($this->isSandboxed()) { + $this->policy->checkSecurity($tags, $filters, $functions); + } + } + + public function checkMethodAllowed($obj, $method) + { + if ($this->isSandboxed()) { + $this->policy->checkMethodAllowed($obj, $method); + } + } + + public function checkPropertyAllowed($obj, $method) + { + if ($this->isSandboxed()) { + $this->policy->checkPropertyAllowed($obj, $method); + } + } + + public function ensureToStringAllowed($obj) + { + if ($this->isSandboxed() && is_object($obj)) { + $this->policy->checkMethodAllowed($obj, '__toString'); + } + + return $obj; + } + + public function getName() + { + return 'sandbox'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Staging.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Staging.php new file mode 100644 index 000000000..d21004d09 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/Staging.php @@ -0,0 +1,94 @@ + + * + * @internal + */ +class Twig_Extension_Staging extends Twig_Extension +{ + protected $functions = array(); + protected $filters = array(); + protected $visitors = array(); + protected $tokenParsers = array(); + protected $globals = array(); + protected $tests = array(); + + public function addFunction($name, $function) + { + $this->functions[$name] = $function; + } + + public function getFunctions() + { + return $this->functions; + } + + public function addFilter($name, $filter) + { + $this->filters[$name] = $filter; + } + + public function getFilters() + { + return $this->filters; + } + + public function addNodeVisitor(Twig_NodeVisitorInterface $visitor) + { + $this->visitors[] = $visitor; + } + + public function getNodeVisitors() + { + return $this->visitors; + } + + public function addTokenParser(Twig_TokenParserInterface $parser) + { + $this->tokenParsers[] = $parser; + } + + public function getTokenParsers() + { + return $this->tokenParsers; + } + + public function addGlobal($name, $value) + { + $this->globals[$name] = $value; + } + + public function getGlobals() + { + return $this->globals; + } + + public function addTest($name, $test) + { + $this->tests[$name] = $test; + } + + public function getTests() + { + return $this->tests; + } + + public function getName() + { + return 'staging'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/StringLoader.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/StringLoader.php new file mode 100644 index 000000000..2a3ddb6a7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Extension/StringLoader.php @@ -0,0 +1,41 @@ + true)), + ); + } + + public function getName() + { + return 'string_loader'; + } +} + +/** + * Loads a template from a string. + * + *
    + * {{ include(template_from_string("Hello {{ name }}")) }}
    + * 
    + * + * @param Twig_Environment $env A Twig_Environment instance + * @param string $template A template as a string or object implementing __toString() + * + * @return Twig_Template A Twig_Template instance + */ +function twig_template_from_string(Twig_Environment $env, $template) +{ + return $env->createTemplate((string) $template); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExtensionInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExtensionInterface.php new file mode 100644 index 000000000..854d07327 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ExtensionInterface.php @@ -0,0 +1,89 @@ + + */ +interface Twig_ExtensionInterface +{ + /** + * Initializes the runtime environment. + * + * This is where you can load some file that contains filter functions for instance. + * + * @param Twig_Environment $environment The current Twig_Environment instance + * + * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead + */ + public function initRuntime(Twig_Environment $environment); + + /** + * Returns the token parser instances to add to the existing list. + * + * @return Twig_TokenParserInterface[] + */ + public function getTokenParsers(); + + /** + * Returns the node visitor instances to add to the existing list. + * + * @return Twig_NodeVisitorInterface[] An array of Twig_NodeVisitorInterface instances + */ + public function getNodeVisitors(); + + /** + * Returns a list of filters to add to the existing list. + * + * @return Twig_SimpleFilter[] + */ + public function getFilters(); + + /** + * Returns a list of tests to add to the existing list. + * + * @return Twig_SimpleTest[] + */ + public function getTests(); + + /** + * Returns a list of functions to add to the existing list. + * + * @return Twig_SimpleFunction[] + */ + public function getFunctions(); + + /** + * Returns a list of operators to add to the existing list. + * + * @return array An array of operators + */ + public function getOperators(); + + /** + * Returns a list of global variables to add to the existing list. + * + * @return array An array of global variables + * + * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead + */ + public function getGlobals(); + + /** + * Returns the name of the extension. + * + * @return string The extension name + * + * @deprecated since 1.26 (to be removed in 2.0), not used anymore internally + */ + public function getName(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php new file mode 100644 index 000000000..9bda0b4f6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php @@ -0,0 +1,58 @@ + + */ +class Twig_FileExtensionEscapingStrategy +{ + /** + * Guesses the best autoescaping strategy based on the file name. + * + * @param string $filename The template file name + * + * @return string|false The escaping strategy name to use or false to disable + */ + public static function guess($filename) + { + if (in_array(substr($filename, -1), array('/', '\\'))) { + return 'html'; // return html for directories + } + + if ('.twig' === substr($filename, -5)) { + $filename = substr($filename, 0, -5); + } + + $extension = pathinfo($filename, PATHINFO_EXTENSION); + + switch ($extension) { + case 'js': + return 'js'; + + case 'css': + return 'css'; + + case 'txt': + return false; + + default: + return 'html'; + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter.php new file mode 100644 index 000000000..101d2e793 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter.php @@ -0,0 +1,84 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +abstract class Twig_Filter implements Twig_FilterInterface, Twig_FilterCallableInterface +{ + protected $options; + protected $arguments = array(); + + public function __construct(array $options = array()) + { + $this->options = array_merge(array( + 'needs_environment' => false, + 'needs_context' => false, + 'pre_escape' => null, + 'preserves_safety' => null, + 'callable' => null, + ), $options); + } + + public function setArguments($arguments) + { + $this->arguments = $arguments; + } + + public function getArguments() + { + return $this->arguments; + } + + public function needsEnvironment() + { + return $this->options['needs_environment']; + } + + public function needsContext() + { + return $this->options['needs_context']; + } + + public function getSafe(Twig_Node $filterArgs) + { + if (isset($this->options['is_safe'])) { + return $this->options['is_safe']; + } + + if (isset($this->options['is_safe_callback'])) { + return call_user_func($this->options['is_safe_callback'], $filterArgs); + } + } + + public function getPreservesSafety() + { + return $this->options['preserves_safety']; + } + + public function getPreEscape() + { + return $this->options['pre_escape']; + } + + public function getCallable() + { + return $this->options['callable']; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Function.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Function.php new file mode 100644 index 000000000..d679cab2f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Function.php @@ -0,0 +1,40 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Filter_Function extends Twig_Filter +{ + protected $function; + + public function __construct($function, array $options = array()) + { + $options['callable'] = $function; + + parent::__construct($options); + + $this->function = $function; + } + + public function compile() + { + return $this->function; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Method.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Method.php new file mode 100644 index 000000000..5ca0511b8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Method.php @@ -0,0 +1,42 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Filter_Method extends Twig_Filter +{ + protected $extension; + protected $method; + + public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array()) + { + $options['callable'] = array($extension, $method); + + parent::__construct($options); + + $this->extension = $extension; + $this->method = $method; + } + + public function compile() + { + return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Node.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Node.php new file mode 100644 index 000000000..a922f5037 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Filter/Node.php @@ -0,0 +1,42 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Filter_Node extends Twig_Filter +{ + protected $class; + + public function __construct($class, array $options = array()) + { + parent::__construct($options); + + $this->class = $class; + } + + public function getClass() + { + return $this->class; + } + + public function compile() + { + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FilterCallableInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FilterCallableInterface.php new file mode 100644 index 000000000..567986131 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FilterCallableInterface.php @@ -0,0 +1,24 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +interface Twig_FilterCallableInterface +{ + public function getCallable(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FilterInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FilterInterface.php new file mode 100644 index 000000000..6b0be0e30 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FilterInterface.php @@ -0,0 +1,43 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +interface Twig_FilterInterface +{ + /** + * Compiles a filter. + * + * @return string The PHP code for the filter + */ + public function compile(); + + public function needsEnvironment(); + + public function needsContext(); + + public function getSafe(Twig_Node $filterArgs); + + public function getPreservesSafety(); + + public function getPreEscape(); + + public function setArguments($arguments); + + public function getArguments(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function.php new file mode 100644 index 000000000..9fc76a8b7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function.php @@ -0,0 +1,74 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +abstract class Twig_Function implements Twig_FunctionInterface, Twig_FunctionCallableInterface +{ + protected $options; + protected $arguments = array(); + + public function __construct(array $options = array()) + { + $this->options = array_merge(array( + 'needs_environment' => false, + 'needs_context' => false, + 'callable' => null, + ), $options); + } + + public function setArguments($arguments) + { + $this->arguments = $arguments; + } + + public function getArguments() + { + return $this->arguments; + } + + public function needsEnvironment() + { + return $this->options['needs_environment']; + } + + public function needsContext() + { + return $this->options['needs_context']; + } + + public function getSafe(Twig_Node $functionArgs) + { + if (isset($this->options['is_safe'])) { + return $this->options['is_safe']; + } + + if (isset($this->options['is_safe_callback'])) { + return call_user_func($this->options['is_safe_callback'], $functionArgs); + } + + return array(); + } + + public function getCallable() + { + return $this->options['callable']; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Function.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Function.php new file mode 100644 index 000000000..ae83e153c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Function.php @@ -0,0 +1,41 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Function_Function extends Twig_Function +{ + protected $function; + + public function __construct($function, array $options = array()) + { + $options['callable'] = $function; + + parent::__construct($options); + + $this->function = $function; + } + + public function compile() + { + return $this->function; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Method.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Method.php new file mode 100644 index 000000000..d014be48f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Method.php @@ -0,0 +1,43 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Function_Method extends Twig_Function +{ + protected $extension; + protected $method; + + public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array()) + { + $options['callable'] = array($extension, $method); + + parent::__construct($options); + + $this->extension = $extension; + $this->method = $method; + } + + public function compile() + { + return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Node.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Node.php new file mode 100644 index 000000000..118b0bab7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Function/Node.php @@ -0,0 +1,42 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Function_Node extends Twig_Function +{ + protected $class; + + public function __construct($class, array $options = array()) + { + parent::__construct($options); + + $this->class = $class; + } + + public function getClass() + { + return $this->class; + } + + public function compile() + { + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php new file mode 100644 index 000000000..87d795eb8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php @@ -0,0 +1,24 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +interface Twig_FunctionCallableInterface +{ + public function getCallable(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FunctionInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FunctionInterface.php new file mode 100644 index 000000000..f44923441 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/FunctionInterface.php @@ -0,0 +1,40 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +interface Twig_FunctionInterface +{ + /** + * Compiles a function. + * + * @return string The PHP code for the function + */ + public function compile(); + + public function needsEnvironment(); + + public function needsContext(); + + public function getSafe(Twig_Node $filterArgs); + + public function setArguments($arguments); + + public function getArguments(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Lexer.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Lexer.php new file mode 100644 index 000000000..829164e88 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Lexer.php @@ -0,0 +1,411 @@ + + */ +class Twig_Lexer implements Twig_LexerInterface +{ + protected $tokens; + protected $code; + protected $cursor; + protected $lineno; + protected $end; + protected $state; + protected $states; + protected $brackets; + protected $env; + protected $filename; + protected $options; + protected $regexes; + protected $position; + protected $positions; + protected $currentVarBlockLine; + + const STATE_DATA = 0; + const STATE_BLOCK = 1; + const STATE_VAR = 2; + const STATE_STRING = 3; + const STATE_INTERPOLATION = 4; + + const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A'; + const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?/A'; + const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As'; + const REGEX_DQ_STRING_DELIM = '/"/A'; + const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As'; + const PUNCTUATION = '()[]{}?:.,|'; + + public function __construct(Twig_Environment $env, array $options = array()) + { + $this->env = $env; + + $this->options = array_merge(array( + 'tag_comment' => array('{#', '#}'), + 'tag_block' => array('{%', '%}'), + 'tag_variable' => array('{{', '}}'), + 'whitespace_trim' => '-', + 'interpolation' => array('#{', '}'), + ), $options); + + $this->regexes = array( + 'lex_var' => '/\s*'.preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_variable'][1], '/').'/A', + 'lex_block' => '/\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')\n?/A', + 'lex_raw_data' => '/('.preg_quote($this->options['tag_block'][0].$this->options['whitespace_trim'], '/').'|'.preg_quote($this->options['tag_block'][0], '/').')\s*(?:end%s)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/s', + 'operator' => $this->getOperatorRegex(), + 'lex_comment' => '/(?:'.preg_quote($this->options['whitespace_trim'], '/').preg_quote($this->options['tag_comment'][1], '/').'\s*|'.preg_quote($this->options['tag_comment'][1], '/').')\n?/s', + 'lex_block_raw' => '/\s*(raw|verbatim)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/As', + 'lex_block_line' => '/\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '/').'/As', + 'lex_tokens_start' => '/('.preg_quote($this->options['tag_variable'][0], '/').'|'.preg_quote($this->options['tag_block'][0], '/').'|'.preg_quote($this->options['tag_comment'][0], '/').')('.preg_quote($this->options['whitespace_trim'], '/').')?/s', + 'interpolation_start' => '/'.preg_quote($this->options['interpolation'][0], '/').'\s*/A', + 'interpolation_end' => '/\s*'.preg_quote($this->options['interpolation'][1], '/').'/A', + ); + } + + /** + * {@inheritdoc} + */ + public function tokenize($code, $filename = null) + { + if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } else { + $mbEncoding = null; + } + + $this->code = str_replace(array("\r\n", "\r"), "\n", $code); + $this->filename = $filename; + $this->cursor = 0; + $this->lineno = 1; + $this->end = strlen($this->code); + $this->tokens = array(); + $this->state = self::STATE_DATA; + $this->states = array(); + $this->brackets = array(); + $this->position = -1; + + // find all token starts in one go + preg_match_all($this->regexes['lex_tokens_start'], $this->code, $matches, PREG_OFFSET_CAPTURE); + $this->positions = $matches; + + while ($this->cursor < $this->end) { + // dispatch to the lexing functions depending + // on the current state + switch ($this->state) { + case self::STATE_DATA: + $this->lexData(); + break; + + case self::STATE_BLOCK: + $this->lexBlock(); + break; + + case self::STATE_VAR: + $this->lexVar(); + break; + + case self::STATE_STRING: + $this->lexString(); + break; + + case self::STATE_INTERPOLATION: + $this->lexInterpolation(); + break; + } + } + + $this->pushToken(Twig_Token::EOF_TYPE); + + if (!empty($this->brackets)) { + list($expect, $lineno) = array_pop($this->brackets); + throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->filename); + } + + if ($mbEncoding) { + mb_internal_encoding($mbEncoding); + } + + return new Twig_TokenStream($this->tokens, $this->filename, $this->env->isDebug() ? $code : ''); + } + + protected function lexData() + { + // if no matches are left we return the rest of the template as simple text token + if ($this->position == count($this->positions[0]) - 1) { + $this->pushToken(Twig_Token::TEXT_TYPE, substr($this->code, $this->cursor)); + $this->cursor = $this->end; + + return; + } + + // Find the first token after the current cursor + $position = $this->positions[0][++$this->position]; + while ($position[1] < $this->cursor) { + if ($this->position == count($this->positions[0]) - 1) { + return; + } + $position = $this->positions[0][++$this->position]; + } + + // push the template text first + $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor); + if (isset($this->positions[2][$this->position][0])) { + $text = rtrim($text); + } + $this->pushToken(Twig_Token::TEXT_TYPE, $text); + $this->moveCursor($textContent.$position[0]); + + switch ($this->positions[1][$this->position][0]) { + case $this->options['tag_comment'][0]: + $this->lexComment(); + break; + + case $this->options['tag_block'][0]: + // raw data? + if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, null, $this->cursor)) { + $this->moveCursor($match[0]); + $this->lexRawData($match[1]); + // {% line \d+ %} + } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, null, $this->cursor)) { + $this->moveCursor($match[0]); + $this->lineno = (int) $match[1]; + } else { + $this->pushToken(Twig_Token::BLOCK_START_TYPE); + $this->pushState(self::STATE_BLOCK); + $this->currentVarBlockLine = $this->lineno; + } + break; + + case $this->options['tag_variable'][0]: + $this->pushToken(Twig_Token::VAR_START_TYPE); + $this->pushState(self::STATE_VAR); + $this->currentVarBlockLine = $this->lineno; + break; + } + } + + protected function lexBlock() + { + if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, null, $this->cursor)) { + $this->pushToken(Twig_Token::BLOCK_END_TYPE); + $this->moveCursor($match[0]); + $this->popState(); + } else { + $this->lexExpression(); + } + } + + protected function lexVar() + { + if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, null, $this->cursor)) { + $this->pushToken(Twig_Token::VAR_END_TYPE); + $this->moveCursor($match[0]); + $this->popState(); + } else { + $this->lexExpression(); + } + } + + protected function lexExpression() + { + // whitespace + if (preg_match('/\s+/A', $this->code, $match, null, $this->cursor)) { + $this->moveCursor($match[0]); + + if ($this->cursor >= $this->end) { + throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $this->state === self::STATE_BLOCK ? 'block' : 'variable'), $this->currentVarBlockLine, $this->filename); + } + } + + // operators + if (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) { + $this->pushToken(Twig_Token::OPERATOR_TYPE, preg_replace('/\s+/', ' ', $match[0])); + $this->moveCursor($match[0]); + } + // names + elseif (preg_match(self::REGEX_NAME, $this->code, $match, null, $this->cursor)) { + $this->pushToken(Twig_Token::NAME_TYPE, $match[0]); + $this->moveCursor($match[0]); + } + // numbers + elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) { + $number = (float) $match[0]; // floats + if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) { + $number = (int) $match[0]; // integers lower than the maximum + } + $this->pushToken(Twig_Token::NUMBER_TYPE, $number); + $this->moveCursor($match[0]); + } + // punctuation + elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) { + // opening bracket + if (false !== strpos('([{', $this->code[$this->cursor])) { + $this->brackets[] = array($this->code[$this->cursor], $this->lineno); + } + // closing bracket + elseif (false !== strpos(')]}', $this->code[$this->cursor])) { + if (empty($this->brackets)) { + throw new Twig_Error_Syntax(sprintf('Unexpected "%s".', $this->code[$this->cursor]), $this->lineno, $this->filename); + } + + list($expect, $lineno) = array_pop($this->brackets); + if ($this->code[$this->cursor] != strtr($expect, '([{', ')]}')) { + throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->filename); + } + } + + $this->pushToken(Twig_Token::PUNCTUATION_TYPE, $this->code[$this->cursor]); + ++$this->cursor; + } + // strings + elseif (preg_match(self::REGEX_STRING, $this->code, $match, null, $this->cursor)) { + $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1))); + $this->moveCursor($match[0]); + } + // opening double quoted string + elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) { + $this->brackets[] = array('"', $this->lineno); + $this->pushState(self::STATE_STRING); + $this->moveCursor($match[0]); + } + // unlexable + else { + throw new Twig_Error_Syntax(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->filename); + } + } + + protected function lexRawData($tag) + { + if ('raw' === $tag) { + @trigger_error(sprintf('Twig Tag "raw" is deprecated since version 1.21. Use "verbatim" instead in %s at line %d.', $this->filename, $this->lineno), E_USER_DEPRECATED); + } + + if (!preg_match(str_replace('%s', $tag, $this->regexes['lex_raw_data']), $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) { + throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "%s" block.', $tag), $this->lineno, $this->filename); + } + + $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor); + $this->moveCursor($text.$match[0][0]); + + if (false !== strpos($match[1][0], $this->options['whitespace_trim'])) { + $text = rtrim($text); + } + + $this->pushToken(Twig_Token::TEXT_TYPE, $text); + } + + protected function lexComment() + { + if (!preg_match($this->regexes['lex_comment'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) { + throw new Twig_Error_Syntax('Unclosed comment.', $this->lineno, $this->filename); + } + + $this->moveCursor(substr($this->code, $this->cursor, $match[0][1] - $this->cursor).$match[0][0]); + } + + protected function lexString() + { + if (preg_match($this->regexes['interpolation_start'], $this->code, $match, null, $this->cursor)) { + $this->brackets[] = array($this->options['interpolation'][0], $this->lineno); + $this->pushToken(Twig_Token::INTERPOLATION_START_TYPE); + $this->moveCursor($match[0]); + $this->pushState(self::STATE_INTERPOLATION); + } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, null, $this->cursor) && strlen($match[0]) > 0) { + $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes($match[0])); + $this->moveCursor($match[0]); + } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) { + list($expect, $lineno) = array_pop($this->brackets); + if ($this->code[$this->cursor] != '"') { + throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->filename); + } + + $this->popState(); + ++$this->cursor; + } + } + + protected function lexInterpolation() + { + $bracket = end($this->brackets); + if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, null, $this->cursor)) { + array_pop($this->brackets); + $this->pushToken(Twig_Token::INTERPOLATION_END_TYPE); + $this->moveCursor($match[0]); + $this->popState(); + } else { + $this->lexExpression(); + } + } + + protected function pushToken($type, $value = '') + { + // do not push empty text tokens + if (Twig_Token::TEXT_TYPE === $type && '' === $value) { + return; + } + + $this->tokens[] = new Twig_Token($type, $value, $this->lineno); + } + + protected function moveCursor($text) + { + $this->cursor += strlen($text); + $this->lineno += substr_count($text, "\n"); + } + + protected function getOperatorRegex() + { + $operators = array_merge( + array('='), + array_keys($this->env->getUnaryOperators()), + array_keys($this->env->getBinaryOperators()) + ); + + $operators = array_combine($operators, array_map('strlen', $operators)); + arsort($operators); + + $regex = array(); + foreach ($operators as $operator => $length) { + // an operator that ends with a character must be followed by + // a whitespace or a parenthesis + if (ctype_alpha($operator[$length - 1])) { + $r = preg_quote($operator, '/').'(?=[\s()])'; + } else { + $r = preg_quote($operator, '/'); + } + + // an operator with a space can be any amount of whitespaces + $r = preg_replace('/\s+/', '\s+', $r); + + $regex[] = $r; + } + + return '/'.implode('|', $regex).'/A'; + } + + protected function pushState($state) + { + $this->states[] = $this->state; + $this->state = $state; + } + + protected function popState() + { + if (0 === count($this->states)) { + throw new Exception('Cannot pop state without a previous state.'); + } + + $this->state = array_pop($this->states); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/LexerInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/LexerInterface.php new file mode 100644 index 000000000..24a947870 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/LexerInterface.php @@ -0,0 +1,32 @@ + + * + * @deprecated since 1.12 (to be removed in 3.0) + */ +interface Twig_LexerInterface +{ + /** + * Tokenizes a source code. + * + * @param string $code The source code + * @param string $filename A unique identifier for the source code + * + * @return Twig_TokenStream A token stream instance + * + * @throws Twig_Error_Syntax When the code is syntactically wrong + */ + public function tokenize($code, $filename = null); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Array.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Array.php new file mode 100644 index 000000000..90221d5db --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Array.php @@ -0,0 +1,95 @@ + + */ +class Twig_Loader_Array implements Twig_LoaderInterface, Twig_ExistsLoaderInterface +{ + protected $templates = array(); + + /** + * Constructor. + * + * @param array $templates An array of templates (keys are the names, and values are the source code) + */ + public function __construct(array $templates) + { + $this->templates = $templates; + } + + /** + * Adds or overrides a template. + * + * @param string $name The template name + * @param string $template The template source + */ + public function setTemplate($name, $template) + { + $this->templates[(string) $name] = $template; + } + + /** + * {@inheritdoc} + */ + public function getSource($name) + { + $name = (string) $name; + if (!isset($this->templates[$name])) { + throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name)); + } + + return $this->templates[$name]; + } + + /** + * {@inheritdoc} + */ + public function exists($name) + { + return isset($this->templates[(string) $name]); + } + + /** + * {@inheritdoc} + */ + public function getCacheKey($name) + { + $name = (string) $name; + if (!isset($this->templates[$name])) { + throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name)); + } + + return $this->templates[$name]; + } + + /** + * {@inheritdoc} + */ + public function isFresh($name, $time) + { + $name = (string) $name; + if (!isset($this->templates[$name])) { + throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name)); + } + + return true; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Chain.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Chain.php new file mode 100644 index 000000000..81d57adae --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Chain.php @@ -0,0 +1,138 @@ + + */ +class Twig_Loader_Chain implements Twig_LoaderInterface, Twig_ExistsLoaderInterface +{ + private $hasSourceCache = array(); + protected $loaders = array(); + + /** + * Constructor. + * + * @param Twig_LoaderInterface[] $loaders An array of loader instances + */ + public function __construct(array $loaders = array()) + { + foreach ($loaders as $loader) { + $this->addLoader($loader); + } + } + + /** + * Adds a loader instance. + * + * @param Twig_LoaderInterface $loader A Loader instance + */ + public function addLoader(Twig_LoaderInterface $loader) + { + $this->loaders[] = $loader; + $this->hasSourceCache = array(); + } + + /** + * {@inheritdoc} + */ + public function getSource($name) + { + $exceptions = array(); + foreach ($this->loaders as $loader) { + if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) { + continue; + } + + try { + return $loader->getSource($name); + } catch (Twig_Error_Loader $e) { + $exceptions[] = $e->getMessage(); + } + } + + throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : '')); + } + + /** + * {@inheritdoc} + */ + public function exists($name) + { + $name = (string) $name; + + if (isset($this->hasSourceCache[$name])) { + return $this->hasSourceCache[$name]; + } + + foreach ($this->loaders as $loader) { + if ($loader instanceof Twig_ExistsLoaderInterface) { + if ($loader->exists($name)) { + return $this->hasSourceCache[$name] = true; + } + + continue; + } + + try { + $loader->getSource($name); + + return $this->hasSourceCache[$name] = true; + } catch (Twig_Error_Loader $e) { + } + } + + return $this->hasSourceCache[$name] = false; + } + + /** + * {@inheritdoc} + */ + public function getCacheKey($name) + { + $exceptions = array(); + foreach ($this->loaders as $loader) { + if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) { + continue; + } + + try { + return $loader->getCacheKey($name); + } catch (Twig_Error_Loader $e) { + $exceptions[] = get_class($loader).': '.$e->getMessage(); + } + } + + throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : '')); + } + + /** + * {@inheritdoc} + */ + public function isFresh($name, $time) + { + $exceptions = array(); + foreach ($this->loaders as $loader) { + if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) { + continue; + } + + try { + return $loader->isFresh($name, $time); + } catch (Twig_Error_Loader $e) { + $exceptions[] = get_class($loader).': '.$e->getMessage(); + } + } + + throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : '')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Filesystem.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Filesystem.php new file mode 100644 index 000000000..2d2153edd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/Filesystem.php @@ -0,0 +1,272 @@ + + */ +class Twig_Loader_Filesystem implements Twig_LoaderInterface, Twig_ExistsLoaderInterface +{ + /** Identifier of the main namespace. */ + const MAIN_NAMESPACE = '__main__'; + + protected $paths = array(); + protected $cache = array(); + protected $errorCache = array(); + + /** + * Constructor. + * + * @param string|array $paths A path or an array of paths where to look for templates + */ + public function __construct($paths = array()) + { + if ($paths) { + $this->setPaths($paths); + } + } + + /** + * Returns the paths to the templates. + * + * @param string $namespace A path namespace + * + * @return array The array of paths where to look for templates + */ + public function getPaths($namespace = self::MAIN_NAMESPACE) + { + return isset($this->paths[$namespace]) ? $this->paths[$namespace] : array(); + } + + /** + * Returns the path namespaces. + * + * The main namespace is always defined. + * + * @return array The array of defined namespaces + */ + public function getNamespaces() + { + return array_keys($this->paths); + } + + /** + * Sets the paths where templates are stored. + * + * @param string|array $paths A path or an array of paths where to look for templates + * @param string $namespace A path namespace + */ + public function setPaths($paths, $namespace = self::MAIN_NAMESPACE) + { + if (!is_array($paths)) { + $paths = array($paths); + } + + $this->paths[$namespace] = array(); + foreach ($paths as $path) { + $this->addPath($path, $namespace); + } + } + + /** + * Adds a path where templates are stored. + * + * @param string $path A path where to look for templates + * @param string $namespace A path name + * + * @throws Twig_Error_Loader + */ + public function addPath($path, $namespace = self::MAIN_NAMESPACE) + { + // invalidate the cache + $this->cache = $this->errorCache = array(); + + if (!is_dir($path)) { + throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path)); + } + + $this->paths[$namespace][] = rtrim($path, '/\\'); + } + + /** + * Prepends a path where templates are stored. + * + * @param string $path A path where to look for templates + * @param string $namespace A path name + * + * @throws Twig_Error_Loader + */ + public function prependPath($path, $namespace = self::MAIN_NAMESPACE) + { + // invalidate the cache + $this->cache = $this->errorCache = array(); + + if (!is_dir($path)) { + throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path)); + } + + $path = rtrim($path, '/\\'); + + if (!isset($this->paths[$namespace])) { + $this->paths[$namespace][] = $path; + } else { + array_unshift($this->paths[$namespace], $path); + } + } + + /** + * {@inheritdoc} + */ + public function getSource($name) + { + return file_get_contents($this->findTemplate($name)); + } + + /** + * {@inheritdoc} + */ + public function getCacheKey($name) + { + return $this->findTemplate($name); + } + + /** + * {@inheritdoc} + */ + public function exists($name) + { + $name = $this->normalizeName($name); + + if (isset($this->cache[$name])) { + return true; + } + + try { + return false !== $this->findTemplate($name, false); + } catch (Twig_Error_Loader $exception) { + return false; + } + } + + /** + * {@inheritdoc} + */ + public function isFresh($name, $time) + { + return filemtime($this->findTemplate($name)) <= $time; + } + + protected function findTemplate($name) + { + $throw = func_num_args() > 1 ? func_get_arg(1) : true; + $name = $this->normalizeName($name); + + if (isset($this->cache[$name])) { + return $this->cache[$name]; + } + + if (isset($this->errorCache[$name])) { + if (!$throw) { + return false; + } + + throw new Twig_Error_Loader($this->errorCache[$name]); + } + + $this->validateName($name); + + list($namespace, $shortname) = $this->parseName($name); + + if (!isset($this->paths[$namespace])) { + $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace); + + if (!$throw) { + return false; + } + + throw new Twig_Error_Loader($this->errorCache[$name]); + } + + foreach ($this->paths[$namespace] as $path) { + if (is_file($path.'/'.$shortname)) { + return $this->cache[$name] = $this->normalizePath($path.'/'.$shortname); + } + } + + $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace])); + + if (!$throw) { + return false; + } + + throw new Twig_Error_Loader($this->errorCache[$name]); + } + + protected function parseName($name, $default = self::MAIN_NAMESPACE) + { + if (isset($name[0]) && '@' == $name[0]) { + if (false === $pos = strpos($name, '/')) { + throw new Twig_Error_Loader(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name)); + } + + $namespace = substr($name, 1, $pos - 1); + $shortname = substr($name, $pos + 1); + + return array($namespace, $shortname); + } + + return array($default, $name); + } + + protected function normalizeName($name) + { + return preg_replace('#/{2,}#', '/', str_replace('\\', '/', (string) $name)); + } + + protected function validateName($name) + { + if (false !== strpos($name, "\0")) { + throw new Twig_Error_Loader('A template name cannot contain NUL bytes.'); + } + + $name = ltrim($name, '/'); + $parts = explode('/', $name); + $level = 0; + foreach ($parts as $part) { + if ('..' === $part) { + --$level; + } elseif ('.' !== $part) { + ++$level; + } + + if ($level < 0) { + throw new Twig_Error_Loader(sprintf('Looks like you try to load a template outside configured directories (%s).', $name)); + } + } + } + + private function normalizePath($path) + { + $parts = explode('/', str_replace('\\', '/', $path)); + $isPhar = strpos($path, 'phar://') === 0; + $new = array(); + foreach ($parts as $i => $part) { + if ('..' === $part) { + array_pop($new); + } elseif ('.' !== $part && ('' !== $part || 0 === $i || $isPhar && $i < 3)) { + $new[] = $part; + } + } + + return implode('/', $new); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/String.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/String.php new file mode 100644 index 000000000..00f507a4f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Loader/String.php @@ -0,0 +1,63 @@ + + */ +class Twig_Loader_String implements Twig_LoaderInterface, Twig_ExistsLoaderInterface +{ + /** + * {@inheritdoc} + */ + public function getSource($name) + { + return $name; + } + + /** + * {@inheritdoc} + */ + public function exists($name) + { + return true; + } + + /** + * {@inheritdoc} + */ + public function getCacheKey($name) + { + return $name; + } + + /** + * {@inheritdoc} + */ + public function isFresh($name, $time) + { + return true; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/LoaderInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/LoaderInterface.php new file mode 100644 index 000000000..544ea4e32 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/LoaderInterface.php @@ -0,0 +1,53 @@ + + */ +interface Twig_LoaderInterface +{ + /** + * Gets the source code of a template, given its name. + * + * @param string $name The name of the template to load + * + * @return string The template source code + * + * @throws Twig_Error_Loader When $name is not found + */ + public function getSource($name); + + /** + * Gets the cache key to use for the cache for a given template name. + * + * @param string $name The name of the template to load + * + * @return string The cache key + * + * @throws Twig_Error_Loader When $name is not found + */ + public function getCacheKey($name); + + /** + * Returns true if the template is still fresh. + * + * @param string $name The template name + * @param int $time Timestamp of the last modification time of the + * cached template + * + * @return bool true if the template is fresh, false otherwise + * + * @throws Twig_Error_Loader When $name is not found + */ + public function isFresh($name, $time); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Markup.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Markup.php new file mode 100644 index 000000000..69871fcbd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Markup.php @@ -0,0 +1,37 @@ + + */ +class Twig_Markup implements Countable +{ + protected $content; + protected $charset; + + public function __construct($content, $charset) + { + $this->content = (string) $content; + $this->charset = $charset; + } + + public function __toString() + { + return $this->content; + } + + public function count() + { + return function_exists('mb_get_info') ? mb_strlen($this->content, $this->charset) : strlen($this->content); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node.php new file mode 100644 index 000000000..e1eddd872 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node.php @@ -0,0 +1,257 @@ + + */ +class Twig_Node implements Twig_NodeInterface +{ + protected $nodes; + protected $attributes; + protected $lineno; + protected $tag; + + private $filename; + + /** + * Constructor. + * + * The nodes are automatically made available as properties ($this->node). + * The attributes are automatically made available as array items ($this['name']). + * + * @param array $nodes An array of named nodes + * @param array $attributes An array of attributes (should not be nodes) + * @param int $lineno The line number + * @param string $tag The tag name associated with the Node + */ + public function __construct(array $nodes = array(), array $attributes = array(), $lineno = 0, $tag = null) + { + foreach ($nodes as $name => $node) { + if (!$node instanceof Twig_NodeInterface) { + @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', is_object($node) ? get_class($node) : null === $node ? 'null' : gettype($node), $name, get_class($this)), E_USER_DEPRECATED); + } + } + $this->nodes = $nodes; + $this->attributes = $attributes; + $this->lineno = $lineno; + $this->tag = $tag; + } + + public function __toString() + { + $attributes = array(); + foreach ($this->attributes as $name => $value) { + $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true))); + } + + $repr = array(get_class($this).'('.implode(', ', $attributes)); + + if (count($this->nodes)) { + foreach ($this->nodes as $name => $node) { + $len = strlen($name) + 4; + $noderepr = array(); + foreach (explode("\n", (string) $node) as $line) { + $noderepr[] = str_repeat(' ', $len).$line; + } + + $repr[] = sprintf(' %s: %s', $name, ltrim(implode("\n", $noderepr))); + } + + $repr[] = ')'; + } else { + $repr[0] .= ')'; + } + + return implode("\n", $repr); + } + + /** + * @deprecated since 1.16.1 (to be removed in 2.0) + */ + public function toXml($asDom = false) + { + @trigger_error(sprintf('%s is deprecated since version 1.16.1 and will be removed in 2.0.', __METHOD__), E_USER_DEPRECATED); + + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = true; + $dom->appendChild($xml = $dom->createElement('twig')); + + $xml->appendChild($node = $dom->createElement('node')); + $node->setAttribute('class', get_class($this)); + + foreach ($this->attributes as $name => $value) { + $node->appendChild($attribute = $dom->createElement('attribute')); + $attribute->setAttribute('name', $name); + $attribute->appendChild($dom->createTextNode($value)); + } + + foreach ($this->nodes as $name => $n) { + if (null === $n) { + continue; + } + + $child = $n->toXml(true)->getElementsByTagName('node')->item(0); + $child = $dom->importNode($child, true); + $child->setAttribute('name', $name); + + $node->appendChild($child); + } + + return $asDom ? $dom : $dom->saveXML(); + } + + public function compile(Twig_Compiler $compiler) + { + foreach ($this->nodes as $node) { + $node->compile($compiler); + } + } + + public function getLine() + { + return $this->lineno; + } + + public function getNodeTag() + { + return $this->tag; + } + + /** + * Returns true if the attribute is defined. + * + * @param string $name The attribute name + * + * @return bool true if the attribute is defined, false otherwise + */ + public function hasAttribute($name) + { + return array_key_exists($name, $this->attributes); + } + + /** + * Gets an attribute value by name. + * + * @param string $name + * + * @return mixed + */ + public function getAttribute($name) + { + if (!array_key_exists($name, $this->attributes)) { + throw new LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, get_class($this))); + } + + return $this->attributes[$name]; + } + + /** + * Sets an attribute by name to a value. + * + * @param string $name + * @param mixed $value + */ + public function setAttribute($name, $value) + { + $this->attributes[$name] = $value; + } + + /** + * Removes an attribute by name. + * + * @param string $name + */ + public function removeAttribute($name) + { + unset($this->attributes[$name]); + } + + /** + * Returns true if the node with the given name exists. + * + * @param string $name + * + * @return bool + */ + public function hasNode($name) + { + return array_key_exists($name, $this->nodes); + } + + /** + * Gets a node by name. + * + * @param string $name + * + * @return Twig_Node + */ + public function getNode($name) + { + if (!array_key_exists($name, $this->nodes)) { + throw new LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, get_class($this))); + } + + return $this->nodes[$name]; + } + + /** + * Sets a node. + * + * @param string $name + * @param Twig_Node $node + */ + public function setNode($name, $node = null) + { + if (!$node instanceof Twig_NodeInterface) { + @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', is_object($node) ? get_class($node) : null === $node ? 'null' : gettype($node), $name, get_class($this)), E_USER_DEPRECATED); + } + + $this->nodes[$name] = $node; + } + + /** + * Removes a node by name. + * + * @param string $name + */ + public function removeNode($name) + { + unset($this->nodes[$name]); + } + + public function count() + { + return count($this->nodes); + } + + public function getIterator() + { + return new ArrayIterator($this->nodes); + } + + public function setFilename($filename) + { + $this->filename = $filename; + foreach ($this->nodes as $node) { + if (null !== $node) { + $node->setFilename($filename); + } + } + } + + public function getFilename() + { + return $this->filename; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/AutoEscape.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/AutoEscape.php new file mode 100644 index 000000000..47cc998d4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/AutoEscape.php @@ -0,0 +1,34 @@ + + */ +class Twig_Node_AutoEscape extends Twig_Node +{ + public function __construct($value, Twig_NodeInterface $body, $lineno, $tag = 'autoescape') + { + parent::__construct(array('body' => $body), array('value' => $value), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->subcompile($this->getNode('body')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Block.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Block.php new file mode 100644 index 000000000..a05af6fb3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Block.php @@ -0,0 +1,39 @@ + + */ +class Twig_Node_Block extends Twig_Node +{ + public function __construct($name, Twig_NodeInterface $body, $lineno, $tag = null) + { + parent::__construct(array('body' => $body), array('name' => $name), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write(sprintf("public function block_%s(\$context, array \$blocks = array())\n", $this->getAttribute('name')), "{\n") + ->indent() + ; + + $compiler + ->subcompile($this->getNode('body')) + ->outdent() + ->write("}\n\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/BlockReference.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/BlockReference.php new file mode 100644 index 000000000..9cd1551f8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/BlockReference.php @@ -0,0 +1,32 @@ + + */ +class Twig_Node_BlockReference extends Twig_Node implements Twig_NodeOutputInterface +{ + public function __construct($name, $lineno, $tag = null) + { + parent::__construct(array(), array('name' => $name), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write(sprintf("\$this->displayBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name'))) + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Body.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Body.php new file mode 100644 index 000000000..3ffb1342b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Body.php @@ -0,0 +1,19 @@ + + */ +class Twig_Node_Body extends Twig_Node +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php new file mode 100644 index 000000000..9a7d2c90e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php @@ -0,0 +1,78 @@ + + */ +class Twig_Node_CheckSecurity extends Twig_Node +{ + protected $usedFilters; + protected $usedTags; + protected $usedFunctions; + + public function __construct(array $usedFilters, array $usedTags, array $usedFunctions) + { + $this->usedFilters = $usedFilters; + $this->usedTags = $usedTags; + $this->usedFunctions = $usedFunctions; + + parent::__construct(); + } + + public function compile(Twig_Compiler $compiler) + { + $tags = $filters = $functions = array(); + foreach (array('tags', 'filters', 'functions') as $type) { + foreach ($this->{'used'.ucfirst($type)} as $name => $node) { + if ($node instanceof Twig_Node) { + ${$type}[$name] = $node->getLine(); + } else { + ${$type}[$node] = null; + } + } + } + + $compiler + ->write('$tags = ')->repr(array_filter($tags))->raw(";\n") + ->write('$filters = ')->repr(array_filter($filters))->raw(";\n") + ->write('$functions = ')->repr(array_filter($functions))->raw(";\n\n") + ->write("try {\n") + ->indent() + ->write("\$this->env->getExtension('Twig_Extension_Sandbox')->checkSecurity(\n") + ->indent() + ->write(!$tags ? "array(),\n" : "array('".implode("', '", array_keys($tags))."'),\n") + ->write(!$filters ? "array(),\n" : "array('".implode("', '", array_keys($filters))."'),\n") + ->write(!$functions ? "array()\n" : "array('".implode("', '", array_keys($functions))."')\n") + ->outdent() + ->write(");\n") + ->outdent() + ->write("} catch (Twig_Sandbox_SecurityError \$e) {\n") + ->indent() + ->write("\$e->setTemplateFile(\$this->getTemplateName());\n\n") + ->write("if (\$e instanceof Twig_Sandbox_SecurityNotAllowedTagError && isset(\$tags[\$e->getTagName()])) {\n") + ->indent() + ->write("\$e->setTemplateLine(\$tags[\$e->getTagName()]);\n") + ->outdent() + ->write("} elseif (\$e instanceof Twig_Sandbox_SecurityNotAllowedFilterError && isset(\$filters[\$e->getFilterName()])) {\n") + ->indent() + ->write("\$e->setTemplateLine(\$filters[\$e->getFilterName()]);\n") + ->outdent() + ->write("} elseif (\$e instanceof Twig_Sandbox_SecurityNotAllowedFunctionError && isset(\$functions[\$e->getFunctionName()])) {\n") + ->indent() + ->write("\$e->setTemplateLine(\$functions[\$e->getFunctionName()]);\n") + ->outdent() + ->write("}\n\n") + ->write("throw \$e;\n") + ->outdent() + ->write("}\n\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Do.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Do.php new file mode 100644 index 000000000..14fb84e97 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Do.php @@ -0,0 +1,33 @@ + + */ +class Twig_Node_Do extends Twig_Node +{ + public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null) + { + parent::__construct(array('expr' => $expr), array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('') + ->subcompile($this->getNode('expr')) + ->raw(";\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Embed.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Embed.php new file mode 100644 index 000000000..7ed12fb88 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Embed.php @@ -0,0 +1,42 @@ + + */ +class Twig_Node_Embed extends Twig_Node_Include +{ + // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module) + public function __construct($filename, $index, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null) + { + parent::__construct(new Twig_Node_Expression_Constant('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag); + + $this->setAttribute('filename', $filename); + $this->setAttribute('index', $index); + } + + protected function addGetTemplate(Twig_Compiler $compiler) + { + $compiler + ->write('$this->loadTemplate(') + ->string($this->getAttribute('filename')) + ->raw(', ') + ->repr($this->getFilename()) + ->raw(', ') + ->repr($this->getLine()) + ->raw(', ') + ->string($this->getAttribute('index')) + ->raw(')') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression.php new file mode 100644 index 000000000..a7382e7d6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression.php @@ -0,0 +1,20 @@ + + */ +abstract class Twig_Node_Expression extends Twig_Node +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Array.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Array.php new file mode 100644 index 000000000..83e583b04 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Array.php @@ -0,0 +1,81 @@ +index = -1; + foreach ($this->getKeyValuePairs() as $pair) { + if ($pair['key'] instanceof Twig_Node_Expression_Constant && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) { + $this->index = $pair['key']->getAttribute('value'); + } + } + } + + public function getKeyValuePairs() + { + $pairs = array(); + + foreach (array_chunk($this->nodes, 2) as $pair) { + $pairs[] = array( + 'key' => $pair[0], + 'value' => $pair[1], + ); + } + + return $pairs; + } + + public function hasElement(Twig_Node_Expression $key) + { + foreach ($this->getKeyValuePairs() as $pair) { + // we compare the string representation of the keys + // to avoid comparing the line numbers which are not relevant here. + if ((string) $key == (string) $pair['key']) { + return true; + } + } + + return false; + } + + public function addElement(Twig_Node_Expression $value, Twig_Node_Expression $key = null) + { + if (null === $key) { + $key = new Twig_Node_Expression_Constant(++$this->index, $value->getLine()); + } + + array_push($this->nodes, $key, $value); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->raw('array('); + $first = true; + foreach ($this->getKeyValuePairs() as $pair) { + if (!$first) { + $compiler->raw(', '); + } + $first = false; + + $compiler + ->subcompile($pair['key']) + ->raw(' => ') + ->subcompile($pair['value']) + ; + } + $compiler->raw(')'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php new file mode 100644 index 000000000..ce0c5fbc5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php @@ -0,0 +1,23 @@ +raw('$context[') + ->string($this->getAttribute('name')) + ->raw(']') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php new file mode 100644 index 000000000..c821db526 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php @@ -0,0 +1,35 @@ + $left, 'right' => $right), array(), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('left')) + ->raw(' ') + ; + $this->operator($compiler); + $compiler + ->raw(' ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + abstract public function operator(Twig_Compiler $compiler); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php new file mode 100644 index 000000000..0ef8e1172 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php @@ -0,0 +1,18 @@ +raw('+'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php new file mode 100644 index 000000000..d5752ebba --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php @@ -0,0 +1,18 @@ +raw('&&'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php new file mode 100644 index 000000000..9a46d8455 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php @@ -0,0 +1,18 @@ +raw('&'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php new file mode 100644 index 000000000..058a20bf6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php @@ -0,0 +1,18 @@ +raw('|'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php new file mode 100644 index 000000000..f4da73d44 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php @@ -0,0 +1,18 @@ +raw('^'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php new file mode 100644 index 000000000..f9a646270 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php @@ -0,0 +1,18 @@ +raw('.'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php new file mode 100644 index 000000000..e0797a612 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php @@ -0,0 +1,18 @@ +raw('/'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php new file mode 100644 index 000000000..93b3b96f0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php @@ -0,0 +1,30 @@ +getVarName(); + $right = $compiler->getVarName(); + $compiler + ->raw(sprintf('(is_string($%s = ', $left)) + ->subcompile($this->getNode('left')) + ->raw(sprintf(') && is_string($%s = ', $right)) + ->subcompile($this->getNode('right')) + ->raw(sprintf(') && (\'\' === $%2$s || $%2$s === substr($%1$s, -strlen($%2$s))))', $left, $right)) + ; + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw(''); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php new file mode 100644 index 000000000..7b1236d0a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php @@ -0,0 +1,17 @@ +raw('=='); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php new file mode 100644 index 000000000..6bbba62e8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php @@ -0,0 +1,24 @@ +raw('(int) floor('); + parent::compile($compiler); + $compiler->raw(')'); + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw('/'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php new file mode 100644 index 000000000..a110bd92d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php @@ -0,0 +1,17 @@ +raw('>'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php new file mode 100644 index 000000000..3754fed21 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php @@ -0,0 +1,17 @@ +raw('>='); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php new file mode 100644 index 000000000..9565a6088 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php @@ -0,0 +1,28 @@ +raw('twig_in_filter(') + ->subcompile($this->getNode('left')) + ->raw(', ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw('in'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php new file mode 100644 index 000000000..45fd30049 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php @@ -0,0 +1,17 @@ +raw('<'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php new file mode 100644 index 000000000..e38e257c3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php @@ -0,0 +1,17 @@ +raw('<='); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php new file mode 100644 index 000000000..93bb29205 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php @@ -0,0 +1,28 @@ +raw('preg_match(') + ->subcompile($this->getNode('right')) + ->raw(', ') + ->subcompile($this->getNode('left')) + ->raw(')') + ; + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw(''); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php new file mode 100644 index 000000000..9924114fb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php @@ -0,0 +1,18 @@ +raw('%'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php new file mode 100644 index 000000000..c91529ca6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php @@ -0,0 +1,18 @@ +raw('*'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php new file mode 100644 index 000000000..26867ba20 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php @@ -0,0 +1,17 @@ +raw('!='); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php new file mode 100644 index 000000000..49ab39e9d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php @@ -0,0 +1,28 @@ +raw('!twig_in_filter(') + ->subcompile($this->getNode('left')) + ->raw(', ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw('not in'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php new file mode 100644 index 000000000..adba49c6f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php @@ -0,0 +1,18 @@ +raw('||'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php new file mode 100644 index 000000000..cd6d04627 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php @@ -0,0 +1,28 @@ +raw('pow(') + ->subcompile($this->getNode('left')) + ->raw(', ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw('**'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php new file mode 100644 index 000000000..692ec9c6d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php @@ -0,0 +1,28 @@ +raw('range(') + ->subcompile($this->getNode('left')) + ->raw(', ') + ->subcompile($this->getNode('right')) + ->raw(')') + ; + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw('..'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php new file mode 100644 index 000000000..d2e30d66e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php @@ -0,0 +1,30 @@ +getVarName(); + $right = $compiler->getVarName(); + $compiler + ->raw(sprintf('(is_string($%s = ', $left)) + ->subcompile($this->getNode('left')) + ->raw(sprintf(') && is_string($%s = ', $right)) + ->subcompile($this->getNode('right')) + ->raw(sprintf(') && (\'\' === $%2$s || 0 === strpos($%1$s, $%2$s)))', $left, $right)) + ; + } + + public function operator(Twig_Compiler $compiler) + { + return $compiler->raw(''); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php new file mode 100644 index 000000000..d44639915 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php @@ -0,0 +1,18 @@ +raw('-'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php new file mode 100644 index 000000000..f6ed6ff4a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php @@ -0,0 +1,46 @@ + + */ +class Twig_Node_Expression_BlockReference extends Twig_Node_Expression +{ + public function __construct(Twig_NodeInterface $name, $asString = false, $lineno, $tag = null) + { + parent::__construct(array('name' => $name), array('as_string' => $asString, 'output' => false), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + if ($this->getAttribute('as_string')) { + $compiler->raw('(string) '); + } + + if ($this->getAttribute('output')) { + $compiler + ->addDebugInfo($this) + ->write('$this->displayBlock(') + ->subcompile($this->getNode('name')) + ->raw(", \$context, \$blocks);\n") + ; + } else { + $compiler + ->raw('$this->renderBlock(') + ->subcompile($this->getNode('name')) + ->raw(', $context, $blocks)') + ; + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Call.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Call.php new file mode 100644 index 000000000..1865043cc --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Call.php @@ -0,0 +1,289 @@ +hasAttribute('callable') && $callable = $this->getAttribute('callable')) { + if (is_string($callable) && false === strpos($callable, '::')) { + $compiler->raw($callable); + } else { + list($r, $callable) = $this->reflectCallable($callable); + if ($r instanceof ReflectionMethod && is_string($callable[0])) { + if ($r->isStatic()) { + $compiler->raw(sprintf('%s::%s', $callable[0], $callable[1])); + } else { + $compiler->raw(sprintf('$this->env->getRuntime(\'%s\')->%s', $callable[0], $callable[1])); + } + } elseif ($r instanceof ReflectionMethod && $callable[0] instanceof Twig_ExtensionInterface) { + $compiler->raw(sprintf('$this->env->getExtension(\'%s\')->%s', get_class($callable[0]), $callable[1])); + } else { + $type = ucfirst($this->getAttribute('type')); + $compiler->raw(sprintf('call_user_func_array($this->env->get%s(\'%s\')->getCallable(), array', $type, $this->getAttribute('name'))); + $closingParenthesis = true; + } + } + } else { + $compiler->raw($this->getAttribute('thing')->compile()); + } + + $this->compileArguments($compiler); + + if ($closingParenthesis) { + $compiler->raw(')'); + } + } + + protected function compileArguments(Twig_Compiler $compiler) + { + $compiler->raw('('); + + $first = true; + + if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) { + $compiler->raw('$this->env'); + $first = false; + } + + if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->raw('$context'); + $first = false; + } + + if ($this->hasAttribute('arguments')) { + foreach ($this->getAttribute('arguments') as $argument) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->string($argument); + $first = false; + } + } + + if ($this->hasNode('node')) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->subcompile($this->getNode('node')); + $first = false; + } + + if ($this->hasNode('arguments')) { + $callable = $this->hasAttribute('callable') ? $this->getAttribute('callable') : null; + + $arguments = $this->getArguments($callable, $this->getNode('arguments')); + + foreach ($arguments as $node) { + if (!$first) { + $compiler->raw(', '); + } + $compiler->subcompile($node); + $first = false; + } + } + + $compiler->raw(')'); + } + + protected function getArguments($callable, $arguments) + { + $callType = $this->getAttribute('type'); + $callName = $this->getAttribute('name'); + + $parameters = array(); + $named = false; + foreach ($arguments as $name => $node) { + if (!is_int($name)) { + $named = true; + $name = $this->normalizeName($name); + } elseif ($named) { + throw new Twig_Error_Syntax(sprintf('Positional arguments cannot be used after named arguments for %s "%s".', $callType, $callName)); + } + + $parameters[$name] = $node; + } + + $isVariadic = $this->hasAttribute('is_variadic') && $this->getAttribute('is_variadic'); + if (!$named && !$isVariadic) { + return $parameters; + } + + if (!$callable) { + if ($named) { + $message = sprintf('Named arguments are not supported for %s "%s".', $callType, $callName); + } else { + $message = sprintf('Arbitrary positional arguments are not supported for %s "%s".', $callType, $callName); + } + + throw new LogicException($message); + } + + $callableParameters = $this->getCallableParameters($callable, $isVariadic); + $arguments = array(); + $names = array(); + $missingArguments = array(); + $optionalArguments = array(); + $pos = 0; + foreach ($callableParameters as $callableParameter) { + $names[] = $name = $this->normalizeName($callableParameter->name); + + if (array_key_exists($name, $parameters)) { + if (array_key_exists($pos, $parameters)) { + throw new Twig_Error_Syntax(sprintf('Argument "%s" is defined twice for %s "%s".', $name, $callType, $callName)); + } + + if (!empty($missingArguments)) { + throw new Twig_Error_Syntax(sprintf( + 'Argument "%s" could not be assigned for %s "%s(%s)" because it is mapped to an internal PHP function which cannot determine default value for optional argument%s "%s".', + $name, $callType, $callName, implode(', ', $names), count($missingArguments) > 1 ? 's' : '', implode('", "', $missingArguments)) + ); + } + + $arguments = array_merge($arguments, $optionalArguments); + $arguments[] = $parameters[$name]; + unset($parameters[$name]); + $optionalArguments = array(); + } elseif (array_key_exists($pos, $parameters)) { + $arguments = array_merge($arguments, $optionalArguments); + $arguments[] = $parameters[$pos]; + unset($parameters[$pos]); + $optionalArguments = array(); + ++$pos; + } elseif ($callableParameter->isDefaultValueAvailable()) { + $optionalArguments[] = new Twig_Node_Expression_Constant($callableParameter->getDefaultValue(), -1); + } elseif ($callableParameter->isOptional()) { + if (empty($parameters)) { + break; + } else { + $missingArguments[] = $name; + } + } else { + throw new Twig_Error_Syntax(sprintf('Value for argument "%s" is required for %s "%s".', $name, $callType, $callName)); + } + } + + if ($isVariadic) { + $arbitraryArguments = new Twig_Node_Expression_Array(array(), -1); + foreach ($parameters as $key => $value) { + if (is_int($key)) { + $arbitraryArguments->addElement($value); + } else { + $arbitraryArguments->addElement($value, new Twig_Node_Expression_Constant($key, -1)); + } + unset($parameters[$key]); + } + + if ($arbitraryArguments->count()) { + $arguments = array_merge($arguments, $optionalArguments); + $arguments[] = $arbitraryArguments; + } + } + + if (!empty($parameters)) { + $unknownParameter = null; + foreach ($parameters as $parameter) { + if ($parameter instanceof Twig_Node) { + $unknownParameter = $parameter; + break; + } + } + + throw new Twig_Error_Syntax(sprintf( + 'Unknown argument%s "%s" for %s "%s(%s)".', + count($parameters) > 1 ? 's' : '', implode('", "', array_keys($parameters)), $callType, $callName, implode(', ', $names) + ), $unknownParameter ? $unknownParameter->getLine() : -1); + } + + return $arguments; + } + + protected function normalizeName($name) + { + return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), $name)); + } + + private function getCallableParameters($callable, $isVariadic) + { + list($r, $_) = $this->reflectCallable($callable); + if (null === $r) { + return array(); + } + + $parameters = $r->getParameters(); + if ($this->hasNode('node')) { + array_shift($parameters); + } + if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) { + array_shift($parameters); + } + if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) { + array_shift($parameters); + } + if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) { + foreach ($this->getAttribute('arguments') as $argument) { + array_shift($parameters); + } + } + if ($isVariadic) { + $argument = end($parameters); + if ($argument && $argument->isArray() && $argument->isDefaultValueAvailable() && array() === $argument->getDefaultValue()) { + array_pop($parameters); + } else { + $callableName = $r->name; + if ($r instanceof ReflectionMethod) { + $callableName = $r->getDeclaringClass()->name.'::'.$callableName; + } + + throw new LogicException(sprintf('The last parameter of "%s" for %s "%s" must be an array with default value, eg. "array $arg = array()".', $callableName, $this->getAttribute('type'), $this->getAttribute('name'))); + } + } + + return $parameters; + } + + private function reflectCallable($callable) + { + if (null !== $this->reflector) { + return $this->reflector; + } + + if (is_array($callable)) { + if (!method_exists($callable[0], $callable[1])) { + // __call() + return array(null, array()); + } + $r = new ReflectionMethod($callable[0], $callable[1]); + } elseif (is_object($callable) && !$callable instanceof Closure) { + $r = new ReflectionObject($callable); + $r = $r->getMethod('__invoke'); + $callable = array($callable, '__invoke'); + } elseif (is_string($callable) && false !== $pos = strpos($callable, '::')) { + $class = substr($callable, 0, $pos); + $method = substr($callable, $pos + 2); + if (!method_exists($class, $method)) { + // __staticCall() + return array(null, array()); + } + $r = new ReflectionMethod($callable); + $callable = array($class, $method); + } else { + $r = new ReflectionFunction($callable); + } + + return $this->reflector = array($r, $callable); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php new file mode 100644 index 000000000..edcb1e2d2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php @@ -0,0 +1,31 @@ + $expr1, 'expr2' => $expr2, 'expr3' => $expr3), array(), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('((') + ->subcompile($this->getNode('expr1')) + ->raw(') ? (') + ->subcompile($this->getNode('expr2')) + ->raw(') : (') + ->subcompile($this->getNode('expr3')) + ->raw('))') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php new file mode 100644 index 000000000..a91dc6985 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php @@ -0,0 +1,23 @@ + $value), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->repr($this->getAttribute('value')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php new file mode 100644 index 000000000..b4882e360 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php @@ -0,0 +1,32 @@ + + * + * @deprecated since 1.23 and will be removed in 2.0. + */ +class Twig_Node_Expression_ExtensionReference extends Twig_Node_Expression +{ + public function __construct($name, $lineno, $tag = null) + { + parent::__construct(array(), array('name' => $name), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->raw(sprintf("\$this->env->getExtension('%s')", $this->getAttribute('name'))); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php new file mode 100644 index 000000000..a906232ea --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php @@ -0,0 +1,39 @@ + $node, 'filter' => $filterName, 'arguments' => $arguments), array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $name = $this->getNode('filter')->getAttribute('value'); + $filter = $compiler->getEnvironment()->getFilter($name); + + $this->setAttribute('name', $name); + $this->setAttribute('type', 'filter'); + $this->setAttribute('thing', $filter); + $this->setAttribute('needs_environment', $filter->needsEnvironment()); + $this->setAttribute('needs_context', $filter->needsContext()); + $this->setAttribute('arguments', $filter->getArguments()); + if ($filter instanceof Twig_FilterCallableInterface || $filter instanceof Twig_SimpleFilter) { + $this->setAttribute('callable', $filter->getCallable()); + } + if ($filter instanceof Twig_SimpleFilter) { + $this->setAttribute('is_variadic', $filter->isVariadic()); + } + + $this->compileCallable($compiler); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php new file mode 100644 index 000000000..1827c8886 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php @@ -0,0 +1,43 @@ + + * {{ var.foo|default('foo item on var is not defined') }} + * + * + * @author Fabien Potencier + */ +class Twig_Node_Expression_Filter_Default extends Twig_Node_Expression_Filter +{ + public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null) + { + $default = new Twig_Node_Expression_Filter($node, new Twig_Node_Expression_Constant('default', $node->getLine()), $arguments, $node->getLine()); + + if ('default' === $filterName->getAttribute('value') && ($node instanceof Twig_Node_Expression_Name || $node instanceof Twig_Node_Expression_GetAttr)) { + $test = new Twig_Node_Expression_Test_Defined(clone $node, 'defined', new Twig_Node(), $node->getLine()); + $false = count($arguments) ? $arguments->getNode(0) : new Twig_Node_Expression_Constant('', $node->getLine()); + + $node = new Twig_Node_Expression_Conditional($test, $default, $false, $node->getLine()); + } else { + $node = $default; + } + + parent::__construct($node, $filterName, $arguments, $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->subcompile($this->getNode('node')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Function.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Function.php new file mode 100644 index 000000000..7326ede26 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Function.php @@ -0,0 +1,38 @@ + $arguments), array('name' => $name), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $name = $this->getAttribute('name'); + $function = $compiler->getEnvironment()->getFunction($name); + + $this->setAttribute('name', $name); + $this->setAttribute('type', 'function'); + $this->setAttribute('thing', $function); + $this->setAttribute('needs_environment', $function->needsEnvironment()); + $this->setAttribute('needs_context', $function->needsContext()); + $this->setAttribute('arguments', $function->getArguments()); + if ($function instanceof Twig_FunctionCallableInterface || $function instanceof Twig_SimpleFunction) { + $this->setAttribute('callable', $function->getCallable()); + } + if ($function instanceof Twig_SimpleFunction) { + $this->setAttribute('is_variadic', $function->isVariadic()); + } + + $this->compileCallable($compiler); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php new file mode 100644 index 000000000..9a8d38160 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php @@ -0,0 +1,68 @@ + $node, 'attribute' => $attribute); + if (null !== $arguments) { + $nodes['arguments'] = $arguments; + } + + parent::__construct($nodes, array('type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false, 'disable_c_ext' => false), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + if (function_exists('twig_template_get_attributes') && !$this->getAttribute('disable_c_ext')) { + $compiler->raw('twig_template_get_attributes($this, '); + } else { + $compiler->raw('$this->getAttribute('); + } + + if ($this->getAttribute('ignore_strict_check')) { + $this->getNode('node')->setAttribute('ignore_strict_check', true); + } + + $compiler->subcompile($this->getNode('node')); + + $compiler->raw(', ')->subcompile($this->getNode('attribute')); + + // only generate optional arguments when needed (to make generated code more readable) + $needFourth = $this->getAttribute('ignore_strict_check'); + $needThird = $needFourth || $this->getAttribute('is_defined_test'); + $needSecond = $needThird || Twig_Template::ANY_CALL !== $this->getAttribute('type'); + $needFirst = $needSecond || $this->hasNode('arguments'); + + if ($needFirst) { + if ($this->hasNode('arguments')) { + $compiler->raw(', ')->subcompile($this->getNode('arguments')); + } else { + $compiler->raw(', array()'); + } + } + + if ($needSecond) { + $compiler->raw(', ')->repr($this->getAttribute('type')); + } + + if ($needThird) { + $compiler->raw(', ')->repr($this->getAttribute('is_defined_test')); + } + + if ($needFourth) { + $compiler->raw(', ')->repr($this->getAttribute('ignore_strict_check')); + } + + $compiler->raw(')'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php new file mode 100644 index 000000000..620b02bf4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php @@ -0,0 +1,41 @@ + $node, 'arguments' => $arguments), array('method' => $method, 'safe' => false), $lineno); + + if ($node instanceof Twig_Node_Expression_Name) { + $node->setAttribute('always_defined', true); + } + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->subcompile($this->getNode('node')) + ->raw('->') + ->raw($this->getAttribute('method')) + ->raw('(') + ; + $first = true; + foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) { + if (!$first) { + $compiler->raw(', '); + } + $first = false; + + $compiler->subcompile($pair['value']); + } + $compiler->raw(')'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Name.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Name.php new file mode 100644 index 000000000..a6e0ff420 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Name.php @@ -0,0 +1,90 @@ + '$this', + '_context' => '$context', + '_charset' => '$this->env->getCharset()', + ); + + public function __construct($name, $lineno) + { + parent::__construct(array(), array('name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false, 'always_defined' => false), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $name = $this->getAttribute('name'); + + $compiler->addDebugInfo($this); + + if ($this->getAttribute('is_defined_test')) { + if ($this->isSpecial()) { + $compiler->repr(true); + } else { + $compiler->raw('array_key_exists(')->repr($name)->raw(', $context)'); + } + } elseif ($this->isSpecial()) { + $compiler->raw($this->specialVars[$name]); + } elseif ($this->getAttribute('always_defined')) { + $compiler + ->raw('$context[') + ->string($name) + ->raw(']') + ; + } else { + // remove the non-PHP 5.4 version when PHP 5.3 support is dropped + // as the non-optimized version is just a workaround for slow ternary operator + // when the context has a lot of variables + if (PHP_VERSION_ID >= 50400) { + // PHP 5.4 ternary operator performance was optimized + $compiler + ->raw('(isset($context[') + ->string($name) + ->raw(']) ? $context[') + ->string($name) + ->raw('] : ') + ; + + if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) { + $compiler->raw('null)'); + } else { + $compiler->raw('$this->getContext($context, ')->string($name)->raw('))'); + } + } else { + $compiler + ->raw('$this->getContext($context, ') + ->string($name) + ; + + if ($this->getAttribute('ignore_strict_check')) { + $compiler->raw(', true'); + } + + $compiler + ->raw(')') + ; + } + } + } + + public function isSpecial() + { + return isset($this->specialVars[$this->getAttribute('name')]); + } + + public function isSimple() + { + return !$this->isSpecial() && !$this->getAttribute('is_defined_test'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php new file mode 100644 index 000000000..10039130c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php @@ -0,0 +1,23 @@ +getLine()), + new Twig_Node_Expression_Unary_Not(new Twig_Node_Expression_Test_Null($left, 'null', new Twig_Node(), $left->getLine()), $left->getLine()), + $left->getLine() + ); + + parent::__construct($test, $left, $right, $lineno); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php new file mode 100644 index 000000000..694c08045 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php @@ -0,0 +1,42 @@ + + */ +class Twig_Node_Expression_Parent extends Twig_Node_Expression +{ + public function __construct($name, $lineno, $tag = null) + { + parent::__construct(array(), array('output' => false, 'name' => $name), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + if ($this->getAttribute('output')) { + $compiler + ->addDebugInfo($this) + ->write('$this->displayParentBlock(') + ->string($this->getAttribute('name')) + ->raw(", \$context, \$blocks);\n") + ; + } else { + $compiler + ->raw('$this->renderParentBlock(') + ->string($this->getAttribute('name')) + ->raw(', $context, $blocks)') + ; + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php new file mode 100644 index 000000000..e6b058e85 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php @@ -0,0 +1,26 @@ + $name), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('$_') + ->raw($this->getAttribute('name')) + ->raw('_') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test.php new file mode 100644 index 000000000..125d381d8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test.php @@ -0,0 +1,40 @@ + $node); + if (null !== $arguments) { + $nodes['arguments'] = $arguments; + } + + parent::__construct($nodes, array('name' => $name), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $name = $this->getAttribute('name'); + $test = $compiler->getEnvironment()->getTest($name); + + $this->setAttribute('name', $name); + $this->setAttribute('type', 'test'); + $this->setAttribute('thing', $test); + if ($test instanceof Twig_TestCallableInterface || $test instanceof Twig_SimpleTest) { + $this->setAttribute('callable', $test->getCallable()); + } + if ($test instanceof Twig_SimpleTest) { + $this->setAttribute('is_variadic', $test->isVariadic()); + } + + $this->compileCallable($compiler); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php new file mode 100644 index 000000000..de55f5f55 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php @@ -0,0 +1,46 @@ + + * {% if post.status is constant('Post::PUBLISHED') %} + * the status attribute is exactly the same as Post::PUBLISHED + * {% endif %} + * + * + * @author Fabien Potencier + */ +class Twig_Node_Expression_Test_Constant extends Twig_Node_Expression_Test +{ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' === constant(') + ; + + if ($this->getNode('arguments')->hasNode(1)) { + $compiler + ->raw('get_class(') + ->subcompile($this->getNode('arguments')->getNode(1)) + ->raw(')."::".') + ; + } + + $compiler + ->subcompile($this->getNode('arguments')->getNode(0)) + ->raw('))') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php new file mode 100644 index 000000000..3dc6ff592 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php @@ -0,0 +1,56 @@ + + * {# defined works with variable names and variable attributes #} + * {% if foo is defined %} + * {# ... #} + * {% endif %} + * + * + * @author Fabien Potencier + */ +class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test +{ + public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno) + { + if ($node instanceof Twig_Node_Expression_Name) { + $node->setAttribute('is_defined_test', true); + } elseif ($node instanceof Twig_Node_Expression_GetAttr) { + $node->setAttribute('is_defined_test', true); + + $this->changeIgnoreStrictCheck($node); + } elseif ($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array) { + $node = new Twig_Node_Expression_Constant(true, $node->getLine()); + } else { + throw new Twig_Error_Syntax('The "defined" test only works with simple variables.', $this->getLine()); + } + + parent::__construct($node, $name, $arguments, $lineno); + } + + protected function changeIgnoreStrictCheck(Twig_Node_Expression_GetAttr $node) + { + $node->setAttribute('ignore_strict_check', true); + + if ($node->getNode('node') instanceof Twig_Node_Expression_GetAttr) { + $this->changeIgnoreStrictCheck($node->getNode('node')); + } + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->subcompile($this->getNode('node')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php new file mode 100644 index 000000000..d5bed234a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php @@ -0,0 +1,33 @@ + + * {% if loop.index is divisible by(3) %} + * + * + * @author Fabien Potencier + */ +class Twig_Node_Expression_Test_Divisibleby extends Twig_Node_Expression_Test +{ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(0 == ') + ->subcompile($this->getNode('node')) + ->raw(' % ') + ->subcompile($this->getNode('arguments')->getNode(0)) + ->raw(')') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php new file mode 100644 index 000000000..d7853e89c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php @@ -0,0 +1,32 @@ + + * {{ var is even }} + * + * + * @author Fabien Potencier + */ +class Twig_Node_Expression_Test_Even extends Twig_Node_Expression_Test +{ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' % 2 == 0') + ->raw(')') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php new file mode 100644 index 000000000..1c83825a0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php @@ -0,0 +1,31 @@ + + * {{ var is none }} + * + * + * @author Fabien Potencier + */ +class Twig_Node_Expression_Test_Null extends Twig_Node_Expression_Test +{ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(null === ') + ->subcompile($this->getNode('node')) + ->raw(')') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php new file mode 100644 index 000000000..421c19e84 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php @@ -0,0 +1,32 @@ + + * {{ var is odd }} + * + * + * @author Fabien Potencier + */ +class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test +{ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' % 2 == 1') + ->raw(')') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php new file mode 100644 index 000000000..b48905ee4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php @@ -0,0 +1,29 @@ + + */ +class Twig_Node_Expression_Test_Sameas extends Twig_Node_Expression_Test +{ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->raw('(') + ->subcompile($this->getNode('node')) + ->raw(' === ') + ->subcompile($this->getNode('arguments')->getNode(0)) + ->raw(')') + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php new file mode 100644 index 000000000..1cf54c326 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php @@ -0,0 +1,27 @@ + $node), array(), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->raw(' '); + $this->operator($compiler); + $compiler->subcompile($this->getNode('node')); + } + + abstract public function operator(Twig_Compiler $compiler); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php new file mode 100644 index 000000000..2a3937ec3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php @@ -0,0 +1,18 @@ +raw('-'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php new file mode 100644 index 000000000..f94073cfa --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php @@ -0,0 +1,18 @@ +raw('!'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php new file mode 100644 index 000000000..04edb52a6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php @@ -0,0 +1,18 @@ +raw('+'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Flush.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Flush.php new file mode 100644 index 000000000..2af17a42b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Flush.php @@ -0,0 +1,31 @@ + + */ +class Twig_Node_Flush extends Twig_Node +{ + public function __construct($lineno, $tag) + { + parent::__construct(array(), array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write("flush();\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/For.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/For.php new file mode 100644 index 000000000..5498a88d2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/For.php @@ -0,0 +1,111 @@ + + */ +class Twig_Node_For extends Twig_Node +{ + protected $loop; + + public function __construct(Twig_Node_Expression_AssignName $keyTarget, Twig_Node_Expression_AssignName $valueTarget, Twig_Node_Expression $seq, Twig_Node_Expression $ifexpr = null, Twig_NodeInterface $body, Twig_NodeInterface $else = null, $lineno, $tag = null) + { + $body = new Twig_Node(array($body, $this->loop = new Twig_Node_ForLoop($lineno, $tag))); + + if (null !== $ifexpr) { + $body = new Twig_Node_If(new Twig_Node(array($ifexpr, $body)), null, $lineno, $tag); + } + + $nodes = array('key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body); + if (null !== $else) { + $nodes['else'] = $else; + } + + parent::__construct($nodes, array('with_loop' => true, 'ifexpr' => null !== $ifexpr), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write("\$context['_parent'] = \$context;\n") + ->write("\$context['_seq'] = twig_ensure_traversable(") + ->subcompile($this->getNode('seq')) + ->raw(");\n") + ; + + if ($this->hasNode('else')) { + $compiler->write("\$context['_iterated'] = false;\n"); + } + + if ($this->getAttribute('with_loop')) { + $compiler + ->write("\$context['loop'] = array(\n") + ->write(" 'parent' => \$context['_parent'],\n") + ->write(" 'index0' => 0,\n") + ->write(" 'index' => 1,\n") + ->write(" 'first' => true,\n") + ->write(");\n") + ; + + if (!$this->getAttribute('ifexpr')) { + $compiler + ->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {\n") + ->indent() + ->write("\$length = count(\$context['_seq']);\n") + ->write("\$context['loop']['revindex0'] = \$length - 1;\n") + ->write("\$context['loop']['revindex'] = \$length;\n") + ->write("\$context['loop']['length'] = \$length;\n") + ->write("\$context['loop']['last'] = 1 === \$length;\n") + ->outdent() + ->write("}\n") + ; + } + } + + $this->loop->setAttribute('else', $this->hasNode('else')); + $this->loop->setAttribute('with_loop', $this->getAttribute('with_loop')); + $this->loop->setAttribute('ifexpr', $this->getAttribute('ifexpr')); + + $compiler + ->write("foreach (\$context['_seq'] as ") + ->subcompile($this->getNode('key_target')) + ->raw(' => ') + ->subcompile($this->getNode('value_target')) + ->raw(") {\n") + ->indent() + ->subcompile($this->getNode('body')) + ->outdent() + ->write("}\n") + ; + + if ($this->hasNode('else')) { + $compiler + ->write("if (!\$context['_iterated']) {\n") + ->indent() + ->subcompile($this->getNode('else')) + ->outdent() + ->write("}\n") + ; + } + + $compiler->write("\$_parent = \$context['_parent'];\n"); + + // remove some "private" loop variables (needed for nested loops) + $compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n"); + + // keep the values set in the inner context for variables defined in the outer context + $compiler->write("\$context = array_intersect_key(\$context, \$_parent) + \$_parent;\n"); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/ForLoop.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/ForLoop.php new file mode 100644 index 000000000..2554d4807 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/ForLoop.php @@ -0,0 +1,50 @@ + + */ +class Twig_Node_ForLoop extends Twig_Node +{ + public function __construct($lineno, $tag = null) + { + parent::__construct(array(), array('with_loop' => false, 'ifexpr' => false, 'else' => false), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + if ($this->getAttribute('else')) { + $compiler->write("\$context['_iterated'] = true;\n"); + } + + if ($this->getAttribute('with_loop')) { + $compiler + ->write("++\$context['loop']['index0'];\n") + ->write("++\$context['loop']['index'];\n") + ->write("\$context['loop']['first'] = false;\n") + ; + + if (!$this->getAttribute('ifexpr')) { + $compiler + ->write("if (isset(\$context['loop']['length'])) {\n") + ->indent() + ->write("--\$context['loop']['revindex0'];\n") + ->write("--\$context['loop']['revindex'];\n") + ->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n") + ->outdent() + ->write("}\n") + ; + } + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/If.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/If.php new file mode 100644 index 000000000..0aa9e7074 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/If.php @@ -0,0 +1,66 @@ + + */ +class Twig_Node_If extends Twig_Node +{ + public function __construct(Twig_NodeInterface $tests, Twig_NodeInterface $else = null, $lineno, $tag = null) + { + $nodes = array('tests' => $tests); + if (null !== $else) { + $nodes['else'] = $else; + } + + parent::__construct($nodes, array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->addDebugInfo($this); + for ($i = 0, $count = count($this->getNode('tests')); $i < $count; $i += 2) { + if ($i > 0) { + $compiler + ->outdent() + ->write('} elseif (') + ; + } else { + $compiler + ->write('if (') + ; + } + + $compiler + ->subcompile($this->getNode('tests')->getNode($i)) + ->raw(") {\n") + ->indent() + ->subcompile($this->getNode('tests')->getNode($i + 1)) + ; + } + + if ($this->hasNode('else')) { + $compiler + ->outdent() + ->write("} else {\n") + ->indent() + ->subcompile($this->getNode('else')) + ; + } + + $compiler + ->outdent() + ->write("}\n"); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Import.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Import.php new file mode 100644 index 000000000..f69a7471e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Import.php @@ -0,0 +1,49 @@ + + */ +class Twig_Node_Import extends Twig_Node +{ + public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $var, $lineno, $tag = null) + { + parent::__construct(array('expr' => $expr, 'var' => $var), array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('') + ->subcompile($this->getNode('var')) + ->raw(' = ') + ; + + if ($this->getNode('expr') instanceof Twig_Node_Expression_Name && '_self' === $this->getNode('expr')->getAttribute('name')) { + $compiler->raw('$this'); + } else { + $compiler + ->raw('$this->loadTemplate(') + ->subcompile($this->getNode('expr')) + ->raw(', ') + ->repr($this->getFilename()) + ->raw(', ') + ->repr($this->getLine()) + ->raw(')') + ; + } + + $compiler->raw(";\n"); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Include.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Include.php new file mode 100644 index 000000000..bc80dc4f1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Include.php @@ -0,0 +1,88 @@ + + */ +class Twig_Node_Include extends Twig_Node implements Twig_NodeOutputInterface +{ + public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null) + { + $nodes = array('expr' => $expr); + if (null !== $variables) { + $nodes['variables'] = $variables; + } + + parent::__construct($nodes, array('only' => (bool) $only, 'ignore_missing' => (bool) $ignoreMissing), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->addDebugInfo($this); + + if ($this->getAttribute('ignore_missing')) { + $compiler + ->write("try {\n") + ->indent() + ; + } + + $this->addGetTemplate($compiler); + + $compiler->raw('->display('); + + $this->addTemplateArguments($compiler); + + $compiler->raw(");\n"); + + if ($this->getAttribute('ignore_missing')) { + $compiler + ->outdent() + ->write("} catch (Twig_Error_Loader \$e) {\n") + ->indent() + ->write("// ignore missing template\n") + ->outdent() + ->write("}\n\n") + ; + } + } + + protected function addGetTemplate(Twig_Compiler $compiler) + { + $compiler + ->write('$this->loadTemplate(') + ->subcompile($this->getNode('expr')) + ->raw(', ') + ->repr($this->getFilename()) + ->raw(', ') + ->repr($this->getLine()) + ->raw(')') + ; + } + + protected function addTemplateArguments(Twig_Compiler $compiler) + { + if (!$this->hasNode('variables')) { + $compiler->raw(false === $this->getAttribute('only') ? '$context' : 'array()'); + } elseif (false === $this->getAttribute('only')) { + $compiler + ->raw('array_merge($context, ') + ->subcompile($this->getNode('variables')) + ->raw(')') + ; + } else { + $compiler->subcompile($this->getNode('variables')); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Macro.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Macro.php new file mode 100644 index 000000000..c186cd0b9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Macro.php @@ -0,0 +1,123 @@ + + */ +class Twig_Node_Macro extends Twig_Node +{ + const VARARGS_NAME = 'varargs'; + + public function __construct($name, Twig_NodeInterface $body, Twig_NodeInterface $arguments, $lineno, $tag = null) + { + foreach ($arguments as $argumentName => $argument) { + if (self::VARARGS_NAME === $argumentName) { + throw new Twig_Error_Syntax(sprintf('The argument "%s" in macro "%s" cannot be defined because the variable "%s" is reserved for arbitrary arguments.', self::VARARGS_NAME, $name, self::VARARGS_NAME), $argument->getLine()); + } + } + + parent::__construct(array('body' => $body, 'arguments' => $arguments), array('name' => $name), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write(sprintf('public function get%s(', $this->getAttribute('name'))) + ; + + $count = count($this->getNode('arguments')); + $pos = 0; + foreach ($this->getNode('arguments') as $name => $default) { + $compiler + ->raw('$__'.$name.'__ = ') + ->subcompile($default) + ; + + if (++$pos < $count) { + $compiler->raw(', '); + } + } + + if (PHP_VERSION_ID >= 50600) { + if ($count) { + $compiler->raw(', '); + } + + $compiler->raw('...$__varargs__'); + } + + $compiler + ->raw(")\n") + ->write("{\n") + ->indent() + ; + + $compiler + ->write("\$context = \$this->env->mergeGlobals(array(\n") + ->indent() + ; + + foreach ($this->getNode('arguments') as $name => $default) { + $compiler + ->addIndentation() + ->string($name) + ->raw(' => $__'.$name.'__') + ->raw(",\n") + ; + } + + $compiler + ->addIndentation() + ->string(self::VARARGS_NAME) + ->raw(' => ') + ; + + if (PHP_VERSION_ID >= 50600) { + $compiler->raw("\$__varargs__,\n"); + } else { + $compiler + ->raw('func_num_args() > ') + ->repr($count) + ->raw(' ? array_slice(func_get_args(), ') + ->repr($count) + ->raw(") : array(),\n") + ; + } + + $compiler + ->outdent() + ->write("));\n\n") + ->write("\$blocks = array();\n\n") + ->write("ob_start();\n") + ->write("try {\n") + ->indent() + ->subcompile($this->getNode('body')) + ->outdent() + ->write("} catch (Exception \$e) {\n") + ->indent() + ->write("ob_end_clean();\n\n") + ->write("throw \$e;\n") + ->outdent() + ->write("} catch (Throwable \$e) {\n") + ->indent() + ->write("ob_end_clean();\n\n") + ->write("throw \$e;\n") + ->outdent() + ->write("}\n\n") + ->write("return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());\n") + ->outdent() + ->write("}\n\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Module.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Module.php new file mode 100644 index 000000000..9da9e5460 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Module.php @@ -0,0 +1,425 @@ + + */ +class Twig_Node_Module extends Twig_Node +{ + public function __construct(Twig_NodeInterface $body, Twig_Node_Expression $parent = null, Twig_NodeInterface $blocks, Twig_NodeInterface $macros, Twig_NodeInterface $traits, $embeddedTemplates, $filename, $source = '') + { + $nodes = array( + 'body' => $body, + 'blocks' => $blocks, + 'macros' => $macros, + 'traits' => $traits, + 'display_start' => new Twig_Node(), + 'display_end' => new Twig_Node(), + 'constructor_start' => new Twig_Node(), + 'constructor_end' => new Twig_Node(), + 'class_end' => new Twig_Node(), + ); + if (null !== $parent) { + $nodes['parent'] = $parent; + } + + // embedded templates are set as attributes so that they are only visited once by the visitors + parent::__construct($nodes, array( + 'source' => $source, + 'filename' => $filename, + 'index' => null, + 'embedded_templates' => $embeddedTemplates, + ), 1); + } + + public function setIndex($index) + { + $this->setAttribute('index', $index); + } + + public function compile(Twig_Compiler $compiler) + { + $this->compileTemplate($compiler); + + foreach ($this->getAttribute('embedded_templates') as $template) { + $compiler->subcompile($template); + } + } + + protected function compileTemplate(Twig_Compiler $compiler) + { + if (!$this->getAttribute('index')) { + $compiler->write('compileClassHeader($compiler); + + if ( + count($this->getNode('blocks')) + || count($this->getNode('traits')) + || !$this->hasNode('parent') + || $this->getNode('parent') instanceof Twig_Node_Expression_Constant + || count($this->getNode('constructor_start')) + || count($this->getNode('constructor_end')) + ) { + $this->compileConstructor($compiler); + } + + $this->compileGetParent($compiler); + + $this->compileDisplay($compiler); + + $compiler->subcompile($this->getNode('blocks')); + + $this->compileMacros($compiler); + + $this->compileGetTemplateName($compiler); + + $this->compileIsTraitable($compiler); + + $this->compileDebugInfo($compiler); + + $this->compileGetSource($compiler); + + $this->compileClassFooter($compiler); + } + + protected function compileGetParent(Twig_Compiler $compiler) + { + if (!$this->hasNode('parent')) { + return; + } + $parent = $this->getNode('parent'); + + $compiler + ->write("protected function doGetParent(array \$context)\n", "{\n") + ->indent() + ->addDebugInfo($parent) + ->write('return ') + ; + + if ($parent instanceof Twig_Node_Expression_Constant) { + $compiler->subcompile($parent); + } else { + $compiler + ->raw('$this->loadTemplate(') + ->subcompile($parent) + ->raw(', ') + ->repr($this->getAttribute('filename')) + ->raw(', ') + ->repr($parent->getLine()) + ->raw(')') + ; + } + + $compiler + ->raw(";\n") + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileClassHeader(Twig_Compiler $compiler) + { + $compiler + ->write("\n\n") + // if the filename contains */, add a blank to avoid a PHP parse error + ->write('/* '.str_replace('*/', '* /', $this->getAttribute('filename'))." */\n") + ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getAttribute('filename'), $this->getAttribute('index'))) + ->raw(sprintf(" extends %s\n", $compiler->getEnvironment()->getBaseTemplateClass())) + ->write("{\n") + ->indent() + ; + } + + protected function compileConstructor(Twig_Compiler $compiler) + { + $compiler + ->write("public function __construct(Twig_Environment \$env)\n", "{\n") + ->indent() + ->subcompile($this->getNode('constructor_start')) + ->write("parent::__construct(\$env);\n\n") + ; + + // parent + if (!$this->hasNode('parent')) { + $compiler->write("\$this->parent = false;\n\n"); + } elseif (($parent = $this->getNode('parent')) && $parent instanceof Twig_Node_Expression_Constant) { + $compiler + ->addDebugInfo($parent) + ->write('$this->parent = $this->loadTemplate(') + ->subcompile($parent) + ->raw(', ') + ->repr($this->getAttribute('filename')) + ->raw(', ') + ->repr($parent->getLine()) + ->raw(");\n") + ; + } + + $countTraits = count($this->getNode('traits')); + if ($countTraits) { + // traits + foreach ($this->getNode('traits') as $i => $trait) { + $this->compileLoadTemplate($compiler, $trait->getNode('template'), sprintf('$_trait_%s', $i)); + + $compiler + ->addDebugInfo($trait->getNode('template')) + ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i)) + ->indent() + ->write("throw new Twig_Error_Runtime('Template \"'.") + ->subcompile($trait->getNode('template')) + ->raw(".'\" cannot be used as a trait.');\n") + ->outdent() + ->write("}\n") + ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i)) + ; + + foreach ($trait->getNode('targets') as $key => $value) { + $compiler + ->write(sprintf('if (!isset($_trait_%s_blocks[', $i)) + ->string($key) + ->raw("])) {\n") + ->indent() + ->write("throw new Twig_Error_Runtime(sprintf('Block ") + ->string($key) + ->raw(' is not defined in trait ') + ->subcompile($trait->getNode('template')) + ->raw(".'));\n") + ->outdent() + ->write("}\n\n") + + ->write(sprintf('$_trait_%s_blocks[', $i)) + ->subcompile($value) + ->raw(sprintf('] = $_trait_%s_blocks[', $i)) + ->string($key) + ->raw(sprintf(']; unset($_trait_%s_blocks[', $i)) + ->string($key) + ->raw("]);\n\n") + ; + } + } + + if ($countTraits > 1) { + $compiler + ->write("\$this->traits = array_merge(\n") + ->indent() + ; + + for ($i = 0; $i < $countTraits; ++$i) { + $compiler + ->write(sprintf('$_trait_%s_blocks'.($i == $countTraits - 1 ? '' : ',')."\n", $i)) + ; + } + + $compiler + ->outdent() + ->write(");\n\n") + ; + } else { + $compiler + ->write("\$this->traits = \$_trait_0_blocks;\n\n") + ; + } + + $compiler + ->write("\$this->blocks = array_merge(\n") + ->indent() + ->write("\$this->traits,\n") + ->write("array(\n") + ; + } else { + $compiler + ->write("\$this->blocks = array(\n") + ; + } + + // blocks + $compiler + ->indent() + ; + + foreach ($this->getNode('blocks') as $name => $node) { + $compiler + ->write(sprintf("'%s' => array(\$this, 'block_%s'),\n", $name, $name)) + ; + } + + if ($countTraits) { + $compiler + ->outdent() + ->write(")\n") + ; + } + + $compiler + ->outdent() + ->write(");\n") + ->outdent() + ->subcompile($this->getNode('constructor_end')) + ->write("}\n\n") + ; + } + + protected function compileDisplay(Twig_Compiler $compiler) + { + $compiler + ->write("protected function doDisplay(array \$context, array \$blocks = array())\n", "{\n") + ->indent() + ->subcompile($this->getNode('display_start')) + ->subcompile($this->getNode('body')) + ; + + if ($this->hasNode('parent')) { + $parent = $this->getNode('parent'); + $compiler->addDebugInfo($parent); + if ($parent instanceof Twig_Node_Expression_Constant) { + $compiler->write('$this->parent'); + } else { + $compiler->write('$this->getParent($context)'); + } + $compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n"); + } + + $compiler + ->subcompile($this->getNode('display_end')) + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileClassFooter(Twig_Compiler $compiler) + { + $compiler + ->subcompile($this->getNode('class_end')) + ->outdent() + ->write("}\n") + ; + } + + protected function compileMacros(Twig_Compiler $compiler) + { + $compiler->subcompile($this->getNode('macros')); + } + + protected function compileGetTemplateName(Twig_Compiler $compiler) + { + $compiler + ->write("public function getTemplateName()\n", "{\n") + ->indent() + ->write('return ') + ->repr($this->getAttribute('filename')) + ->raw(";\n") + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileIsTraitable(Twig_Compiler $compiler) + { + // A template can be used as a trait if: + // * it has no parent + // * it has no macros + // * it has no body + // + // Put another way, a template can be used as a trait if it + // only contains blocks and use statements. + $traitable = !$this->hasNode('parent') && 0 === count($this->getNode('macros')); + if ($traitable) { + if ($this->getNode('body') instanceof Twig_Node_Body) { + $nodes = $this->getNode('body')->getNode(0); + } else { + $nodes = $this->getNode('body'); + } + + if (!count($nodes)) { + $nodes = new Twig_Node(array($nodes)); + } + + foreach ($nodes as $node) { + if (!count($node)) { + continue; + } + + if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) { + continue; + } + + if ($node instanceof Twig_Node_BlockReference) { + continue; + } + + $traitable = false; + break; + } + } + + if ($traitable) { + return; + } + + $compiler + ->write("public function isTraitable()\n", "{\n") + ->indent() + ->write(sprintf("return %s;\n", $traitable ? 'true' : 'false')) + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileDebugInfo(Twig_Compiler $compiler) + { + $compiler + ->write("public function getDebugInfo()\n", "{\n") + ->indent() + ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true)))) + ->outdent() + ->write("}\n\n") + ; + } + + protected function compileGetSource(Twig_Compiler $compiler) + { + $compiler + ->write("public function getSource()\n", "{\n") + ->indent() + ->write('return ') + ->string($this->getAttribute('source')) + ->raw(";\n") + ->outdent() + ->write("}\n") + ; + } + + protected function compileLoadTemplate(Twig_Compiler $compiler, $node, $var) + { + if ($node instanceof Twig_Node_Expression_Constant) { + $compiler + ->write(sprintf('%s = $this->loadTemplate(', $var)) + ->subcompile($node) + ->raw(', ') + ->repr($this->getAttribute('filename')) + ->raw(', ') + ->repr($node->getLine()) + ->raw(");\n") + ; + } else { + throw new LogicException('Trait templates can only be constant nodes.'); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Print.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Print.php new file mode 100644 index 000000000..7b69ee811 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Print.php @@ -0,0 +1,34 @@ + + */ +class Twig_Node_Print extends Twig_Node implements Twig_NodeOutputInterface +{ + public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null) + { + parent::__construct(array('expr' => $expr), array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('echo ') + ->subcompile($this->getNode('expr')) + ->raw(";\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Sandbox.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Sandbox.php new file mode 100644 index 000000000..4c8f8fa63 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Sandbox.php @@ -0,0 +1,42 @@ + + */ +class Twig_Node_Sandbox extends Twig_Node +{ + public function __construct(Twig_NodeInterface $body, $lineno, $tag = null) + { + parent::__construct(array('body' => $body), array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write("\$sandbox = \$this->env->getExtension('Twig_Extension_Sandbox');\n") + ->write("if (!\$alreadySandboxed = \$sandbox->isSandboxed()) {\n") + ->indent() + ->write("\$sandbox->enableSandbox();\n") + ->outdent() + ->write("}\n") + ->subcompile($this->getNode('body')) + ->write("if (!\$alreadySandboxed) {\n") + ->indent() + ->write("\$sandbox->disableSandbox();\n") + ->outdent() + ->write("}\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php new file mode 100644 index 000000000..3aaafb46b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php @@ -0,0 +1,51 @@ + + */ +class Twig_Node_SandboxedPrint extends Twig_Node_Print +{ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('echo $this->env->getExtension(\'Twig_Extension_Sandbox\')->ensureToStringAllowed(') + ->subcompile($this->getNode('expr')) + ->raw(");\n") + ; + } + + /** + * Removes node filters. + * + * This is mostly needed when another visitor adds filters (like the escaper one). + * + * @param Twig_Node $node A Node + * + * @return Twig_Node + */ + protected function removeNodeFilter($node) + { + if ($node instanceof Twig_Node_Expression_Filter) { + return $this->removeNodeFilter($node->getNode('node')); + } + + return $node; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Set.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Set.php new file mode 100644 index 000000000..e5a660375 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Set.php @@ -0,0 +1,96 @@ + + */ +class Twig_Node_Set extends Twig_Node +{ + public function __construct($capture, Twig_NodeInterface $names, Twig_NodeInterface $values, $lineno, $tag = null) + { + parent::__construct(array('names' => $names, 'values' => $values), array('capture' => $capture, 'safe' => false), $lineno, $tag); + + /* + * Optimizes the node when capture is used for a large block of text. + * + * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig_Markup("foo"); + */ + if ($this->getAttribute('capture')) { + $this->setAttribute('safe', true); + + $values = $this->getNode('values'); + if ($values instanceof Twig_Node_Text) { + $this->setNode('values', new Twig_Node_Expression_Constant($values->getAttribute('data'), $values->getLine())); + $this->setAttribute('capture', false); + } + } + } + + public function compile(Twig_Compiler $compiler) + { + $compiler->addDebugInfo($this); + + if (count($this->getNode('names')) > 1) { + $compiler->write('list('); + foreach ($this->getNode('names') as $idx => $node) { + if ($idx) { + $compiler->raw(', '); + } + + $compiler->subcompile($node); + } + $compiler->raw(')'); + } else { + if ($this->getAttribute('capture')) { + $compiler + ->write("ob_start();\n") + ->subcompile($this->getNode('values')) + ; + } + + $compiler->subcompile($this->getNode('names'), false); + + if ($this->getAttribute('capture')) { + $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())"); + } + } + + if (!$this->getAttribute('capture')) { + $compiler->raw(' = '); + + if (count($this->getNode('names')) > 1) { + $compiler->write('array('); + foreach ($this->getNode('values') as $idx => $value) { + if ($idx) { + $compiler->raw(', '); + } + + $compiler->subcompile($value); + } + $compiler->raw(')'); + } else { + if ($this->getAttribute('safe')) { + $compiler + ->raw("('' === \$tmp = ") + ->subcompile($this->getNode('values')) + ->raw(") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())") + ; + } else { + $compiler->subcompile($this->getNode('values')); + } + } + } + + $compiler->raw(";\n"); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/SetTemp.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/SetTemp.php new file mode 100644 index 000000000..3bdd1cb74 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/SetTemp.php @@ -0,0 +1,35 @@ + $name), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $name = $this->getAttribute('name'); + $compiler + ->addDebugInfo($this) + ->write('if (isset($context[') + ->string($name) + ->raw('])) { $_') + ->raw($name) + ->raw('_ = $context[') + ->repr($name) + ->raw(']; } else { $_') + ->raw($name) + ->raw("_ = null; }\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Spaceless.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Spaceless.php new file mode 100644 index 000000000..486e461a6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Spaceless.php @@ -0,0 +1,35 @@ + + */ +class Twig_Node_Spaceless extends Twig_Node +{ + public function __construct(Twig_NodeInterface $body, $lineno, $tag = 'spaceless') + { + parent::__construct(array('body' => $body), array(), $lineno, $tag); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write("ob_start();\n") + ->subcompile($this->getNode('body')) + ->write("echo trim(preg_replace('/>\s+<', ob_get_clean()));\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Text.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Text.php new file mode 100644 index 000000000..39879bb2c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Node/Text.php @@ -0,0 +1,34 @@ + + */ +class Twig_Node_Text extends Twig_Node implements Twig_NodeOutputInterface +{ + public function __construct($data, $lineno) + { + parent::__construct(array(), array('data' => $data), $lineno); + } + + public function compile(Twig_Compiler $compiler) + { + $compiler + ->addDebugInfo($this) + ->write('echo ') + ->string($this->getAttribute('data')) + ->raw(";\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeInterface.php new file mode 100644 index 000000000..8077349b3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeInterface.php @@ -0,0 +1,31 @@ + + * + * @deprecated since 1.12 (to be removed in 3.0) + */ +interface Twig_NodeInterface extends Countable, IteratorAggregate +{ + /** + * Compiles the node to PHP. + * + * @param Twig_Compiler $compiler A Twig_Compiler instance + */ + public function compile(Twig_Compiler $compiler); + + public function getLine(); + + public function getNodeTag(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeOutputInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeOutputInterface.php new file mode 100644 index 000000000..22172c09d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeOutputInterface.php @@ -0,0 +1,19 @@ + + */ +interface Twig_NodeOutputInterface +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeTraverser.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeTraverser.php new file mode 100644 index 000000000..00f7b54b6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeTraverser.php @@ -0,0 +1,89 @@ + + */ +class Twig_NodeTraverser +{ + protected $env; + protected $visitors = array(); + + /** + * Constructor. + * + * @param Twig_Environment $env A Twig_Environment instance + * @param Twig_NodeVisitorInterface[] $visitors An array of Twig_NodeVisitorInterface instances + */ + public function __construct(Twig_Environment $env, array $visitors = array()) + { + $this->env = $env; + foreach ($visitors as $visitor) { + $this->addVisitor($visitor); + } + } + + /** + * Adds a visitor. + * + * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance + */ + public function addVisitor(Twig_NodeVisitorInterface $visitor) + { + if (!isset($this->visitors[$visitor->getPriority()])) { + $this->visitors[$visitor->getPriority()] = array(); + } + + $this->visitors[$visitor->getPriority()][] = $visitor; + } + + /** + * Traverses a node and calls the registered visitors. + * + * @param Twig_NodeInterface $node A Twig_NodeInterface instance + * + * @return Twig_NodeInterface + */ + public function traverse(Twig_NodeInterface $node) + { + ksort($this->visitors); + foreach ($this->visitors as $visitors) { + foreach ($visitors as $visitor) { + $node = $this->traverseForVisitor($visitor, $node); + } + } + + return $node; + } + + protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null) + { + if (null === $node) { + return; + } + + $node = $visitor->enterNode($node, $this->env); + + foreach ($node as $k => $n) { + if (false !== $n = $this->traverseForVisitor($visitor, $n)) { + $node->setNode($k, $n); + } else { + $node->removeNode($k); + } + } + + return $visitor->leaveNode($node, $this->env); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php new file mode 100644 index 000000000..a21ade7eb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php @@ -0,0 +1,159 @@ + + */ +class Twig_NodeVisitor_Escaper extends Twig_BaseNodeVisitor +{ + protected $statusStack = array(); + protected $blocks = array(); + protected $safeAnalysis; + protected $traverser; + protected $defaultStrategy = false; + protected $safeVars = array(); + + public function __construct() + { + $this->safeAnalysis = new Twig_NodeVisitor_SafeAnalysis(); + } + + /** + * {@inheritdoc} + */ + protected function doEnterNode(Twig_Node $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Module) { + if ($env->hasExtension('Twig_Extension_Escaper') && $defaultStrategy = $env->getExtension('Twig_Extension_Escaper')->getDefaultStrategy($node->getAttribute('filename'))) { + $this->defaultStrategy = $defaultStrategy; + } + $this->safeVars = array(); + $this->blocks = array(); + } elseif ($node instanceof Twig_Node_AutoEscape) { + $this->statusStack[] = $node->getAttribute('value'); + } elseif ($node instanceof Twig_Node_Block) { + $this->statusStack[] = isset($this->blocks[$node->getAttribute('name')]) ? $this->blocks[$node->getAttribute('name')] : $this->needEscaping($env); + } elseif ($node instanceof Twig_Node_Import) { + $this->safeVars[] = $node->getNode('var')->getAttribute('name'); + } + + return $node; + } + + /** + * {@inheritdoc} + */ + protected function doLeaveNode(Twig_Node $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Module) { + $this->defaultStrategy = false; + $this->safeVars = array(); + $this->blocks = array(); + } elseif ($node instanceof Twig_Node_Expression_Filter) { + return $this->preEscapeFilterNode($node, $env); + } elseif ($node instanceof Twig_Node_Print) { + return $this->escapePrintNode($node, $env, $this->needEscaping($env)); + } + + if ($node instanceof Twig_Node_AutoEscape || $node instanceof Twig_Node_Block) { + array_pop($this->statusStack); + } elseif ($node instanceof Twig_Node_BlockReference) { + $this->blocks[$node->getAttribute('name')] = $this->needEscaping($env); + } + + return $node; + } + + protected function escapePrintNode(Twig_Node_Print $node, Twig_Environment $env, $type) + { + if (false === $type) { + return $node; + } + + $expression = $node->getNode('expr'); + + if ($this->isSafeFor($type, $expression, $env)) { + return $node; + } + + $class = get_class($node); + + return new $class( + $this->getEscaperFilter($type, $expression), + $node->getLine() + ); + } + + protected function preEscapeFilterNode(Twig_Node_Expression_Filter $filter, Twig_Environment $env) + { + $name = $filter->getNode('filter')->getAttribute('value'); + + $type = $env->getFilter($name)->getPreEscape(); + if (null === $type) { + return $filter; + } + + $node = $filter->getNode('node'); + if ($this->isSafeFor($type, $node, $env)) { + return $filter; + } + + $filter->setNode('node', $this->getEscaperFilter($type, $node)); + + return $filter; + } + + protected function isSafeFor($type, Twig_NodeInterface $expression, $env) + { + $safe = $this->safeAnalysis->getSafe($expression); + + if (null === $safe) { + if (null === $this->traverser) { + $this->traverser = new Twig_NodeTraverser($env, array($this->safeAnalysis)); + } + + $this->safeAnalysis->setSafeVars($this->safeVars); + + $this->traverser->traverse($expression); + $safe = $this->safeAnalysis->getSafe($expression); + } + + return in_array($type, $safe) || in_array('all', $safe); + } + + protected function needEscaping(Twig_Environment $env) + { + if (count($this->statusStack)) { + return $this->statusStack[count($this->statusStack) - 1]; + } + + return $this->defaultStrategy ? $this->defaultStrategy : false; + } + + protected function getEscaperFilter($type, Twig_NodeInterface $node) + { + $line = $node->getLine(); + $name = new Twig_Node_Expression_Constant('escape', $line); + $args = new Twig_Node(array(new Twig_Node_Expression_Constant((string) $type, $line), new Twig_Node_Expression_Constant(null, $line), new Twig_Node_Expression_Constant(true, $line))); + + return new Twig_Node_Expression_Filter($node, $name, $args, $line); + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return 0; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php new file mode 100644 index 000000000..882d2bbbb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php @@ -0,0 +1,271 @@ + + */ +class Twig_NodeVisitor_Optimizer extends Twig_BaseNodeVisitor +{ + const OPTIMIZE_ALL = -1; + const OPTIMIZE_NONE = 0; + const OPTIMIZE_FOR = 2; + const OPTIMIZE_RAW_FILTER = 4; + const OPTIMIZE_VAR_ACCESS = 8; + + protected $loops = array(); + protected $loopsTargets = array(); + protected $optimizers; + protected $prependedNodes = array(); + protected $inABody = false; + + /** + * Constructor. + * + * @param int $optimizers The optimizer mode + */ + public function __construct($optimizers = -1) + { + if (!is_int($optimizers) || $optimizers > (self::OPTIMIZE_FOR | self::OPTIMIZE_RAW_FILTER | self::OPTIMIZE_VAR_ACCESS)) { + throw new InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.', $optimizers)); + } + + $this->optimizers = $optimizers; + } + + /** + * {@inheritdoc} + */ + protected function doEnterNode(Twig_Node $node, Twig_Environment $env) + { + if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) { + $this->enterOptimizeFor($node, $env); + } + + if (PHP_VERSION_ID < 50400 && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) { + if ($this->inABody) { + if (!$node instanceof Twig_Node_Expression) { + if (get_class($node) !== 'Twig_Node') { + array_unshift($this->prependedNodes, array()); + } + } else { + $node = $this->optimizeVariables($node, $env); + } + } elseif ($node instanceof Twig_Node_Body) { + $this->inABody = true; + } + } + + return $node; + } + + /** + * {@inheritdoc} + */ + protected function doLeaveNode(Twig_Node $node, Twig_Environment $env) + { + $expression = $node instanceof Twig_Node_Expression; + + if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) { + $this->leaveOptimizeFor($node, $env); + } + + if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) { + $node = $this->optimizeRawFilter($node, $env); + } + + $node = $this->optimizePrintNode($node, $env); + + if (self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) { + if ($node instanceof Twig_Node_Body) { + $this->inABody = false; + } elseif ($this->inABody) { + if (!$expression && get_class($node) !== 'Twig_Node' && $prependedNodes = array_shift($this->prependedNodes)) { + $nodes = array(); + foreach (array_unique($prependedNodes) as $name) { + $nodes[] = new Twig_Node_SetTemp($name, $node->getLine()); + } + + $nodes[] = $node; + $node = new Twig_Node($nodes); + } + } + } + + return $node; + } + + protected function optimizeVariables(Twig_NodeInterface $node, Twig_Environment $env) + { + if ('Twig_Node_Expression_Name' === get_class($node) && $node->isSimple()) { + $this->prependedNodes[0][] = $node->getAttribute('name'); + + return new Twig_Node_Expression_TempName($node->getAttribute('name'), $node->getLine()); + } + + return $node; + } + + /** + * Optimizes print nodes. + * + * It replaces: + * + * * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()" + * + * @param Twig_NodeInterface $node A Node + * @param Twig_Environment $env The current Twig environment + * + * @return Twig_NodeInterface + */ + protected function optimizePrintNode(Twig_NodeInterface $node, Twig_Environment $env) + { + if (!$node instanceof Twig_Node_Print) { + return $node; + } + + if ( + $node->getNode('expr') instanceof Twig_Node_Expression_BlockReference || + $node->getNode('expr') instanceof Twig_Node_Expression_Parent + ) { + $node->getNode('expr')->setAttribute('output', true); + + return $node->getNode('expr'); + } + + return $node; + } + + /** + * Removes "raw" filters. + * + * @param Twig_NodeInterface $node A Node + * @param Twig_Environment $env The current Twig environment + * + * @return Twig_NodeInterface + */ + protected function optimizeRawFilter(Twig_NodeInterface $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Expression_Filter && 'raw' == $node->getNode('filter')->getAttribute('value')) { + return $node->getNode('node'); + } + + return $node; + } + + /** + * Optimizes "for" tag by removing the "loop" variable creation whenever possible. + * + * @param Twig_NodeInterface $node A Node + * @param Twig_Environment $env The current Twig environment + */ + protected function enterOptimizeFor(Twig_NodeInterface $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_For) { + // disable the loop variable by default + $node->setAttribute('with_loop', false); + array_unshift($this->loops, $node); + array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name')); + array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name')); + } elseif (!$this->loops) { + // we are outside a loop + return; + } + + // when do we need to add the loop variable back? + + // the loop variable is referenced for the current loop + elseif ($node instanceof Twig_Node_Expression_Name && 'loop' === $node->getAttribute('name')) { + $node->setAttribute('always_defined', true); + $this->addLoopToCurrent(); + } + + // optimize access to loop targets + elseif ($node instanceof Twig_Node_Expression_Name && in_array($node->getAttribute('name'), $this->loopsTargets)) { + $node->setAttribute('always_defined', true); + } + + // block reference + elseif ($node instanceof Twig_Node_BlockReference || $node instanceof Twig_Node_Expression_BlockReference) { + $this->addLoopToCurrent(); + } + + // include without the only attribute + elseif ($node instanceof Twig_Node_Include && !$node->getAttribute('only')) { + $this->addLoopToAll(); + } + + // include function without the with_context=false parameter + elseif ($node instanceof Twig_Node_Expression_Function + && 'include' === $node->getAttribute('name') + && (!$node->getNode('arguments')->hasNode('with_context') + || false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value') + ) + ) { + $this->addLoopToAll(); + } + + // the loop variable is referenced via an attribute + elseif ($node instanceof Twig_Node_Expression_GetAttr + && (!$node->getNode('attribute') instanceof Twig_Node_Expression_Constant + || 'parent' === $node->getNode('attribute')->getAttribute('value') + ) + && (true === $this->loops[0]->getAttribute('with_loop') + || ($node->getNode('node') instanceof Twig_Node_Expression_Name + && 'loop' === $node->getNode('node')->getAttribute('name') + ) + ) + ) { + $this->addLoopToAll(); + } + } + + /** + * Optimizes "for" tag by removing the "loop" variable creation whenever possible. + * + * @param Twig_NodeInterface $node A Node + * @param Twig_Environment $env The current Twig environment + */ + protected function leaveOptimizeFor(Twig_NodeInterface $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_For) { + array_shift($this->loops); + array_shift($this->loopsTargets); + array_shift($this->loopsTargets); + } + } + + protected function addLoopToCurrent() + { + $this->loops[0]->setAttribute('with_loop', true); + } + + protected function addLoopToAll() + { + foreach ($this->loops as $loop) { + $loop->setAttribute('with_loop', true); + } + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return 255; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php new file mode 100644 index 000000000..439f5bf49 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php @@ -0,0 +1,154 @@ +safeVars = $safeVars; + } + + public function getSafe(Twig_NodeInterface $node) + { + $hash = spl_object_hash($node); + if (!isset($this->data[$hash])) { + return; + } + + foreach ($this->data[$hash] as $bucket) { + if ($bucket['key'] !== $node) { + continue; + } + + if (in_array('html_attr', $bucket['value'])) { + $bucket['value'][] = 'html'; + } + + return $bucket['value']; + } + } + + protected function setSafe(Twig_NodeInterface $node, array $safe) + { + $hash = spl_object_hash($node); + if (isset($this->data[$hash])) { + foreach ($this->data[$hash] as &$bucket) { + if ($bucket['key'] === $node) { + $bucket['value'] = $safe; + + return; + } + } + } + $this->data[$hash][] = array( + 'key' => $node, + 'value' => $safe, + ); + } + + /** + * {@inheritdoc} + */ + protected function doEnterNode(Twig_Node $node, Twig_Environment $env) + { + return $node; + } + + /** + * {@inheritdoc} + */ + protected function doLeaveNode(Twig_Node $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Expression_Constant) { + // constants are marked safe for all + $this->setSafe($node, array('all')); + } elseif ($node instanceof Twig_Node_Expression_BlockReference) { + // blocks are safe by definition + $this->setSafe($node, array('all')); + } elseif ($node instanceof Twig_Node_Expression_Parent) { + // parent block is safe by definition + $this->setSafe($node, array('all')); + } elseif ($node instanceof Twig_Node_Expression_Conditional) { + // intersect safeness of both operands + $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3'))); + $this->setSafe($node, $safe); + } elseif ($node instanceof Twig_Node_Expression_Filter) { + // filter expression is safe when the filter is safe + $name = $node->getNode('filter')->getAttribute('value'); + $args = $node->getNode('arguments'); + if (false !== $filter = $env->getFilter($name)) { + $safe = $filter->getSafe($args); + if (null === $safe) { + $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety()); + } + $this->setSafe($node, $safe); + } else { + $this->setSafe($node, array()); + } + } elseif ($node instanceof Twig_Node_Expression_Function) { + // function expression is safe when the function is safe + $name = $node->getAttribute('name'); + $args = $node->getNode('arguments'); + $function = $env->getFunction($name); + if (false !== $function) { + $this->setSafe($node, $function->getSafe($args)); + } else { + $this->setSafe($node, array()); + } + } elseif ($node instanceof Twig_Node_Expression_MethodCall) { + if ($node->getAttribute('safe')) { + $this->setSafe($node, array('all')); + } else { + $this->setSafe($node, array()); + } + } elseif ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name) { + $name = $node->getNode('node')->getAttribute('name'); + // attributes on template instances are safe + if ('_self' == $name || in_array($name, $this->safeVars)) { + $this->setSafe($node, array('all')); + } else { + $this->setSafe($node, array()); + } + } else { + $this->setSafe($node, array()); + } + + return $node; + } + + protected function intersectSafe(array $a = null, array $b = null) + { + if (null === $a || null === $b) { + return array(); + } + + if (in_array('all', $a)) { + return $b; + } + + if (in_array('all', $b)) { + return $a; + } + + return array_intersect($a, $b); + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return 0; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php new file mode 100644 index 000000000..7f1b913b7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php @@ -0,0 +1,82 @@ + + */ +class Twig_NodeVisitor_Sandbox extends Twig_BaseNodeVisitor +{ + protected $inAModule = false; + protected $tags; + protected $filters; + protected $functions; + + /** + * {@inheritdoc} + */ + protected function doEnterNode(Twig_Node $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Module) { + $this->inAModule = true; + $this->tags = array(); + $this->filters = array(); + $this->functions = array(); + + return $node; + } elseif ($this->inAModule) { + // look for tags + if ($node->getNodeTag() && !isset($this->tags[$node->getNodeTag()])) { + $this->tags[$node->getNodeTag()] = $node; + } + + // look for filters + if ($node instanceof Twig_Node_Expression_Filter && !isset($this->filters[$node->getNode('filter')->getAttribute('value')])) { + $this->filters[$node->getNode('filter')->getAttribute('value')] = $node; + } + + // look for functions + if ($node instanceof Twig_Node_Expression_Function && !isset($this->functions[$node->getAttribute('name')])) { + $this->functions[$node->getAttribute('name')] = $node; + } + + // wrap print to check __toString() calls + if ($node instanceof Twig_Node_Print) { + return new Twig_Node_SandboxedPrint($node->getNode('expr'), $node->getLine(), $node->getNodeTag()); + } + } + + return $node; + } + + /** + * {@inheritdoc} + */ + protected function doLeaveNode(Twig_Node $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Module) { + $this->inAModule = false; + + $node->setNode('display_start', new Twig_Node(array(new Twig_Node_CheckSecurity($this->filters, $this->tags, $this->functions), $node->getNode('display_start')))); + } + + return $node; + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return 0; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php new file mode 100644 index 000000000..f27616302 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php @@ -0,0 +1,47 @@ + + */ +interface Twig_NodeVisitorInterface +{ + /** + * Called before child nodes are visited. + * + * @param Twig_NodeInterface $node The node to visit + * @param Twig_Environment $env The Twig environment instance + * + * @return Twig_NodeInterface The modified node + */ + public function enterNode(Twig_NodeInterface $node, Twig_Environment $env); + + /** + * Called after child nodes are visited. + * + * @param Twig_NodeInterface $node The node to visit + * @param Twig_Environment $env The Twig environment instance + * + * @return Twig_NodeInterface|false The modified node or false if the node must be removed + */ + public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env); + + /** + * Returns the priority for this visitor. + * + * Priority should be between -10 and 10 (0 is the default). + * + * @return int The priority level + */ + public function getPriority(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Parser.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Parser.php new file mode 100644 index 000000000..1f66cfa41 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Parser.php @@ -0,0 +1,399 @@ + + */ +class Twig_Parser implements Twig_ParserInterface +{ + protected $stack = array(); + protected $stream; + protected $parent; + protected $handlers; + protected $visitors; + protected $expressionParser; + protected $blocks; + protected $blockStack; + protected $macros; + protected $env; + protected $reservedMacroNames; + protected $importedSymbols; + protected $traits; + protected $embeddedTemplates = array(); + + /** + * Constructor. + * + * @param Twig_Environment $env A Twig_Environment instance + */ + public function __construct(Twig_Environment $env) + { + $this->env = $env; + } + + public function getEnvironment() + { + return $this->env; + } + + public function getVarName() + { + return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false)); + } + + public function getFilename() + { + return $this->stream->getFilename(); + } + + /** + * {@inheritdoc} + */ + public function parse(Twig_TokenStream $stream, $test = null, $dropNeedle = false) + { + // push all variables into the stack to keep the current state of the parser + // using get_object_vars() instead of foreach would lead to https://bugs.php.net/71336 + $vars = array(); + foreach ($this as $k => $v) { + $vars[$k] = $v; + } + + unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser'], $vars['reservedMacroNames']); + $this->stack[] = $vars; + + // tag handlers + if (null === $this->handlers) { + $this->handlers = $this->env->getTokenParsers(); + $this->handlers->setParser($this); + } + + // node visitors + if (null === $this->visitors) { + $this->visitors = $this->env->getNodeVisitors(); + } + + if (null === $this->expressionParser) { + $this->expressionParser = new Twig_ExpressionParser($this, $this->env->getUnaryOperators(), $this->env->getBinaryOperators()); + } + + $this->stream = $stream; + $this->parent = null; + $this->blocks = array(); + $this->macros = array(); + $this->traits = array(); + $this->blockStack = array(); + $this->importedSymbols = array(array()); + $this->embeddedTemplates = array(); + + try { + $body = $this->subparse($test, $dropNeedle); + + if (null !== $this->parent && null === $body = $this->filterBodyNodes($body)) { + $body = new Twig_Node(); + } + } catch (Twig_Error_Syntax $e) { + if (!$e->getTemplateFile()) { + $e->setTemplateFile($this->getFilename()); + } + + if (!$e->getTemplateLine()) { + $e->setTemplateLine($this->stream->getCurrent()->getLine()); + } + + throw $e; + } + + $node = new Twig_Node_Module(new Twig_Node_Body(array($body)), $this->parent, new Twig_Node($this->blocks), new Twig_Node($this->macros), new Twig_Node($this->traits), $this->embeddedTemplates, $this->getFilename(), $stream->getSource()); + + $traverser = new Twig_NodeTraverser($this->env, $this->visitors); + + $node = $traverser->traverse($node); + + // restore previous stack so previous parse() call can resume working + foreach (array_pop($this->stack) as $key => $val) { + $this->$key = $val; + } + + return $node; + } + + public function subparse($test, $dropNeedle = false) + { + $lineno = $this->getCurrentToken()->getLine(); + $rv = array(); + while (!$this->stream->isEOF()) { + switch ($this->getCurrentToken()->getType()) { + case Twig_Token::TEXT_TYPE: + $token = $this->stream->next(); + $rv[] = new Twig_Node_Text($token->getValue(), $token->getLine()); + break; + + case Twig_Token::VAR_START_TYPE: + $token = $this->stream->next(); + $expr = $this->expressionParser->parseExpression(); + $this->stream->expect(Twig_Token::VAR_END_TYPE); + $rv[] = new Twig_Node_Print($expr, $token->getLine()); + break; + + case Twig_Token::BLOCK_START_TYPE: + $this->stream->next(); + $token = $this->getCurrentToken(); + + if ($token->getType() !== Twig_Token::NAME_TYPE) { + throw new Twig_Error_Syntax('A block must start with a tag name.', $token->getLine(), $this->getFilename()); + } + + if (null !== $test && call_user_func($test, $token)) { + if ($dropNeedle) { + $this->stream->next(); + } + + if (1 === count($rv)) { + return $rv[0]; + } + + return new Twig_Node($rv, array(), $lineno); + } + + $subparser = $this->handlers->getTokenParser($token->getValue()); + if (null === $subparser) { + if (null !== $test) { + $e = new Twig_Error_Syntax(sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->getFilename()); + + if (is_array($test) && isset($test[0]) && $test[0] instanceof Twig_TokenParserInterface) { + $e->appendMessage(sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $test[0]->getTag(), $lineno)); + } + } else { + $e = new Twig_Error_Syntax(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->getFilename()); + $e->addSuggestions($token->getValue(), array_keys($this->env->getTags())); + } + + throw $e; + } + + $this->stream->next(); + + $node = $subparser->parse($token); + if (null !== $node) { + $rv[] = $node; + } + break; + + default: + throw new Twig_Error_Syntax('Lexer or parser ended up in unsupported state.', 0, $this->getFilename()); + } + } + + if (1 === count($rv)) { + return $rv[0]; + } + + return new Twig_Node($rv, array(), $lineno); + } + + public function addHandler($name, $class) + { + $this->handlers[$name] = $class; + } + + public function addNodeVisitor(Twig_NodeVisitorInterface $visitor) + { + $this->visitors[] = $visitor; + } + + public function getBlockStack() + { + return $this->blockStack; + } + + public function peekBlockStack() + { + return $this->blockStack[count($this->blockStack) - 1]; + } + + public function popBlockStack() + { + array_pop($this->blockStack); + } + + public function pushBlockStack($name) + { + $this->blockStack[] = $name; + } + + public function hasBlock($name) + { + return isset($this->blocks[$name]); + } + + public function getBlock($name) + { + return $this->blocks[$name]; + } + + public function setBlock($name, Twig_Node_Block $value) + { + $this->blocks[$name] = new Twig_Node_Body(array($value), array(), $value->getLine()); + } + + public function hasMacro($name) + { + return isset($this->macros[$name]); + } + + public function setMacro($name, Twig_Node_Macro $node) + { + if ($this->isReservedMacroName($name)) { + throw new Twig_Error_Syntax(sprintf('"%s" cannot be used as a macro name as it is a reserved keyword.', $name), $node->getLine(), $this->getFilename()); + } + + $this->macros[$name] = $node; + } + + public function isReservedMacroName($name) + { + if (null === $this->reservedMacroNames) { + $this->reservedMacroNames = array(); + $r = new ReflectionClass($this->env->getBaseTemplateClass()); + foreach ($r->getMethods() as $method) { + $methodName = strtolower($method->getName()); + + if ('get' === substr($methodName, 0, 3) && isset($methodName[3])) { + $this->reservedMacroNames[] = substr($methodName, 3); + } + } + } + + return in_array(strtolower($name), $this->reservedMacroNames); + } + + public function addTrait($trait) + { + $this->traits[] = $trait; + } + + public function hasTraits() + { + return count($this->traits) > 0; + } + + public function embedTemplate(Twig_Node_Module $template) + { + $template->setIndex(mt_rand()); + + $this->embeddedTemplates[] = $template; + } + + public function addImportedSymbol($type, $alias, $name = null, Twig_Node_Expression $node = null) + { + $this->importedSymbols[0][$type][$alias] = array('name' => $name, 'node' => $node); + } + + public function getImportedSymbol($type, $alias) + { + foreach ($this->importedSymbols as $functions) { + if (isset($functions[$type][$alias])) { + return $functions[$type][$alias]; + } + } + } + + public function isMainScope() + { + return 1 === count($this->importedSymbols); + } + + public function pushLocalScope() + { + array_unshift($this->importedSymbols, array()); + } + + public function popLocalScope() + { + array_shift($this->importedSymbols); + } + + /** + * Gets the expression parser. + * + * @return Twig_ExpressionParser The expression parser + */ + public function getExpressionParser() + { + return $this->expressionParser; + } + + public function getParent() + { + return $this->parent; + } + + public function setParent($parent) + { + $this->parent = $parent; + } + + /** + * Gets the token stream. + * + * @return Twig_TokenStream The token stream + */ + public function getStream() + { + return $this->stream; + } + + /** + * Gets the current token. + * + * @return Twig_Token The current token + */ + public function getCurrentToken() + { + return $this->stream->getCurrent(); + } + + protected function filterBodyNodes(Twig_NodeInterface $node) + { + // check that the body does not contain non-empty output nodes + if ( + ($node instanceof Twig_Node_Text && !ctype_space($node->getAttribute('data'))) + || + (!$node instanceof Twig_Node_Text && !$node instanceof Twig_Node_BlockReference && $node instanceof Twig_NodeOutputInterface) + ) { + if (false !== strpos((string) $node, chr(0xEF).chr(0xBB).chr(0xBF))) { + throw new Twig_Error_Syntax('A template that extends another one cannot start with a byte order mark (BOM); it must be removed.', $node->getLine(), $this->getFilename()); + } + + throw new Twig_Error_Syntax('A template that extends another one cannot include contents outside Twig blocks. Did you forget to put the contents inside a {% block %} tag?', $node->getLine(), $this->getFilename()); + } + + // bypass "set" nodes as they "capture" the output + if ($node instanceof Twig_Node_Set) { + return $node; + } + + if ($node instanceof Twig_NodeOutputInterface) { + return; + } + + foreach ($node as $k => $n) { + if (null !== $n && null === $this->filterBodyNodes($n)) { + $node->removeNode($k); + } + } + + return $node; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ParserInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ParserInterface.php new file mode 100644 index 000000000..8e7cc0a85 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/ParserInterface.php @@ -0,0 +1,31 @@ + + * + * @deprecated since 1.12 (to be removed in 3.0) + */ +interface Twig_ParserInterface +{ + /** + * Converts a token stream to a node tree. + * + * @param Twig_TokenStream $stream A token stream instance + * + * @return Twig_Node_Module A node tree + * + * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong + */ + public function parse(Twig_TokenStream $stream); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php new file mode 100644 index 000000000..b82747a94 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php @@ -0,0 +1,68 @@ + + */ +class Twig_Profiler_Dumper_Blackfire +{ + public function dump(Twig_Profiler_Profile $profile) + { + $data = array(); + $this->dumpProfile('main()', $profile, $data); + $this->dumpChildren('main()', $profile, $data); + + $start = microtime(true); + $str = << $values) { + $str .= "{$name}//{$values['ct']} {$values['wt']} {$values['mu']} {$values['pmu']}\n"; + } + + return $str; + } + + private function dumpChildren($parent, Twig_Profiler_Profile $profile, &$data) + { + foreach ($profile as $p) { + if ($p->isTemplate()) { + $name = $p->getTemplate(); + } else { + $name = sprintf('%s::%s(%s)', $p->getTemplate(), $p->getType(), $p->getName()); + } + $this->dumpProfile(sprintf('%s==>%s', $parent, $name), $p, $data); + $this->dumpChildren($name, $p, $data); + } + } + + private function dumpProfile($edge, Twig_Profiler_Profile $profile, &$data) + { + if (isset($data[$edge])) { + $data[$edge]['ct'] += 1; + $data[$edge]['wt'] += floor($profile->getDuration() * 1000000); + $data[$edge]['mu'] += $profile->getMemoryUsage(); + $data[$edge]['pmu'] += $profile->getPeakMemoryUsage(); + } else { + $data[$edge] = array( + 'ct' => 1, + 'wt' => floor($profile->getDuration() * 1000000), + 'mu' => $profile->getMemoryUsage(), + 'pmu' => $profile->getPeakMemoryUsage(), + ); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php new file mode 100644 index 000000000..f066da750 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php @@ -0,0 +1,43 @@ + + */ +class Twig_Profiler_Dumper_Html extends Twig_Profiler_Dumper_Text +{ + private static $colors = array( + 'block' => '#dfd', + 'macro' => '#ddf', + 'template' => '#ffd', + 'big' => '#d44', + ); + + public function dump(Twig_Profiler_Profile $profile) + { + return '
    '.parent::dump($profile).'
    '; + } + + protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix) + { + return sprintf('%s└ %s', $prefix, self::$colors['template'], $profile->getTemplate()); + } + + protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix) + { + return sprintf('%s└ %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), isset(self::$colors[$profile->getType()]) ? self::$colors[$profile->getType()] : 'auto', $profile->getName()); + } + + protected function formatTime(Twig_Profiler_Profile $profile, $percent) + { + return sprintf('%.2fms/%.0f%%', $percent > 20 ? self::$colors['big'] : 'auto', $profile->getDuration() * 1000, $percent); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php new file mode 100644 index 000000000..998e210d3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php @@ -0,0 +1,68 @@ + + */ +class Twig_Profiler_Dumper_Text +{ + private $root; + + public function dump(Twig_Profiler_Profile $profile) + { + return $this->dumpProfile($profile); + } + + protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix) + { + return sprintf('%s└ %s', $prefix, $profile->getTemplate()); + } + + protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix) + { + return sprintf('%s└ %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), $profile->getName()); + } + + protected function formatTime(Twig_Profiler_Profile $profile, $percent) + { + return sprintf('%.2fms/%.0f%%', $profile->getDuration() * 1000, $percent); + } + + private function dumpProfile(Twig_Profiler_Profile $profile, $prefix = '', $sibling = false) + { + if ($profile->isRoot()) { + $this->root = $profile->getDuration(); + $start = $profile->getName(); + } else { + if ($profile->isTemplate()) { + $start = $this->formatTemplate($profile, $prefix); + } else { + $start = $this->formatNonTemplate($profile, $prefix); + } + $prefix .= $sibling ? '│ ' : ' '; + } + + $percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0; + + if ($profile->getDuration() * 1000 < 1) { + $str = $start."\n"; + } else { + $str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent)); + } + + $nCount = count($profile->getProfiles()); + foreach ($profile as $i => $p) { + $str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount); + } + + return $str; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php new file mode 100644 index 000000000..2f9721481 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php @@ -0,0 +1,40 @@ + + */ +class Twig_Profiler_Node_EnterProfile extends Twig_Node +{ + public function __construct($extensionName, $type, $name, $varName) + { + parent::__construct(array(), array('extension_name' => $extensionName, 'name' => $name, 'type' => $type, 'var_name' => $varName)); + } + + /** + * {@inheritdoc} + */ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->write(sprintf('$%s = $this->env->getExtension(', $this->getAttribute('var_name'))) + ->repr($this->getAttribute('extension_name')) + ->raw(");\n") + ->write(sprintf('$%s->enter($%s = new Twig_Profiler_Profile($this->getTemplateName(), ', $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof')) + ->repr($this->getAttribute('type')) + ->raw(', ') + ->repr($this->getAttribute('name')) + ->raw("));\n\n") + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php new file mode 100644 index 000000000..88074c2f6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php @@ -0,0 +1,34 @@ + + */ +class Twig_Profiler_Node_LeaveProfile extends Twig_Node +{ + public function __construct($varName) + { + parent::__construct(array(), array('var_name' => $varName)); + } + + /** + * {@inheritdoc} + */ + public function compile(Twig_Compiler $compiler) + { + $compiler + ->write("\n") + ->write(sprintf("\$%s->leave(\$%s);\n\n", $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof')) + ; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php new file mode 100644 index 000000000..4b0baa82e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php @@ -0,0 +1,72 @@ + + */ +class Twig_Profiler_NodeVisitor_Profiler extends Twig_BaseNodeVisitor +{ + private $extensionName; + + public function __construct($extensionName) + { + $this->extensionName = $extensionName; + } + + /** + * {@inheritdoc} + */ + protected function doEnterNode(Twig_Node $node, Twig_Environment $env) + { + return $node; + } + + /** + * {@inheritdoc} + */ + protected function doLeaveNode(Twig_Node $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Module) { + $varName = $this->getVarName(); + $node->setNode('display_start', new Twig_Node(array(new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::TEMPLATE, $node->getAttribute('filename'), $varName), $node->getNode('display_start')))); + $node->setNode('display_end', new Twig_Node(array(new Twig_Profiler_Node_LeaveProfile($varName), $node->getNode('display_end')))); + } elseif ($node instanceof Twig_Node_Block) { + $varName = $this->getVarName(); + $node->setNode('body', new Twig_Node_Body(array( + new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::BLOCK, $node->getAttribute('name'), $varName), + $node->getNode('body'), + new Twig_Profiler_Node_LeaveProfile($varName), + ))); + } elseif ($node instanceof Twig_Node_Macro) { + $varName = $this->getVarName(); + $node->setNode('body', new Twig_Node_Body(array( + new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::MACRO, $node->getAttribute('name'), $varName), + $node->getNode('body'), + new Twig_Profiler_Node_LeaveProfile($varName), + ))); + } + + return $node; + } + + private function getVarName() + { + return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false)); + } + + /** + * {@inheritdoc} + */ + public function getPriority() + { + return 0; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Profile.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Profile.php new file mode 100644 index 000000000..104bc0581 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Profiler/Profile.php @@ -0,0 +1,160 @@ + + */ +class Twig_Profiler_Profile implements IteratorAggregate, Serializable +{ + const ROOT = 'ROOT'; + const BLOCK = 'block'; + const TEMPLATE = 'template'; + const MACRO = 'macro'; + + private $template; + private $name; + private $type; + private $starts = array(); + private $ends = array(); + private $profiles = array(); + + public function __construct($template = 'main', $type = self::ROOT, $name = 'main') + { + $this->template = $template; + $this->type = $type; + $this->name = 0 === strpos($name, '__internal_') ? 'INTERNAL' : $name; + $this->enter(); + } + + public function getTemplate() + { + return $this->template; + } + + public function getType() + { + return $this->type; + } + + public function getName() + { + return $this->name; + } + + public function isRoot() + { + return self::ROOT === $this->type; + } + + public function isTemplate() + { + return self::TEMPLATE === $this->type; + } + + public function isBlock() + { + return self::BLOCK === $this->type; + } + + public function isMacro() + { + return self::MACRO === $this->type; + } + + public function getProfiles() + { + return $this->profiles; + } + + public function addProfile(Twig_Profiler_Profile $profile) + { + $this->profiles[] = $profile; + } + + /** + * Returns the duration in microseconds. + * + * @return int + */ + public function getDuration() + { + if ($this->isRoot() && $this->profiles) { + // for the root node with children, duration is the sum of all child durations + $duration = 0; + foreach ($this->profiles as $profile) { + $duration += $profile->getDuration(); + } + + return $duration; + } + + return isset($this->ends['wt']) && isset($this->starts['wt']) ? $this->ends['wt'] - $this->starts['wt'] : 0; + } + + /** + * Returns the memory usage in bytes. + * + * @return int + */ + public function getMemoryUsage() + { + return isset($this->ends['mu']) && isset($this->starts['mu']) ? $this->ends['mu'] - $this->starts['mu'] : 0; + } + + /** + * Returns the peak memory usage in bytes. + * + * @return int + */ + public function getPeakMemoryUsage() + { + return isset($this->ends['pmu']) && isset($this->starts['pmu']) ? $this->ends['pmu'] - $this->starts['pmu'] : 0; + } + + /** + * Starts the profiling. + */ + public function enter() + { + $this->starts = array( + 'wt' => microtime(true), + 'mu' => memory_get_usage(), + 'pmu' => memory_get_peak_usage(), + ); + } + + /** + * Stops the profiling. + */ + public function leave() + { + $this->ends = array( + 'wt' => microtime(true), + 'mu' => memory_get_usage(), + 'pmu' => memory_get_peak_usage(), + ); + } + + public function getIterator() + { + return new ArrayIterator($this->profiles); + } + + public function serialize() + { + return serialize(array($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles)); + } + + public function unserialize($data) + { + list($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles) = unserialize($data); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php new file mode 100644 index 000000000..c41f44af9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php @@ -0,0 +1,27 @@ + + */ +interface Twig_RuntimeLoaderInterface +{ + /** + * Creates the runtime implementation of a Twig element (filter/function/test). + * + * @param string $class A runtime class + * + * @return object|null The runtime instance or null if the loader does not know how to create the runtime for this class + */ + public function load($class); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php new file mode 100644 index 000000000..015bfaea2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php @@ -0,0 +1,19 @@ + + */ +class Twig_Sandbox_SecurityError extends Twig_Error +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php new file mode 100644 index 000000000..99faba9dd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php @@ -0,0 +1,31 @@ + + */ +class Twig_Sandbox_SecurityNotAllowedFilterError extends Twig_Sandbox_SecurityError +{ + private $filterName; + + public function __construct($message, $functionName, $lineno = -1, $filename = null, Exception $previous = null) + { + parent::__construct($message, $lineno, $filename, $previous); + $this->filterName = $functionName; + } + + public function getFilterName() + { + return $this->filterName; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php new file mode 100644 index 000000000..05cf488af --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php @@ -0,0 +1,31 @@ + + */ +class Twig_Sandbox_SecurityNotAllowedFunctionError extends Twig_Sandbox_SecurityError +{ + private $functionName; + + public function __construct($message, $functionName, $lineno = -1, $filename = null, Exception $previous = null) + { + parent::__construct($message, $lineno, $filename, $previous); + $this->functionName = $functionName; + } + + public function getFunctionName() + { + return $this->functionName; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php new file mode 100644 index 000000000..b3bb5e8e2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php @@ -0,0 +1,31 @@ + + */ +class Twig_Sandbox_SecurityNotAllowedTagError extends Twig_Sandbox_SecurityError +{ + private $tagName; + + public function __construct($message, $tagName, $lineno = -1, $filename = null, Exception $previous = null) + { + parent::__construct($message, $lineno, $filename, $previous); + $this->tagName = $tagName; + } + + public function getTagName() + { + return $this->tagName; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php new file mode 100644 index 000000000..c4dd03dff --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php @@ -0,0 +1,119 @@ + + */ +class Twig_Sandbox_SecurityPolicy implements Twig_Sandbox_SecurityPolicyInterface +{ + protected $allowedTags; + protected $allowedFilters; + protected $allowedMethods; + protected $allowedProperties; + protected $allowedFunctions; + + public function __construct(array $allowedTags = array(), array $allowedFilters = array(), array $allowedMethods = array(), array $allowedProperties = array(), array $allowedFunctions = array()) + { + $this->allowedTags = $allowedTags; + $this->allowedFilters = $allowedFilters; + $this->setAllowedMethods($allowedMethods); + $this->allowedProperties = $allowedProperties; + $this->allowedFunctions = $allowedFunctions; + } + + public function setAllowedTags(array $tags) + { + $this->allowedTags = $tags; + } + + public function setAllowedFilters(array $filters) + { + $this->allowedFilters = $filters; + } + + public function setAllowedMethods(array $methods) + { + $this->allowedMethods = array(); + foreach ($methods as $class => $m) { + $this->allowedMethods[$class] = array_map('strtolower', is_array($m) ? $m : array($m)); + } + } + + public function setAllowedProperties(array $properties) + { + $this->allowedProperties = $properties; + } + + public function setAllowedFunctions(array $functions) + { + $this->allowedFunctions = $functions; + } + + public function checkSecurity($tags, $filters, $functions) + { + foreach ($tags as $tag) { + if (!in_array($tag, $this->allowedTags)) { + throw new Twig_Sandbox_SecurityNotAllowedTagError(sprintf('Tag "%s" is not allowed.', $tag), $tag); + } + } + + foreach ($filters as $filter) { + if (!in_array($filter, $this->allowedFilters)) { + throw new Twig_Sandbox_SecurityNotAllowedFilterError(sprintf('Filter "%s" is not allowed.', $filter), $filter); + } + } + + foreach ($functions as $function) { + if (!in_array($function, $this->allowedFunctions)) { + throw new Twig_Sandbox_SecurityNotAllowedFunctionError(sprintf('Function "%s" is not allowed.', $function), $function); + } + } + } + + public function checkMethodAllowed($obj, $method) + { + if ($obj instanceof Twig_TemplateInterface || $obj instanceof Twig_Markup) { + return true; + } + + $allowed = false; + $method = strtolower($method); + foreach ($this->allowedMethods as $class => $methods) { + if ($obj instanceof $class) { + $allowed = in_array($method, $methods); + + break; + } + } + + if (!$allowed) { + throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, get_class($obj))); + } + } + + public function checkPropertyAllowed($obj, $property) + { + $allowed = false; + foreach ($this->allowedProperties as $class => $properties) { + if ($obj instanceof $class) { + $allowed = in_array($property, is_array($properties) ? $properties : array($properties)); + + break; + } + } + + if (!$allowed) { + throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, get_class($obj))); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php new file mode 100644 index 000000000..6ab48e3cc --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php @@ -0,0 +1,24 @@ + + */ +interface Twig_Sandbox_SecurityPolicyInterface +{ + public function checkSecurity($tags, $filters, $functions); + + public function checkMethodAllowed($obj, $method); + + public function checkPropertyAllowed($obj, $method); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleFilter.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleFilter.php new file mode 100644 index 000000000..0c1e092a7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleFilter.php @@ -0,0 +1,117 @@ + + */ +class Twig_SimpleFilter +{ + protected $name; + protected $callable; + protected $options; + protected $arguments = array(); + + public function __construct($name, $callable, array $options = array()) + { + $this->name = $name; + $this->callable = $callable; + $this->options = array_merge(array( + 'needs_environment' => false, + 'needs_context' => false, + 'is_variadic' => false, + 'is_safe' => null, + 'is_safe_callback' => null, + 'pre_escape' => null, + 'preserves_safety' => null, + 'node_class' => 'Twig_Node_Expression_Filter', + 'deprecated' => false, + 'alternative' => null, + ), $options); + } + + public function getName() + { + return $this->name; + } + + public function getCallable() + { + return $this->callable; + } + + public function getNodeClass() + { + return $this->options['node_class']; + } + + public function setArguments($arguments) + { + $this->arguments = $arguments; + } + + public function getArguments() + { + return $this->arguments; + } + + public function needsEnvironment() + { + return $this->options['needs_environment']; + } + + public function needsContext() + { + return $this->options['needs_context']; + } + + public function getSafe(Twig_Node $filterArgs) + { + if (null !== $this->options['is_safe']) { + return $this->options['is_safe']; + } + + if (null !== $this->options['is_safe_callback']) { + return call_user_func($this->options['is_safe_callback'], $filterArgs); + } + } + + public function getPreservesSafety() + { + return $this->options['preserves_safety']; + } + + public function getPreEscape() + { + return $this->options['pre_escape']; + } + + public function isVariadic() + { + return $this->options['is_variadic']; + } + + public function isDeprecated() + { + return (bool) $this->options['deprecated']; + } + + public function getDeprecatedVersion() + { + return $this->options['deprecated']; + } + + public function getAlternative() + { + return $this->options['alternative']; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleFunction.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleFunction.php new file mode 100644 index 000000000..63003d6a0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleFunction.php @@ -0,0 +1,107 @@ + + */ +class Twig_SimpleFunction +{ + protected $name; + protected $callable; + protected $options; + protected $arguments = array(); + + public function __construct($name, $callable, array $options = array()) + { + $this->name = $name; + $this->callable = $callable; + $this->options = array_merge(array( + 'needs_environment' => false, + 'needs_context' => false, + 'is_variadic' => false, + 'is_safe' => null, + 'is_safe_callback' => null, + 'node_class' => 'Twig_Node_Expression_Function', + 'deprecated' => false, + 'alternative' => null, + ), $options); + } + + public function getName() + { + return $this->name; + } + + public function getCallable() + { + return $this->callable; + } + + public function getNodeClass() + { + return $this->options['node_class']; + } + + public function setArguments($arguments) + { + $this->arguments = $arguments; + } + + public function getArguments() + { + return $this->arguments; + } + + public function needsEnvironment() + { + return $this->options['needs_environment']; + } + + public function needsContext() + { + return $this->options['needs_context']; + } + + public function getSafe(Twig_Node $functionArgs) + { + if (null !== $this->options['is_safe']) { + return $this->options['is_safe']; + } + + if (null !== $this->options['is_safe_callback']) { + return call_user_func($this->options['is_safe_callback'], $functionArgs); + } + + return array(); + } + + public function isVariadic() + { + return $this->options['is_variadic']; + } + + public function isDeprecated() + { + return (bool) $this->options['deprecated']; + } + + public function getDeprecatedVersion() + { + return $this->options['deprecated']; + } + + public function getAlternative() + { + return $this->options['alternative']; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleTest.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleTest.php new file mode 100644 index 000000000..cff3ae7c9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/SimpleTest.php @@ -0,0 +1,69 @@ + + */ +class Twig_SimpleTest +{ + protected $name; + protected $callable; + protected $options; + + public function __construct($name, $callable, array $options = array()) + { + $this->name = $name; + $this->callable = $callable; + $this->options = array_merge(array( + 'is_variadic' => false, + 'node_class' => 'Twig_Node_Expression_Test', + 'deprecated' => false, + 'alternative' => null, + ), $options); + } + + public function getName() + { + return $this->name; + } + + public function getCallable() + { + return $this->callable; + } + + public function getNodeClass() + { + return $this->options['node_class']; + } + + public function isVariadic() + { + return $this->options['is_variadic']; + } + + public function isDeprecated() + { + return (bool) $this->options['deprecated']; + } + + public function getDeprecatedVersion() + { + return $this->options['deprecated']; + } + + public function getAlternative() + { + return $this->options['alternative']; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Template.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Template.php new file mode 100644 index 000000000..3d1d3b9f3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Template.php @@ -0,0 +1,615 @@ + + */ +abstract class Twig_Template implements Twig_TemplateInterface +{ + protected static $cache = array(); + + protected $parent; + protected $parents = array(); + protected $env; + protected $blocks = array(); + protected $traits = array(); + + /** + * Constructor. + * + * @param Twig_Environment $env A Twig_Environment instance + */ + public function __construct(Twig_Environment $env) + { + $this->env = $env; + } + + /** + * Returns the template name. + * + * @return string The template name + */ + abstract public function getTemplateName(); + + /** + * Returns debug information about the template. + * + * @return array Debug information + * + * @internal + */ + public function getDebugInfo() + { + return array(); + } + + /** + * Returns the template source code. + * + * @return string The template source code + */ + public function getSource() + { + return ''; + } + + /** + * @deprecated since 1.20 (to be removed in 2.0) + */ + public function getEnvironment() + { + @trigger_error('The '.__METHOD__.' method is deprecated since version 1.20 and will be removed in 2.0.', E_USER_DEPRECATED); + + return $this->env; + } + + /** + * Returns the parent template. + * + * This method is for internal use only and should never be called + * directly. + * + * @param array $context + * + * @return Twig_TemplateInterface|false The parent template or false if there is no parent + * + * @internal + */ + public function getParent(array $context) + { + if (null !== $this->parent) { + return $this->parent; + } + + try { + $parent = $this->doGetParent($context); + + if (false === $parent) { + return false; + } + + if ($parent instanceof self) { + return $this->parents[$parent->getTemplateName()] = $parent; + } + + if (!isset($this->parents[$parent])) { + $this->parents[$parent] = $this->loadTemplate($parent); + } + } catch (Twig_Error_Loader $e) { + $e->setTemplateFile(null); + $e->guess(); + + throw $e; + } + + return $this->parents[$parent]; + } + + protected function doGetParent(array $context) + { + return false; + } + + public function isTraitable() + { + return true; + } + + /** + * Displays a parent block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to display from the parent + * @param array $context The context + * @param array $blocks The current set of blocks + * + * @internal + */ + public function displayParentBlock($name, array $context, array $blocks = array()) + { + $name = (string) $name; + + if (isset($this->traits[$name])) { + $this->traits[$name][0]->displayBlock($name, $context, $blocks, false); + } elseif (false !== $parent = $this->getParent($context)) { + $parent->displayBlock($name, $context, $blocks, false); + } else { + throw new Twig_Error_Runtime(sprintf('The template has no parent and no traits defining the "%s" block.', $name), -1, $this->getTemplateName()); + } + } + + /** + * Displays a block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to display + * @param array $context The context + * @param array $blocks The current set of blocks + * @param bool $useBlocks Whether to use the current set of blocks + * + * @internal + */ + public function displayBlock($name, array $context, array $blocks = array(), $useBlocks = true) + { + $name = (string) $name; + + if ($useBlocks && isset($blocks[$name])) { + $template = $blocks[$name][0]; + $block = $blocks[$name][1]; + } elseif (isset($this->blocks[$name])) { + $template = $this->blocks[$name][0]; + $block = $this->blocks[$name][1]; + } else { + $template = null; + $block = null; + } + + if (null !== $template) { + // avoid RCEs when sandbox is enabled + if (!$template instanceof self) { + throw new LogicException('A block must be a method on a Twig_Template instance.'); + } + + try { + $template->$block($context, $blocks); + } catch (Twig_Error $e) { + if (!$e->getTemplateFile()) { + $e->setTemplateFile($template->getTemplateName()); + } + + // this is mostly useful for Twig_Error_Loader exceptions + // see Twig_Error_Loader + if (false === $e->getTemplateLine()) { + $e->setTemplateLine(-1); + $e->guess(); + } + + throw $e; + } catch (Exception $e) { + throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getTemplateName(), $e); + } + } elseif (false !== $parent = $this->getParent($context)) { + $parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false); + } + } + + /** + * Renders a parent block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to render from the parent + * @param array $context The context + * @param array $blocks The current set of blocks + * + * @return string The rendered block + * + * @internal + */ + public function renderParentBlock($name, array $context, array $blocks = array()) + { + ob_start(); + $this->displayParentBlock($name, $context, $blocks); + + return ob_get_clean(); + } + + /** + * Renders a block. + * + * This method is for internal use only and should never be called + * directly. + * + * @param string $name The block name to render + * @param array $context The context + * @param array $blocks The current set of blocks + * @param bool $useBlocks Whether to use the current set of blocks + * + * @return string The rendered block + * + * @internal + */ + public function renderBlock($name, array $context, array $blocks = array(), $useBlocks = true) + { + ob_start(); + $this->displayBlock($name, $context, $blocks, $useBlocks); + + return ob_get_clean(); + } + + /** + * Returns whether a block exists or not. + * + * This method is for internal use only and should never be called + * directly. + * + * This method does only return blocks defined in the current template + * or defined in "used" traits. + * + * It does not return blocks from parent templates as the parent + * template name can be dynamic, which is only known based on the + * current context. + * + * @param string $name The block name + * + * @return bool true if the block exists, false otherwise + * + * @internal + */ + public function hasBlock($name) + { + return isset($this->blocks[(string) $name]); + } + + /** + * Returns all block names. + * + * This method is for internal use only and should never be called + * directly. + * + * @return array An array of block names + * + * @see hasBlock + * + * @internal + */ + public function getBlockNames() + { + return array_keys($this->blocks); + } + + protected function loadTemplate($template, $templateName = null, $line = null, $index = null) + { + try { + if (is_array($template)) { + return $this->env->resolveTemplate($template); + } + + if ($template instanceof self) { + return $template; + } + + return $this->env->loadTemplate($template, $index); + } catch (Twig_Error $e) { + if (!$e->getTemplateFile()) { + $e->setTemplateFile($templateName ? $templateName : $this->getTemplateName()); + } + + if ($e->getTemplateLine()) { + throw $e; + } + + if (!$line) { + $e->guess(); + } else { + $e->setTemplateLine($line); + } + + throw $e; + } + } + + /** + * Returns all blocks. + * + * This method is for internal use only and should never be called + * directly. + * + * @return array An array of blocks + * + * @see hasBlock + * + * @internal + */ + public function getBlocks() + { + return $this->blocks; + } + + /** + * {@inheritdoc} + */ + public function display(array $context, array $blocks = array()) + { + $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks)); + } + + /** + * {@inheritdoc} + */ + public function render(array $context) + { + $level = ob_get_level(); + ob_start(); + try { + $this->display($context); + } catch (Exception $e) { + while (ob_get_level() > $level) { + ob_end_clean(); + } + + throw $e; + } catch (Throwable $e) { + while (ob_get_level() > $level) { + ob_end_clean(); + } + + throw $e; + } + + return ob_get_clean(); + } + + protected function displayWithErrorHandling(array $context, array $blocks = array()) + { + try { + $this->doDisplay($context, $blocks); + } catch (Twig_Error $e) { + if (!$e->getTemplateFile()) { + $e->setTemplateFile($this->getTemplateName()); + } + + // this is mostly useful for Twig_Error_Loader exceptions + // see Twig_Error_Loader + if (false === $e->getTemplateLine()) { + $e->setTemplateLine(-1); + $e->guess(); + } + + throw $e; + } catch (Exception $e) { + throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getTemplateName(), $e); + } + } + + /** + * Auto-generated method to display the template with the given context. + * + * @param array $context An array of parameters to pass to the template + * @param array $blocks An array of blocks to pass to the template + */ + abstract protected function doDisplay(array $context, array $blocks = array()); + + /** + * Returns a variable from the context. + * + * This method is for internal use only and should never be called + * directly. + * + * This method should not be overridden in a sub-class as this is an + * implementation detail that has been introduced to optimize variable + * access for versions of PHP before 5.4. This is not a way to override + * the way to get a variable value. + * + * @param array $context The context + * @param string $item The variable to return from the context + * @param bool $ignoreStrictCheck Whether to ignore the strict variable check or not + * + * @return mixed The content of the context variable + * + * @throws Twig_Error_Runtime if the variable does not exist and Twig is running in strict mode + * + * @internal + */ + final protected function getContext($context, $item, $ignoreStrictCheck = false) + { + if (!array_key_exists($item, $context)) { + if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { + return; + } + + throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist.', $item), -1, $this->getTemplateName()); + } + + return $context[$item]; + } + + /** + * Returns the attribute value for a given array/object. + * + * @param mixed $object The object or array from where to get the item + * @param mixed $item The item to get from the array or object + * @param array $arguments An array of arguments to pass if the item is an object method + * @param string $type The type of attribute (@see Twig_Template constants) + * @param bool $isDefinedTest Whether this is only a defined check + * @param bool $ignoreStrictCheck Whether to ignore the strict attribute check or not + * + * @return mixed The attribute value, or a Boolean when $isDefinedTest is true, or null when the attribute is not set and $ignoreStrictCheck is true + * + * @throws Twig_Error_Runtime if the attribute does not exist and Twig is running in strict mode and $isDefinedTest is false + */ + protected function getAttribute($object, $item, array $arguments = array(), $type = self::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false) + { + // array + if (self::METHOD_CALL !== $type) { + $arrayItem = is_bool($item) || is_float($item) ? (int) $item : $item; + + if ((is_array($object) && array_key_exists($arrayItem, $object)) + || ($object instanceof ArrayAccess && isset($object[$arrayItem])) + ) { + if ($isDefinedTest) { + return true; + } + + return $object[$arrayItem]; + } + + if (self::ARRAY_CALL === $type || !is_object($object)) { + if ($isDefinedTest) { + return false; + } + + if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { + return; + } + + if ($object instanceof ArrayAccess) { + $message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist.', $arrayItem, get_class($object)); + } elseif (is_object($object)) { + $message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface.', $item, get_class($object)); + } elseif (is_array($object)) { + if (empty($object)) { + $message = sprintf('Key "%s" does not exist as the array is empty.', $arrayItem); + } else { + $message = sprintf('Key "%s" for array with keys "%s" does not exist.', $arrayItem, implode(', ', array_keys($object))); + } + } elseif (self::ARRAY_CALL === $type) { + if (null === $object) { + $message = sprintf('Impossible to access a key ("%s") on a null variable.', $item); + } else { + $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s").', $item, gettype($object), $object); + } + } elseif (null === $object) { + $message = sprintf('Impossible to access an attribute ("%s") on a null variable.', $item); + } else { + $message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s").', $item, gettype($object), $object); + } + + throw new Twig_Error_Runtime($message, -1, $this->getTemplateName()); + } + } + + if (!is_object($object)) { + if ($isDefinedTest) { + return false; + } + + if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { + return; + } + + if (null === $object) { + $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item); + } else { + $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, gettype($object), $object); + } + + throw new Twig_Error_Runtime($message, -1, $this->getTemplateName()); + } + + // object property + if (self::METHOD_CALL !== $type && !$object instanceof self) { // Twig_Template does not have public properties, and we don't want to allow access to internal ones + if (isset($object->$item) || array_key_exists((string) $item, $object)) { + if ($isDefinedTest) { + return true; + } + + if ($this->env->hasExtension('Twig_Extension_Sandbox')) { + $this->env->getExtension('Twig_Extension_Sandbox')->checkPropertyAllowed($object, $item); + } + + return $object->$item; + } + } + + $class = get_class($object); + + // object method + if (!isset(self::$cache[$class]['methods'])) { + // get_class_methods returns all methods accessible in the scope, but we only want public ones to be accessible in templates + if ($object instanceof self) { + $ref = new ReflectionClass($class); + $methods = array(); + + foreach ($ref->getMethods(ReflectionMethod::IS_PUBLIC) as $refMethod) { + $methodName = strtolower($refMethod->name); + + // Accessing the environment from templates is forbidden to prevent untrusted changes to the environment + if ('getenvironment' !== $methodName) { + $methods[$methodName] = true; + } + } + + self::$cache[$class]['methods'] = $methods; + } else { + self::$cache[$class]['methods'] = array_change_key_case(array_flip(get_class_methods($object))); + } + } + + $call = false; + $lcItem = strtolower($item); + if (isset(self::$cache[$class]['methods'][$lcItem])) { + $method = (string) $item; + } elseif (isset(self::$cache[$class]['methods']['get'.$lcItem])) { + $method = 'get'.$item; + } elseif (isset(self::$cache[$class]['methods']['is'.$lcItem])) { + $method = 'is'.$item; + } elseif (isset(self::$cache[$class]['methods']['__call'])) { + $method = (string) $item; + $call = true; + } else { + if ($isDefinedTest) { + return false; + } + + if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { + return; + } + + throw new Twig_Error_Runtime(sprintf('Neither the property "%1$s" nor one of the methods "%1$s()", "get%1$s()"/"is%1$s()" or "__call()" exist and have public access in class "%2$s".', $item, get_class($object)), -1, $this->getTemplateName()); + } + + if ($isDefinedTest) { + return true; + } + + if ($this->env->hasExtension('Twig_Extension_Sandbox')) { + $this->env->getExtension('Twig_Extension_Sandbox')->checkMethodAllowed($object, $method); + } + + // Some objects throw exceptions when they have __call, and the method we try + // to call is not supported. If ignoreStrictCheck is true, we should return null. + try { + $ret = call_user_func_array(array($object, $method), $arguments); + } catch (BadMethodCallException $e) { + if ($call && ($ignoreStrictCheck || !$this->env->isStrictVariables())) { + return; + } + throw $e; + } + + // useful when calling a template method from a template + // this is not supported but unfortunately heavily used in the Symfony profiler + if ($object instanceof Twig_TemplateInterface) { + return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset()); + } + + return $ret; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TemplateInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TemplateInterface.php new file mode 100644 index 000000000..32746407e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TemplateInterface.php @@ -0,0 +1,48 @@ + + * + * @deprecated since 1.12 (to be removed in 3.0) + */ +interface Twig_TemplateInterface +{ + const ANY_CALL = 'any'; + const ARRAY_CALL = 'array'; + const METHOD_CALL = 'method'; + + /** + * Renders the template with the given context and returns it as string. + * + * @param array $context An array of parameters to pass to the template + * + * @return string The rendered template + */ + public function render(array $context); + + /** + * Displays the template with the given context. + * + * @param array $context An array of parameters to pass to the template + * @param array $blocks An array of blocks to pass to the template + */ + public function display(array $context, array $blocks = array()); + + /** + * Returns the bound environment for this template. + * + * @return Twig_Environment The current environment + */ + public function getEnvironment(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test.php new file mode 100644 index 000000000..3c2d8590b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test.php @@ -0,0 +1,37 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +abstract class Twig_Test implements Twig_TestInterface, Twig_TestCallableInterface +{ + protected $options; + protected $arguments = array(); + + public function __construct(array $options = array()) + { + $this->options = array_merge(array( + 'callable' => null, + ), $options); + } + + public function getCallable() + { + return $this->options['callable']; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Function.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Function.php new file mode 100644 index 000000000..5e76c711b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Function.php @@ -0,0 +1,38 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Test_Function extends Twig_Test +{ + protected $function; + + public function __construct($function, array $options = array()) + { + $options['callable'] = $function; + + parent::__construct($options); + + $this->function = $function; + } + + public function compile() + { + return $this->function; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php new file mode 100644 index 000000000..22b772c3f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php @@ -0,0 +1,233 @@ + + * @author Karma Dordrak + */ +abstract class Twig_Test_IntegrationTestCase extends PHPUnit_Framework_TestCase +{ + /** + * @return string + */ + abstract protected function getFixturesDir(); + + /** + * @return Twig_ExtensionInterface[] + */ + protected function getExtensions() + { + return array(); + } + + /** + * @return Twig_SimpleFilter[] + */ + protected function getTwigFilters() + { + return array(); + } + + /** + * @return Twig_SimpleFunction[] + */ + protected function getTwigFunctions() + { + return array(); + } + + /** + * @return Twig_SimpleTest[] + */ + protected function getTwigTests() + { + return array(); + } + + /** + * @dataProvider getTests + */ + public function testIntegration($file, $message, $condition, $templates, $exception, $outputs) + { + $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs); + } + + /** + * @dataProvider getLegacyTests + * @group legacy + */ + public function testLegacyIntegration($file, $message, $condition, $templates, $exception, $outputs) + { + $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs); + } + + public function getTests($name, $legacyTests = false) + { + $fixturesDir = realpath($this->getFixturesDir()); + $tests = array(); + + foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixturesDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) { + if (!preg_match('/\.test$/', $file)) { + continue; + } + + if ($legacyTests xor false !== strpos($file->getRealpath(), '.legacy.test')) { + continue; + } + + $test = file_get_contents($file->getRealpath()); + + if (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)\s*(?:--DATA--\s*(.*))?\s*--EXCEPTION--\s*(.*)/sx', $test, $match)) { + $message = $match[1]; + $condition = $match[2]; + $templates = self::parseTemplates($match[3]); + $exception = $match[5]; + $outputs = array(array(null, $match[4], null, '')); + } elseif (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)--DATA--.*?--EXPECT--.*/s', $test, $match)) { + $message = $match[1]; + $condition = $match[2]; + $templates = self::parseTemplates($match[3]); + $exception = false; + preg_match_all('/--DATA--(.*?)(?:--CONFIG--(.*?))?--EXPECT--(.*?)(?=\-\-DATA\-\-|$)/s', $test, $outputs, PREG_SET_ORDER); + } else { + throw new InvalidArgumentException(sprintf('Test "%s" is not valid.', str_replace($fixturesDir.'/', '', $file))); + } + + $tests[] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $templates, $exception, $outputs); + } + + if ($legacyTests && empty($tests)) { + // add a dummy test to avoid a PHPUnit message + return array(array('not', '-', '', array(), '', array())); + } + + return $tests; + } + + public function getLegacyTests() + { + return $this->getTests('testLegacyIntegration', true); + } + + protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs) + { + if ($condition) { + eval('$ret = '.$condition.';'); + if (!$ret) { + $this->markTestSkipped($condition); + } + } + + $loader = new Twig_Loader_Array($templates); + + foreach ($outputs as $i => $match) { + $config = array_merge(array( + 'cache' => false, + 'strict_variables' => true, + ), $match[2] ? eval($match[2].';') : array()); + $twig = new Twig_Environment($loader, $config); + $twig->addGlobal('global', 'global'); + foreach ($this->getExtensions() as $extension) { + $twig->addExtension($extension); + } + + foreach ($this->getTwigFilters() as $filter) { + $twig->addFilter($filter); + } + + foreach ($this->getTwigTests() as $test) { + $twig->addTest($test); + } + + foreach ($this->getTwigFunctions() as $function) { + $twig->addFunction($function); + } + + // avoid using the same PHP class name for different cases + // only for PHP 5.2+ + if (PHP_VERSION_ID >= 50300) { + $p = new ReflectionProperty($twig, 'templateClassPrefix'); + $p->setAccessible(true); + $p->setValue($twig, '__TwigTemplate_'.hash('sha256', uniqid(mt_rand(), true), false).'_'); + } + + try { + $template = $twig->loadTemplate('index.twig'); + } catch (Exception $e) { + if (false !== $exception) { + $message = $e->getMessage(); + $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $message))); + $last = substr($message, strlen($message) - 1); + $this->assertTrue('.' === $last || '?' === $last, $message, 'Exception message must end with a dot or a question mark.'); + + return; + } + + if ($e instanceof Twig_Error_Syntax) { + $e->setTemplateFile($file); + + throw $e; + } + + throw new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e); + } + + try { + $output = trim($template->render(eval($match[1].';')), "\n "); + } catch (Exception $e) { + if (false !== $exception) { + $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $e->getMessage()))); + + return; + } + + if ($e instanceof Twig_Error_Syntax) { + $e->setTemplateFile($file); + } else { + $e = new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e); + } + + $output = trim(sprintf('%s: %s', get_class($e), $e->getMessage())); + } + + if (false !== $exception) { + list($class) = explode(':', $exception); + $this->assertThat(null, new PHPUnit_Framework_Constraint_Exception($class)); + } + + $expected = trim($match[3], "\n "); + + if ($expected !== $output) { + printf("Compiled templates that failed on case %d:\n", $i + 1); + + foreach (array_keys($templates) as $name) { + echo "Template: $name\n"; + $source = $loader->getSource($name); + echo $twig->compile($twig->parse($twig->tokenize($source, $name))); + } + } + $this->assertEquals($expected, $output, $message.' (in '.$file.')'); + } + } + + protected static function parseTemplates($test) + { + $templates = array(); + preg_match_all('/--TEMPLATE(?:\((.*?)\))?--(.*?)(?=\-\-TEMPLATE|$)/s', $test, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + $templates[($match[1] ? $match[1] : 'index.twig')] = $match[2]; + } + + return $templates; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Method.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Method.php new file mode 100644 index 000000000..69144bf70 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Method.php @@ -0,0 +1,40 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Test_Method extends Twig_Test +{ + protected $extension; + protected $method; + + public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array()) + { + $options['callable'] = array($extension, $method); + + parent::__construct($options); + + $this->extension = $extension; + $this->method = $method; + } + + public function compile() + { + return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Node.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Node.php new file mode 100644 index 000000000..baef49cce --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/Node.php @@ -0,0 +1,40 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_Test_Node extends Twig_Test +{ + protected $class; + + public function __construct($class, array $options = array()) + { + parent::__construct($options); + + $this->class = $class; + } + + public function getClass() + { + return $this->class; + } + + public function compile() + { + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php new file mode 100644 index 000000000..e591c1d52 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php @@ -0,0 +1,64 @@ +assertNodeCompilation($source, $node, $environment, $isPattern); + } + + public function assertNodeCompilation($source, Twig_Node $node, Twig_Environment $environment = null, $isPattern = false) + { + $compiler = $this->getCompiler($environment); + $compiler->compile($node); + + if ($isPattern) { + $this->assertStringMatchesFormat($source, trim($compiler->getSource())); + } else { + $this->assertEquals($source, trim($compiler->getSource())); + } + } + + protected function getCompiler(Twig_Environment $environment = null) + { + return new Twig_Compiler(null === $environment ? $this->getEnvironment() : $environment); + } + + protected function getEnvironment() + { + return new Twig_Environment(new Twig_Loader_Array(array())); + } + + protected function getVariableGetter($name, $line = false) + { + $line = $line > 0 ? "// line {$line}\n" : ''; + + if (PHP_VERSION_ID >= 50400) { + return sprintf('%s(isset($context["%s"]) ? $context["%s"] : null)', $line, $name, $name); + } + + return sprintf('%s$this->getContext($context, "%s")', $line, $name); + } + + protected function getAttributeGetter() + { + if (function_exists('twig_template_get_attributes')) { + return 'twig_template_get_attributes($this, '; + } + + return '$this->getAttribute('; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TestCallableInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TestCallableInterface.php new file mode 100644 index 000000000..98d345785 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TestCallableInterface.php @@ -0,0 +1,22 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +interface Twig_TestCallableInterface +{ + public function getCallable(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TestInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TestInterface.php new file mode 100644 index 000000000..2fa821ca3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TestInterface.php @@ -0,0 +1,27 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +interface Twig_TestInterface +{ + /** + * Compiles a test. + * + * @return string The PHP code for the test + */ + public function compile(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Token.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Token.php new file mode 100644 index 000000000..a0a029bcd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Token.php @@ -0,0 +1,216 @@ + + */ +class Twig_Token +{ + protected $value; + protected $type; + protected $lineno; + + const EOF_TYPE = -1; + const TEXT_TYPE = 0; + const BLOCK_START_TYPE = 1; + const VAR_START_TYPE = 2; + const BLOCK_END_TYPE = 3; + const VAR_END_TYPE = 4; + const NAME_TYPE = 5; + const NUMBER_TYPE = 6; + const STRING_TYPE = 7; + const OPERATOR_TYPE = 8; + const PUNCTUATION_TYPE = 9; + const INTERPOLATION_START_TYPE = 10; + const INTERPOLATION_END_TYPE = 11; + + /** + * Constructor. + * + * @param int $type The type of the token + * @param string $value The token value + * @param int $lineno The line position in the source + */ + public function __construct($type, $value, $lineno) + { + $this->type = $type; + $this->value = $value; + $this->lineno = $lineno; + } + + /** + * Returns a string representation of the token. + * + * @return string A string representation of the token + */ + public function __toString() + { + return sprintf('%s(%s)', self::typeToString($this->type, true), $this->value); + } + + /** + * Tests the current token for a type and/or a value. + * + * Parameters may be: + * * just type + * * type and value (or array of possible values) + * * just value (or array of possible values) (NAME_TYPE is used as type) + * + * @param array|int $type The type to test + * @param array|string|null $values The token value + * + * @return bool + */ + public function test($type, $values = null) + { + if (null === $values && !is_int($type)) { + $values = $type; + $type = self::NAME_TYPE; + } + + return ($this->type === $type) && ( + null === $values || + (is_array($values) && in_array($this->value, $values)) || + $this->value == $values + ); + } + + /** + * Gets the line. + * + * @return int The source line + */ + public function getLine() + { + return $this->lineno; + } + + /** + * Gets the token type. + * + * @return int The token type + */ + public function getType() + { + return $this->type; + } + + /** + * Gets the token value. + * + * @return string The token value + */ + public function getValue() + { + return $this->value; + } + + /** + * Returns the constant representation (internal) of a given type. + * + * @param int $type The type as an integer + * @param bool $short Whether to return a short representation or not + * + * @return string The string representation + */ + public static function typeToString($type, $short = false) + { + switch ($type) { + case self::EOF_TYPE: + $name = 'EOF_TYPE'; + break; + case self::TEXT_TYPE: + $name = 'TEXT_TYPE'; + break; + case self::BLOCK_START_TYPE: + $name = 'BLOCK_START_TYPE'; + break; + case self::VAR_START_TYPE: + $name = 'VAR_START_TYPE'; + break; + case self::BLOCK_END_TYPE: + $name = 'BLOCK_END_TYPE'; + break; + case self::VAR_END_TYPE: + $name = 'VAR_END_TYPE'; + break; + case self::NAME_TYPE: + $name = 'NAME_TYPE'; + break; + case self::NUMBER_TYPE: + $name = 'NUMBER_TYPE'; + break; + case self::STRING_TYPE: + $name = 'STRING_TYPE'; + break; + case self::OPERATOR_TYPE: + $name = 'OPERATOR_TYPE'; + break; + case self::PUNCTUATION_TYPE: + $name = 'PUNCTUATION_TYPE'; + break; + case self::INTERPOLATION_START_TYPE: + $name = 'INTERPOLATION_START_TYPE'; + break; + case self::INTERPOLATION_END_TYPE: + $name = 'INTERPOLATION_END_TYPE'; + break; + default: + throw new LogicException(sprintf('Token of type "%s" does not exist.', $type)); + } + + return $short ? $name : 'Twig_Token::'.$name; + } + + /** + * Returns the english representation of a given type. + * + * @param int $type The type as an integer + * + * @return string The string representation + */ + public static function typeToEnglish($type) + { + switch ($type) { + case self::EOF_TYPE: + return 'end of template'; + case self::TEXT_TYPE: + return 'text'; + case self::BLOCK_START_TYPE: + return 'begin of statement block'; + case self::VAR_START_TYPE: + return 'begin of print statement'; + case self::BLOCK_END_TYPE: + return 'end of statement block'; + case self::VAR_END_TYPE: + return 'end of print statement'; + case self::NAME_TYPE: + return 'name'; + case self::NUMBER_TYPE: + return 'number'; + case self::STRING_TYPE: + return 'string'; + case self::OPERATOR_TYPE: + return 'operator'; + case self::PUNCTUATION_TYPE: + return 'punctuation'; + case self::INTERPOLATION_START_TYPE: + return 'begin of string interpolation'; + case self::INTERPOLATION_END_TYPE: + return 'end of string interpolation'; + default: + throw new LogicException(sprintf('Token of type "%s" does not exist.', $type)); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser.php new file mode 100644 index 000000000..fa9b6d867 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser.php @@ -0,0 +1,33 @@ + + */ +abstract class Twig_TokenParser implements Twig_TokenParserInterface +{ + /** + * @var Twig_Parser + */ + protected $parser; + + /** + * Sets the parser associated with this token parser. + * + * @param Twig_Parser $parser A Twig_Parser instance + */ + public function setParser(Twig_Parser $parser) + { + $this->parser = $parser; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php new file mode 100644 index 000000000..fd34cafe2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php @@ -0,0 +1,79 @@ + + * {% autoescape true %} + * Everything will be automatically escaped in this block + * {% endautoescape %} + * + * {% autoescape false %} + * Everything will be outputed as is in this block + * {% endautoescape %} + * + * {% autoescape true js %} + * Everything will be automatically escaped in this block + * using the js escaping strategy + * {% endautoescape %} + * + */ +class Twig_TokenParser_AutoEscape extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + + if ($stream->test(Twig_Token::BLOCK_END_TYPE)) { + $value = 'html'; + } else { + $expr = $this->parser->getExpressionParser()->parseExpression(); + if (!$expr instanceof Twig_Node_Expression_Constant) { + throw new Twig_Error_Syntax('An escaping strategy must be a string or a bool.', $stream->getCurrent()->getLine(), $stream->getFilename()); + } + $value = $expr->getAttribute('value'); + + $compat = true === $value || false === $value; + + if (true === $value) { + $value = 'html'; + } + + if ($compat && $stream->test(Twig_Token::NAME_TYPE)) { + @trigger_error('Using the autoescape tag with "true" or "false" before the strategy name is deprecated since version 1.21.', E_USER_DEPRECATED); + + if (false === $value) { + throw new Twig_Error_Syntax('Unexpected escaping strategy as you set autoescaping to false.', $stream->getCurrent()->getLine(), $stream->getFilename()); + } + + $value = $stream->next()->getValue(); + } + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_AutoEscape($value, $body, $lineno, $this->getTag()); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test('endautoescape'); + } + + public function getTag() + { + return 'autoescape'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Block.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Block.php new file mode 100644 index 000000000..4ffafbe71 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Block.php @@ -0,0 +1,69 @@ + + * {% block head %} + * + * {% block title %}{% endblock %} - My Webpage + * {% endblock %} + * + */ +class Twig_TokenParser_Block extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + if ($this->parser->hasBlock($name)) { + throw new Twig_Error_Syntax(sprintf("The block '%s' has already been defined line %d.", $name, $this->parser->getBlock($name)->getLine()), $stream->getCurrent()->getLine(), $stream->getFilename()); + } + $this->parser->setBlock($name, $block = new Twig_Node_Block($name, new Twig_Node(array()), $lineno)); + $this->parser->pushLocalScope(); + $this->parser->pushBlockStack($name); + + if ($stream->nextIf(Twig_Token::BLOCK_END_TYPE)) { + $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true); + if ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) { + $value = $token->getValue(); + + if ($value != $name) { + throw new Twig_Error_Syntax(sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getFilename()); + } + } + } else { + $body = new Twig_Node(array( + new Twig_Node_Print($this->parser->getExpressionParser()->parseExpression(), $lineno), + )); + } + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $block->setNode('body', $body); + $this->parser->popBlockStack(); + $this->parser->popLocalScope(); + + return new Twig_Node_BlockReference($name, $lineno, $this->getTag()); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test('endblock'); + } + + public function getTag() + { + return 'block'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Do.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Do.php new file mode 100644 index 000000000..7adb5a081 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Do.php @@ -0,0 +1,30 @@ +parser->getExpressionParser()->parseExpression(); + + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_Do($expr, $token->getLine(), $this->getTag()); + } + + public function getTag() + { + return 'do'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Embed.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Embed.php new file mode 100644 index 000000000..150f433be --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Embed.php @@ -0,0 +1,63 @@ +parser->getStream(); + + $parent = $this->parser->getExpressionParser()->parseExpression(); + + list($variables, $only, $ignoreMissing) = $this->parseArguments(); + + $parentToken = $fakeParentToken = new Twig_Token(Twig_Token::STRING_TYPE, '__parent__', $token->getLine()); + if ($parent instanceof Twig_Node_Expression_Constant) { + $parentToken = new Twig_Token(Twig_Token::STRING_TYPE, $parent->getAttribute('value'), $token->getLine()); + } elseif ($parent instanceof Twig_Node_Expression_Name) { + $parentToken = new Twig_Token(Twig_Token::NAME_TYPE, $parent->getAttribute('name'), $token->getLine()); + } + + // inject a fake parent to make the parent() function work + $stream->injectTokens(array( + new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', $token->getLine()), + new Twig_Token(Twig_Token::NAME_TYPE, 'extends', $token->getLine()), + $parentToken, + new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', $token->getLine()), + )); + + $module = $this->parser->parse($stream, array($this, 'decideBlockEnd'), true); + + // override the parent with the correct one + if ($fakeParentToken === $parentToken) { + $module->setNode('parent', $parent); + } + + $this->parser->embedTemplate($module); + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_Embed($module->getAttribute('filename'), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag()); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test('endembed'); + } + + public function getTag() + { + return 'embed'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Extends.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Extends.php new file mode 100644 index 000000000..510417ad1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Extends.php @@ -0,0 +1,40 @@ + + * {% extends "base.html" %} + * + */ +class Twig_TokenParser_Extends extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + if (!$this->parser->isMainScope()) { + throw new Twig_Error_Syntax('Cannot extend from a block.', $token->getLine(), $this->parser->getFilename()); + } + + if (null !== $this->parser->getParent()) { + throw new Twig_Error_Syntax('Multiple extends tags are forbidden.', $token->getLine(), $this->parser->getFilename()); + } + $this->parser->setParent($this->parser->getExpressionParser()->parseExpression()); + + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + } + + public function getTag() + { + return 'extends'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Filter.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Filter.php new file mode 100644 index 000000000..b20dd5b32 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Filter.php @@ -0,0 +1,49 @@ + + * {% filter upper %} + * This text becomes uppercase + * {% endfilter %} + * + */ +class Twig_TokenParser_Filter extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $name = $this->parser->getVarName(); + $ref = new Twig_Node_Expression_BlockReference(new Twig_Node_Expression_Constant($name, $token->getLine()), true, $token->getLine(), $this->getTag()); + + $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag()); + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true); + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + $block = new Twig_Node_Block($name, $body, $token->getLine()); + $this->parser->setBlock($name, $block); + + return new Twig_Node_Print($filter, $token->getLine(), $this->getTag()); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test('endfilter'); + } + + public function getTag() + { + return 'filter'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Flush.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Flush.php new file mode 100644 index 000000000..f9ce7c3b1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Flush.php @@ -0,0 +1,30 @@ +parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_Flush($token->getLine(), $this->getTag()); + } + + public function getTag() + { + return 'flush'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/For.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/For.php new file mode 100644 index 000000000..3fac51119 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/For.php @@ -0,0 +1,123 @@ + + *
      + * {% for user in users %} + *
    • {{ user.username|e }}
    • + * {% endfor %} + *
    + * + */ +class Twig_TokenParser_For extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $targets = $this->parser->getExpressionParser()->parseAssignmentExpression(); + $stream->expect(Twig_Token::OPERATOR_TYPE, 'in'); + $seq = $this->parser->getExpressionParser()->parseExpression(); + + $ifexpr = null; + if ($stream->nextIf(Twig_Token::NAME_TYPE, 'if')) { + $ifexpr = $this->parser->getExpressionParser()->parseExpression(); + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideForFork')); + if ($stream->next()->getValue() == 'else') { + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $else = $this->parser->subparse(array($this, 'decideForEnd'), true); + } else { + $else = null; + } + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + if (count($targets) > 1) { + $keyTarget = $targets->getNode(0); + $keyTarget = new Twig_Node_Expression_AssignName($keyTarget->getAttribute('name'), $keyTarget->getLine()); + $valueTarget = $targets->getNode(1); + $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getLine()); + } else { + $keyTarget = new Twig_Node_Expression_AssignName('_key', $lineno); + $valueTarget = $targets->getNode(0); + $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getLine()); + } + + if ($ifexpr) { + $this->checkLoopUsageCondition($stream, $ifexpr); + $this->checkLoopUsageBody($stream, $body); + } + + return new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag()); + } + + public function decideForFork(Twig_Token $token) + { + return $token->test(array('else', 'endfor')); + } + + public function decideForEnd(Twig_Token $token) + { + return $token->test('endfor'); + } + + // the loop variable cannot be used in the condition + protected function checkLoopUsageCondition(Twig_TokenStream $stream, Twig_NodeInterface $node) + { + if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) { + throw new Twig_Error_Syntax('The "loop" variable cannot be used in a looping condition.', $node->getLine(), $stream->getFilename()); + } + + foreach ($node as $n) { + if (!$n) { + continue; + } + + $this->checkLoopUsageCondition($stream, $n); + } + } + + // check usage of non-defined loop-items + // it does not catch all problems (for instance when a for is included into another or when the variable is used in an include) + protected function checkLoopUsageBody(Twig_TokenStream $stream, Twig_NodeInterface $node) + { + if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) { + $attribute = $node->getNode('attribute'); + if ($attribute instanceof Twig_Node_Expression_Constant && in_array($attribute->getAttribute('value'), array('length', 'revindex0', 'revindex', 'last'))) { + throw new Twig_Error_Syntax(sprintf('The "loop.%s" variable is not defined when looping with a condition.', $attribute->getAttribute('value')), $node->getLine(), $stream->getFilename()); + } + } + + // should check for parent.loop.XXX usage + if ($node instanceof Twig_Node_For) { + return; + } + + foreach ($node as $n) { + if (!$n) { + continue; + } + + $this->checkLoopUsageBody($stream, $n); + } + } + + public function getTag() + { + return 'for'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/From.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/From.php new file mode 100644 index 000000000..f7547ebe3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/From.php @@ -0,0 +1,62 @@ + + * {% from 'forms.html' import forms %} + * + */ +class Twig_TokenParser_From extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $macro = $this->parser->getExpressionParser()->parseExpression(); + $stream = $this->parser->getStream(); + $stream->expect('import'); + + $targets = array(); + do { + $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + + $alias = $name; + if ($stream->nextIf('as')) { + $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + } + + $targets[$name] = $alias; + + if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) { + break; + } + } while (true); + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $node = new Twig_Node_Import($macro, new Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()), $token->getLine(), $this->getTag()); + + foreach ($targets as $name => $alias) { + if ($this->parser->isReservedMacroName($name)) { + throw new Twig_Error_Syntax(sprintf('"%s" cannot be an imported macro as it is a reserved keyword.', $name), $token->getLine(), $stream->getFilename()); + } + + $this->parser->addImportedSymbol('function', $alias, 'get'.$name, $node->getNode('var')); + } + + return $node; + } + + public function getTag() + { + return 'from'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/If.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/If.php new file mode 100644 index 000000000..91c060498 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/If.php @@ -0,0 +1,82 @@ + + * {% if users %} + *
      + * {% for user in users %} + *
    • {{ user.username|e }}
    • + * {% endfor %} + *
    + * {% endif %} + * + */ +class Twig_TokenParser_If extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $expr = $this->parser->getExpressionParser()->parseExpression(); + $stream = $this->parser->getStream(); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideIfFork')); + $tests = array($expr, $body); + $else = null; + + $end = false; + while (!$end) { + switch ($stream->next()->getValue()) { + case 'else': + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $else = $this->parser->subparse(array($this, 'decideIfEnd')); + break; + + case 'elseif': + $expr = $this->parser->getExpressionParser()->parseExpression(); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideIfFork')); + $tests[] = $expr; + $tests[] = $body; + break; + + case 'endif': + $end = true; + break; + + default: + throw new Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d).', $lineno), $stream->getCurrent()->getLine(), $stream->getFilename()); + } + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_If(new Twig_Node($tests), $else, $lineno, $this->getTag()); + } + + public function decideIfFork(Twig_Token $token) + { + return $token->test(array('elseif', 'else', 'endif')); + } + + public function decideIfEnd(Twig_Token $token) + { + return $token->test(array('endif')); + } + + public function getTag() + { + return 'if'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Import.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Import.php new file mode 100644 index 000000000..85c5c0364 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Import.php @@ -0,0 +1,37 @@ + + * {% import 'forms.html' as forms %} + * + */ +class Twig_TokenParser_Import extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $macro = $this->parser->getExpressionParser()->parseExpression(); + $this->parser->getStream()->expect('as'); + $var = new Twig_Node_Expression_AssignName($this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue(), $token->getLine()); + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + $this->parser->addImportedSymbol('template', $var->getAttribute('name')); + + return new Twig_Node_Import($macro, $var, $token->getLine(), $this->getTag()); + } + + public function getTag() + { + return 'import'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Include.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Include.php new file mode 100644 index 000000000..0e76dae3e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Include.php @@ -0,0 +1,63 @@ + + * {% include 'header.html' %} + * Body + * {% include 'footer.html' %} + * + */ +class Twig_TokenParser_Include extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $expr = $this->parser->getExpressionParser()->parseExpression(); + + list($variables, $only, $ignoreMissing) = $this->parseArguments(); + + return new Twig_Node_Include($expr, $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag()); + } + + protected function parseArguments() + { + $stream = $this->parser->getStream(); + + $ignoreMissing = false; + if ($stream->nextIf(Twig_Token::NAME_TYPE, 'ignore')) { + $stream->expect(Twig_Token::NAME_TYPE, 'missing'); + + $ignoreMissing = true; + } + + $variables = null; + if ($stream->nextIf(Twig_Token::NAME_TYPE, 'with')) { + $variables = $this->parser->getExpressionParser()->parseExpression(); + } + + $only = false; + if ($stream->nextIf(Twig_Token::NAME_TYPE, 'only')) { + $only = true; + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + return array($variables, $only, $ignoreMissing); + } + + public function getTag() + { + return 'include'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Macro.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Macro.php new file mode 100644 index 000000000..8a7ebd6ed --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Macro.php @@ -0,0 +1,56 @@ + + * {% macro input(name, value, type, size) %} + * + * {% endmacro %} + * + */ +class Twig_TokenParser_Macro extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + + $arguments = $this->parser->getExpressionParser()->parseArguments(true, true); + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + $this->parser->pushLocalScope(); + $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true); + if ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) { + $value = $token->getValue(); + + if ($value != $name) { + throw new Twig_Error_Syntax(sprintf('Expected endmacro for macro "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getFilename()); + } + } + $this->parser->popLocalScope(); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $this->parser->setMacro($name, new Twig_Node_Macro($name, new Twig_Node_Body(array($body)), $arguments, $lineno, $this->getTag())); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test('endmacro'); + } + + public function getTag() + { + return 'macro'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php new file mode 100644 index 000000000..1feadd084 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php @@ -0,0 +1,56 @@ + + * {% sandbox %} + * {% include 'user.html' %} + * {% endsandbox %} + * + * + * @see http://www.twig-project.org/doc/api.html#sandbox-extension for details + */ +class Twig_TokenParser_Sandbox extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true); + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + // in a sandbox tag, only include tags are allowed + if (!$body instanceof Twig_Node_Include) { + foreach ($body as $node) { + if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) { + continue; + } + + if (!$node instanceof Twig_Node_Include) { + throw new Twig_Error_Syntax('Only "include" tags are allowed within a "sandbox" section.', $node->getLine(), $this->parser->getFilename()); + } + } + } + + return new Twig_Node_Sandbox($body, $token->getLine(), $this->getTag()); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test('endsandbox'); + } + + public function getTag() + { + return 'sandbox'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Set.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Set.php new file mode 100644 index 000000000..5ca614bd6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Set.php @@ -0,0 +1,71 @@ + + * {% set foo = 'foo' %} + * + * {% set foo = [1, 2] %} + * + * {% set foo = {'foo': 'bar'} %} + * + * {% set foo = 'foo' ~ 'bar' %} + * + * {% set foo, bar = 'foo', 'bar' %} + * + * {% set foo %}Some content{% endset %} + * + */ +class Twig_TokenParser_Set extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + $stream = $this->parser->getStream(); + $names = $this->parser->getExpressionParser()->parseAssignmentExpression(); + + $capture = false; + if ($stream->nextIf(Twig_Token::OPERATOR_TYPE, '=')) { + $values = $this->parser->getExpressionParser()->parseMultitargetExpression(); + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + if (count($names) !== count($values)) { + throw new Twig_Error_Syntax('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getFilename()); + } + } else { + $capture = true; + + if (count($names) > 1) { + throw new Twig_Error_Syntax('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getFilename()); + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $values = $this->parser->subparse(array($this, 'decideBlockEnd'), true); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + } + + return new Twig_Node_Set($capture, $names, $values, $lineno, $this->getTag()); + } + + public function decideBlockEnd(Twig_Token $token) + { + return $token->test('endset'); + } + + public function getTag() + { + return 'set'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php new file mode 100644 index 000000000..53d906d82 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php @@ -0,0 +1,47 @@ + + * {% spaceless %} + *
    + * foo + *
    + * {% endspaceless %} + * + * {# output will be
    foo
    #} + * + */ +class Twig_TokenParser_Spaceless extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $lineno = $token->getLine(); + + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + $body = $this->parser->subparse(array($this, 'decideSpacelessEnd'), true); + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_Spaceless($body, $lineno, $this->getTag()); + } + + public function decideSpacelessEnd(Twig_Token $token) + { + return $token->test('endspaceless'); + } + + public function getTag() + { + return 'spaceless'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Use.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Use.php new file mode 100644 index 000000000..4945d03c0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParser/Use.php @@ -0,0 +1,64 @@ + + * {% extends "base.html" %} + * + * {% use "blocks.html" %} + * + * {% block title %}{% endblock %} + * {% block content %}{% endblock %} + * + * + * @see http://www.twig-project.org/doc/templates.html#horizontal-reuse for details. + */ +class Twig_TokenParser_Use extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $template = $this->parser->getExpressionParser()->parseExpression(); + $stream = $this->parser->getStream(); + + if (!$template instanceof Twig_Node_Expression_Constant) { + throw new Twig_Error_Syntax('The template references in a "use" statement must be a string.', $stream->getCurrent()->getLine(), $stream->getFilename()); + } + + $targets = array(); + if ($stream->nextIf('with')) { + do { + $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + + $alias = $name; + if ($stream->nextIf('as')) { + $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); + } + + $targets[$name] = new Twig_Node_Expression_Constant($alias, -1); + + if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) { + break; + } + } while (true); + } + + $stream->expect(Twig_Token::BLOCK_END_TYPE); + + $this->parser->addTrait(new Twig_Node(array('template' => $template, 'targets' => new Twig_Node($targets)))); + } + + public function getTag() + { + return 'use'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserBroker.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserBroker.php new file mode 100644 index 000000000..d88bb43e7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserBroker.php @@ -0,0 +1,142 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface +{ + protected $parser; + protected $parsers = array(); + protected $brokers = array(); + + /** + * Constructor. + * + * @param array|Traversable $parsers A Traversable of Twig_TokenParserInterface instances + * @param array|Traversable $brokers A Traversable of Twig_TokenParserBrokerInterface instances + * @param bool $triggerDeprecationError + */ + public function __construct($parsers = array(), $brokers = array(), $triggerDeprecationError = true) + { + if ($triggerDeprecationError) { + @trigger_error('The '.__CLASS__.' class is deprecated since version 1.12 and will be removed in 2.0.', E_USER_DEPRECATED); + } + + foreach ($parsers as $parser) { + if (!$parser instanceof Twig_TokenParserInterface) { + throw new LogicException('$parsers must a an array of Twig_TokenParserInterface.'); + } + $this->parsers[$parser->getTag()] = $parser; + } + foreach ($brokers as $broker) { + if (!$broker instanceof Twig_TokenParserBrokerInterface) { + throw new LogicException('$brokers must a an array of Twig_TokenParserBrokerInterface.'); + } + $this->brokers[] = $broker; + } + } + + /** + * Adds a TokenParser. + * + * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance + */ + public function addTokenParser(Twig_TokenParserInterface $parser) + { + $this->parsers[$parser->getTag()] = $parser; + } + + /** + * Removes a TokenParser. + * + * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance + */ + public function removeTokenParser(Twig_TokenParserInterface $parser) + { + $name = $parser->getTag(); + if (isset($this->parsers[$name]) && $parser === $this->parsers[$name]) { + unset($this->parsers[$name]); + } + } + + /** + * Adds a TokenParserBroker. + * + * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance + */ + public function addTokenParserBroker(Twig_TokenParserBroker $broker) + { + $this->brokers[] = $broker; + } + + /** + * Removes a TokenParserBroker. + * + * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance + */ + public function removeTokenParserBroker(Twig_TokenParserBroker $broker) + { + if (false !== $pos = array_search($broker, $this->brokers)) { + unset($this->brokers[$pos]); + } + } + + /** + * Gets a suitable TokenParser for a tag. + * + * First looks in parsers, then in brokers. + * + * @param string $tag A tag name + * + * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found + */ + public function getTokenParser($tag) + { + if (isset($this->parsers[$tag])) { + return $this->parsers[$tag]; + } + $broker = end($this->brokers); + while (false !== $broker) { + $parser = $broker->getTokenParser($tag); + if (null !== $parser) { + return $parser; + } + $broker = prev($this->brokers); + } + } + + public function getParsers() + { + return $this->parsers; + } + + public function getParser() + { + return $this->parser; + } + + public function setParser(Twig_ParserInterface $parser) + { + $this->parser = $parser; + foreach ($this->parsers as $tokenParser) { + $tokenParser->setParser($parser); + } + foreach ($this->brokers as $broker) { + $broker->setParser($parser); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php new file mode 100644 index 000000000..3ec2a8801 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php @@ -0,0 +1,46 @@ + + * + * @deprecated since 1.12 (to be removed in 2.0) + */ +interface Twig_TokenParserBrokerInterface +{ + /** + * Gets a TokenParser suitable for a tag. + * + * @param string $tag A tag name + * + * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found + */ + public function getTokenParser($tag); + + /** + * Calls Twig_TokenParserInterface::setParser on all parsers the implementation knows of. + * + * @param Twig_ParserInterface $parser A Twig_ParserInterface interface + */ + public function setParser(Twig_ParserInterface $parser); + + /** + * Gets the Twig_ParserInterface. + * + * @return null|Twig_ParserInterface A Twig_ParserInterface instance or null + */ + public function getParser(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserInterface.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserInterface.php new file mode 100644 index 000000000..12ec39617 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenParserInterface.php @@ -0,0 +1,43 @@ + + */ +interface Twig_TokenParserInterface +{ + /** + * Sets the parser associated with this token parser. + * + * @param Twig_Parser $parser A Twig_Parser instance + */ + public function setParser(Twig_Parser $parser); + + /** + * Parses a token and returns a node. + * + * @param Twig_Token $token A Twig_Token instance + * + * @return Twig_NodeInterface A Twig_NodeInterface instance + * + * @throws Twig_Error_Syntax + */ + public function parse(Twig_Token $token); + + /** + * Gets the tag name associated with this token parser. + * + * @return string The tag name + */ + public function getTag(); +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenStream.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenStream.php new file mode 100644 index 000000000..768853263 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/TokenStream.php @@ -0,0 +1,169 @@ + + */ +class Twig_TokenStream +{ + protected $tokens; + protected $current = 0; + protected $filename; + + private $source; + + /** + * Constructor. + * + * @param array $tokens An array of tokens + * @param string|null $filename The name of the filename which tokens are associated with + * @param string|null $source The source code associated with the tokens + */ + public function __construct(array $tokens, $filename = null, $source = null) + { + $this->tokens = $tokens; + $this->filename = $filename; + $this->source = $source ? $source : ''; + } + + /** + * Returns a string representation of the token stream. + * + * @return string + */ + public function __toString() + { + return implode("\n", $this->tokens); + } + + public function injectTokens(array $tokens) + { + $this->tokens = array_merge(array_slice($this->tokens, 0, $this->current), $tokens, array_slice($this->tokens, $this->current)); + } + + /** + * Sets the pointer to the next token and returns the old one. + * + * @return Twig_Token + */ + public function next() + { + if (!isset($this->tokens[++$this->current])) { + throw new Twig_Error_Syntax('Unexpected end of template.', $this->tokens[$this->current - 1]->getLine(), $this->filename); + } + + return $this->tokens[$this->current - 1]; + } + + /** + * Tests a token, sets the pointer to the next one and returns it or throws a syntax error. + * + * @return Twig_Token|null The next token if the condition is true, null otherwise + */ + public function nextIf($primary, $secondary = null) + { + if ($this->tokens[$this->current]->test($primary, $secondary)) { + return $this->next(); + } + } + + /** + * Tests a token and returns it or throws a syntax error. + * + * @return Twig_Token + */ + public function expect($type, $value = null, $message = null) + { + $token = $this->tokens[$this->current]; + if (!$token->test($type, $value)) { + $line = $token->getLine(); + throw new Twig_Error_Syntax(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s).', + $message ? $message.'. ' : '', + Twig_Token::typeToEnglish($token->getType()), $token->getValue(), + Twig_Token::typeToEnglish($type), $value ? sprintf(' with value "%s"', $value) : ''), + $line, + $this->filename + ); + } + $this->next(); + + return $token; + } + + /** + * Looks at the next token. + * + * @param int $number + * + * @return Twig_Token + */ + public function look($number = 1) + { + if (!isset($this->tokens[$this->current + $number])) { + throw new Twig_Error_Syntax('Unexpected end of template.', $this->tokens[$this->current + $number - 1]->getLine(), $this->filename); + } + + return $this->tokens[$this->current + $number]; + } + + /** + * Tests the current token. + * + * @return bool + */ + public function test($primary, $secondary = null) + { + return $this->tokens[$this->current]->test($primary, $secondary); + } + + /** + * Checks if end of stream was reached. + * + * @return bool + */ + public function isEOF() + { + return $this->tokens[$this->current]->getType() === Twig_Token::EOF_TYPE; + } + + /** + * Gets the current token. + * + * @return Twig_Token + */ + public function getCurrent() + { + return $this->tokens[$this->current]; + } + + /** + * Gets the filename associated with this stream (null if not defined). + * + * @return string|null + */ + public function getFilename() + { + return $this->filename; + } + + /** + * Gets the source code associated with this stream. + * + * @return string + */ + public function getSource() + { + return $this->source; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php new file mode 100644 index 000000000..e406f0aa7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php @@ -0,0 +1,82 @@ + + */ +class Twig_Util_DeprecationCollector +{ + private $twig; + private $deprecations; + + public function __construct(Twig_Environment $twig) + { + $this->twig = $twig; + } + + /** + * Returns deprecations for templates contained in a directory. + * + * @param string $dir A directory where templates are stored + * @param string $ext Limit the loaded templates by extension + * + * @return array() An array of deprecations + */ + public function collectDir($dir, $ext = '.twig') + { + $iterator = new RegexIterator( + new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY + ), '{'.preg_quote($ext).'$}' + ); + + return $this->collect(new Twig_Util_TemplateDirIterator($iterator)); + } + + /** + * Returns deprecations for passed templates. + * + * @param Iterator $iterator An iterator of templates (where keys are template names and values the contents of the template) + * + * @return array() An array of deprecations + */ + public function collect(Iterator $iterator) + { + $this->deprecations = array(); + + set_error_handler(array($this, 'errorHandler')); + + foreach ($iterator as $name => $contents) { + try { + $this->twig->parse($this->twig->tokenize($contents, $name)); + } catch (Twig_Error_Syntax $e) { + // ignore templates containing syntax errors + } + } + + restore_error_handler(); + + $deprecations = $this->deprecations; + $this->deprecations = array(); + + return $deprecations; + } + + /** + * @internal + */ + public function errorHandler($type, $msg) + { + if (E_USER_DEPRECATED === $type) { + $this->deprecations[] = $msg; + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php new file mode 100644 index 000000000..3fb893278 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php @@ -0,0 +1,26 @@ + + */ +class Twig_Util_TemplateDirIterator extends IteratorIterator +{ + public function current() + { + return file_get_contents(parent::current()); + } + + public function key() + { + return (string) parent::key(); + } +} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/phpunit.xml.dist b/dkan/.ahoy/site/vendor/twig/twig/phpunit.xml.dist similarity index 58% rename from dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/phpunit.xml.dist rename to dkan/.ahoy/site/vendor/twig/twig/phpunit.xml.dist index 0136d8edc..6f6d1d25a 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/phpunit.xml.dist +++ b/dkan/.ahoy/site/vendor/twig/twig/phpunit.xml.dist @@ -10,17 +10,16 @@ stopOnFailure="false" syntaxCheck="false" bootstrap="vendor/autoload.php" - verbose="true" > - - - tests - - + + + ./test/Twig/ + + - - - ./src/JsonSchema/ - - + + + ./lib/Twig/ + + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php new file mode 100644 index 000000000..52107c0c1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php @@ -0,0 +1,24 @@ +assertFalse(class_exists('FooBarFoo'), '->autoload() does not try to load classes that does not begin with Twig'); + + $autoloader = new Twig_Autoloader(); + $this->assertNull($autoloader->autoload('Foo'), '->autoload() returns false if it is not able to load a class'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php new file mode 100644 index 000000000..af8618ba4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php @@ -0,0 +1,193 @@ +classname = '__Twig_Tests_Cache_FilesystemTest_Template_'.$nonce; + $this->directory = sys_get_temp_dir().'/twig-test'; + $this->cache = new Twig_Cache_Filesystem($this->directory); + } + + protected function tearDown() + { + if (file_exists($this->directory)) { + Twig_Tests_FilesystemHelper::removeDir($this->directory); + } + } + + public function testLoad() + { + $key = $this->directory.'/cache/cachefile.php'; + + $dir = dirname($key); + @mkdir($dir, 0777, true); + $this->assertTrue(is_dir($dir)); + $this->assertFalse(class_exists($this->classname, false)); + + $content = $this->generateSource(); + file_put_contents($key, $content); + + $this->cache->load($key); + + $this->assertTrue(class_exists($this->classname, false)); + } + + public function testLoadMissing() + { + $key = $this->directory.'/cache/cachefile.php'; + + $this->assertFalse(class_exists($this->classname, false)); + + $this->cache->load($key); + + $this->assertFalse(class_exists($this->classname, false)); + } + + public function testWrite() + { + $key = $this->directory.'/cache/cachefile.php'; + $content = $this->generateSource(); + + $this->assertFalse(file_exists($key)); + $this->assertFalse(file_exists($this->directory)); + + $this->cache->write($key, $content); + + $this->assertTrue(file_exists($this->directory)); + $this->assertTrue(file_exists($key)); + $this->assertSame(file_get_contents($key), $content); + } + + /** + * @expectedException RuntimeException + * @expectedExceptionMessage Unable to create the cache directory + */ + public function testWriteFailMkdir() + { + if (defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->markTestSkipped('Read-only directories not possible on Windows.'); + } + + $key = $this->directory.'/cache/cachefile.php'; + $content = $this->generateSource(); + + $this->assertFalse(file_exists($key)); + + // Create read-only root directory. + @mkdir($this->directory, 0555, true); + $this->assertTrue(is_dir($this->directory)); + + $this->cache->write($key, $content); + } + + /** + * @expectedException RuntimeException + * @expectedExceptionMessage Unable to write in the cache directory + */ + public function testWriteFailDirWritable() + { + if (defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->markTestSkipped('Read-only directories not possible on Windows.'); + } + + $key = $this->directory.'/cache/cachefile.php'; + $content = $this->generateSource(); + + $this->assertFalse(file_exists($key)); + + // Create root directory. + @mkdir($this->directory, 0777, true); + // Create read-only subdirectory. + @mkdir($this->directory.'/cache', 0555); + $this->assertTrue(is_dir($this->directory.'/cache')); + + $this->cache->write($key, $content); + } + + /** + * @expectedException RuntimeException + * @expectedExceptionMessage Failed to write cache file + */ + public function testWriteFailWriteFile() + { + $key = $this->directory.'/cache/cachefile.php'; + $content = $this->generateSource(); + + $this->assertFalse(file_exists($key)); + + // Create a directory in the place of the cache file. + @mkdir($key, 0777, true); + $this->assertTrue(is_dir($key)); + + $this->cache->write($key, $content); + } + + public function testGetTimestamp() + { + $key = $this->directory.'/cache/cachefile.php'; + + $dir = dirname($key); + @mkdir($dir, 0777, true); + $this->assertTrue(is_dir($dir)); + + // Create the file with a specific modification time. + touch($key, 1234567890); + + $this->assertSame(1234567890, $this->cache->getTimestamp($key)); + } + + public function testGetTimestampMissingFile() + { + $key = $this->directory.'/cache/cachefile.php'; + $this->assertSame(0, $this->cache->getTimestamp($key)); + } + + /** + * Test file cache is tolerant towards trailing (back)slashes on the configured cache directory. + * + * @dataProvider provideDirectories + */ + public function testGenerateKey($expected, $input) + { + $cache = new Twig_Cache_Filesystem($input); + $this->assertRegExp($expected, $cache->generateKey('_test_', get_class($this))); + } + + public function provideDirectories() + { + $pattern = '#a/b/[a-zA-Z0-9]+/[a-zA-Z0-9]+.php$#'; + + return array( + array($pattern, 'a/b'), + array($pattern, 'a/b/'), + array($pattern, 'a/b\\'), + array($pattern, 'a/b\\/'), + array($pattern, 'a/b\\//'), + array('#/'.substr($pattern, 1), '/a/b'), + ); + } + + private function generateSource() + { + return strtr(' $this->classname, + )); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/CompilerTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/CompilerTest.php new file mode 100644 index 000000000..da7f53315 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/CompilerTest.php @@ -0,0 +1,33 @@ +getMockBuilder('Twig_LoaderInterface')->getMock())); + + $locale = setlocale(LC_NUMERIC, 0); + if (false === $locale) { + $this->markTestSkipped('Your platform does not support locales.'); + } + + $required_locales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252'); + if (false === setlocale(LC_NUMERIC, $required_locales)) { + $this->markTestSkipped('Could not set any of required locales: '.implode(', ', $required_locales)); + } + + $this->assertEquals('1.2', $compiler->repr(1.2)->getSource()); + $this->assertContains('fr', strtolower(setlocale(LC_NUMERIC, 0))); + + setlocale(LC_NUMERIC, $locale); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php new file mode 100644 index 000000000..ce33fcf99 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php @@ -0,0 +1,578 @@ +render('test'); + } + + public function testAutoescapeOption() + { + $loader = new Twig_Loader_Array(array( + 'html' => '{{ foo }} {{ foo }}', + 'js' => '{{ bar }} {{ bar }}', + )); + + $twig = new Twig_Environment($loader, array( + 'debug' => true, + 'cache' => false, + 'autoescape' => array($this, 'escapingStrategyCallback'), + )); + + $this->assertEquals('foo<br/ > foo<br/ >', $twig->render('html', array('foo' => 'foo
    '))); + $this->assertEquals('foo\x3Cbr\x2F\x20\x3E foo\x3Cbr\x2F\x20\x3E', $twig->render('js', array('bar' => 'foo
    '))); + } + + public function escapingStrategyCallback($filename) + { + return $filename; + } + + public function testGlobals() + { + // globals can be added after calling getGlobals + + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addGlobal('foo', 'foo'); + $twig->getGlobals(); + $twig->addGlobal('foo', 'bar'); + $globals = $twig->getGlobals(); + $this->assertEquals('bar', $globals['foo']); + + // globals can be modified after a template has been loaded + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addGlobal('foo', 'foo'); + $twig->getGlobals(); + $twig->loadTemplate('index'); + $twig->addGlobal('foo', 'bar'); + $globals = $twig->getGlobals(); + $this->assertEquals('bar', $globals['foo']); + + // globals can be modified after extensions init + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addGlobal('foo', 'foo'); + $twig->getGlobals(); + $twig->getFunctions(); + $twig->addGlobal('foo', 'bar'); + $globals = $twig->getGlobals(); + $this->assertEquals('bar', $globals['foo']); + + // globals can be modified after extensions and a template has been loaded + $twig = new Twig_Environment($loader = new Twig_Loader_Array(array('index' => '{{foo}}'))); + $twig->addGlobal('foo', 'foo'); + $twig->getGlobals(); + $twig->getFunctions(); + $twig->loadTemplate('index'); + $twig->addGlobal('foo', 'bar'); + $globals = $twig->getGlobals(); + $this->assertEquals('bar', $globals['foo']); + + $twig = new Twig_Environment($loader); + $twig->getGlobals(); + $twig->addGlobal('foo', 'bar'); + $template = $twig->loadTemplate('index'); + $this->assertEquals('bar', $template->render(array())); + + /* to be uncomment in Twig 2.0 + // globals cannot be added after a template has been loaded + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addGlobal('foo', 'foo'); + $twig->getGlobals(); + $twig->loadTemplate('index'); + try { + $twig->addGlobal('bar', 'bar'); + $this->fail(); + } catch (LogicException $e) { + $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); + } + + // globals cannot be added after extensions init + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addGlobal('foo', 'foo'); + $twig->getGlobals(); + $twig->getFunctions(); + try { + $twig->addGlobal('bar', 'bar'); + $this->fail(); + } catch (LogicException $e) { + $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); + } + + // globals cannot be added after extensions and a template has been loaded + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addGlobal('foo', 'foo'); + $twig->getGlobals(); + $twig->getFunctions(); + $twig->loadTemplate('index'); + try { + $twig->addGlobal('bar', 'bar'); + $this->fail(); + } catch (LogicException $e) { + $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); + } + + // test adding globals after a template has been loaded without call to getGlobals + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->loadTemplate('index'); + try { + $twig->addGlobal('bar', 'bar'); + $this->fail(); + } catch (LogicException $e) { + $this->assertFalse(array_key_exists('bar', $twig->getGlobals())); + } + */ + } + + public function testExtensionsAreNotInitializedWhenRenderingACompiledTemplate() + { + $cache = new Twig_Cache_Filesystem($dir = sys_get_temp_dir().'/twig'); + $options = array('cache' => $cache, 'auto_reload' => false, 'debug' => false); + + // force compilation + $twig = new Twig_Environment($loader = new Twig_Loader_Array(array('index' => '{{ foo }}')), $options); + + $key = $cache->generateKey('index', $twig->getTemplateClass('index')); + $cache->write($key, $twig->compileSource('{{ foo }}', 'index')); + + // check that extensions won't be initialized when rendering a template that is already in the cache + $twig = $this + ->getMockBuilder('Twig_Environment') + ->setConstructorArgs(array($loader, $options)) + ->setMethods(array('initExtensions')) + ->getMock() + ; + + $twig->expects($this->never())->method('initExtensions'); + + // render template + $output = $twig->render('index', array('foo' => 'bar')); + $this->assertEquals('bar', $output); + + Twig_Tests_FilesystemHelper::removeDir($dir); + } + + public function testAutoReloadCacheMiss() + { + $templateName = __FUNCTION__; + $templateContent = __FUNCTION__; + + $cache = $this->getMockBuilder('Twig_CacheInterface')->getMock(); + $loader = $this->getMockLoader($templateName, $templateContent); + $twig = new Twig_Environment($loader, array('cache' => $cache, 'auto_reload' => true, 'debug' => false)); + + // Cache miss: getTimestamp returns 0 and as a result the load() is + // skipped. + $cache->expects($this->once()) + ->method('generateKey') + ->will($this->returnValue('key')); + $cache->expects($this->once()) + ->method('getTimestamp') + ->will($this->returnValue(0)); + $loader->expects($this->never()) + ->method('isFresh'); + $cache->expects($this->never()) + ->method('load'); + + $twig->loadTemplate($templateName); + } + + public function testAutoReloadCacheHit() + { + $templateName = __FUNCTION__; + $templateContent = __FUNCTION__; + + $cache = $this->getMockBuilder('Twig_CacheInterface')->getMock(); + $loader = $this->getMockLoader($templateName, $templateContent); + $twig = new Twig_Environment($loader, array('cache' => $cache, 'auto_reload' => true, 'debug' => false)); + + $now = time(); + + // Cache hit: getTimestamp returns something > extension timestamps and + // the loader returns true for isFresh(). + $cache->expects($this->once()) + ->method('generateKey') + ->will($this->returnValue('key')); + $cache->expects($this->once()) + ->method('getTimestamp') + ->will($this->returnValue($now)); + $loader->expects($this->once()) + ->method('isFresh') + ->will($this->returnValue(true)); + $cache->expects($this->once()) + ->method('load'); + + $twig->loadTemplate($templateName); + } + + public function testAutoReloadOutdatedCacheHit() + { + $templateName = __FUNCTION__; + $templateContent = __FUNCTION__; + + $cache = $this->getMockBuilder('Twig_CacheInterface')->getMock(); + $loader = $this->getMockLoader($templateName, $templateContent); + $twig = new Twig_Environment($loader, array('cache' => $cache, 'auto_reload' => true, 'debug' => false)); + + $now = time(); + + $cache->expects($this->once()) + ->method('generateKey') + ->will($this->returnValue('key')); + $cache->expects($this->once()) + ->method('getTimestamp') + ->will($this->returnValue($now)); + $loader->expects($this->once()) + ->method('isFresh') + ->will($this->returnValue(false)); + $cache->expects($this->never()) + ->method('load'); + + $twig->loadTemplate($templateName); + } + + public function testHasGetExtensionByClassName() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addExtension($ext = new Twig_Tests_EnvironmentTest_Extension()); + $this->assertTrue($twig->hasExtension('Twig_Tests_EnvironmentTest_Extension')); + $this->assertTrue($twig->hasExtension('\Twig_Tests_EnvironmentTest_Extension')); + + $this->assertSame($ext, $twig->getExtension('Twig_Tests_EnvironmentTest_Extension')); + $this->assertSame($ext, $twig->getExtension('\Twig_Tests_EnvironmentTest_Extension')); + } + + public function testAddExtension() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension()); + + $this->assertArrayHasKey('test', $twig->getTags()); + $this->assertArrayHasKey('foo_filter', $twig->getFilters()); + $this->assertArrayHasKey('foo_function', $twig->getFunctions()); + $this->assertArrayHasKey('foo_test', $twig->getTests()); + $this->assertArrayHasKey('foo_unary', $twig->getUnaryOperators()); + $this->assertArrayHasKey('foo_binary', $twig->getBinaryOperators()); + $this->assertArrayHasKey('foo_global', $twig->getGlobals()); + $visitors = $twig->getNodeVisitors(); + $found = false; + foreach ($visitors as $visitor) { + if ($visitor instanceof Twig_Tests_EnvironmentTest_NodeVisitor) { + $found = true; + } + } + $this->assertTrue($found); + } + + /** + * @requires PHP 5.3 + */ + public function testAddExtensionWithDeprecatedGetGlobals() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithGlobals()); + + $this->deprecations = array(); + set_error_handler(array($this, 'handleError')); + + $this->assertArrayHasKey('foo_global', $twig->getGlobals()); + + $this->assertCount(1, $this->deprecations); + $this->assertContains('Defining the getGlobals() method in the "Twig_Tests_EnvironmentTest_Extension_WithGlobals" extension ', $this->deprecations[0]); + + restore_error_handler(); + } + + /** + * @group legacy + */ + public function testRemoveExtension() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName()); + $twig->removeExtension('environment_test'); + + $this->assertFalse(array_key_exists('test', $twig->getTags())); + $this->assertFalse(array_key_exists('foo_filter', $twig->getFilters())); + $this->assertFalse(array_key_exists('foo_function', $twig->getFunctions())); + $this->assertFalse(array_key_exists('foo_test', $twig->getTests())); + $this->assertFalse(array_key_exists('foo_unary', $twig->getUnaryOperators())); + $this->assertFalse(array_key_exists('foo_binary', $twig->getBinaryOperators())); + $this->assertFalse(array_key_exists('foo_global', $twig->getGlobals())); + $this->assertCount(2, $twig->getNodeVisitors()); + } + + public function testAddMockExtension() + { + // should be replaced by the following in 2.0 (this current code is just to avoid a dep notice) + // $extension = $this->getMockBuilder('Twig_Extension')->getMock(); + $extension = eval(<< 'hey')); + + $twig = new Twig_Environment($loader); + $twig->addExtension($extension); + + $this->assertInstanceOf('Twig_ExtensionInterface', $twig->getExtension(get_class($extension))); + $this->assertTrue($twig->isTemplateFresh('page', time())); + } + + public function testInitRuntimeWithAnExtensionUsingInitRuntimeNoDeprecation() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithoutDeprecationInitRuntime()); + + $twig->initRuntime(); + } + + /** + * @requires PHP 5.3 + */ + public function testInitRuntimeWithAnExtensionUsingInitRuntimeDeprecation() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime()); + + $this->deprecations = array(); + set_error_handler(array($this, 'handleError')); + + $twig->initRuntime(); + + $this->assertCount(1, $this->deprecations); + $this->assertContains('Defining the initRuntime() method in the "Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime" extension is deprecated since version 1.23.', $this->deprecations[0]); + + restore_error_handler(); + } + + public function handleError($type, $msg) + { + if (E_USER_DEPRECATED === $type) { + $this->deprecations[] = $msg; + } + } + + /** + * @requires PHP 5.3 + */ + public function testOverrideExtension() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime()); + + $this->deprecations = array(); + set_error_handler(array($this, 'handleError')); + + $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName()); + $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName()); + + $this->assertCount(1, $this->deprecations); + $this->assertContains('The possibility to register the same extension twice', $this->deprecations[0]); + + restore_error_handler(); + } + + public function testAddRuntimeLoader() + { + $runtimeLoader = $this->getMockBuilder('Twig_RuntimeLoaderInterface')->getMock(); + $runtimeLoader->expects($this->any())->method('load')->will($this->returnValue(new Twig_Tests_EnvironmentTest_Runtime())); + + $loader = new Twig_Loader_Array(array( + 'func_array' => '{{ from_runtime_array("foo") }}', + 'func_array_default' => '{{ from_runtime_array() }}', + 'func_array_named_args' => '{{ from_runtime_array(name="foo") }}', + 'func_string' => '{{ from_runtime_string("foo") }}', + 'func_string_default' => '{{ from_runtime_string() }}', + 'func_string_named_args' => '{{ from_runtime_string(name="foo") }}', + )); + + $twig = new Twig_Environment($loader); + $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithoutRuntime()); + $twig->addRuntimeLoader($runtimeLoader); + + $this->assertEquals('foo', $twig->render('func_array')); + $this->assertEquals('bar', $twig->render('func_array_default')); + $this->assertEquals('foo', $twig->render('func_array_named_args')); + $this->assertEquals('foo', $twig->render('func_string')); + $this->assertEquals('bar', $twig->render('func_string_default')); + $this->assertEquals('foo', $twig->render('func_string_named_args')); + } + + protected function getMockLoader($templateName, $templateContent) + { + $loader = $this->getMockBuilder('Twig_LoaderInterface')->getMock(); + $loader->expects($this->any()) + ->method('getSource') + ->with($templateName) + ->will($this->returnValue($templateContent)); + $loader->expects($this->any()) + ->method('getCacheKey') + ->with($templateName) + ->will($this->returnValue($templateName)); + + return $loader; + } +} + +class Twig_Tests_EnvironmentTest_Extension_WithGlobals extends Twig_Extension +{ + public function getGlobals() + { + return array( + 'foo_global' => 'foo_global', + ); + } +} + +class Twig_Tests_EnvironmentTest_Extension extends Twig_Extension implements Twig_Extension_GlobalsInterface +{ + public function getTokenParsers() + { + return array( + new Twig_Tests_EnvironmentTest_TokenParser(), + ); + } + + public function getNodeVisitors() + { + return array( + new Twig_Tests_EnvironmentTest_NodeVisitor(), + ); + } + + public function getFilters() + { + return array( + new Twig_SimpleFilter('foo_filter', 'foo_filter'), + ); + } + + public function getTests() + { + return array( + new Twig_SimpleTest('foo_test', 'foo_test'), + ); + } + + public function getFunctions() + { + return array( + new Twig_SimpleFunction('foo_function', 'foo_function'), + ); + } + + public function getOperators() + { + return array( + array('foo_unary' => array()), + array('foo_binary' => array()), + ); + } + + public function getGlobals() + { + return array( + 'foo_global' => 'foo_global', + ); + } +} + +class Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName extends Twig_Extension +{ + public function getName() + { + return 'environment_test'; + } +} + +class Twig_Tests_EnvironmentTest_TokenParser extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + } + + public function getTag() + { + return 'test'; + } +} + +class Twig_Tests_EnvironmentTest_NodeVisitor implements Twig_NodeVisitorInterface +{ + public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) + { + return $node; + } + + public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env) + { + return $node; + } + + public function getPriority() + { + return 0; + } +} + +class Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime extends Twig_Extension +{ + public function initRuntime(Twig_Environment $env) + { + } +} + +class Twig_Tests_EnvironmentTest_ExtensionWithoutDeprecationInitRuntime extends Twig_Extension implements Twig_Extension_InitRuntimeInterface +{ + public function initRuntime(Twig_Environment $env) + { + } +} + +class Twig_Tests_EnvironmentTest_ExtensionWithoutRuntime extends Twig_Extension +{ + public function getFunctions() + { + return array( + new Twig_SimpleFunction('from_runtime_array', array('Twig_Tests_EnvironmentTest_Runtime', 'fromRuntime')), + new Twig_SimpleFunction('from_runtime_string', 'Twig_Tests_EnvironmentTest_Runtime::fromRuntime'), + ); + } + + public function getName() + { + return 'from_runtime'; + } +} + +class Twig_Tests_EnvironmentTest_Runtime +{ + public function fromRuntime($name = 'bar') + { + return $name; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ErrorTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ErrorTest.php new file mode 100644 index 000000000..a898cb1fd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ErrorTest.php @@ -0,0 +1,144 @@ +setTemplateFile(new SplFileInfo(__FILE__)); + + $this->assertContains('test'.DIRECTORY_SEPARATOR.'Twig'.DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR.'ErrorTest.php', $error->getMessage()); + } + + public function testErrorWithArrayFilename() + { + $error = new Twig_Error('foo'); + $error->setTemplateFile(array('foo' => 'bar')); + + $this->assertEquals('foo in {"foo":"bar"}', $error->getMessage()); + } + + public function testTwigExceptionAddsFileAndLineWhenMissingWithInheritanceOnDisk() + { + $loader = new Twig_Loader_Filesystem(dirname(__FILE__).'/Fixtures/errors'); + $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false)); + + $template = $twig->loadTemplate('index.html'); + try { + $template->render(array()); + + $this->fail(); + } catch (Twig_Error_Runtime $e) { + $this->assertEquals('Variable "foo" does not exist in "index.html" at line 3.', $e->getMessage()); + $this->assertEquals(3, $e->getTemplateLine()); + $this->assertEquals('index.html', $e->getTemplateFile()); + } + + try { + $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo())); + + $this->fail(); + } catch (Twig_Error_Runtime $e) { + $this->assertEquals('An exception has been thrown during the rendering of a template ("Runtime error...") in "index.html" at line 3.', $e->getMessage()); + $this->assertEquals(3, $e->getTemplateLine()); + $this->assertEquals('index.html', $e->getTemplateFile()); + } + } + + /** + * @dataProvider getErroredTemplates + */ + public function testTwigExceptionAddsFileAndLine($templates, $name, $line) + { + $loader = new Twig_Loader_Array($templates); + $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false)); + + $template = $twig->loadTemplate('index'); + + try { + $template->render(array()); + + $this->fail(); + } catch (Twig_Error_Runtime $e) { + $this->assertEquals(sprintf('Variable "foo" does not exist in "%s" at line %d.', $name, $line), $e->getMessage()); + $this->assertEquals($line, $e->getTemplateLine()); + $this->assertEquals($name, $e->getTemplateFile()); + } + + try { + $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo())); + + $this->fail(); + } catch (Twig_Error_Runtime $e) { + $this->assertEquals(sprintf('An exception has been thrown during the rendering of a template ("Runtime error...") in "%s" at line %d.', $name, $line), $e->getMessage()); + $this->assertEquals($line, $e->getTemplateLine()); + $this->assertEquals($name, $e->getTemplateFile()); + } + } + + public function getErroredTemplates() + { + return array( + // error occurs in a template + array( + array( + 'index' => "\n\n{{ foo.bar }}\n\n\n{{ 'foo' }}", + ), + 'index', 3, + ), + + // error occurs in an included template + array( + array( + 'index' => "{% include 'partial' %}", + 'partial' => '{{ foo.bar }}', + ), + 'partial', 1, + ), + + // error occurs in a parent block when called via parent() + array( + array( + 'index' => "{% extends 'base' %} + {% block content %} + {{ parent() }} + {% endblock %}", + 'base' => '{% block content %}{{ foo.bar }}{% endblock %}', + ), + 'base', 1, + ), + + // error occurs in a block from the child + array( + array( + 'index' => "{% extends 'base' %} + {% block content %} + {{ foo.bar }} + {% endblock %} + {% block foo %} + {{ foo.bar }} + {% endblock %}", + 'base' => '{% block content %}{% endblock %}', + ), + 'index', 3, + ), + ); + } +} + +class Twig_Tests_ErrorTest_Foo +{ + public function bar() + { + throw new Exception('Runtime error...'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php new file mode 100644 index 000000000..0489e91ad --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php @@ -0,0 +1,373 @@ +getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize($template, 'index')); + } + + public function getFailingTestsForAssignment() + { + return array( + array('{% set false = "foo" %}'), + array('{% set FALSE = "foo" %}'), + array('{% set true = "foo" %}'), + array('{% set TRUE = "foo" %}'), + array('{% set none = "foo" %}'), + array('{% set NONE = "foo" %}'), + array('{% set null = "foo" %}'), + array('{% set NULL = "foo" %}'), + array('{% set 3 = "foo" %}'), + array('{% set 1 + 2 = "foo" %}'), + array('{% set "bar" = "foo" %}'), + array('{% set %}{% endset %}'), + ); + } + + /** + * @dataProvider getTestsForArray + */ + public function testArrayExpression($template, $expected) + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $stream = $env->tokenize($template, 'index'); + $parser = new Twig_Parser($env); + + $this->assertEquals($expected, $parser->parse($stream)->getNode('body')->getNode(0)->getNode('expr')); + } + + /** + * @expectedException Twig_Error_Syntax + * @dataProvider getFailingTestsForArray + */ + public function testArraySyntaxError($template) + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize($template, 'index')); + } + + public function getFailingTestsForArray() + { + return array( + array('{{ [1, "a": "b"] }}'), + array('{{ {"a": "b", 2} }}'), + ); + } + + public function getTestsForArray() + { + return array( + // simple array + array('{{ [1, 2] }}', new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant(0, 1), + new Twig_Node_Expression_Constant(1, 1), + + new Twig_Node_Expression_Constant(1, 1), + new Twig_Node_Expression_Constant(2, 1), + ), 1), + ), + + // array with trailing , + array('{{ [1, 2, ] }}', new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant(0, 1), + new Twig_Node_Expression_Constant(1, 1), + + new Twig_Node_Expression_Constant(1, 1), + new Twig_Node_Expression_Constant(2, 1), + ), 1), + ), + + // simple hash + array('{{ {"a": "b", "b": "c"} }}', new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant('a', 1), + new Twig_Node_Expression_Constant('b', 1), + + new Twig_Node_Expression_Constant('b', 1), + new Twig_Node_Expression_Constant('c', 1), + ), 1), + ), + + // hash with trailing , + array('{{ {"a": "b", "b": "c", } }}', new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant('a', 1), + new Twig_Node_Expression_Constant('b', 1), + + new Twig_Node_Expression_Constant('b', 1), + new Twig_Node_Expression_Constant('c', 1), + ), 1), + ), + + // hash in an array + array('{{ [1, {"a": "b", "b": "c"}] }}', new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant(0, 1), + new Twig_Node_Expression_Constant(1, 1), + + new Twig_Node_Expression_Constant(1, 1), + new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant('a', 1), + new Twig_Node_Expression_Constant('b', 1), + + new Twig_Node_Expression_Constant('b', 1), + new Twig_Node_Expression_Constant('c', 1), + ), 1), + ), 1), + ), + + // array in a hash + array('{{ {"a": [1, 2], "b": "c"} }}', new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant('a', 1), + new Twig_Node_Expression_Array(array( + new Twig_Node_Expression_Constant(0, 1), + new Twig_Node_Expression_Constant(1, 1), + + new Twig_Node_Expression_Constant(1, 1), + new Twig_Node_Expression_Constant(2, 1), + ), 1), + new Twig_Node_Expression_Constant('b', 1), + new Twig_Node_Expression_Constant('c', 1), + ), 1), + ), + ); + } + + /** + * @expectedException Twig_Error_Syntax + */ + public function testStringExpressionDoesNotConcatenateTwoConsecutiveStrings() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0)); + $stream = $env->tokenize('{{ "a" "b" }}', 'index'); + $parser = new Twig_Parser($env); + + $parser->parse($stream); + } + + /** + * @dataProvider getTestsForString + */ + public function testStringExpression($template, $expected) + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0)); + $stream = $env->tokenize($template, 'index'); + $parser = new Twig_Parser($env); + + $this->assertEquals($expected, $parser->parse($stream)->getNode('body')->getNode(0)->getNode('expr')); + } + + public function getTestsForString() + { + return array( + array( + '{{ "foo" }}', new Twig_Node_Expression_Constant('foo', 1), + ), + array( + '{{ "foo #{bar}" }}', new Twig_Node_Expression_Binary_Concat( + new Twig_Node_Expression_Constant('foo ', 1), + new Twig_Node_Expression_Name('bar', 1), + 1 + ), + ), + array( + '{{ "foo #{bar} baz" }}', new Twig_Node_Expression_Binary_Concat( + new Twig_Node_Expression_Binary_Concat( + new Twig_Node_Expression_Constant('foo ', 1), + new Twig_Node_Expression_Name('bar', 1), + 1 + ), + new Twig_Node_Expression_Constant(' baz', 1), + 1 + ), + ), + + array( + '{{ "foo #{"foo #{bar} baz"} baz" }}', new Twig_Node_Expression_Binary_Concat( + new Twig_Node_Expression_Binary_Concat( + new Twig_Node_Expression_Constant('foo ', 1), + new Twig_Node_Expression_Binary_Concat( + new Twig_Node_Expression_Binary_Concat( + new Twig_Node_Expression_Constant('foo ', 1), + new Twig_Node_Expression_Name('bar', 1), + 1 + ), + new Twig_Node_Expression_Constant(' baz', 1), + 1 + ), + 1 + ), + new Twig_Node_Expression_Constant(' baz', 1), + 1 + ), + ), + ); + } + + /** + * @expectedException Twig_Error_Syntax + */ + public function testAttributeCallDoesNotSupportNamedArguments() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{{ foo.bar(name="Foo") }}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + */ + public function testMacroCallDoesNotSupportNamedArguments() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{% from _self import foo %}{% macro foo() %}{% endmacro %}{{ foo(name="Foo") }}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage An argument must be a name. Unexpected token "string" of value "a" ("name" expected) in "index" at line 1. + */ + public function testMacroDefinitionDoesNotSupportNonNameVariableName() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{% macro foo("a") %}{% endmacro %}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage A default value for an argument must be a constant (a boolean, a string, a number, or an array) in "index" at line 1 + * @dataProvider getMacroDefinitionDoesNotSupportNonConstantDefaultValues + */ + public function testMacroDefinitionDoesNotSupportNonConstantDefaultValues($template) + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize($template, 'index')); + } + + public function getMacroDefinitionDoesNotSupportNonConstantDefaultValues() + { + return array( + array('{% macro foo(name = "a #{foo} a") %}{% endmacro %}'), + array('{% macro foo(name = [["b", "a #{foo} a"]]) %}{% endmacro %}'), + ); + } + + /** + * @dataProvider getMacroDefinitionSupportsConstantDefaultValues + */ + public function testMacroDefinitionSupportsConstantDefaultValues($template) + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize($template, 'index')); + } + + public function getMacroDefinitionSupportsConstantDefaultValues() + { + return array( + array('{% macro foo(name = "aa") %}{% endmacro %}'), + array('{% macro foo(name = 12) %}{% endmacro %}'), + array('{% macro foo(name = true) %}{% endmacro %}'), + array('{% macro foo(name = ["a"]) %}{% endmacro %}'), + array('{% macro foo(name = [["a"]]) %}{% endmacro %}'), + array('{% macro foo(name = {a: "a"}) %}{% endmacro %}'), + array('{% macro foo(name = {a: {b: "a"}}) %}{% endmacro %}'), + ); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "cycl" function. Did you mean "cycle" in "index" at line 1? + */ + public function testUnknownFunction() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{{ cycl() }}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "foobar" function in "index" at line 1. + */ + public function testUnknownFunctionWithoutSuggestions() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{{ foobar() }}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "lowe" filter. Did you mean "lower" in "index" at line 1? + */ + public function testUnknownFilter() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{{ 1|lowe }}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "foobar" filter in "index" at line 1. + */ + public function testUnknownFilterWithoutSuggestions() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{{ 1|foobar }}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "nul" test. Did you mean "null" in "index" at line 1 + */ + public function testUnknownTest() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{{ 1 is nul }}', 'index')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "foobar" test in "index" at line 1. + */ + public function testUnknownTestWithoutSuggestions() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $parser = new Twig_Parser($env); + + $parser->parse($env->tokenize('{{ 1 is foobar }}', 'index')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php new file mode 100644 index 000000000..89937b785 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php @@ -0,0 +1,158 @@ +getMockBuilder('Twig_LoaderInterface')->getMock()); + + for ($i = 0; $i < 100; ++$i) { + $this->assertTrue(in_array(twig_random($env, $value), $expectedInArray, true)); // assertContains() would not consider the type + } + } + + public function getRandomFunctionTestData() + { + return array( + array(// array + array('apple', 'orange', 'citrus'), + array('apple', 'orange', 'citrus'), + ), + array(// Traversable + new ArrayObject(array('apple', 'orange', 'citrus')), + array('apple', 'orange', 'citrus'), + ), + array(// unicode string + 'Ä€é', + array('Ä', '€', 'é'), + ), + array(// numeric but string + '123', + array('1', '2', '3'), + ), + array(// integer + 5, + range(0, 5, 1), + ), + array(// float + 5.9, + range(0, 5, 1), + ), + array(// negative + -2, + array(0, -1, -2), + ), + ); + } + + public function testRandomFunctionWithoutParameter() + { + $max = mt_getrandmax(); + + for ($i = 0; $i < 100; ++$i) { + $val = twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $this->assertTrue(is_int($val) && $val >= 0 && $val <= $max); + } + } + + public function testRandomFunctionReturnsAsIs() + { + $this->assertSame('', twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), '')); + $this->assertSame('', twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('charset' => null)), '')); + + $instance = new stdClass(); + $this->assertSame($instance, twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), $instance)); + } + + /** + * @expectedException Twig_Error_Runtime + */ + public function testRandomFunctionOfEmptyArrayThrowsException() + { + twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), array()); + } + + public function testRandomFunctionOnNonUTF8String() + { + if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) { + $this->markTestSkipped('needs iconv or mbstring'); + } + + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->setCharset('ISO-8859-1'); + + $text = twig_convert_encoding('Äé', 'ISO-8859-1', 'UTF-8'); + for ($i = 0; $i < 30; ++$i) { + $rand = twig_random($twig, $text); + $this->assertTrue(in_array(twig_convert_encoding($rand, 'UTF-8', 'ISO-8859-1'), array('Ä', 'é'), true)); + } + } + + public function testReverseFilterOnNonUTF8String() + { + if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) { + $this->markTestSkipped('needs iconv or mbstring'); + } + + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->setCharset('ISO-8859-1'); + + $input = twig_convert_encoding('Äé', 'ISO-8859-1', 'UTF-8'); + $output = twig_convert_encoding(twig_reverse_filter($twig, $input), 'UTF-8', 'ISO-8859-1'); + + $this->assertEquals($output, 'éÄ'); + } + + public function testCustomEscaper() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $twig->getExtension('Twig_Extension_Core')->setEscaper('foo', 'foo_escaper_for_test'); + + $this->assertEquals('fooUTF-8', twig_escape_filter($twig, 'foo', 'foo')); + $this->assertEquals('UTF-8', twig_escape_filter($twig, null, 'foo')); + $this->assertEquals('42UTF-8', twig_escape_filter($twig, 42, 'foo')); + } + + /** + * @expectedException Twig_Error_Runtime + */ + public function testUnknownCustomEscaper() + { + twig_escape_filter(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), 'foo', 'bar'); + } + + public function testTwigFirst() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $this->assertEquals('a', twig_first($twig, 'abc')); + $this->assertEquals(1, twig_first($twig, array(1, 2, 3))); + $this->assertSame('', twig_first($twig, null)); + $this->assertSame('', twig_first($twig, '')); + } + + public function testTwigLast() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $this->assertEquals('c', twig_last($twig, 'abc')); + $this->assertEquals(3, twig_last($twig, array(1, 2, 3))); + $this->assertSame('', twig_last($twig, null)); + $this->assertSame('', twig_last($twig, '')); + } +} + +function foo_escaper_for_test(Twig_Environment $env, $string, $charset) +{ + return $string.$charset; +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php new file mode 100644 index 000000000..bfaa62b04 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php @@ -0,0 +1,220 @@ + 'Fabien', + 'obj' => new FooObject(), + 'arr' => array('obj' => new FooObject()), + ); + + self::$templates = array( + '1_basic1' => '{{ obj.foo }}', + '1_basic2' => '{{ name|upper }}', + '1_basic3' => '{% if name %}foo{% endif %}', + '1_basic4' => '{{ obj.bar }}', + '1_basic5' => '{{ obj }}', + '1_basic6' => '{{ arr.obj }}', + '1_basic7' => '{{ cycle(["foo","bar"], 1) }}', + '1_basic8' => '{{ obj.getfoobar }}{{ obj.getFooBar }}', + '1_basic9' => '{{ obj.foobar }}{{ obj.fooBar }}', + '1_basic' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}', + '1_layout' => '{% block content %}{% endblock %}', + '1_child' => "{% extends \"1_layout\" %}\n{% block content %}\n{{ \"a\"|json_encode }}\n{% endblock %}", + ); + } + + /** + * @expectedException Twig_Sandbox_SecurityError + * @expectedExceptionMessage Filter "json_encode" is not allowed in "1_child" at line 3. + */ + public function testSandboxWithInheritance() + { + $twig = $this->getEnvironment(true, array(), self::$templates, array('block')); + $twig->loadTemplate('1_child')->render(array()); + } + + public function testSandboxGloballySet() + { + $twig = $this->getEnvironment(false, array(), self::$templates); + $this->assertEquals('FOO', $twig->loadTemplate('1_basic')->render(self::$params), 'Sandbox does nothing if it is disabled globally'); + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('1_basic1')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception if an unallowed method is called'); + } catch (Twig_Sandbox_SecurityError $e) { + } + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('1_basic2')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception if an unallowed filter is called'); + } catch (Twig_Sandbox_SecurityError $e) { + } + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('1_basic3')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception if an unallowed tag is used in the template'); + } catch (Twig_Sandbox_SecurityError $e) { + } + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('1_basic4')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception if an unallowed property is called in the template'); + } catch (Twig_Sandbox_SecurityError $e) { + } + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('1_basic5')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception if an unallowed method (__toString()) is called in the template'); + } catch (Twig_Sandbox_SecurityError $e) { + } + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('1_basic6')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception if an unallowed method (__toString()) is called in the template'); + } catch (Twig_Sandbox_SecurityError $e) { + } + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('1_basic7')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception if an unallowed function is called in the template'); + } catch (Twig_Sandbox_SecurityError $e) { + } + + $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => 'foo')); + FooObject::reset(); + $this->assertEquals('foo', $twig->loadTemplate('1_basic1')->render(self::$params), 'Sandbox allow some methods'); + $this->assertEquals(1, FooObject::$called['foo'], 'Sandbox only calls method once'); + + $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => '__toString')); + FooObject::reset(); + $this->assertEquals('foo', $twig->loadTemplate('1_basic5')->render(self::$params), 'Sandbox allow some methods'); + $this->assertEquals(1, FooObject::$called['__toString'], 'Sandbox only calls method once'); + + $twig = $this->getEnvironment(false, array(), self::$templates); + FooObject::reset(); + $this->assertEquals('foo', $twig->loadTemplate('1_basic5')->render(self::$params), 'Sandbox allows __toString when sandbox disabled'); + $this->assertEquals(1, FooObject::$called['__toString'], 'Sandbox only calls method once'); + + $twig = $this->getEnvironment(true, array(), self::$templates, array(), array('upper')); + $this->assertEquals('FABIEN', $twig->loadTemplate('1_basic2')->render(self::$params), 'Sandbox allow some filters'); + + $twig = $this->getEnvironment(true, array(), self::$templates, array('if')); + $this->assertEquals('foo', $twig->loadTemplate('1_basic3')->render(self::$params), 'Sandbox allow some tags'); + + $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array(), array('FooObject' => 'bar')); + $this->assertEquals('bar', $twig->loadTemplate('1_basic4')->render(self::$params), 'Sandbox allow some properties'); + + $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array(), array(), array('cycle')); + $this->assertEquals('bar', $twig->loadTemplate('1_basic7')->render(self::$params), 'Sandbox allow some functions'); + + foreach (array('getfoobar', 'getFoobar', 'getFooBar') as $name) { + $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => $name)); + FooObject::reset(); + $this->assertEquals('foobarfoobar', $twig->loadTemplate('1_basic8')->render(self::$params), 'Sandbox allow methods in a case-insensitive way'); + $this->assertEquals(2, FooObject::$called['getFooBar'], 'Sandbox only calls method once'); + + $this->assertEquals('foobarfoobar', $twig->loadTemplate('1_basic9')->render(self::$params), 'Sandbox allow methods via shortcut names (ie. without get/set)'); + } + } + + public function testSandboxLocallySetForAnInclude() + { + self::$templates = array( + '2_basic' => '{{ obj.foo }}{% include "2_included" %}{{ obj.foo }}', + '2_included' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}', + ); + + $twig = $this->getEnvironment(false, array(), self::$templates); + $this->assertEquals('fooFOOfoo', $twig->loadTemplate('2_basic')->render(self::$params), 'Sandbox does nothing if disabled globally and sandboxed not used for the include'); + + self::$templates = array( + '3_basic' => '{{ obj.foo }}{% sandbox %}{% include "3_included" %}{% endsandbox %}{{ obj.foo }}', + '3_included' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}', + ); + + $twig = $this->getEnvironment(true, array(), self::$templates); + try { + $twig->loadTemplate('3_basic')->render(self::$params); + $this->fail('Sandbox throws a SecurityError exception when the included file is sandboxed'); + } catch (Twig_Sandbox_SecurityError $e) { + } + } + + public function testMacrosInASandbox() + { + $twig = $this->getEnvironment(true, array('autoescape' => 'html'), array('index' => <<{{ text }}

    {% endmacro %} + +{{- macros.test('username') }} +EOF + ), array('macro', 'import'), array('escape')); + + $this->assertEquals('

    username

    ', $twig->loadTemplate('index')->render(array())); + } + + protected function getEnvironment($sandboxed, $options, $templates, $tags = array(), $filters = array(), $methods = array(), $properties = array(), $functions = array()) + { + $loader = new Twig_Loader_Array($templates); + $twig = new Twig_Environment($loader, array_merge(array('debug' => true, 'cache' => false, 'autoescape' => false), $options)); + $policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions); + $twig->addExtension(new Twig_Extension_Sandbox($policy, $sandboxed)); + + return $twig; + } +} + +class FooObject +{ + public static $called = array('__toString' => 0, 'foo' => 0, 'getFooBar' => 0); + + public $bar = 'bar'; + + public static function reset() + { + self::$called = array('__toString' => 0, 'foo' => 0, 'getFooBar' => 0); + } + + public function __toString() + { + ++self::$called['__toString']; + + return 'foo'; + } + + public function foo() + { + ++self::$called['foo']; + + return 'foo'; + } + + public function getFooBar() + { + ++self::$called['getFooBar']; + + return 'foobar'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php new file mode 100644 index 000000000..d9c02c077 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php @@ -0,0 +1,63 @@ +tmpDir = sys_get_temp_dir().'/TwigTests'; + if (!file_exists($this->tmpDir)) { + @mkdir($this->tmpDir, 0777, true); + } + + if (!is_writable($this->tmpDir)) { + $this->markTestSkipped(sprintf('Unable to run the tests as "%s" is not writable.', $this->tmpDir)); + } + + $this->env = new Twig_Environment(new Twig_Loader_Array(array('index' => 'index', 'index2' => 'index2')), array('cache' => $this->tmpDir)); + } + + protected function tearDown() + { + Twig_Tests_FilesystemHelper::removeDir($this->tmpDir); + } + + /** + * @group legacy + */ + public function testWritingCacheFiles() + { + $name = 'index'; + $this->env->loadTemplate($name); + $cacheFileName = $this->env->getCacheFilename($name); + + $this->assertTrue(file_exists($cacheFileName), 'Cache file does not exist.'); + } + + /** + * @group legacy + */ + public function testClearingCacheFiles() + { + $name = 'index2'; + $this->env->loadTemplate($name); + $cacheFileName = $this->env->getCacheFilename($name); + + $this->assertTrue(file_exists($cacheFileName), 'Cache file does not exist.'); + $this->env->clearCacheFiles(); + $this->assertFalse(file_exists($cacheFileName), 'Cache file was not cleared.'); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php new file mode 100644 index 000000000..b310a5be3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php @@ -0,0 +1,51 @@ +assertSame($strategy, Twig_FileExtensionEscapingStrategy::guess($filename)); + } + + public function getGuessData() + { + return array( + // default + array('html', 'foo.html'), + array('html', 'foo.html.twig'), + array('html', 'foo'), + array('html', 'foo.bar.twig'), + array('html', 'foo.txt/foo'), + array('html', 'foo.txt/foo.js/'), + + // css + array('css', 'foo.css'), + array('css', 'foo.css.twig'), + array('css', 'foo.twig.css'), + array('css', 'foo.js.css'), + array('css', 'foo.js.css.twig'), + + // js + array('js', 'foo.js'), + array('js', 'foo.js.twig'), + array('js', 'foo.txt/foo.js'), + array('js', 'foo.txt.twig/foo.js'), + + // txt + array(false, 'foo.txt'), + array(false, 'foo.txt.twig'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php new file mode 100644 index 000000000..0e315e8f7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php @@ -0,0 +1,30 @@ + $fileInfo) { + if ($iterator->isDot()) { + continue; + } + + if ($fileInfo->isDir()) { + rmdir($filename); + } else { + unlink($filename); + } + } + rmdir($dir); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/block.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/block.test new file mode 100644 index 000000000..4b38b5b6e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/block.test @@ -0,0 +1,21 @@ +--TEST-- +blocks and autoescape +--TEMPLATE-- +{{ include('unrelated.txt.twig') -}} +{{ include('template.html.twig') -}} +--TEMPLATE(unrelated.txt.twig)-- +{% block content %}{% endblock %} +--TEMPLATE(template.html.twig)-- +{% extends 'parent.html.twig' %} +{% block content %} +{{ br -}} +{% endblock %} +--TEMPLATE(parent.html.twig)-- +{% set _content = block('content')|raw %} +{{ _content|raw }} +--DATA-- +return array('br' => '
    ') +--CONFIG-- +return array('autoescape' => 'filename') +--EXPECT-- +<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/filename.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/filename.test new file mode 100644 index 000000000..b091ad34d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/filename.test @@ -0,0 +1,18 @@ +--TEST-- +"filename" autoescape strategy +--TEMPLATE-- +{{ br -}} +{{ include('index.html.twig') -}} +{{ include('index.txt.twig') -}} +--TEMPLATE(index.html.twig)-- +{{ br -}} +--TEMPLATE(index.txt.twig)-- +{{ br -}} +--DATA-- +return array('br' => '
    ') +--CONFIG-- +return array('autoescape' => 'filename') +--EXPECT-- +<br /> +<br /> +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html new file mode 100644 index 000000000..cb0dbe444 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/base.html @@ -0,0 +1 @@ +{% block content %}{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html new file mode 100644 index 000000000..df57c822f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/index.html @@ -0,0 +1,7 @@ +{% extends 'base.html' %} +{% block content %} + {{ foo.bar }} +{% endblock %} +{% block foo %} + {{ foo.bar }} +{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/child_contents_outside_blocks.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/child_contents_outside_blocks.test new file mode 100644 index 000000000..a3f0b50ff --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/child_contents_outside_blocks.test @@ -0,0 +1,15 @@ +--TEST-- +Exception for child templates defining contents outside blocks defined by parent +--TEMPLATE-- +{% extends 'base.twig' %} + +Content outside a block. + +{% block sidebar %} + Content inside a block. +{% endblock %} +--TEMPLATE(base.twig)-- +{% block sidebar %} +{% endblock %} +--EXCEPTION-- +Twig_Error_Syntax: A template that extends another one cannot include contents outside Twig blocks. Did you forget to put the contents inside a {% block %} tag in "index.twig" at line 3? diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test new file mode 100644 index 000000000..7ff2eedb7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test @@ -0,0 +1,18 @@ +--TEST-- +Exception for multiline array with undefined variable +--TEMPLATE-- +{% set foo = { + foo: 'foo', + bar: 'bar', + + + foobar: foobar, + + + + foo2: foo2, +} %} +--DATA-- +return array('foobar' => 'foobar') +--EXCEPTION-- +Twig_Error_Runtime: Variable "foo2" does not exist in "index.twig" at line 11. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test new file mode 100644 index 000000000..c425069bf --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test @@ -0,0 +1,18 @@ +--TEST-- +Exception for multiline array with undefined variable +--TEMPLATE-- +{% set foo = { + foo: 'foo', + bar: 'bar', + + + foobar: foobar, + + + + foo2: foo2, +} %} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Runtime: Variable "foobar" does not exist in "index.twig" at line 7. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test new file mode 100644 index 000000000..2f94a5ee9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test @@ -0,0 +1,12 @@ +--TEST-- +Exception for multile function with undefined variable +--TEMPLATE-- +{{ include('foo', + with_context=with_context +) }} +--TEMPLATE(foo)-- +Foo +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Runtime: Variable "with_context" does not exist in "index.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test new file mode 100644 index 000000000..64761fcf1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test @@ -0,0 +1,9 @@ +--TEST-- +Exception for multiline function with unknown argument +--TEMPLATE-- +{{ include('foo', + with_context=True, + invalid=False +) }} +--EXCEPTION-- +Twig_Error_Syntax: Unknown argument "invalid" for function "include(template, variables, with_context, ignore_missing, sandboxed)" in "index.twig" at line 4. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test new file mode 100644 index 000000000..7b3b1daf9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test @@ -0,0 +1,12 @@ +--TEST-- +Exception for multiline tag with undefined variable +--TEMPLATE-- +{% include 'foo' + with vars +%} +--TEMPLATE(foo)-- +Foo +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Runtime: Variable "vars" does not exist in "index.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test new file mode 100644 index 000000000..9ca418b22 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test @@ -0,0 +1,10 @@ +--TEST-- +Exception for syntax error in reused template +--TEMPLATE-- +{% use 'foo.twig' %} +--TEMPLATE(foo.twig)-- +{% block bar %} + {% do node.data = 5 %} +{% endblock %} +--EXCEPTION-- +Twig_Error_Syntax: Unexpected token "operator" of value "=" ("end of statement block" expected) in "foo.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test new file mode 100644 index 000000000..2c35ad564 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test @@ -0,0 +1,20 @@ +--TEST-- +Exception for an unclosed tag +--TEMPLATE-- +{% block foo %} + {% if foo %} + + + + + {% for i in fo %} + + + + {% endfor %} + + + +{% endblock %} +--EXCEPTION-- +Twig_Error_Syntax: Unexpected "endblock" tag (expecting closing tag for the "if" tag defined near line 4) in "index.twig" at line 16. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test new file mode 100644 index 000000000..c8e7a0973 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test @@ -0,0 +1,8 @@ +--TEST-- +Exception for an undefined parent +--TEMPLATE-- +{% extends 'foo.html' %} + +{% set foo = "foo" %} +--EXCEPTION-- +Twig_Error_Loader: Template "foo.html" is not defined in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test new file mode 100644 index 000000000..1992510b2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test @@ -0,0 +1,15 @@ +--TEST-- +Exception for an undefined template in a child template +--TEMPLATE-- +{% extends 'base.twig' %} + +{% block sidebar %} + {{ include('include.twig') }} +{% endblock %} +--TEMPLATE(base.twig)-- +{% block sidebar %} +{% endblock %} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Loader: Template "include.twig" is not defined in "index.twig" at line 5. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test new file mode 100644 index 000000000..6679fbe13 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test @@ -0,0 +1,9 @@ +--TEST-- +Exception for an undefined trait +--TEMPLATE-- +{% use 'foo' with foobar as bar %} +--TEMPLATE(foo)-- +{% block bar %} +{% endblock %} +--EXCEPTION-- +Twig_Error_Runtime: Block "foobar" is not defined in trait "foo" in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test new file mode 100644 index 000000000..c69b1192f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test @@ -0,0 +1,61 @@ +--TEST-- +Twig supports array notation +--TEMPLATE-- +{# empty array #} +{{ []|join(',') }} + +{{ [1, 2]|join(',') }} +{{ ['foo', "bar"]|join(',') }} +{{ {0: 1, 'foo': 'bar'}|join(',') }} +{{ {0: 1, 'foo': 'bar'}|keys|join(',') }} + +{{ {0: 1, foo: 'bar'}|join(',') }} +{{ {0: 1, foo: 'bar'}|keys|join(',') }} + +{# nested arrays #} +{% set a = [1, 2, [1, 2], {'foo': {'foo': 'bar'}}] %} +{{ a[2]|join(',') }} +{{ a[3]["foo"]|join(',') }} + +{# works even if [] is used inside the array #} +{{ [foo[bar]]|join(',') }} + +{# elements can be any expression #} +{{ ['foo'|upper, bar|upper, bar == foo]|join(',') }} + +{# arrays can have a trailing , like in PHP #} +{{ + [ + 1, + 2, + ]|join(',') +}} + +{# keys can be any expression #} +{% set a = 1 %} +{% set b = "foo" %} +{% set ary = { (a): 'a', (b): 'b', 'c': 'c', (a ~ b): 'd' } %} +{{ ary|keys|join(',') }} +{{ ary|join(',') }} +--DATA-- +return array('bar' => 'bar', 'foo' => array('bar' => 'bar')) +--EXPECT-- +1,2 +foo,bar +1,bar +0,foo + +1,bar +0,foo + +1,2 +bar + +bar + +FOO,BAR, + +1,2 + +1,foo,c,1foo +a,b,c,d diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test new file mode 100644 index 000000000..f3df328fe --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test @@ -0,0 +1,14 @@ +--TEST-- +Twig supports method calls +--TEMPLATE-- +{{ items.foo }} +{{ items['foo'] }} +{{ items[foo] }} +{{ items[items[foo]] }} +--DATA-- +return array('foo' => 'bar', 'items' => array('foo' => 'bar', 'bar' => 'foo')) +--EXPECT-- +bar +bar +foo +bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test new file mode 100644 index 000000000..f5e68456d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test @@ -0,0 +1,46 @@ +--TEST-- +Twig supports binary operations (+, -, *, /, ~, %, and, or) +--TEMPLATE-- +{{ 1 + 1 }} +{{ 2 - 1 }} +{{ 2 * 2 }} +{{ 2 / 2 }} +{{ 3 % 2 }} +{{ 1 and 1 }} +{{ 1 and 0 }} +{{ 0 and 1 }} +{{ 0 and 0 }} +{{ 1 or 1 }} +{{ 1 or 0 }} +{{ 0 or 1 }} +{{ 0 or 0 }} +{{ 0 or 1 and 0 }} +{{ 1 or 0 and 1 }} +{{ "foo" ~ "bar" }} +{{ foo ~ "bar" }} +{{ "foo" ~ bar }} +{{ foo ~ bar }} +{{ 20 // 7 }} +--DATA-- +return array('foo' => 'bar', 'bar' => 'foo') +--EXPECT-- +2 +1 +4 +1 +1 +1 + + + +1 +1 +1 + + +1 +foobar +barbar +foofoo +barfoo +2 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test new file mode 100644 index 000000000..74fe6cabb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test @@ -0,0 +1,14 @@ +--TEST-- +Twig supports bitwise operations +--TEMPLATE-- +{{ 1 b-and 5 }} +{{ 1 b-or 5 }} +{{ 1 b-xor 5 }} +{{ (1 and 0 b-or 0) is same as(1 and (0 b-or 0)) ? 'ok' : 'ko' }} +--DATA-- +return array() +--EXPECT-- +1 +5 +4 +ok diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test new file mode 100644 index 000000000..726b85075 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test @@ -0,0 +1,14 @@ +--TEST-- +Twig supports comparison operators (==, !=, <, >, >=, <=) +--TEMPLATE-- +{{ 1 > 2 }}/{{ 1 > 1 }}/{{ 1 >= 2 }}/{{ 1 >= 1 }} +{{ 1 < 2 }}/{{ 1 < 1 }}/{{ 1 <= 2 }}/{{ 1 <= 1 }} +{{ 1 == 1 }}/{{ 1 == 2 }} +{{ 1 != 1 }}/{{ 1 != 2 }} +--DATA-- +return array() +--EXPECT-- +///1 +1//1/1 +1/ +/1 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test new file mode 100644 index 000000000..238dd2790 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test @@ -0,0 +1,17 @@ +--TEST-- +Twig supports the "divisible by" operator +--TEMPLATE-- +{{ 8 is divisible by(2) ? 'OK' }} +{{ 8 is not divisible by(3) ? 'OK' }} +{{ 8 is divisible by (2) ? 'OK' }} +{{ 8 is not + divisible + by + (3) ? 'OK' }} +--DATA-- +return array() +--EXPECT-- +OK +OK +OK +OK diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test new file mode 100644 index 000000000..9cd0676ce --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test @@ -0,0 +1,20 @@ +--TEST-- +Twig supports the .. operator +--TEMPLATE-- +{% for i in 0..10 %}{{ i }} {% endfor %} + +{% for letter in 'a'..'z' %}{{ letter }} {% endfor %} + +{% for letter in 'a'|upper..'z'|upper %}{{ letter }} {% endfor %} + +{% for i in foo[0]..foo[1] %}{{ i }} {% endfor %} + +{% for i in 0 + 1 .. 10 - 1 %}{{ i }} {% endfor %} +--DATA-- +return array('foo' => array(1, 10)) +--EXPECT-- +0 1 2 3 4 5 6 7 8 9 10 +a b c d e f g h i j k l m n o p q r s t u v w x y z +A B C D E F G H I J K L M N O P Q R S T U V W X Y Z +1 2 3 4 5 6 7 8 9 10 +1 2 3 4 5 6 7 8 9 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test new file mode 100644 index 000000000..9ad5e5e8e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test @@ -0,0 +1,26 @@ +--TEST-- +Twig supports the "ends with" operator +--TEMPLATE-- +{{ 'foo' ends with 'o' ? 'OK' : 'KO' }} +{{ not ('foo' ends with 'f') ? 'OK' : 'KO' }} +{{ not ('foo' ends with 'foowaytoolong') ? 'OK' : 'KO' }} +{{ 'foo' ends with '' ? 'OK' : 'KO' }} +{{ '1' ends with true ? 'OK' : 'KO' }} +{{ 1 ends with true ? 'OK' : 'KO' }} +{{ 0 ends with false ? 'OK' : 'KO' }} +{{ '' ends with false ? 'OK' : 'KO' }} +{{ false ends with false ? 'OK' : 'KO' }} +{{ false ends with '' ? 'OK' : 'KO' }} +--DATA-- +return array() +--EXPECT-- +OK +OK +OK +OK +KO +KO +KO +KO +KO +KO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test new file mode 100644 index 000000000..79f8e0b0d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test @@ -0,0 +1,8 @@ +--TEST-- +Twig supports grouping of expressions +--TEMPLATE-- +{{ (2 + 2) / 2 }} +--DATA-- +return array() +--EXPECT-- +2 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test new file mode 100644 index 000000000..7ae3bae95 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test @@ -0,0 +1,22 @@ +--TEST-- +Twig supports literals +--TEMPLATE-- +1 {{ true }} +2 {{ TRUE }} +3 {{ false }} +4 {{ FALSE }} +5 {{ none }} +6 {{ NONE }} +7 {{ null }} +8 {{ NULL }} +--DATA-- +return array() +--EXPECT-- +1 1 +2 1 +3 +4 +5 +6 +7 +8 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test new file mode 100644 index 000000000..1a27a2d6f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test @@ -0,0 +1,27 @@ +--TEST-- +Twig supports __call() for attributes +--TEMPLATE-- +{{ foo.foo }} +{{ foo.bar }} +--DATA-- +class TestClassForMagicCallAttributes +{ + public function getBar() + { + return 'bar_from_getbar'; + } + + public function __call($method, $arguments) + { + if ('foo' === $method) { + return 'foo_from_call'; + } + + return false; + } +} + +return array('foo' => new TestClassForMagicCallAttributes()) +--EXPECT-- +foo_from_call +bar_from_getbar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test new file mode 100644 index 000000000..b6c771657 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test @@ -0,0 +1,12 @@ +--TEST-- +Twig supports the "matches" operator +--TEMPLATE-- +{{ 'foo' matches '/o/' ? 'OK' : 'KO' }} +{{ 'foo' matches '/^fo/' ? 'OK' : 'KO' }} +{{ 'foo' matches '/O/i' ? 'OK' : 'KO' }} +--DATA-- +return array() +--EXPECT-- +OK +OK +OK diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test new file mode 100644 index 000000000..5f801e635 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test @@ -0,0 +1,28 @@ +--TEST-- +Twig supports method calls +--TEMPLATE-- +{{ items.foo.foo }} +{{ items.foo.getFoo() }} +{{ items.foo.bar }} +{{ items.foo['bar'] }} +{{ items.foo.bar('a', 43) }} +{{ items.foo.bar(foo) }} +{{ items.foo.self.foo() }} +{{ items.foo.is }} +{{ items.foo.in }} +{{ items.foo.not }} +--DATA-- +return array('foo' => 'bar', 'items' => array('foo' => new TwigTestFoo(), 'bar' => 'foo')) +--CONFIG-- +return array('strict_variables' => false) +--EXPECT-- +foo +foo +bar + +bar_a-43 +bar_bar +foo +is +in +not diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test new file mode 100644 index 000000000..1853b1b06 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test @@ -0,0 +1,18 @@ +--TEST-- +Twig manages negative numbers correctly +--TEMPLATE-- +{{ -1 }} +{{ - 1 }} +{{ 5 - 1 }} +{{ 5-1 }} +{{ 5 + -1 }} +{{ 5 + - 1 }} +--DATA-- +return array() +--EXPECT-- +-1 +-1 +4 +4 +4 +4 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test new file mode 100644 index 000000000..fe29d08bb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test @@ -0,0 +1,16 @@ +--TEST-- +Twig allows to use named operators as variable names +--TEMPLATE-- +{% for match in matches %} + {{- match }} +{% endfor %} +{{ in }} +{{ is }} +--DATA-- +return array('matches' => array(1, 2, 3), 'in' => 'in', 'is' => 'is') +--EXPECT-- +1 +2 +3 +in +is diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test new file mode 100644 index 000000000..542c35046 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test @@ -0,0 +1,22 @@ +--TEST-- +Twig parses postfix expressions +--TEMPLATE-- +{% import _self as macros %} + +{% macro foo() %}foo{% endmacro %} + +{{ 'a' }} +{{ 'a'|upper }} +{{ ('a')|upper }} +{{ -1|upper }} +{{ macros.foo() }} +{{ (macros).foo() }} +--DATA-- +return array(); +--EXPECT-- +a +A +A +-1 +foo +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test new file mode 100644 index 000000000..601201deb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test @@ -0,0 +1,21 @@ +--TEST-- +Twig supports the "same as" operator +--TEMPLATE-- +{{ 1 is same as(1) ? 'OK' }} +{{ 1 is not same as(true) ? 'OK' }} +{{ 1 is same as(1) ? 'OK' }} +{{ 1 is not same as(true) ? 'OK' }} +{{ 1 is same as (1) ? 'OK' }} +{{ 1 is not + same + as + (true) ? 'OK' }} +--DATA-- +return array() +--EXPECT-- +OK +OK +OK +OK +OK +OK diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test new file mode 100644 index 000000000..75d331e90 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test @@ -0,0 +1,27 @@ +--TEST-- +Twig supports the "starts with" operator +--TEMPLATE-- +{{ 'foo' starts with 'f' ? 'OK' : 'KO' }} +{{ not ('foo' starts with 'oo') ? 'OK' : 'KO' }} +{{ not ('foo' starts with 'foowaytoolong') ? 'OK' : 'KO' }} +{{ 'foo' starts with 'f' ? 'OK' : 'KO' }} +{{ 'foo' starts +with 'f' ? 'OK' : 'KO' }} +{{ 'foo' starts with '' ? 'OK' : 'KO' }} +{{ '1' starts with true ? 'OK' : 'KO' }} +{{ '' starts with false ? 'OK' : 'KO' }} +{{ 'a' starts with false ? 'OK' : 'KO' }} +{{ false starts with '' ? 'OK' : 'KO' }} +--DATA-- +return array() +--EXPECT-- +OK +OK +OK +OK +OK +OK +KO +KO +KO +KO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test new file mode 100644 index 000000000..a9116613e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test @@ -0,0 +1,10 @@ +--TEST-- +Twig supports string interpolation +--TEMPLATE-- +{{ "foo #{"foo #{bar} baz"} baz" }} +{{ "foo #{bar}#{bar} baz" }} +--DATA-- +return array('bar' => 'BAR'); +--EXPECT-- +foo foo BAR baz baz +foo BARBAR baz diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test new file mode 100644 index 000000000..0e6fa96e2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test @@ -0,0 +1,18 @@ +--TEST-- +Twig supports the ternary operator +--TEMPLATE-- +{{ 1 ? 'YES' : 'NO' }} +{{ 0 ? 'YES' : 'NO' }} +{{ 0 ? 'YES' : (1 ? 'YES1' : 'NO1') }} +{{ 0 ? 'YES' : (0 ? 'YES1' : 'NO1') }} +{{ 1 == 1 ? 'foo
    ':'' }} +{{ foo ~ (bar ? ('-' ~ bar) : '') }} +--DATA-- +return array('foo' => 'foo', 'bar' => 'bar') +--EXPECT-- +YES +NO +YES1 +NO1 +foo
    +foo-bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test new file mode 100644 index 000000000..fdc660fc5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test @@ -0,0 +1,10 @@ +--TEST-- +Twig supports the ternary operator +--TEMPLATE-- +{{ 1 ? 'YES' }} +{{ 0 ? 'YES' }} +--DATA-- +return array() +--EXPECT-- +YES + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test new file mode 100644 index 000000000..9057e8370 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test @@ -0,0 +1,10 @@ +--TEST-- +Twig supports the ternary operator +--TEMPLATE-- +{{ 'YES' ?: 'NO' }} +{{ 0 ?: 'NO' }} +--DATA-- +return array() +--EXPECT-- +YES +NO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test new file mode 100644 index 000000000..0eaabb446 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test @@ -0,0 +1,8 @@ +--TEST-- +Twig does not allow to use two-word named operators as variable names +--TEMPLATE-- +{{ starts with }} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Syntax: Unexpected token "operator" of value "starts with" in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test new file mode 100644 index 000000000..b79219a2a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test @@ -0,0 +1,12 @@ +--TEST-- +Twig supports unary operators (not, -, +) +--TEMPLATE-- +{{ not 1 }}/{{ not 0 }} +{{ +1 + 1 }}/{{ -1 - 1 }} +{{ not (false or true) }} +--DATA-- +return array() +--EXPECT-- +/1 +2/-2 + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test new file mode 100644 index 000000000..ad84a9c26 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test @@ -0,0 +1,22 @@ +--TEST-- +Twig manages negative numbers as default parameters +--TEMPLATE-- +{% import _self as macros %} +{{ macros.negative_number1() }} +{{ macros.negative_number2() }} +{{ macros.negative_number3() }} +{{ macros.positive_number1() }} +{{ macros.positive_number2() }} +{% macro negative_number1(nb=-1) %}{{ nb }}{% endmacro %} +{% macro negative_number2(nb = --1) %}{{ nb }}{% endmacro %} +{% macro negative_number3(nb = - 1) %}{{ nb }}{% endmacro %} +{% macro positive_number1(nb = +1) %}{{ nb }}{% endmacro %} +{% macro positive_number2(nb = ++1) %}{{ nb }}{% endmacro %} +--DATA-- +return array() +--EXPECT-- +-1 +1 +-1 +1 +1 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test new file mode 100644 index 000000000..cc6eef8d2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test @@ -0,0 +1,14 @@ +--TEST-- +Twig unary operators precedence +--TEMPLATE-- +{{ -1 - 1 }} +{{ -1 - -1 }} +{{ -1 * -1 }} +{{ 4 / -1 * 5 }} +--DATA-- +return array() +--EXPECT-- +-2 +0 +1 +-20 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test new file mode 100644 index 000000000..27e93fd63 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test @@ -0,0 +1,30 @@ +--TEST-- +"abs" filter +--TEMPLATE-- +{{ (-5.5)|abs }} +{{ (-5)|abs }} +{{ (-0)|abs }} +{{ 0|abs }} +{{ 5|abs }} +{{ 5.5|abs }} +{{ number1|abs }} +{{ number2|abs }} +{{ number3|abs }} +{{ number4|abs }} +{{ number5|abs }} +{{ number6|abs }} +--DATA-- +return array('number1' => -5.5, 'number2' => -5, 'number3' => -0, 'number4' => 0, 'number5' => 5, 'number6' => 5.5) +--EXPECT-- +5.5 +5 +0 +0 +5 +5.5 +5.5 +5 +0 +0 +5 +5.5 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test new file mode 100644 index 000000000..cb6de7f97 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test @@ -0,0 +1,31 @@ +--TEST-- +"batch" filter +--TEMPLATE-- +{% for row in items|batch(3) %} +
    + {% for column in row %} +
    {{ column }}
    + {% endfor %} +
    +{% endfor %} +--DATA-- +return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j')) +--EXPECT-- +
    +
    a
    +
    b
    +
    c
    +
    +
    +
    d
    +
    e
    +
    f
    +
    +
    +
    g
    +
    h
    +
    i
    +
    +
    +
    j
    +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test new file mode 100644 index 000000000..e2ec4beb2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test @@ -0,0 +1,29 @@ +--TEST-- +"batch" filter +--TEMPLATE-- +{% for row in items|batch(3.1) %} +
    + {% for column in row %} +
    {{ column }}
    + {% endfor %} +
    +{% endfor %} +--DATA-- +return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j')) +--EXPECT-- +
    +
    a
    +
    b
    +
    c
    +
    d
    +
    +
    +
    e
    +
    f
    +
    g
    +
    h
    +
    +
    +
    i
    +
    j
    +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test new file mode 100644 index 000000000..af996f246 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test @@ -0,0 +1,37 @@ +--TEST-- +"batch" filter +--TEMPLATE-- + +{% for row in items|batch(3, '') %} + + {% for column in row %} + + {% endfor %} + +{% endfor %} +
    {{ column }}
    +--DATA-- +return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j')) +--EXPECT-- + + + + + + + + + + + + + + + + + + + + + +
    abc
    def
    ghi
    j
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test new file mode 100644 index 000000000..72483f4b5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test @@ -0,0 +1,33 @@ +--TEST-- +"batch" filter +--TEMPLATE-- +{% for row in items|batch(3, 'fill') %} +
    + {% for column in row %} +
    {{ column }}
    + {% endfor %} +
    +{% endfor %} +--DATA-- +return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l')) +--EXPECT-- +
    +
    a
    +
    b
    +
    c
    +
    +
    +
    d
    +
    e
    +
    f
    +
    +
    +
    g
    +
    h
    +
    i
    +
    +
    +
    j
    +
    k
    +
    l
    +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test new file mode 100644 index 000000000..746295f1b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test @@ -0,0 +1,37 @@ +--TEST-- +"batch" filter +--TEMPLATE-- + +{% for row in items|batch(3, 'fill') %} + + {% for column in row %} + + {% endfor %} + +{% endfor %} +
    {{ column }}
    +--DATA-- +return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j')) +--EXPECT-- + + + + + + + + + + + + + + + + + + + + + +
    abc
    def
    ghi
    jfillfill
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test new file mode 100644 index 000000000..6015380e2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test @@ -0,0 +1,10 @@ +--TEST-- +"batch" filter preserves array keys +--TEMPLATE-- +{{ {'foo': 'bar', 'key': 'value'}|batch(4)|first|keys|join(',') }} +{{ {'foo': 'bar', 'key': 'value'}|batch(4, 'fill')|first|keys|join(',') }} +--DATA-- +return array() +--EXPECT-- +foo,key +foo,key,0,1 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test new file mode 100644 index 000000000..b9c058d6b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test @@ -0,0 +1,10 @@ +--TEST-- +"batch" filter with zero elements +--TEMPLATE-- +{{ []|batch(3)|length }} +{{ []|batch(3, 'fill')|length }} +--DATA-- +return array() +--EXPECT-- +0 +0 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test new file mode 100644 index 000000000..380b04bb8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test @@ -0,0 +1,10 @@ +--TEST-- +"convert_encoding" filter +--CONDITION-- +function_exists('iconv') || function_exists('mb_convert_encoding') +--TEMPLATE-- +{{ "愛していますか?"|convert_encoding('ISO-2022-JP', 'UTF-8')|convert_encoding('UTF-8', 'ISO-2022-JP') }} +--DATA-- +return array() +--EXPECT-- +愛していますか? diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test new file mode 100644 index 000000000..d17e5e2f0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test @@ -0,0 +1,90 @@ +--TEST-- +"date" filter +--TEMPLATE-- +{{ date1|date }} +{{ date1|date('d/m/Y') }} +{{ date1|date('d/m/Y H:i:s', 'Asia/Hong_Kong') }} +{{ date1|date('d/m/Y H:i:s P', 'Asia/Hong_Kong') }} +{{ date1|date('d/m/Y H:i:s P', 'America/Chicago') }} +{{ date1|date('e') }} +{{ date1|date('d/m/Y H:i:s') }} + +{{ date2|date }} +{{ date2|date('d/m/Y') }} +{{ date2|date('d/m/Y H:i:s', 'Asia/Hong_Kong') }} +{{ date2|date('d/m/Y H:i:s', timezone1) }} +{{ date2|date('d/m/Y H:i:s') }} + +{{ date3|date }} +{{ date3|date('d/m/Y') }} + +{{ date4|date }} +{{ date4|date('d/m/Y') }} + +{{ date5|date }} +{{ date5|date('d/m/Y') }} + +{{ date6|date('d/m/Y H:i:s P', 'Europe/Paris') }} +{{ date6|date('d/m/Y H:i:s P', 'Asia/Hong_Kong') }} +{{ date6|date('d/m/Y H:i:s P', false) }} +{{ date6|date('e', 'Europe/Paris') }} +{{ date6|date('e', false) }} + +{{ date7|date }} +{{ date7|date(timezone='Europe/Paris') }} +{{ date7|date(timezone='Asia/Hong_Kong') }} +{{ date7|date(timezone=false) }} +{{ date7|date(timezone='Indian/Mauritius') }} + +{{ '2010-01-28 15:00:00'|date(timezone="Europe/Paris") }} +{{ '2010-01-28 15:00:00'|date(timezone="Asia/Hong_Kong") }} +--DATA-- +date_default_timezone_set('Europe/Paris'); +return array( + 'date1' => mktime(13, 45, 0, 10, 4, 2010), + 'date2' => new DateTime('2010-10-04 13:45'), + 'date3' => '2010-10-04 13:45', + 'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT + 'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(), + 'date6' => new DateTime('2010-10-04 13:45', new DateTimeZone('America/New_York')), + 'date7' => '2010-01-28T15:00:00+04:00', + 'timezone1' => new DateTimeZone('America/New_York'), +) +--EXPECT-- +October 4, 2010 13:45 +04/10/2010 +04/10/2010 19:45:00 +04/10/2010 19:45:00 +08:00 +04/10/2010 06:45:00 -05:00 +Europe/Paris +04/10/2010 13:45:00 + +October 4, 2010 13:45 +04/10/2010 +04/10/2010 19:45:00 +04/10/2010 07:45:00 +04/10/2010 13:45:00 + +October 4, 2010 13:45 +04/10/2010 + +October 4, 2010 15:45 +04/10/2010 + +January 2, 1964 04:04 +02/01/1964 + +04/10/2010 19:45:00 +02:00 +05/10/2010 01:45:00 +08:00 +04/10/2010 13:45:00 -04:00 +Europe/Paris +America/New_York + +January 28, 2010 12:00 +January 28, 2010 12:00 +January 28, 2010 19:00 +January 28, 2010 15:00 +January 28, 2010 15:00 + +January 28, 2010 15:00 +January 28, 2010 22:00 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test new file mode 100644 index 000000000..6ad504cdf --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test @@ -0,0 +1,14 @@ +--TEST-- +"date" filter +--TEMPLATE-- +{{ date1|date }} +{{ date1|date('d/m/Y') }} +--DATA-- +date_default_timezone_set('UTC'); +$twig->getExtension('Twig_Extension_Core')->setDateFormat('Y-m-d', '%d days %h hours'); +return array( + 'date1' => mktime(13, 45, 0, 10, 4, 2010), +) +--EXPECT-- +2010-10-04 +04/10/2010 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test new file mode 100644 index 000000000..be4a642e7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test @@ -0,0 +1,16 @@ +--TEST-- +"date" filter (interval support as of PHP 5.3) +--CONDITION-- +version_compare(phpversion(), '5.3.0', '>=') +--TEMPLATE-- +{{ date2|date }} +{{ date2|date('%d days') }} +--DATA-- +date_default_timezone_set('UTC'); +$twig->getExtension('Twig_Extension_Core')->setDateFormat('Y-m-d', '%d days %h hours'); +return array( + 'date2' => new DateInterval('P2D'), +) +--EXPECT-- +2 days 0 hours +2 days diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test new file mode 100644 index 000000000..4e1832562 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test @@ -0,0 +1,37 @@ +--TEST-- +"date" filter +--CONDITION-- +version_compare(phpversion(), '5.5.0', '>=') +--TEMPLATE-- +{{ date1|date }} +{{ date1|date('d/m/Y') }} +{{ date1|date('d/m/Y H:i:s', 'Asia/Hong_Kong') }} +{{ date1|date('d/m/Y H:i:s', timezone1) }} +{{ date1|date('d/m/Y H:i:s') }} +{{ date1|date_modify('+1 hour')|date('d/m/Y H:i:s') }} + +{{ date2|date('d/m/Y H:i:s P', 'Europe/Paris') }} +{{ date2|date('d/m/Y H:i:s P', 'Asia/Hong_Kong') }} +{{ date2|date('d/m/Y H:i:s P', false) }} +{{ date2|date('e', 'Europe/Paris') }} +{{ date2|date('e', false) }} +--DATA-- +date_default_timezone_set('Europe/Paris'); +return array( + 'date1' => new DateTimeImmutable('2010-10-04 13:45'), + 'date2' => new DateTimeImmutable('2010-10-04 13:45', new DateTimeZone('America/New_York')), + 'timezone1' => new DateTimeZone('America/New_York'), +) +--EXPECT-- +October 4, 2010 13:45 +04/10/2010 +04/10/2010 19:45:00 +04/10/2010 07:45:00 +04/10/2010 13:45:00 +04/10/2010 14:45:00 + +04/10/2010 19:45:00 +02:00 +05/10/2010 01:45:00 +08:00 +04/10/2010 13:45:00 -04:00 +Europe/Paris +America/New_York diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test new file mode 100644 index 000000000..0c8c6f1a2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test @@ -0,0 +1,19 @@ +--TEST-- +"date" filter (interval support as of PHP 5.3) +--CONDITION-- +version_compare(phpversion(), '5.3.0', '>=') +--TEMPLATE-- +{{ date1|date }} +{{ date1|date('%d days %h hours') }} +{{ date1|date('%d days %h hours', timezone1) }} +--DATA-- +date_default_timezone_set('UTC'); +return array( + 'date1' => new DateInterval('P2D'), + // This should have no effect on DateInterval formatting + 'timezone1' => new DateTimeZone('America/New_York'), +) +--EXPECT-- +2 days +2 days 0 hours +2 days 0 hours diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test new file mode 100644 index 000000000..53d3a69cd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test @@ -0,0 +1,14 @@ +--TEST-- +"date_modify" filter +--TEMPLATE-- +{{ date1|date_modify('-1day')|date('Y-m-d H:i:s') }} +{{ date2|date_modify('-1day')|date('Y-m-d H:i:s') }} +--DATA-- +date_default_timezone_set('UTC'); +return array( + 'date1' => '2010-10-04 13:45', + 'date2' => new DateTime('2010-10-04 13:45'), +) +--EXPECT-- +2010-10-03 13:45:00 +2010-10-03 13:45:00 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test new file mode 100644 index 000000000..4ecde8a18 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test @@ -0,0 +1,13 @@ +--TEST-- +"date" filter +--TEMPLATE-- +{{ date|date(format='d/m/Y H:i:s P', timezone='America/Chicago') }} +{{ date|date(timezone='America/Chicago', format='d/m/Y H:i:s P') }} +{{ date|date('d/m/Y H:i:s P', timezone='America/Chicago') }} +--DATA-- +date_default_timezone_set('UTC'); +return array('date' => mktime(13, 45, 0, 10, 4, 2010)) +--EXPECT-- +04/10/2010 08:45:00 -05:00 +04/10/2010 08:45:00 -05:00 +04/10/2010 08:45:00 -05:00 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test new file mode 100644 index 000000000..b8d1d66f5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test @@ -0,0 +1,150 @@ +--TEST-- +"default" filter +--TEMPLATE-- +Variable: +{{ definedVar |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ zeroVar |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ emptyVar |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ nullVar |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ undefinedVar |default('default') is same as('default') ? 'ok' : 'ko' }} +Array access: +{{ nested.definedVar |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ nested['definedVar'] |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ nested.zeroVar |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ nested.emptyVar |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ nested.nullVar |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ nested.undefinedVar |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ nested['undefinedVar'] |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ undefinedVar.foo |default('default') is same as('default') ? 'ok' : 'ko' }} +Plain values: +{{ 'defined' |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ 0 |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ '' |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ null |default('default') is same as('default') ? 'ok' : 'ko' }} +Precedence: +{{ 'o' ~ nullVar |default('k') }} +{{ 'o' ~ nested.nullVar |default('k') }} +Object methods: +{{ object.foo |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ object.undefinedMethod |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ object.getFoo() |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ object.getFoo('a') |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ object.undefinedMethod() |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ object.undefinedMethod('a') |default('default') is same as('default') ? 'ok' : 'ko' }} +Deep nested: +{{ nested.undefinedVar.foo.bar |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ nested.definedArray.0 |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ nested['definedArray'][0] |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ object.self.foo |default('default') is same as('default') ? 'ko' : 'ok' }} +{{ object.self.undefinedMethod |default('default') is same as('default') ? 'ok' : 'ko' }} +{{ object.undefinedMethod.self |default('default') is same as('default') ? 'ok' : 'ko' }} +--DATA-- +return array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'emptyVar' => '', + 'nullVar' => null, + 'nested' => array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'emptyVar' => '', + 'nullVar' => null, + 'definedArray' => array(0), + ), + 'object' => new TwigTestFoo(), +) +--CONFIG-- +return array('strict_variables' => false) +--EXPECT-- +Variable: +ok +ok +ok +ok +ok +Array access: +ok +ok +ok +ok +ok +ok +ok +ok +Plain values: +ok +ok +ok +ok +Precedence: +ok +ok +Object methods: +ok +ok +ok +ok +ok +ok +Deep nested: +ok +ok +ok +ok +ok +ok +--DATA-- +return array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'emptyVar' => '', + 'nullVar' => null, + 'nested' => array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'emptyVar' => '', + 'nullVar' => null, + 'definedArray' => array(0), + ), + 'object' => new TwigTestFoo(), +) +--CONFIG-- +return array('strict_variables' => true) +--EXPECT-- +Variable: +ok +ok +ok +ok +ok +Array access: +ok +ok +ok +ok +ok +ok +ok +ok +Plain values: +ok +ok +ok +ok +Precedence: +ok +ok +Object methods: +ok +ok +ok +ok +ok +ok +Deep nested: +ok +ok +ok +ok +ok +ok diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test new file mode 100644 index 000000000..93c5913f2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test @@ -0,0 +1,10 @@ +--TEST-- +dynamic filter +--TEMPLATE-- +{{ 'bar'|foo_path }} +{{ 'bar'|a_foo_b_bar }} +--DATA-- +return array() +--EXPECT-- +foo/bar +a/b/bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test new file mode 100644 index 000000000..a606c1065 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test @@ -0,0 +1,8 @@ +--TEST-- +"escape" filter +--TEMPLATE-- +{{ "foo
    "|e }} +--DATA-- +return array() +--EXPECT-- +foo <br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test new file mode 100644 index 000000000..009a24532 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test @@ -0,0 +1,8 @@ +--TEST-- +"escape" filter does not escape with the html strategy when using the html_attr strategy +--TEMPLATE-- +{{ '
    '|escape('html_attr') }} +--DATA-- +return array() +--EXPECT-- +<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test new file mode 100644 index 000000000..bba26a0df --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test @@ -0,0 +1,8 @@ +--TEST-- +"escape" filter +--TEMPLATE-- +{{ "愛していますか?
    "|e }} +--DATA-- +return array() +--EXPECT-- +愛していますか? <br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test new file mode 100644 index 000000000..aa54645c3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test @@ -0,0 +1,17 @@ +--TEST-- +"first" filter +--TEMPLATE-- +{{ [1, 2, 3, 4]|first }} +{{ {a: 1, b: 2, c: 3, d: 4}|first }} +{{ '1234'|first }} +{{ arr|first }} +{{ 'Ä€é'|first }} +{{ ''|first }} +--DATA-- +return array('arr' => new ArrayObject(array(1, 2, 3, 4))) +--EXPECT-- +1 +1 +1 +1 +Ä diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test new file mode 100644 index 000000000..85a9b7172 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test @@ -0,0 +1,18 @@ +--TEST-- +"escape" filter +--TEMPLATE-- +{% set foo %} + foo
    +{% endset %} + +{{ foo|e('html') -}} +{{ foo|e('js') }} +{% autoescape true %} + {{ foo }} +{% endautoescape %} +--DATA-- +return array() +--EXPECT-- + foo<br /> +\x20\x20\x20\x20foo\x3Cbr\x20\x2F\x3E\x0A + foo
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test new file mode 100644 index 000000000..97221ff80 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test @@ -0,0 +1,8 @@ +--TEST-- +"format" filter +--TEMPLATE-- +{{ string|format(foo, 3) }} +--DATA-- +return array('string' => '%s/%d', 'foo' => 'bar') +--EXPECT-- +bar/3 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test new file mode 100644 index 000000000..b342c174c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test @@ -0,0 +1,12 @@ +--TEST-- +"join" filter +--TEMPLATE-- +{{ ["foo", "bar"]|join(', ') }} +{{ foo|join(', ') }} +{{ bar|join(', ') }} +--DATA-- +return array('foo' => new TwigTestFoo(), 'bar' => new ArrayObject(array(3, 4))) +--EXPECT-- +foo, bar +1, 2 +3, 4 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test new file mode 100644 index 000000000..1738d40cd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test @@ -0,0 +1,12 @@ +--TEST-- +"json_encode" filter +--TEMPLATE-- +{{ "foo"|json_encode|raw }} +{{ foo|json_encode|raw }} +{{ [foo, "foo"]|json_encode|raw }} +--DATA-- +return array('foo' => new Twig_Markup('foo', 'UTF-8')) +--EXPECT-- +"foo" +"foo" +["foo","foo"] diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test new file mode 100644 index 000000000..1b8031ee8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test @@ -0,0 +1,17 @@ +--TEST-- +"last" filter +--TEMPLATE-- +{{ [1, 2, 3, 4]|last }} +{{ {a: 1, b: 2, c: 3, d: 4}|last }} +{{ '1234'|last }} +{{ arr|last }} +{{ 'Ä€é'|last }} +{{ ''|last }} +--DATA-- +return array('arr' => new ArrayObject(array(1, 2, 3, 4))) +--EXPECT-- +4 +4 +4 +4 +é diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test new file mode 100644 index 000000000..3347474d5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test @@ -0,0 +1,14 @@ +--TEST-- +"length" filter +--TEMPLATE-- +{{ array|length }} +{{ string|length }} +{{ number|length }} +{{ markup|length }} +--DATA-- +return array('array' => array(1, 4), 'string' => 'foo', 'number' => 1000, 'markup' => new Twig_Markup('foo', 'UTF-8')) +--EXPECT-- +2 +3 +4 +3 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test new file mode 100644 index 000000000..5d5e24361 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test @@ -0,0 +1,12 @@ +--TEST-- +"length" filter +--CONDITION-- +function_exists('mb_get_info') +--TEMPLATE-- +{{ string|length }} +{{ markup|length }} +--DATA-- +return array('string' => 'été', 'markup' => new Twig_Markup('foo', 'UTF-8')) +--EXPECT-- +3 +3 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test new file mode 100644 index 000000000..81371a41b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test @@ -0,0 +1,18 @@ +--TEST-- +"merge" filter +--TEMPLATE-- +{{ items|merge({'bar': 'foo'})|join }} +{{ items|merge({'bar': 'foo'})|keys|join }} +{{ {'bar': 'foo'}|merge(items)|join }} +{{ {'bar': 'foo'}|merge(items)|keys|join }} +{{ numerics|merge([4, 5, 6])|join }} +{{ traversable.a|merge(traversable.b)|join }} +--DATA-- +return array('items' => array('foo' => 'bar'), 'numerics' => array(1, 2, 3), 'traversable' => array('a' => new ArrayObject(array(0 => 1, 1 => 2, 2 => 3)), 'b' => new ArrayObject(array('a' => 'b')))) +--EXPECT-- +barfoo +foobar +foobar +barfoo +123456 +123b diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test new file mode 100644 index 000000000..6545a9bb0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test @@ -0,0 +1,14 @@ +--TEST-- +"nl2br" filter +--TEMPLATE-- +{{ "I like Twig.\nYou will like it too.\n\nEverybody like it!"|nl2br }} +{{ text|nl2br }} +--DATA-- +return array('text' => "If you have some HTML\nit will be escaped.") +--EXPECT-- +I like Twig.
    +You will like it too.
    +
    +Everybody like it! +If you have some <strong>HTML</strong>
    +it will be escaped. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test new file mode 100644 index 000000000..639a8659f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test @@ -0,0 +1,18 @@ +--TEST-- +"number_format" filter +--TEMPLATE-- +{{ 20|number_format }} +{{ 20.25|number_format }} +{{ 20.25|number_format(2) }} +{{ 20.25|number_format(2, ',') }} +{{ 1020.25|number_format(2, ',') }} +{{ 1020.25|number_format(2, ',', '.') }} +--DATA-- +return array(); +--EXPECT-- +20 +20 +20.25 +20,25 +1,020,25 +1.020,25 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test new file mode 100644 index 000000000..65c1cdb48 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test @@ -0,0 +1,21 @@ +--TEST-- +"number_format" filter with defaults. +--TEMPLATE-- +{{ 20|number_format }} +{{ 20.25|number_format }} +{{ 20.25|number_format(1) }} +{{ 20.25|number_format(2, ',') }} +{{ 1020.25|number_format }} +{{ 1020.25|number_format(2, ',') }} +{{ 1020.25|number_format(2, ',', '.') }} +--DATA-- +$twig->getExtension('Twig_Extension_Core')->setNumberFormat(2, '!', '='); +return array(); +--EXPECT-- +20!00 +20!25 +20!3 +20,25 +1=020!25 +1=020,25 +1.020,25 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test new file mode 100644 index 000000000..06be7e270 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test @@ -0,0 +1,12 @@ +--TEST-- +"replace" filter +--TEMPLATE-- +{{ "I liké %this% and %that%."|replace({'%this%': "foo", '%that%': "bar"}) }} +{{ 'I like single replace operation only %that%'|replace({'%that%' : '%that%1'}) }} +{{ 'I like %this% and %that%.'|replace(traversable) }} +--DATA-- +return array('traversable' => new ArrayObject(array('%this%' => 'foo', '%that%' => 'bar'))) +--EXPECT-- +I liké foo and bar. +I like single replace operation only %that%1 +I like foo and bar. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test new file mode 100644 index 000000000..2143a8690 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test @@ -0,0 +1,8 @@ +--TEST-- +Exception for invalid argument type in replace call +--TEMPLATE-- +{{ 'test %foo%'|replace(stdClass) }} +--DATA-- +return array('stdClass' => new stdClass()) +--EXCEPTION-- +Twig_Error_Runtime: The "replace" filter expects an array or "Traversable" as replace values, got "stdClass" in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test new file mode 100644 index 000000000..7948ac45f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test @@ -0,0 +1,18 @@ +--TEST-- +"reverse" filter +--TEMPLATE-- +{{ [1, 2, 3, 4]|reverse|join('') }} +{{ '1234évènement'|reverse }} +{{ arr|reverse|join('') }} +{{ {'a': 'c', 'b': 'a'}|reverse()|join(',') }} +{{ {'a': 'c', 'b': 'a'}|reverse(preserveKeys=true)|join(glue=',') }} +{{ {'a': 'c', 'b': 'a'}|reverse(preserve_keys=true)|join(glue=',') }} +--DATA-- +return array('arr' => new ArrayObject(array(1, 2, 3, 4))) +--EXPECT-- +4321 +tnemenèvé4321 +4321 +a,c +a,c +a,c diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test new file mode 100644 index 000000000..57806b619 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test @@ -0,0 +1,22 @@ +--TEST-- +"round" filter +--TEMPLATE-- +{{ 2.7|round }} +{{ 2.1|round }} +{{ 2.1234|round(3, 'floor') }} +{{ 2.1|round(0, 'ceil') }} + +{{ 21.3|round(-1)}} +{{ 21.3|round(-1, 'ceil')}} +{{ 21.3|round(-1, 'floor')}} +--DATA-- +return array() +--EXPECT-- +3 +2 +2.123 +3 + +20 +30 +20 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test new file mode 100644 index 000000000..b49b89fe5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test @@ -0,0 +1,54 @@ +--TEST-- +"slice" filter +--TEMPLATE-- +{{ [1, 2, 3, 4][1:2]|join('') }} +{{ {a: 1, b: 2, c: 3, d: 4}[1:2]|join('') }} +{{ [1, 2, 3, 4][start:length]|join('') }} +{{ [1, 2, 3, 4]|slice(1, 2)|join('') }} +{{ [1, 2, 3, 4]|slice(1, 2)|keys|join('') }} +{{ [1, 2, 3, 4]|slice(1, 2, true)|keys|join('') }} +{{ {a: 1, b: 2, c: 3, d: 4}|slice(1, 2)|join('') }} +{{ {a: 1, b: 2, c: 3, d: 4}|slice(1, 2)|keys|join('') }} +{{ '1234'|slice(1, 2) }} +{{ '1234'[1:2] }} +{{ arr|slice(1, 2)|join('') }} +{{ arr[1:2]|join('') }} +{{ arr[4:1]|join('') }} +{{ arr[3:2]|join('') }} + +{{ [1, 2, 3, 4]|slice(1)|join('') }} +{{ [1, 2, 3, 4][1:]|join('') }} +{{ '1234'|slice(1) }} +{{ '1234'[1:] }} +{{ '1234'[:1] }} + +{{ arr|slice(3)|join('') }} +{{ arr[2:]|join('') }} +{{ xml|slice(1)|join('')}} +--DATA-- +return array('start' => 1, 'length' => 2, 'arr' => new ArrayObject(array(1, 2, 3, 4)), 'xml' => new SimpleXMLElement('12')) +--EXPECT-- +23 +23 +23 +23 +01 +12 +23 +bc +23 +23 +23 +23 + +4 + +234 +234 +234 +234 +1 + +4 +34 +2 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test new file mode 100644 index 000000000..c67c18ea9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test @@ -0,0 +1,12 @@ +--TEST-- +"sort" filter +--TEMPLATE-- +{{ array1|sort|join }} +{{ array2|sort|join }} +{{ traversable|sort|join }} +--DATA-- +return array('array1' => array(4, 1), 'array2' => array('foo', 'bar'), 'traversable' => new ArrayObject(array(0 => 3, 1 => 2, 2 => 1))) +--EXPECT-- +14 +barfoo +123 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test new file mode 100644 index 000000000..dbaf7dc97 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test @@ -0,0 +1,8 @@ +--TEST-- +"§" custom filter +--TEMPLATE-- +{{ 'foo'|§ }} +--DATA-- +return array() +--EXPECT-- +§foo§ diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test new file mode 100644 index 000000000..a093ed79b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test @@ -0,0 +1,20 @@ +--TEST-- +"split" filter +--TEMPLATE-- +{{ "one,two,three,four,five"|split(',')|join('-') }} +{{ foo|split(',')|join('-') }} +{{ foo|split(',', 3)|join('-') }} +{{ baz|split('')|join('-') }} +{{ baz|split('', 1)|join('-') }} +{{ baz|split('', 2)|join('-') }} +{{ foo|split(',', -2)|join('-') }} +--DATA-- +return array('foo' => "one,two,three,four,five", 'baz' => '12345',) +--EXPECT-- +one-two-three-four-five +one-two-three-four-five +one-two-three,four,five +1-2-3-4-5 +1-2-3-4-5 +12-34-5 +one-two-three \ No newline at end of file diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test new file mode 100644 index 000000000..305e162fe --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test @@ -0,0 +1,24 @@ +--TEST-- +"split" filter +--CONDITION-- +function_exists('mb_get_info') +--TEMPLATE-- +{{ "é"|split('', 10)|join('-') }} +{{ foo|split(',')|join('-') }} +{{ foo|split(',', 1)|join('-') }} +{{ foo|split(',', 2)|join('-') }} +{{ foo|split(',', 3)|join('-') }} +{{ baz|split('')|join('-') }} +{{ baz|split('', 1)|join('-') }} +{{ baz|split('', 2)|join('-') }} +--DATA-- +return array('foo' => 'Ä,é,Äほ', 'baz' => 'éÄßごa',) +--EXPECT-- +é +Ä-é-Äほ +Ä,é,Äほ +Ä-é,Äほ +Ä-é-Äほ +é-Ä-ß-ご-a +é-Ä-ß-ご-a +éÄ-ßご-a \ No newline at end of file diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/static_calls.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/static_calls.test new file mode 100644 index 000000000..4e17b7726 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/static_calls.test @@ -0,0 +1,10 @@ +--TEST-- +Filters as static method calls +--TEMPLATE-- +{{ 'foo'|static_call_string }} +{{ 'foo'|static_call_array }} +--DATA-- +return array('foo' => 'foo') +--EXPECT-- +*foo* +*foo* diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test new file mode 100644 index 000000000..319206258 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test @@ -0,0 +1,12 @@ +--TEST-- +"trim" filter +--TEMPLATE-- +{{ " I like Twig. "|trim }} +{{ text|trim }} +{{ " foo/"|trim("/") }} +--DATA-- +return array('text' => " If you have some HTML it will be escaped. ") +--EXPECT-- +I like Twig. +If you have some <strong>HTML</strong> it will be escaped. + foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test new file mode 100644 index 000000000..8726159db --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test @@ -0,0 +1,16 @@ +--TEST-- +"url_encode" filter +--CONDITION-- +defined('PHP_QUERY_RFC3986') +--TEMPLATE-- +{{ {foo: "bar", number: 3, "spéßi%l": "e%c0d@d", "spa ce": ""}|url_encode }} +{{ {foo: "bar", number: 3, "spéßi%l": "e%c0d@d", "spa ce": ""}|url_encode|raw }} +{{ {}|url_encode|default("default") }} +{{ 'spéßi%le%c0d@dspa ce'|url_encode }} +--DATA-- +return array() +--EXPECT-- +foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce= +foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce= +default +sp%C3%A9%C3%9Fi%25le%25c0d%40dspa%20ce diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test new file mode 100644 index 000000000..11800e9c0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test @@ -0,0 +1,16 @@ +--TEST-- +"url_encode" filter for PHP < 5.4 and HHVM +--CONDITION-- +defined('PHP_QUERY_RFC3986') +--TEMPLATE-- +{{ {foo: "bar", number: 3, "spéßi%l": "e%c0d@d", "spa ce": ""}|url_encode }} +{{ {foo: "bar", number: 3, "spéßi%l": "e%c0d@d", "spa ce": ""}|url_encode|raw }} +{{ {}|url_encode|default("default") }} +{{ 'spéßi%le%c0d@dspa ce'|url_encode }} +--DATA-- +return array() +--EXPECT-- +foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce= +foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce= +default +sp%C3%A9%C3%9Fi%25le%25c0d%40dspa%20ce diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test new file mode 100644 index 000000000..71b2038aa --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test @@ -0,0 +1,18 @@ +--TEST-- +"attribute" function +--TEMPLATE-- +{{ attribute(obj, method) }} +{{ attribute(array, item) }} +{{ attribute(obj, "bar", ["a", "b"]) }} +{{ attribute(obj, "bar", arguments) }} +{{ attribute(obj, method) is defined ? 'ok' : 'ko' }} +{{ attribute(obj, nonmethod) is defined ? 'ok' : 'ko' }} +--DATA-- +return array('obj' => new TwigTestFoo(), 'method' => 'foo', 'array' => array('foo' => 'bar'), 'item' => 'foo', 'nonmethod' => 'xxx', 'arguments' => array('a', 'b')) +--EXPECT-- +foo +bar +bar_a-b +bar_a-b +ok +ko diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test new file mode 100644 index 000000000..8e54059ae --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test @@ -0,0 +1,12 @@ +--TEST-- +"block" function +--TEMPLATE-- +{% extends 'base.twig' %} +{% block bar %}BAR{% endblock %} +--TEMPLATE(base.twig)-- +{% block foo %}{{ block('bar') }}{% endblock %} +{% block bar %}BAR_BASE{% endblock %} +--DATA-- +return array() +--EXPECT-- +BARBAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test new file mode 100644 index 000000000..63128791f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test @@ -0,0 +1,10 @@ +--TEST-- +"constant" function +--TEMPLATE-- +{{ constant('DATE_W3C') == expect ? 'true' : 'false' }} +{{ constant('ARRAY_AS_PROPS', object) }} +--DATA-- +return array('expect' => DATE_W3C, 'object' => new ArrayObject(array('hi'))); +--EXPECT-- +true +2 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test new file mode 100644 index 000000000..522a63b85 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test @@ -0,0 +1,16 @@ +--TEST-- +"cycle" function +--TEMPLATE-- +{% for i in 0..6 %} +{{ cycle(array1, i) }}-{{ cycle(array2, i) }} +{% endfor %} +--DATA-- +return array('array1' => array('odd', 'even'), 'array2' => array('apple', 'orange', 'citrus')) +--EXPECT-- +odd-apple +even-orange +odd-citrus +even-apple +odd-orange +even-citrus +odd-apple diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test new file mode 100644 index 000000000..8be9c0c40 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test @@ -0,0 +1,25 @@ +--TEST-- +"date" function +--TEMPLATE-- +{{ date() == date('now') ? 'OK' : 'KO' }} +{{ date(date1) == date('2010-10-04 13:45') ? 'OK' : 'KO' }} +{{ date(date2) == date('2010-10-04 13:45') ? 'OK' : 'KO' }} +{{ date(date3) == date('2010-10-04 13:45') ? 'OK' : 'KO' }} +{{ date(date4) == date('2010-10-04 13:45') ? 'OK' : 'KO' }} +{{ date(date5) == date('1964-01-02 03:04') ? 'OK' : 'KO' }} +--DATA-- +date_default_timezone_set('UTC'); +return array( + 'date1' => mktime(13, 45, 0, 10, 4, 2010), + 'date2' => new DateTime('2010-10-04 13:45'), + 'date3' => '2010-10-04 13:45', + 'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT + 'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(), +) +--EXPECT-- +OK +OK +OK +OK +OK +OK diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test new file mode 100644 index 000000000..b9dd9e383 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test @@ -0,0 +1,11 @@ +--TEST-- +"date" function +--TEMPLATE-- +{{ date(date, "America/New_York")|date('d/m/Y H:i:s P', false) }} +{{ date(timezone="America/New_York", date=date)|date('d/m/Y H:i:s P', false) }} +--DATA-- +date_default_timezone_set('UTC'); +return array('date' => mktime(13, 45, 0, 10, 4, 2010)) +--EXPECT-- +04/10/2010 09:45:00 -04:00 +04/10/2010 09:45:00 -04:00 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test new file mode 100644 index 000000000..f4072375a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test @@ -0,0 +1,16 @@ +--TEST-- +"dump" function +--CONDITION-- +!extension_loaded('xdebug') +--TEMPLATE-- +{{ dump('foo') }} +{{ dump('foo', 'bar') }} +--DATA-- +return array('foo' => 'foo', 'bar' => 'bar') +--CONFIG-- +return array('debug' => true, 'autoescape' => false); +--EXPECT-- +string(3) "foo" + +string(3) "foo" +string(3) "bar" diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test new file mode 100644 index 000000000..889b7a922 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test @@ -0,0 +1,19 @@ +--TEST-- +"dump" function, xdebug is not loaded or xdebug <2.2-dev is loaded +--CONDITION-- +!extension_loaded('xdebug') || (($r = new ReflectionExtension('xdebug')) && version_compare($r->getVersion(), '2.2-dev', '<')) +--TEMPLATE-- +{{ dump() }} +--DATA-- +return array('foo' => 'foo', 'bar' => 'bar') +--CONFIG-- +return array('debug' => true, 'autoescape' => false); +--EXPECT-- +array(3) { + ["foo"]=> + string(3) "foo" + ["bar"]=> + string(3) "bar" + ["global"]=> + string(6) "global" +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test new file mode 100644 index 000000000..913fbc995 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test @@ -0,0 +1,10 @@ +--TEST-- +dynamic function +--TEMPLATE-- +{{ foo_path('bar') }} +{{ a_foo_b_bar('bar') }} +--DATA-- +return array() +--EXPECT-- +foo/bar +a/b/bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test new file mode 100644 index 000000000..b7653b4ef --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test @@ -0,0 +1,13 @@ +--TEST-- +"include" function +--TEMPLATE-- +{% set tmp = include("foo.twig") %} + +FOO{{ tmp }}BAR +--TEMPLATE(foo.twig)-- +FOOBAR +--DATA-- +return array() +--EXPECT-- +FOO +FOOBARBAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test new file mode 100644 index 000000000..56f8f3b5a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test @@ -0,0 +1,10 @@ +--TEST-- +"include" function is safe for auto-escaping +--TEMPLATE-- +{{ include("foo.twig") }} +--TEMPLATE(foo.twig)-- +

    Test

    +--DATA-- +return array() +--EXPECT-- +

    Test

    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test new file mode 100644 index 000000000..a434182a2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test @@ -0,0 +1,17 @@ +--TEST-- +"include" function +--TEMPLATE-- +FOO +{{ include("foo.twig") }} + +BAR +--TEMPLATE(foo.twig)-- +FOOBAR +--DATA-- +return array() +--EXPECT-- +FOO + +FOOBAR + +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test new file mode 100644 index 000000000..aba30ce3f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test @@ -0,0 +1,17 @@ +--TEST-- +"include" function allows expressions for the template to include +--TEMPLATE-- +FOO +{{ include(foo) }} + +BAR +--TEMPLATE(foo.twig)-- +FOOBAR +--DATA-- +return array('foo' => 'foo.twig') +--EXPECT-- +FOO + +FOOBAR + +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test new file mode 100644 index 000000000..43a2ccc2c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test @@ -0,0 +1,10 @@ +--TEST-- +"include" function +--TEMPLATE-- +{{ include(["foo.twig", "bar.twig"], ignore_missing = true) }} +{{ include("foo.twig", ignore_missing = true) }} +{{ include("foo.twig", ignore_missing = true, variables = {}) }} +{{ include("foo.twig", ignore_missing = true, variables = {}, with_context = true) }} +--DATA-- +return array() +--EXPECT-- diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test new file mode 100644 index 000000000..4d2f6cf13 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test @@ -0,0 +1,8 @@ +--TEST-- +"include" function +--TEMPLATE-- +{{ include("foo.twig") }} +--DATA-- +return array(); +--EXCEPTION-- +Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test new file mode 100644 index 000000000..78fddc7a6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test @@ -0,0 +1,16 @@ +--TEST-- +"include" function +--TEMPLATE-- +{% extends "base.twig" %} + +{% block content %} + {{ parent() }} +{% endblock %} +--TEMPLATE(base.twig)-- +{% block content %} + {{ include("foo.twig") }} +{% endblock %} +--DATA-- +return array(); +--EXCEPTION-- +Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test new file mode 100644 index 000000000..7b9ccaca8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test @@ -0,0 +1,13 @@ +--TEST-- +"include" tag sandboxed +--TEMPLATE-- +{{ include("foo.twig", sandboxed = true) }} +--TEMPLATE(foo.twig)-- + + +{{ foo|e }} +{{ foo|e }} +--DATA-- +return array() +--EXCEPTION-- +Twig_Sandbox_SecurityNotAllowedFilterError: Filter "e" is not allowed in "foo.twig" at line 4. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test new file mode 100644 index 000000000..8ffc49225 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test @@ -0,0 +1,16 @@ +--TEST-- +"include" tag sandboxed +--TEMPLATE-- +{{ include("foo.twig", sandboxed = true) }} +{{ include("bar.twig") }} +--TEMPLATE(foo.twig)-- +foo +--TEMPLATE(bar.twig)-- +{{ foo|e }} +--DATA-- +return array('foo' => 'bar
    ') +--EXPECT-- +foo + + +bar<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test new file mode 100644 index 000000000..8bf6e102d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test @@ -0,0 +1,13 @@ +--TEST-- +"include" tag sandboxed +--TEMPLATE-- +{{ include("unknown.twig", sandboxed = true, ignore_missing = true) }} +{{ include("bar.twig") }} +--TEMPLATE(bar.twig)-- +{{ foo|e }} +--DATA-- +return array('foo' => 'bar
    ') +--EXPECT-- + + +bar<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test new file mode 100644 index 000000000..18d405a02 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test @@ -0,0 +1,10 @@ +--TEST-- +"include" function accepts Twig_Template instance +--TEMPLATE-- +{{ include(foo) }} FOO +--TEMPLATE(foo.twig)-- +BAR +--DATA-- +return array('foo' => $twig->loadTemplate('foo.twig')) +--EXPECT-- +BAR FOO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test new file mode 100644 index 000000000..1a8100687 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test @@ -0,0 +1,12 @@ +--TEST-- +"include" function +--TEMPLATE-- +{{ include(["foo.twig", "bar.twig"]) }} +{{- include(["bar.twig", "foo.twig"]) }} +--TEMPLATE(foo.twig)-- +foo +--DATA-- +return array() +--EXPECT-- +foo +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test new file mode 100644 index 000000000..35611fbb9 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test @@ -0,0 +1,16 @@ +--TEST-- +"include" function accept variables and with_context +--TEMPLATE-- +{{ include("foo.twig") }} +{{- include("foo.twig", with_context = false) }} +{{- include("foo.twig", {'foo1': 'bar'}) }} +{{- include("foo.twig", {'foo1': 'bar'}, with_context = false) }} +--TEMPLATE(foo.twig)-- +{% for k, v in _context %}{{ k }},{% endfor %} +--DATA-- +return array('foo' => 'bar') +--EXPECT-- +foo,global,_parent, +global,_parent, +foo,global,foo1,_parent, +foo1,global,_parent, diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test new file mode 100644 index 000000000..b2ace940e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test @@ -0,0 +1,12 @@ +--TEST-- +"include" function accept variables +--TEMPLATE-- +{{ include("foo.twig", {'foo': 'bar'}) }} +{{- include("foo.twig", vars) }} +--TEMPLATE(foo.twig)-- +{{ foo }} +--DATA-- +return array('vars' => array('foo' => 'bar')) +--EXPECT-- +bar +bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call.test new file mode 100644 index 000000000..933544312 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call.test @@ -0,0 +1,8 @@ +--TEST-- +__call calls +--TEMPLATE-- +{{ 'foo'|magic_call }} +--DATA-- +return array() +--EXPECT-- +magic_foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call53.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call53.test new file mode 100644 index 000000000..a0f55e116 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call53.test @@ -0,0 +1,12 @@ +--TEST-- +__staticCall calls +--CONDITION-- +version_compare(phpversion(), '5.3.0', '>=') +--TEMPLATE-- +{{ 'foo'|magic_call_string }} +{{ 'foo'|magic_call_array }} +--DATA-- +return array() +--EXPECT-- +static_magic_foo +static_magic_foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test new file mode 100644 index 000000000..e6c94af63 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test @@ -0,0 +1,12 @@ +--TEST-- +"max" function +--TEMPLATE-- +{{ max([2, 1, 3, 5, 4]) }} +{{ max(2, 1, 3, 5, 4) }} +{{ max({2:"two", 1:"one", 3:"three", 5:"five", 4:"for"}) }} +--DATA-- +return array() +--EXPECT-- +5 +5 +two diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test new file mode 100644 index 000000000..660471c00 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test @@ -0,0 +1,12 @@ +--TEST-- +"min" function +--TEMPLATE-- +{{ min(2, 1, 3, 5, 4) }} +{{ min([2, 1, 3, 5, 4]) }} +{{ min({2:"two", 1:"one", 3:"three", 5:"five", 4:"for"}) }} +--DATA-- +return array() +--EXPECT-- +1 +1 +five diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test new file mode 100644 index 000000000..e0377c8d4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test @@ -0,0 +1,8 @@ +--TEST-- +"range" function +--TEMPLATE-- +{{ range(low=0+1, high=10+0, step=2)|join(',') }} +--DATA-- +return array() +--EXPECT-- +1,3,5,7,9 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test new file mode 100644 index 000000000..f39712da8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test @@ -0,0 +1,21 @@ +--TEST-- +"block" function recursively called in a parent template +--TEMPLATE-- +{% extends "ordered_menu.twig" %} +{% block label %}"{{ parent() }}"{% endblock %} +{% block list %}{% set class = 'b' %}{{ parent() }}{% endblock %} +--TEMPLATE(ordered_menu.twig)-- +{% extends "menu.twig" %} +{% block list %}{% set class = class|default('a') %}
      {{ block('children') }}
    {% endblock %} +--TEMPLATE(menu.twig)-- +{% extends "base.twig" %} +{% block list %}
      {{ block('children') }}
    {% endblock %} +{% block children %}{% set currentItem = item %}{% for item in currentItem %}{{ block('item') }}{% endfor %}{% set item = currentItem %}{% endblock %} +{% block item %}
  • {% if item is not iterable %}{{ block('label') }}{% else %}{{ block('list') }}{% endif %}
  • {% endblock %} +{% block label %}{{ item }}{{ block('unknown') }}{% endblock %} +--TEMPLATE(base.twig)-- +{{ block('list') }} +--DATA-- +return array('item' => array('1', '2', array('3.1', array('3.2.1', '3.2.2'), '3.4'))) +--EXPECT-- +
    1. "1"
    2. "2"
      1. "3.1"
        1. "3.2.1"
        2. "3.2.2"
      2. "3.4"
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test new file mode 100644 index 000000000..0e094c3b2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test @@ -0,0 +1,17 @@ +--TEST-- +"source" function +--TEMPLATE-- +FOO +{{ source("foo.twig") }} + +BAR +--TEMPLATE(foo.twig)-- +{{ foo }}
    +--DATA-- +return array() +--EXPECT-- +FOO + +{{ foo }}
    + +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test new file mode 100644 index 000000000..30c3df516 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test @@ -0,0 +1,8 @@ +--TEST-- +"§" custom function +--TEMPLATE-- +{{ §('foo') }} +--DATA-- +return array() +--EXPECT-- +§foo§ diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/static_calls.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/static_calls.test new file mode 100644 index 000000000..57e5be392 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/static_calls.test @@ -0,0 +1,10 @@ +--TEST-- +Functions as static method calls +--TEMPLATE-- +{{ static_call_string('foo') }} +{{ static_call_array('foo') }} +--DATA-- +return array('foo' => 'foo') +--EXPECT-- +*foo* +*foo* diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test new file mode 100644 index 000000000..3d3b95874 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test @@ -0,0 +1,15 @@ +--TEST-- +"template_from_string" function +--TEMPLATE-- +{% include template_from_string(template) %} + +{% include template_from_string("Hello {{ name }}") %} +{% include template_from_string('{% extends "parent.twig" %}{% block content %}Hello {{ name }}{% endblock %}') %} +--TEMPLATE(parent.twig)-- +{% block content %}{% endblock %} +--DATA-- +return array('name' => 'Fabien', 'template' => "Hello {{ name }}") +--EXPECT-- +Hello Fabien +Hello Fabien +Hello Fabien diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test new file mode 100644 index 000000000..4ccff7b67 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test @@ -0,0 +1,16 @@ +--TEST-- +macro +--TEMPLATE-- +{% from _self import test %} + +{% macro test(a, b = 'bar') -%} +{{ a }}{{ b }} +{%- endmacro %} + +{{ test('foo') }} +{{ test('bar', 'foo') }} +--DATA-- +return array(); +--EXPECT-- +foobar +barfoo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test new file mode 100644 index 000000000..cd2542810 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test @@ -0,0 +1,18 @@ +--TEST-- +macro +--TEMPLATE-- +{% import _self as macros %} + +{% macro foo(data) %} + {{ data }} +{% endmacro %} + +{% macro bar() %} +
    +{% endmacro %} + +{{ macros.foo(macros.bar()) }} +--DATA-- +return array(); +--EXPECT-- +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test new file mode 100644 index 000000000..cbfb921b2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test @@ -0,0 +1,14 @@ +--TEST-- +macro +--TEMPLATE-- +{% from _self import test %} + +{% macro test(this) -%} + {{ this }} +{%- endmacro %} + +{{ test(this) }} +--DATA-- +return array('this' => 'foo'); +--EXPECT-- +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test new file mode 100644 index 000000000..6a366cdf1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test @@ -0,0 +1,22 @@ +--TEST-- +macro +--TEMPLATE-- +{% import _self as test %} +{% from _self import test %} + +{% macro test(a, b) -%} + {{ a|default('a') }}
    + {{- b|default('b') }}
    +{%- endmacro %} + +{{ test.test() }} +{{ test() }} +{{ test.test(1, "c") }} +{{ test(1, "c") }} +--DATA-- +return array(); +--EXPECT-- +a
    b
    +a
    b
    +1
    c
    +1
    c
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test new file mode 100644 index 000000000..412c90fae --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test @@ -0,0 +1,21 @@ +--TEST-- +macro with arbitrary arguments +--TEMPLATE-- +{% from _self import test1, test2 %} + +{% macro test1(var) %} + {{- var }}: {{ varargs|join(", ") }} +{% endmacro %} + +{% macro test2() %} + {{- varargs|join(", ") }} +{% endmacro %} + +{{ test1("foo", "bar", "foobar") }} +{{ test2("foo", "bar", "foobar") }} +--DATA-- +return array(); +--EXPECT-- +foo: bar, foobar + +foo, bar, foobar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test new file mode 100644 index 000000000..800c262e7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test @@ -0,0 +1,7 @@ +--TEST-- +macro with varargs argument +--TEMPLATE-- +{% macro test(varargs) %} +{% endmacro %} +--EXCEPTION-- +Twig_Error_Syntax: The argument "varargs" in macro "test" cannot be defined because the variable "varargs" is reserved for arbitrary arguments in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test new file mode 100644 index 000000000..685626f2a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test @@ -0,0 +1,14 @@ +--TEST-- +macro with a filter +--TEMPLATE-- +{% import _self as test %} + +{% macro test() %} + {% filter escape %}foo
    {% endfilter %} +{% endmacro %} + +{{ test.test() }} +--DATA-- +return array(); +--EXPECT-- +foo<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test new file mode 100644 index 000000000..ff977ad62 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test @@ -0,0 +1,15 @@ +--TEST-- +Exception with bad line number +--TEMPLATE-- +{% block content %} + {{ foo }} + {{ include("foo") }} +{% endblock %} +index +--TEMPLATE(foo)-- +foo +{{ foo.bar }} +--DATA-- +return array('foo' => 'foo'); +--EXCEPTION-- +Twig_Error_Runtime: Impossible to access an attribute ("bar") on a string variable ("foo") in "foo" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test new file mode 100644 index 000000000..65f6cd2b8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test @@ -0,0 +1,8 @@ +--TEST-- +Twig outputs 0 nodes correctly +--TEMPLATE-- +{{ foo }}0{{ foo }} +--DATA-- +return array('foo' => 'foo') +--EXPECT-- +foo0foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test new file mode 100644 index 000000000..ff7c8bb70 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test @@ -0,0 +1,23 @@ +--TEST-- +error in twig extension +--TEMPLATE-- +{{ object.region is not null ? object.regionChoices[object.region] }} +--DATA-- +class House +{ + const REGION_S = 1; + const REGION_P = 2; + + public static $regionChoices = array(self::REGION_S => 'house.region.s', self::REGION_P => 'house.region.p'); + + public function getRegionChoices() + { + return self::$regionChoices; + } +} + +$object = new House(); +$object->region = 1; +return array('object' => $object) +--EXPECT-- +house.region.s diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test new file mode 100644 index 000000000..269a30571 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test @@ -0,0 +1,10 @@ +--TEST-- +Twig allows multi-word tests without a custom node class +--TEMPLATE-- +{{ 'foo' is multi word ? 'yes' : 'no' }} +{{ 'foo bar' is multi word ? 'yes' : 'no' }} +--DATA-- +return array() +--EXPECT-- +no +yes diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test new file mode 100644 index 000000000..60c3c51d7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test @@ -0,0 +1,19 @@ +--TEST-- +Twig is able to deal with SimpleXMLElement instances as variables +--CONDITION-- +version_compare(phpversion(), '5.3.0', '>=') +--TEMPLATE-- +Hello '{{ images.image.0.group }}'! +{{ images.image.0.group.attributes.myattr }} +{{ images.children().image.count() }} +{% for image in images %} + - {{ image.group }} +{% endfor %} +--DATA-- +return array('images' => new SimpleXMLElement('foobar')) +--EXPECT-- +Hello 'foo'! +example +2 + - foo + - bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test new file mode 100644 index 000000000..e18e11079 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test @@ -0,0 +1,8 @@ +--TEST-- +Twig does not confuse strings with integers in getAttribute() +--TEMPLATE-- +{{ hash['2e2'] }} +--DATA-- +return array('hash' => array('2e2' => 'works')) +--EXPECT-- +works diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test new file mode 100644 index 000000000..2f6a3e1a0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test @@ -0,0 +1,26 @@ +--TEST-- +"autoescape" tag applies escaping on its children +--TEMPLATE-- +{% autoescape %} +{{ var }}
    +{% endautoescape %} +{% autoescape 'html' %} +{{ var }}
    +{% endautoescape %} +{% autoescape false %} +{{ var }}
    +{% endautoescape %} +{% autoescape true %} +{{ var }}
    +{% endautoescape %} +{% autoescape false %} +{{ var }}
    +{% endautoescape %} +--DATA-- +return array('var' => '
    ') +--EXPECT-- +<br />
    +<br />
    +

    +<br />
    +

    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test new file mode 100644 index 000000000..05ab83ce3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test @@ -0,0 +1,12 @@ +--TEST-- +"autoescape" tag applies escaping on embedded blocks +--TEMPLATE-- +{% autoescape 'html' %} + {% block foo %} + {{ var }} + {% endblock %} +{% endautoescape %} +--DATA-- +return array('var' => '
    ') +--EXPECT-- +<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test new file mode 100644 index 000000000..9c0972462 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test @@ -0,0 +1,10 @@ +--TEST-- +"autoescape" tag does not double-escape +--TEMPLATE-- +{% autoescape 'html' %} +{{ var|escape }} +{% endautoescape %} +--DATA-- +return array('var' => '
    ') +--EXPECT-- +<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test new file mode 100644 index 000000000..ce7ea789e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test @@ -0,0 +1,83 @@ +--TEST-- +"autoescape" tag applies escaping after calling functions +--TEMPLATE-- + +autoescape false +{% autoescape false %} + +safe_br +{{ safe_br() }} + +unsafe_br +{{ unsafe_br() }} + +{% endautoescape %} + +autoescape 'html' +{% autoescape 'html' %} + +safe_br +{{ safe_br() }} + +unsafe_br +{{ unsafe_br() }} + +unsafe_br()|raw +{{ (unsafe_br())|raw }} + +safe_br()|escape +{{ (safe_br())|escape }} + +safe_br()|raw +{{ (safe_br())|raw }} + +unsafe_br()|escape +{{ (unsafe_br())|escape }} + +{% endautoescape %} + +autoescape js +{% autoescape 'js' %} + +safe_br +{{ safe_br() }} + +{% endautoescape %} +--DATA-- +return array() +--EXPECT-- + +autoescape false + +safe_br +
    + +unsafe_br +
    + + +autoescape 'html' + +safe_br +
    + +unsafe_br +<br /> + +unsafe_br()|raw +
    + +safe_br()|escape +<br /> + +safe_br()|raw +
    + +unsafe_br()|escape +<br /> + + +autoescape js + +safe_br +\x3Cbr\x20\x2F\x3E diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test new file mode 100644 index 000000000..e389d4dd5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test @@ -0,0 +1,45 @@ +--TEST-- +"autoescape" tag does not apply escaping on literals +--TEMPLATE-- +{% autoescape 'html' %} + +1. Simple literal +{{ "
    " }} + +2. Conditional expression with only literals +{{ true ? "
    " : "
    " }} + +3. Conditional expression with a variable +{{ true ? "
    " : someVar }} + +4. Nested conditionals with only literals +{{ true ? (true ? "
    " : "
    ") : "\n" }} + +5. Nested conditionals with a variable +{{ true ? (true ? "
    " : someVar) : "\n" }} + +6. Nested conditionals with a variable marked safe +{{ true ? (true ? "
    " : someVar|raw) : "\n" }} + +{% endautoescape %} +--DATA-- +return array() +--EXPECT-- + +1. Simple literal +
    + +2. Conditional expression with only literals +
    + +3. Conditional expression with a variable +<br /> + +4. Nested conditionals with only literals +
    + +5. Nested conditionals with a variable +<br /> + +6. Nested conditionals with a variable marked safe +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test new file mode 100644 index 000000000..798e6feaf --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test @@ -0,0 +1,26 @@ +--TEST-- +"autoescape" tags can be nested at will +--TEMPLATE-- +{{ var }} +{% autoescape 'html' %} + {{ var }} + {% autoescape false %} + {{ var }} + {% autoescape 'html' %} + {{ var }} + {% endautoescape %} + {{ var }} + {% endautoescape %} + {{ var }} +{% endautoescape %} +{{ var }} +--DATA-- +return array('var' => '
    ') +--EXPECT-- +<br /> + <br /> +
    + <br /> +
    + <br /> +<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test new file mode 100644 index 000000000..e896aa41c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test @@ -0,0 +1,26 @@ +--TEST-- +"autoescape" tag applies escaping to object method calls +--TEMPLATE-- +{% autoescape 'html' %} +{{ user.name }} +{{ user.name|lower }} +{{ user }} +{% endautoescape %} +--DATA-- +class UserForAutoEscapeTest +{ + public function getName() + { + return 'Fabien
    '; + } + + public function __toString() + { + return 'Fabien
    '; + } +} +return array('user' => new UserForAutoEscapeTest()) +--EXPECT-- +Fabien<br /> +fabien<br /> +Fabien<br /> diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test new file mode 100644 index 000000000..9f1cedd3a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test @@ -0,0 +1,10 @@ +--TEST-- +"autoescape" tag does not escape when raw is used as a filter +--TEMPLATE-- +{% autoescape 'html' %} +{{ var|raw }} +{% endautoescape %} +--DATA-- +return array('var' => '
    ') +--EXPECT-- +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test new file mode 100644 index 000000000..bbf1356e7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test @@ -0,0 +1,11 @@ +--TEST-- +"autoescape" tag accepts an escaping strategy +--TEMPLATE-- +{% autoescape true js %}{{ var }}{% endautoescape %} + +{% autoescape true html %}{{ var }}{% endautoescape %} +--DATA-- +return array('var' => '
    "') +--EXPECT-- +\x3Cbr\x20\x2F\x3E\x22 +<br />" diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test new file mode 100644 index 000000000..e496f6081 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test @@ -0,0 +1,11 @@ +--TEST-- +"autoescape" tag accepts an escaping strategy +--TEMPLATE-- +{% autoescape 'js' %}{{ var }}{% endautoescape %} + +{% autoescape 'html' %}{{ var }}{% endautoescape %} +--DATA-- +return array('var' => '
    "') +--EXPECT-- +\x3Cbr\x20\x2F\x3E\x22 +<br />" diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test new file mode 100644 index 000000000..4f415201d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test @@ -0,0 +1,69 @@ +--TEST-- +escape types +--TEMPLATE-- + +1. autoescape 'html' |escape('js') + +{% autoescape 'html' %} + +{% endautoescape %} + +2. autoescape 'html' |escape('js') + +{% autoescape 'html' %} + +{% endautoescape %} + +3. autoescape 'js' |escape('js') + +{% autoescape 'js' %} + +{% endautoescape %} + +4. no escape + +{% autoescape false %} + +{% endautoescape %} + +5. |escape('js')|escape('html') + +{% autoescape false %} + +{% endautoescape %} + +6. autoescape 'html' |escape('js')|escape('html') + +{% autoescape 'html' %} + +{% endautoescape %} + +--DATA-- +return array('msg' => "<>\n'\"") +--EXPECT-- + +1. autoescape 'html' |escape('js') + + + +2. autoescape 'html' |escape('js') + + + +3. autoescape 'js' |escape('js') + + + +4. no escape + + + +5. |escape('js')|escape('html') + + + +6. autoescape 'html' |escape('js')|escape('html') + + + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test new file mode 100644 index 000000000..7821a9aaf --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test @@ -0,0 +1,131 @@ +--TEST-- +"autoescape" tag applies escaping after calling filters +--TEMPLATE-- +{% autoescape 'html' %} + +(escape_and_nl2br is an escaper filter) + +1. Don't escape escaper filter output +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is not escaped ) +{{ var|escape_and_nl2br }} + +2. Don't escape escaper filter output +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is not escaped, |raw is redundant ) +{{ var|escape_and_nl2br|raw }} + +3. Explicit escape +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is explicitly escaped by |escape ) +{{ var|escape_and_nl2br|escape }} + +4. Escape non-escaper filter output +( var is upper-cased by |upper, + the output is auto-escaped ) +{{ var|upper }} + +5. Escape if last filter is not an escaper +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is upper-cased by |upper, + the output is auto-escaped as |upper is not an escaper ) +{{ var|escape_and_nl2br|upper }} + +6. Don't escape escaper filter output +( var is upper cased by upper, + the output is escaped by |escape_and_nl2br, line-breaks are added, + the output is not escaped as |escape_and_nl2br is an escaper ) +{{ var|upper|escape_and_nl2br }} + +7. Escape if last filter is not an escaper +( the output of |format is "" ~ var ~ "", + the output is auto-escaped ) +{{ "%s"|format(var) }} + +8. Escape if last filter is not an escaper +( the output of |format is "" ~ var ~ "", + |raw is redundant, + the output is auto-escaped ) +{{ "%s"|raw|format(var) }} + +9. Don't escape escaper filter output +( the output of |format is "" ~ var ~ "", + the output is not escaped due to |raw filter at the end ) +{{ "%s"|format(var)|raw }} + +10. Don't escape escaper filter output +( the output of |format is "" ~ var ~ "", + the output is not escaped due to |raw filter at the end, + the |raw filter on var is redundant ) +{{ "%s"|format(var|raw)|raw }} + +{% endautoescape %} +--DATA-- +return array('var' => "\nTwig") +--EXPECT-- + +(escape_and_nl2br is an escaper filter) + +1. Don't escape escaper filter output +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is not escaped ) +<Fabien>
    +Twig + +2. Don't escape escaper filter output +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is not escaped, |raw is redundant ) +<Fabien>
    +Twig + +3. Explicit escape +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is explicitly escaped by |escape ) +&lt;Fabien&gt;<br /> +Twig + +4. Escape non-escaper filter output +( var is upper-cased by |upper, + the output is auto-escaped ) +<FABIEN> +TWIG + +5. Escape if last filter is not an escaper +( var is escaped by |escape_and_nl2br, line-breaks are added, + the output is upper-cased by |upper, + the output is auto-escaped as |upper is not an escaper ) +&LT;FABIEN&GT;<BR /> +TWIG + +6. Don't escape escaper filter output +( var is upper cased by upper, + the output is escaped by |escape_and_nl2br, line-breaks are added, + the output is not escaped as |escape_and_nl2br is an escaper ) +<FABIEN>
    +TWIG + +7. Escape if last filter is not an escaper +( the output of |format is "" ~ var ~ "", + the output is auto-escaped ) +<b><Fabien> +Twig</b> + +8. Escape if last filter is not an escaper +( the output of |format is "" ~ var ~ "", + |raw is redundant, + the output is auto-escaped ) +<b><Fabien> +Twig</b> + +9. Don't escape escaper filter output +( the output of |format is "" ~ var ~ "", + the output is not escaped due to |raw filter at the end ) + +Twig + +10. Don't escape escaper filter output +( the output of |format is "" ~ var ~ "", + the output is not escaped due to |raw filter at the end, + the |raw filter on var is redundant ) + +Twig diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test new file mode 100644 index 000000000..f58a1e09c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test @@ -0,0 +1,23 @@ +--TEST-- +"autoescape" tag do not applies escaping on filter arguments +--TEMPLATE-- +{% autoescape 'html' %} +{{ var|nl2br("
    ") }} +{{ var|nl2br("
    "|escape) }} +{{ var|nl2br(sep) }} +{{ var|nl2br(sep|raw) }} +{{ var|nl2br(sep|escape) }} +{% endautoescape %} +--DATA-- +return array('var' => "\nTwig", 'sep' => '
    ') +--EXPECT-- +<Fabien>
    +Twig +<Fabien><br /> +Twig +<Fabien>
    +Twig +<Fabien>
    +Twig +<Fabien><br /> +Twig diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test new file mode 100644 index 000000000..134c77ea8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test @@ -0,0 +1,68 @@ +--TEST-- +"autoescape" tag applies escaping after calling filters, and before calling pre_escape filters +--TEMPLATE-- +{% autoescape 'html' %} + +(nl2br is pre_escaped for "html" and declared safe for "html") + +1. Pre-escape and don't post-escape +( var|escape|nl2br ) +{{ var|nl2br }} + +2. Don't double-pre-escape +( var|escape|nl2br ) +{{ var|escape|nl2br }} + +3. Don't escape safe values +( var|raw|nl2br ) +{{ var|raw|nl2br }} + +4. Don't escape safe values +( var|escape|nl2br|nl2br ) +{{ var|nl2br|nl2br }} + +5. Re-escape values that are escaped for an other contexts +( var|escape_something|escape|nl2br ) +{{ var|escape_something|nl2br }} + +6. Still escape when using filters not declared safe +( var|escape|nl2br|upper|escape ) +{{ var|nl2br|upper }} + +{% endautoescape %} +--DATA-- +return array('var' => "\nTwig") +--EXPECT-- + +(nl2br is pre_escaped for "html" and declared safe for "html") + +1. Pre-escape and don't post-escape +( var|escape|nl2br ) +<Fabien>
    +Twig + +2. Don't double-pre-escape +( var|escape|nl2br ) +<Fabien>
    +Twig + +3. Don't escape safe values +( var|raw|nl2br ) +
    +Twig + +4. Don't escape safe values +( var|escape|nl2br|nl2br ) +<Fabien>

    +Twig + +5. Re-escape values that are escaped for an other contexts +( var|escape_something|escape|nl2br ) +<FABIEN>
    +TWIG + +6. Still escape when using filters not declared safe +( var|escape|nl2br|upper|escape ) +&LT;FABIEN&GT;<BR /> +TWIG + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test new file mode 100644 index 000000000..32d3943b5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test @@ -0,0 +1,50 @@ +--TEST-- +"autoescape" tag handles filters preserving the safety +--TEMPLATE-- +{% autoescape 'html' %} + +(preserves_safety is preserving safety for "html") + +1. Unsafe values are still unsafe +( var|preserves_safety|escape ) +{{ var|preserves_safety }} + +2. Safe values are still safe +( var|escape|preserves_safety ) +{{ var|escape|preserves_safety }} + +3. Re-escape values that are escaped for an other contexts +( var|escape_something|preserves_safety|escape ) +{{ var|escape_something|preserves_safety }} + +4. Still escape when using filters not declared safe +( var|escape|preserves_safety|replace({'FABIEN': 'FABPOT'})|escape ) +{{ var|escape|preserves_safety|replace({'FABIEN': 'FABPOT'}) }} + +{% endautoescape %} +--DATA-- +return array('var' => "\nTwig") +--EXPECT-- + +(preserves_safety is preserving safety for "html") + +1. Unsafe values are still unsafe +( var|preserves_safety|escape ) +<FABIEN> +TWIG + +2. Safe values are still safe +( var|escape|preserves_safety ) +<FABIEN> +TWIG + +3. Re-escape values that are escaped for an other contexts +( var|escape_something|preserves_safety|escape ) +<FABIEN> +TWIG + +4. Still escape when using filters not declared safe +( var|escape|preserves_safety|replace({'FABIEN': 'FABPOT'})|escape ) +&LT;FABPOT&GT; +TWIG + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test new file mode 100644 index 000000000..360dcf030 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test @@ -0,0 +1,11 @@ +--TEST-- +"block" tag +--TEMPLATE-- +{% block title1 %}FOO{% endblock %} +{% block title2 foo|lower %} +--TEMPLATE(foo.twig)-- +{% block content %}{% endblock %} +--DATA-- +return array('foo' => 'bar') +--EXPECT-- +FOObar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test new file mode 100644 index 000000000..bc89ec820 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test @@ -0,0 +1,11 @@ +--TEST-- +"block" tag +--TEMPLATE-- +{% block content %} + {% block content %} + {% endblock %} +{% endblock %} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Syntax: The block 'content' has already been defined line 2 in "index.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test new file mode 100644 index 000000000..be17fedf3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test @@ -0,0 +1,10 @@ +--TEST-- +"§" special chars in a block name +--TEMPLATE-- +{% block § %} +§ +{% endblock § %} +--DATA-- +return array() +--EXPECT-- +§ diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test new file mode 100644 index 000000000..f44296ea0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test @@ -0,0 +1,35 @@ +--TEST-- +"embed" tag +--TEMPLATE-- +FOO +{% embed "foo.twig" %} + {% block c1 %} + {{ parent() }} + block1extended + {% endblock %} +{% endembed %} + +BAR +--TEMPLATE(foo.twig)-- +A +{% block c1 %} + block1 +{% endblock %} +B +{% block c2 %} + block2 +{% endblock %} +C +--DATA-- +return array() +--EXPECT-- +FOO + +A + block1 + + block1extended + B + block2 +C +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test new file mode 100644 index 000000000..de5ea7eea --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test @@ -0,0 +1,35 @@ +--TEST-- +"embed" tag +--TEMPLATE-- +FOO +{% embed foo ~ ".twig" %} + {% block c1 %} + {{ parent() }} + block1extended + {% endblock %} +{% endembed %} + +BAR +--TEMPLATE(foo.twig)-- +A +{% block c1 %} + block1 +{% endblock %} +B +{% block c2 %} + block2 +{% endblock %} +C +--DATA-- +return array('foo' => 'foo') +--EXPECT-- +FOO + +A + block1 + + block1extended + B + block2 +C +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test new file mode 100644 index 000000000..2a125e6b5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test @@ -0,0 +1,35 @@ +--TEST-- +"embed" tag +--TEMPLATE-- +FOO +{% embed foo %} + {% block c1 %} + {{ parent() }} + block1extended + {% endblock %} +{% endembed %} + +BAR +--TEMPLATE(foo.twig)-- +A +{% block c1 %} + block1 +{% endblock %} +B +{% block c2 %} + block2 +{% endblock %} +C +--DATA-- +return array('foo' => 'foo.twig') +--EXPECT-- +FOO + +A + block1 + + block1extended + B + block2 +C +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test new file mode 100644 index 000000000..431473707 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test @@ -0,0 +1,16 @@ +--TEST-- +"embed" tag +--TEMPLATE(index.twig)-- +FOO +{% embed "foo.twig" %} + {% block c1 %} + {{ nothing }} + {% endblock %} +{% endembed %} +BAR +--TEMPLATE(foo.twig)-- +{% block c1 %}{% endblock %} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Runtime: Variable "nothing" does not exist in "index.twig" at line 5. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test new file mode 100644 index 000000000..da161e6d4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test @@ -0,0 +1,50 @@ +--TEST-- +"embed" tag +--TEMPLATE-- +FOO +{% embed "foo.twig" %} + {% block c1 %} + {{ parent() }} + block1extended + {% endblock %} +{% endembed %} + +{% embed "foo.twig" %} + {% block c1 %} + {{ parent() }} + block1extended + {% endblock %} +{% endembed %} + +BAR +--TEMPLATE(foo.twig)-- +A +{% block c1 %} + block1 +{% endblock %} +B +{% block c2 %} + block2 +{% endblock %} +C +--DATA-- +return array() +--EXPECT-- +FOO + +A + block1 + + block1extended + B + block2 +C + +A + block1 + + block1extended + B + block2 +C +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test new file mode 100644 index 000000000..81563dcef --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test @@ -0,0 +1,42 @@ +--TEST-- +"embed" tag +--TEMPLATE-- +{% embed "foo.twig" %} + {% block c1 %} + {{ parent() }} + {% embed "foo.twig" %} + {% block c1 %} + {{ parent() }} + block1extended + {% endblock %} + {% endembed %} + + {% endblock %} +{% endembed %} +--TEMPLATE(foo.twig)-- +A +{% block c1 %} + block1 +{% endblock %} +B +{% block c2 %} + block2 +{% endblock %} +C +--DATA-- +return array() +--EXPECT-- +A + block1 + + +A + block1 + + block1extended + B + block2 +C + B + block2 +C diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test new file mode 100644 index 000000000..2c1dd584c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test @@ -0,0 +1,60 @@ +--TEST-- +"embed" tag +--TEMPLATE-- +{% extends "base.twig" %} + +{% block c1 %} + {{ parent() }} + blockc1baseextended +{% endblock %} + +{% block c2 %} + {{ parent() }} + + {% embed "foo.twig" %} + {% block c1 %} + {{ parent() }} + block1extended + {% endblock %} + {% endembed %} + {{ parent() }} +{% endblock %} +--TEMPLATE(base.twig)-- +A +{% block c1 %} + blockc1base +{% endblock %} +{% block c2 %} + blockc2base +{% endblock %} +B +--TEMPLATE(foo.twig)-- +A +{% block c1 %} + block1 +{% endblock %} +B +{% block c2 %} + block2 +{% endblock %} +C +--DATA-- +return array() +--EXPECT-- +A + blockc1base + + blockc1baseextended + blockc2base + + + +A + block1 + + block1extended + B + block2 +C blockc2base + +B \ No newline at end of file diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test new file mode 100644 index 000000000..82094f2f0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test @@ -0,0 +1,10 @@ +--TEST-- +"filter" tag applies a filter on its children +--TEMPLATE-- +{% filter upper %} +Some text with a {{ var }} +{% endfilter %} +--DATA-- +return array('var' => 'var') +--EXPECT-- +SOME TEXT WITH A VAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test new file mode 100644 index 000000000..3e7148bf4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test @@ -0,0 +1,8 @@ +--TEST-- +"filter" tag applies a filter on its children +--TEMPLATE-- +{% filter json_encode|raw %}test{% endfilter %} +--DATA-- +return array() +--EXPECT-- +"test" diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test new file mode 100644 index 000000000..75512ef96 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test @@ -0,0 +1,10 @@ +--TEST-- +"filter" tags accept multiple chained filters +--TEMPLATE-- +{% filter lower|title %} + {{ var }} +{% endfilter %} +--DATA-- +return array('var' => 'VAR') +--EXPECT-- + Var diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test new file mode 100644 index 000000000..7e4e4eb33 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test @@ -0,0 +1,16 @@ +--TEST-- +"filter" tags can be nested at will +--TEMPLATE-- +{% filter lower|title %} + {{ var }} + {% filter upper %} + {{ var }} + {% endfilter %} + {{ var }} +{% endfilter %} +--DATA-- +return array('var' => 'var') +--EXPECT-- + Var + Var + Var diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test new file mode 100644 index 000000000..22745eadf --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test @@ -0,0 +1,13 @@ +--TEST-- +"filter" tag applies the filter on "for" tags +--TEMPLATE-- +{% filter upper %} +{% for item in items %} +{{ item }} +{% endfor %} +{% endfilter %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- +A +B diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test new file mode 100644 index 000000000..afd95b296 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test @@ -0,0 +1,29 @@ +--TEST-- +"filter" tag applies the filter on "if" tags +--TEMPLATE-- +{% filter upper %} +{% if items %} +{{ items|join(', ') }} +{% endif %} + +{% if items.3 is defined %} +FOO +{% else %} +{{ items.1 }} +{% endif %} + +{% if items.3 is defined %} +FOO +{% elseif items.1 %} +{{ items.0 }} +{% endif %} + +{% endfilter %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- +A, B + +B + +A diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test new file mode 100644 index 000000000..380531f78 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test @@ -0,0 +1,14 @@ +--TEST-- +"for" tag takes a condition +--TEMPLATE-- +{% for i in 1..5 if i is odd -%} + {{ loop.index }}.{{ i }}{{ foo.bar }} +{% endfor %} +--DATA-- +return array('foo' => array('bar' => 'X')) +--CONFIG-- +return array('strict_variables' => false) +--EXPECT-- +1.1X +2.3X +3.5X diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test new file mode 100644 index 000000000..ddc69307b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test @@ -0,0 +1,18 @@ +--TEST-- +"for" tag keeps the context safe +--TEMPLATE-- +{% for item in items %} + {% for item in items %} + * {{ item }} + {% endfor %} + * {{ item }} +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- + * a + * b + * a + * a + * b + * b diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test new file mode 100644 index 000000000..20ccc880c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test @@ -0,0 +1,23 @@ +--TEST-- +"for" tag can use an "else" clause +--TEMPLATE-- +{% for item in items %} + * {{ item }} +{% else %} + no item +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- + * a + * b +--DATA-- +return array('items' => array()) +--EXPECT-- + no item +--DATA-- +return array() +--CONFIG-- +return array('strict_variables' => false) +--EXPECT-- + no item diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test new file mode 100644 index 000000000..49fb9ca6f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test @@ -0,0 +1,17 @@ +--TEST-- +"for" tag does not reset inner variables +--TEMPLATE-- +{% for i in 1..2 %} + {% for j in 0..2 %} + {{k}}{% set k = k+1 %} {{ loop.parent.loop.index }} + {% endfor %} +{% endfor %} +--DATA-- +return array('k' => 0) +--EXPECT-- + 0 1 + 1 1 + 2 1 + 3 2 + 4 2 + 5 2 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test new file mode 100644 index 000000000..4e22cb473 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test @@ -0,0 +1,11 @@ +--TEST-- +"for" tag can iterate over keys +--TEMPLATE-- +{% for key in items|keys %} + * {{ key }} +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- + * 0 + * 1 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test new file mode 100644 index 000000000..4c211689d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test @@ -0,0 +1,11 @@ +--TEST-- +"for" tag can iterate over keys and values +--TEMPLATE-- +{% for key, item in items %} + * {{ key }}/{{ item }} +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- + * 0/a + * 1/b diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test new file mode 100644 index 000000000..93bc76a1f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test @@ -0,0 +1,19 @@ +--TEST-- +"for" tag adds a loop variable to the context +--TEMPLATE-- +{% for item in items %} + * {{ loop.index }}/{{ loop.index0 }} + * {{ loop.revindex }}/{{ loop.revindex0 }} + * {{ loop.first }}/{{ loop.last }}/{{ loop.length }} + +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- + * 1/0 + * 2/1 + * 1//2 + + * 2/1 + * 1/0 + * /1/2 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test new file mode 100644 index 000000000..58af2c326 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test @@ -0,0 +1,10 @@ +--TEST-- +"for" tag adds a loop variable to the context locally +--TEMPLATE-- +{% for item in items %} +{% endfor %} +{% if loop is not defined %}WORKS{% endif %} +--DATA-- +return array('items' => array()) +--EXPECT-- +WORKS diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test new file mode 100644 index 000000000..6a2af63b6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test @@ -0,0 +1,10 @@ +--TEST-- +"for" tag +--TEMPLATE-- +{% for i, item in items if i > 0 %} + {{ loop.last }} +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXCEPTION-- +Twig_Error_Syntax: The "loop.last" variable is not defined when looping with a condition in "index.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test new file mode 100644 index 000000000..1e819ca0a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test @@ -0,0 +1,9 @@ +--TEST-- +"for" tag +--TEMPLATE-- +{% for i, item in items if loop.last > 0 %} +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXCEPTION-- +Twig_Error_Syntax: The "loop" variable cannot be used in a looping condition in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test new file mode 100644 index 000000000..f8b9f6bc1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test @@ -0,0 +1,17 @@ +--TEST-- +"for" tag can use an "else" clause +--TEMPLATE-- +{% for item in items %} + {% for item in items1 %} + * {{ item }} + {% else %} + no {{ item }} + {% endfor %} +{% else %} + no item1 +{% endfor %} +--DATA-- +return array('items' => array('a', 'b'), 'items1' => array()) +--EXPECT-- +no a + no b diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test new file mode 100644 index 000000000..503443792 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test @@ -0,0 +1,43 @@ +--TEST-- +"for" tag iterates over iterable objects +--TEMPLATE-- +{% for item in items %} + * {{ item }} + * {{ loop.index }}/{{ loop.index0 }} + * {{ loop.first }} + +{% endfor %} + +{% for key, value in items %} + * {{ key }}/{{ value }} +{% endfor %} + +{% for key in items|keys %} + * {{ key }} +{% endfor %} +--DATA-- +class ItemsIterator implements Iterator +{ + protected $values = array('foo' => 'bar', 'bar' => 'foo'); + public function current() { return current($this->values); } + public function key() { return key($this->values); } + public function next() { return next($this->values); } + public function rewind() { return reset($this->values); } + public function valid() { return false !== current($this->values); } +} +return array('items' => new ItemsIterator()) +--EXPECT-- + * bar + * 1/0 + * 1 + + * foo + * 2/1 + * + + + * foo/bar + * bar/foo + + * foo + * bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test new file mode 100644 index 000000000..4a1ff6119 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test @@ -0,0 +1,47 @@ +--TEST-- +"for" tag iterates over iterable and countable objects +--TEMPLATE-- +{% for item in items %} + * {{ item }} + * {{ loop.index }}/{{ loop.index0 }} + * {{ loop.revindex }}/{{ loop.revindex0 }} + * {{ loop.first }}/{{ loop.last }}/{{ loop.length }} + +{% endfor %} + +{% for key, value in items %} + * {{ key }}/{{ value }} +{% endfor %} + +{% for key in items|keys %} + * {{ key }} +{% endfor %} +--DATA-- +class ItemsIteratorCountable implements Iterator, Countable +{ + protected $values = array('foo' => 'bar', 'bar' => 'foo'); + public function current() { return current($this->values); } + public function key() { return key($this->values); } + public function next() { return next($this->values); } + public function rewind() { return reset($this->values); } + public function valid() { return false !== current($this->values); } + public function count() { return count($this->values); } +} +return array('items' => new ItemsIteratorCountable()) +--EXPECT-- + * bar + * 1/0 + * 2/1 + * 1//2 + + * foo + * 2/1 + * 1/0 + * /1/2 + + + * foo/bar + * bar/foo + + * foo + * bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test new file mode 100644 index 000000000..17b2e2223 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test @@ -0,0 +1,18 @@ +--TEST-- +"for" tags can be nested +--TEMPLATE-- +{% for key, item in items %} +* {{ key }} ({{ loop.length }}): +{% for value in item %} + * {{ value }} ({{ loop.length }}) +{% endfor %} +{% endfor %} +--DATA-- +return array('items' => array('a' => array('a1', 'a2', 'a3'), 'b' => array('b1'))) +--EXPECT-- +* a (2): + * a1 (3) + * a2 (3) + * a3 (3) +* b (2): + * b1 (1) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test new file mode 100644 index 000000000..82f2ae8a4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test @@ -0,0 +1,11 @@ +--TEST-- +"for" tag iterates over item values +--TEMPLATE-- +{% for item in items %} + * {{ item }} +{% endfor %} +--DATA-- +return array('items' => array('a', 'b')) +--EXPECT-- + * a + * b diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test new file mode 100644 index 000000000..5f5da0ec1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test @@ -0,0 +1,14 @@ +--TEST-- +global variables +--TEMPLATE-- +{% include "included.twig" %} +{% from "included.twig" import foobar %} +{{ foobar() }} +--TEMPLATE(included.twig)-- +{% macro foobar() %} +called foobar +{% endmacro %} +--DATA-- +return array(); +--EXPECT-- +called foobar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test new file mode 100644 index 000000000..c1c3d2768 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test @@ -0,0 +1,22 @@ +--TEST-- +"if" creates a condition +--TEMPLATE-- +{% if a is defined %} + {{ a }} +{% elseif b is defined %} + {{ b }} +{% else %} + NOTHING +{% endif %} +--DATA-- +return array('a' => 'a') +--EXPECT-- + a +--DATA-- +return array('b' => 'b') +--EXPECT-- + b +--DATA-- +return array() +--EXPECT-- + NOTHING diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test new file mode 100644 index 000000000..edfb73df4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test @@ -0,0 +1,22 @@ +--TEST-- +"if" takes an expression as a test +--TEMPLATE-- +{% if a < 2 %} + A1 +{% elseif a > 10 %} + A2 +{% else %} + A3 +{% endif %} +--DATA-- +return array('a' => 1) +--EXPECT-- + A1 +--DATA-- +return array('a' => 12) +--EXPECT-- + A2 +--DATA-- +return array('a' => 7) +--EXPECT-- + A3 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test new file mode 100644 index 000000000..8fe1a6c13 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test @@ -0,0 +1,16 @@ +--TEST-- +"include" tag +--TEMPLATE-- +FOO +{% include "foo.twig" %} + +BAR +--TEMPLATE(foo.twig)-- +FOOBAR +--DATA-- +return array() +--EXPECT-- +FOO + +FOOBAR +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test new file mode 100644 index 000000000..eaeeb112e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test @@ -0,0 +1,16 @@ +--TEST-- +"include" tag allows expressions for the template to include +--TEMPLATE-- +FOO +{% include foo %} + +BAR +--TEMPLATE(foo.twig)-- +FOOBAR +--DATA-- +return array('foo' => 'foo.twig') +--EXPECT-- +FOO + +FOOBAR +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test new file mode 100644 index 000000000..24aed06de --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test @@ -0,0 +1,10 @@ +--TEST-- +"include" tag +--TEMPLATE-- +{% include ["foo.twig", "bar.twig"] ignore missing %} +{% include "foo.twig" ignore missing %} +{% include "foo.twig" ignore missing with {} %} +{% include "foo.twig" ignore missing with {} only %} +--DATA-- +return array() +--EXPECT-- diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test new file mode 100644 index 000000000..f25e87155 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test @@ -0,0 +1,8 @@ +--TEST-- +"include" tag +--TEMPLATE-- +{% include "foo.twig" %} +--DATA-- +return array(); +--EXCEPTION-- +Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test new file mode 100644 index 000000000..86c186444 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test @@ -0,0 +1,16 @@ +--TEST-- +"include" tag +--TEMPLATE-- +{% extends "base.twig" %} + +{% block content %} + {{ parent() }} +{% endblock %} +--TEMPLATE(base.twig)-- +{% block content %} + {% include "foo.twig" %} +{% endblock %} +--DATA-- +return array(); +--EXCEPTION-- +Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test new file mode 100644 index 000000000..77760a09e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test @@ -0,0 +1,16 @@ +--TEST-- +"include" tag accept variables and only +--TEMPLATE-- +{% include "foo.twig" %} +{% include "foo.twig" only %} +{% include "foo.twig" with {'foo1': 'bar'} %} +{% include "foo.twig" with {'foo1': 'bar'} only %} +--TEMPLATE(foo.twig)-- +{% for k, v in _context %}{{ k }},{% endfor %} +--DATA-- +return array('foo' => 'bar') +--EXPECT-- +foo,global,_parent, +global,_parent, +foo,global,foo1,_parent, +foo1,global,_parent, diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test new file mode 100644 index 000000000..6ba064a38 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test @@ -0,0 +1,10 @@ +--TEST-- +"include" tag accepts Twig_Template instance +--TEMPLATE-- +{% include foo %} FOO +--TEMPLATE(foo.twig)-- +BAR +--DATA-- +return array('foo' => $twig->loadTemplate('foo.twig')) +--EXPECT-- +BAR FOO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test new file mode 100644 index 000000000..ab670ee06 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test @@ -0,0 +1,12 @@ +--TEST-- +"include" tag +--TEMPLATE-- +{% include ["foo.twig", "bar.twig"] %} +{% include ["bar.twig", "foo.twig"] %} +--TEMPLATE(foo.twig)-- +foo +--DATA-- +return array() +--EXPECT-- +foo +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test new file mode 100644 index 000000000..41384ac7c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test @@ -0,0 +1,12 @@ +--TEST-- +"include" tag accept variables +--TEMPLATE-- +{% include "foo.twig" with {'foo': 'bar'} %} +{% include "foo.twig" with vars %} +--TEMPLATE(foo.twig)-- +{{ foo }} +--DATA-- +return array('vars' => array('foo' => 'bar')) +--EXPECT-- +bar +bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test new file mode 100644 index 000000000..0778a4b49 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test @@ -0,0 +1,14 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends "foo.twig" %} + +{% block content %} +FOO +{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %}{% endblock %} +--DATA-- +return array() +--EXPECT-- +FOO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test new file mode 100644 index 000000000..9a81499ab --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test @@ -0,0 +1,32 @@ +--TEST-- +block_expr +--TEMPLATE-- +{% extends "base.twig" %} + +{% block element -%} + Element: + {{- parent() -}} +{% endblock %} +--TEMPLATE(base.twig)-- +{% spaceless %} +{% block element -%} +
    + {%- if item.children is defined %} + {%- for item in item.children %} + {{- block('element') -}} + {% endfor %} + {%- endif -%} +
    +{%- endblock %} +{% endspaceless %} +--DATA-- +return array( + 'item' => array( + 'children' => array( + null, + null, + ) + ) +) +--EXPECT-- +Element:
    Element:
    Element:
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test new file mode 100644 index 000000000..3e868c0da --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test @@ -0,0 +1,34 @@ +--TEST-- +block_expr2 +--TEMPLATE-- +{% extends "base2.twig" %} + +{% block element -%} + Element: + {{- parent() -}} +{% endblock %} +--TEMPLATE(base2.twig)-- +{% extends "base.twig" %} +--TEMPLATE(base.twig)-- +{% spaceless %} +{% block element -%} +
    + {%- if item.children is defined %} + {%- for item in item.children %} + {{- block('element') -}} + {% endfor %} + {%- endif -%} +
    +{%- endblock %} +{% endspaceless %} +--DATA-- +return array( + 'item' => array( + 'children' => array( + null, + null, + ) + ) +) +--EXPECT-- +Element:
    Element:
    Element:
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test new file mode 100644 index 000000000..8576e773a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test @@ -0,0 +1,14 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends standalone ? foo : 'bar.twig' %} + +{% block content %}{{ parent() }}FOO{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %}FOO{% endblock %} +--TEMPLATE(bar.twig)-- +{% block content %}BAR{% endblock %} +--DATA-- +return array('foo' => 'foo.twig', 'standalone' => true) +--EXPECT-- +FOOFOO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test new file mode 100644 index 000000000..ee06ddce3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test @@ -0,0 +1,14 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends foo %} + +{% block content %} +FOO +{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %}{% endblock %} +--DATA-- +return array('foo' => 'foo.twig') +--EXPECT-- +FOO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test new file mode 100644 index 000000000..784f35718 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test @@ -0,0 +1,10 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends "foo.twig" %} +--TEMPLATE(foo.twig)-- +{% block content %}FOO{% endblock %} +--DATA-- +return array() +--EXPECT-- +FOO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test new file mode 100644 index 000000000..a1cb1ce8a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test @@ -0,0 +1,12 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends ["foo.twig", "bar.twig"] %} +--TEMPLATE(bar.twig)-- +{% block content %} +foo +{% endblock %} +--DATA-- +return array() +--EXPECT-- +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test new file mode 100644 index 000000000..acc74f6a1 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test @@ -0,0 +1,12 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends ["", "bar.twig"] %} +--TEMPLATE(bar.twig)-- +{% block content %} +foo +{% endblock %} +--DATA-- +return array() +--EXPECT-- +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test new file mode 100644 index 000000000..cfa648d41 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test @@ -0,0 +1,12 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends [null, "bar.twig"] %} +--TEMPLATE(bar.twig)-- +{% block content %} +foo +{% endblock %} +--DATA-- +return array() +--EXPECT-- +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test new file mode 100644 index 000000000..dfc2b6c49 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test @@ -0,0 +1,12 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends "layout.twig" %}{% block content %}{{ parent() }}index {% endblock %} +--TEMPLATE(layout.twig)-- +{% extends "base.twig" %}{% block content %}{{ parent() }}layout {% endblock %} +--TEMPLATE(base.twig)-- +{% block content %}base {% endblock %} +--DATA-- +return array() +--EXPECT-- +base layout index diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test new file mode 100644 index 000000000..1d3e639ca --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test @@ -0,0 +1,22 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% set foo = 1 %} +{{ include('parent.twig') }} +{{ include('parent.twig') }} +{% set foo = 2 %} +{{ include('parent.twig') }} +--TEMPLATE(parent.twig)-- +{% extends foo~'_parent.twig' %}{% block content %}{{ parent() }} parent{% endblock %} +--TEMPLATE(1_parent.twig)-- +{% block content %}1{% endblock %} +--TEMPLATE(2_parent.twig)-- +{% block content %}2{% endblock %} +--DATA-- +return array() +--EXPECT-- +1 parent + +1 parent + +2 parent diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test new file mode 100644 index 000000000..faca92591 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test @@ -0,0 +1,22 @@ +--TEST-- +"block" tag +--TEMPLATE-- +{% extends "foo.twig" %} + +{% block content %} + {% block subcontent %} + {% block subsubcontent %} + SUBSUBCONTENT + {% endblock %} + {% endblock %} +{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %} + {% block subcontent %} + SUBCONTENT + {% endblock %} +{% endblock %} +--DATA-- +return array() +--EXPECT-- +SUBSUBCONTENT diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test new file mode 100644 index 000000000..0ad11d0c0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test @@ -0,0 +1,15 @@ +--TEST-- +"block" tag +--TEMPLATE-- +{% block content %} + CONTENT + {%- block subcontent -%} + SUBCONTENT + {%- endblock -%} + ENDCONTENT +{% endblock %} +--TEMPLATE(foo.twig)-- +--DATA-- +return array() +--EXPECT-- +CONTENTSUBCONTENTENDCONTENT diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test new file mode 100644 index 000000000..71e3cdfd4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test @@ -0,0 +1,16 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends "layout.twig" %} +{% block inside %}INSIDE{% endblock inside %} +--TEMPLATE(layout.twig)-- +{% extends "base.twig" %} +{% block body %} + {% block inside '' %} +{% endblock body %} +--TEMPLATE(base.twig)-- +{% block body '' %} +--DATA-- +return array() +--EXPECT-- +INSIDE diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test new file mode 100644 index 000000000..4f975db80 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test @@ -0,0 +1,12 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends "foo.twig" %} + +{% block content %}{{ parent() }}FOO{{ parent() }}{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %}BAR{% endblock %} +--DATA-- +return array() +--EXPECT-- +BARFOOBAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test new file mode 100644 index 000000000..a8bc90cef --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test @@ -0,0 +1,16 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends foo ? 'foo.twig' : 'bar.twig' %} +--TEMPLATE(foo.twig)-- +FOO +--TEMPLATE(bar.twig)-- +BAR +--DATA-- +return array('foo' => true) +--EXPECT-- +FOO +--DATA-- +return array('foo' => false) +--EXPECT-- +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test new file mode 100644 index 000000000..cca6dbc9b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test @@ -0,0 +1,8 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% block content %} + {% extends "foo.twig" %} +{% endblock %} +--EXCEPTION-- +Twig_Error_Syntax: Cannot extend from a block in "index.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test new file mode 100644 index 000000000..628167135 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test @@ -0,0 +1,20 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends "base.twig" %} +{% block content %}{% include "included.twig" %}{% endblock %} + +{% block footer %}Footer{% endblock %} +--TEMPLATE(included.twig)-- +{% extends "base.twig" %} +{% block content %}Included Content{% endblock %} +--TEMPLATE(base.twig)-- +{% block content %}Default Content{% endblock %} + +{% block footer %}Default Footer{% endblock %} +--DATA-- +return array() +--EXPECT-- +Included Content +Default Footer +Footer diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test new file mode 100644 index 000000000..71e7c2080 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test @@ -0,0 +1,28 @@ +--TEST-- +"extends" tag +--TEMPLATE-- +{% extends "foo.twig" %} + +{% block content %} + {% block inside %} + INSIDE OVERRIDDEN + {% endblock %} + + BEFORE + {{ parent() }} + AFTER +{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %} + BAR +{% endblock %} +--DATA-- +return array() +--EXPECT-- + +INSIDE OVERRIDDEN + + BEFORE + BAR + + AFTER diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test new file mode 100644 index 000000000..e29b1ac4b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test @@ -0,0 +1,8 @@ +--TEST-- +"parent" tag +--TEMPLATE-- +{% block content %} + {{ parent() }} +{% endblock %} +--EXCEPTION-- +Twig_Error_Syntax: Calling "parent" on a template that does not extend nor "use" another template is forbidden in "index.twig" at line 3. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test new file mode 100644 index 000000000..63c730550 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test @@ -0,0 +1,14 @@ +--TEST-- +"parent" tag +--TEMPLATE-- +{% use 'foo.twig' %} + +{% block content %} + {{ parent() }} +{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %}BAR{% endblock %} +--DATA-- +return array() +--EXPECT-- +BAR diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test new file mode 100644 index 000000000..d1876a52d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test @@ -0,0 +1,14 @@ +--TEST-- +"extends" tag accepts Twig_Template instance +--TEMPLATE-- +{% extends foo %} + +{% block content %} +{{ parent() }}FOO +{% endblock %} +--TEMPLATE(foo.twig)-- +{% block content %}BAR{% endblock %} +--DATA-- +return array('foo' => $twig->loadTemplate('foo.twig')) +--EXPECT-- +BARFOO diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test new file mode 100644 index 000000000..8f9ece7ce --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test @@ -0,0 +1,44 @@ +--TEST-- +"parent" function +--TEMPLATE-- +{% extends "parent.twig" %} + +{% use "use1.twig" %} +{% use "use2.twig" %} + +{% block content_parent %} + {{ parent() }} +{% endblock %} + +{% block content_use1 %} + {{ parent() }} +{% endblock %} + +{% block content_use2 %} + {{ parent() }} +{% endblock %} + +{% block content %} + {{ block('content_use1_only') }} + {{ block('content_use2_only') }} +{% endblock %} +--TEMPLATE(parent.twig)-- +{% block content_parent 'content_parent' %} +{% block content_use1 'content_parent' %} +{% block content_use2 'content_parent' %} +{% block content '' %} +--TEMPLATE(use1.twig)-- +{% block content_use1 'content_use1' %} +{% block content_use2 'content_use1' %} +{% block content_use1_only 'content_use1_only' %} +--TEMPLATE(use2.twig)-- +{% block content_use2 'content_use2' %} +{% block content_use2_only 'content_use2_only' %} +--DATA-- +return array() +--EXPECT-- + content_parent + content_use1 + content_use2 + content_use1_only + content_use2_only diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test new file mode 100644 index 000000000..eef0c10d5 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test @@ -0,0 +1,17 @@ +--TEST-- +"macro" tag +--TEMPLATE-- +{% import _self as macros %} + +{{ macros.input('username') }} +{{ macros.input('password', null, 'password', 1) }} + +{% macro input(name, value, type, size) %} + +{% endmacro %} +--DATA-- +return array() +--EXPECT-- + + + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test new file mode 100644 index 000000000..ae6203bb6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test @@ -0,0 +1,16 @@ +--TEST-- +"macro" tag supports name for endmacro +--TEMPLATE-- +{% import _self as macros %} + +{{ macros.foo() }} +{{ macros.bar() }} + +{% macro foo() %}foo{% endmacro %} +{% macro bar() %}bar{% endmacro bar %} +--DATA-- +return array() +--EXPECT-- +foo +bar + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test new file mode 100644 index 000000000..5cd3dae66 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test @@ -0,0 +1,17 @@ +--TEST-- +"macro" tag +--TEMPLATE-- +{% import 'forms.twig' as forms %} + +{{ forms.input('username') }} +{{ forms.input('password', null, 'password', 1) }} +--TEMPLATE(forms.twig)-- +{% macro input(name, value, type, size) %} + +{% endmacro %} +--DATA-- +return array() +--EXPECT-- + + + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test new file mode 100644 index 000000000..205f59182 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test @@ -0,0 +1,18 @@ +--TEST-- +"macro" tag +--TEMPLATE-- +{% from 'forms.twig' import foo %} +{% from 'forms.twig' import foo as foobar, bar %} + +{{ foo('foo') }} +{{ foobar('foo') }} +{{ bar('foo') }} +--TEMPLATE(forms.twig)-- +{% macro foo(name) %}foo{{ name }}{% endmacro %} +{% macro bar(name) %}bar{{ name }}{% endmacro %} +--DATA-- +return array() +--EXPECT-- +foofoo +foofoo +barfoo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test new file mode 100644 index 000000000..2de9765ff --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test @@ -0,0 +1,9 @@ +--TEST-- +"from" tag with reserved name +--TEMPLATE-- +{% from 'forms.twig' import templateName %} +--TEMPLATE(forms.twig)-- +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Syntax: "templateName" cannot be an imported macro as it is a reserved keyword in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test new file mode 100644 index 000000000..6b371768e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test @@ -0,0 +1,14 @@ +--TEST-- +"macro" tag +--TEMPLATE-- +{% from 'forms.twig' import foo %} + +{{ foo('foo') }} +{{ foo() }} +--TEMPLATE(forms.twig)-- +{% macro foo(name) %}{{ name|default('foo') }}{{ global }}{% endmacro %} +--DATA-- +return array() +--EXPECT-- +fooglobal +fooglobal diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test new file mode 100644 index 000000000..7bd93c62d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test @@ -0,0 +1,11 @@ +--TEST-- +"from" tag with reserved name +--TEMPLATE-- +{% import 'forms.twig' as macros %} + +{{ macros.parent() }} +--TEMPLATE(forms.twig)-- +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Syntax: "parent" cannot be called as macro as it is a reserved keyword in "index.twig" at line 4. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test new file mode 100644 index 000000000..f7c102f02 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test @@ -0,0 +1,10 @@ +--TEST-- +"macro" tag with reserved name +--TEMPLATE-- +{% macro parent(arg1, arg2) %} + parent +{% endmacro %} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Syntax: "parent" cannot be used as a macro name as it is a reserved keyword in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test new file mode 100644 index 000000000..17756cb6c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test @@ -0,0 +1,17 @@ +--TEST-- +"macro" tag +--TEMPLATE-- +{% import _self as forms %} + +{{ forms.input('username') }} +{{ forms.input('password', null, 'password', 1) }} + +{% macro input(name, value, type, size) %} + +{% endmacro %} +--DATA-- +return array() +--EXPECT-- + + + diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test new file mode 100644 index 000000000..372177073 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test @@ -0,0 +1,14 @@ +--TEST-- +"§" as a macro name +--TEMPLATE-- +{% import _self as macros %} + +{{ macros.§('foo') }} + +{% macro §(foo) %} + §{{ foo }}§ +{% endmacro %} +--DATA-- +return array() +--EXPECT-- +§foo§ diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test new file mode 100644 index 000000000..567946281 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test @@ -0,0 +1,14 @@ +--TEST-- +Super globals as macro arguments +--TEMPLATE-- +{% import _self as macros %} + +{{ macros.foo('foo') }} + +{% macro foo(GET) %} + {{ GET }} +{% endmacro %} +--DATA-- +return array() +--EXPECT-- +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test new file mode 100644 index 000000000..0445e8530 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test @@ -0,0 +1,10 @@ +--TEST-- +"raw" tag +--TEMPLATE-- +{% raw %} +{{ foo }} +{% endraw %} +--DATA-- +return array() +--EXPECT-- +{{ foo }} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test new file mode 100644 index 000000000..99deefc32 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test @@ -0,0 +1,10 @@ +--TEST-- +"raw" tag +--TEMPLATE-- +{% raw %} +{{ foo }} +{% endverbatim %} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Syntax: Unexpected end of file: Unclosed "raw" block in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test new file mode 100644 index 000000000..352bb1876 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test @@ -0,0 +1,56 @@ +--TEST-- +"raw" tag +--TEMPLATE-- +1*** + +{%- raw %} + {{ 'bla' }} +{% endraw %} + +1*** +2*** + +{%- raw -%} + {{ 'bla' }} +{% endraw %} + +2*** +3*** + +{%- raw -%} + {{ 'bla' }} +{% endraw -%} + +3*** +4*** + +{%- raw -%} + {{ 'bla' }} +{%- endraw %} + +4*** +5*** + +{%- raw -%} + {{ 'bla' }} +{%- endraw -%} + +5*** +--DATA-- +return array() +--EXPECT-- +1*** + {{ 'bla' }} + + +1*** +2***{{ 'bla' }} + + +2*** +3***{{ 'bla' }} +3*** +4***{{ 'bla' }} + +4*** +5***{{ 'bla' }}5*** diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test new file mode 100644 index 000000000..dfddc1513 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test @@ -0,0 +1,11 @@ +--TEST-- +sandbox tag +--TEMPLATE-- +{%- sandbox %} + {%- include "foo.twig" %} + a +{%- endsandbox %} +--TEMPLATE(foo.twig)-- +foo +--EXCEPTION-- +Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 4. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test new file mode 100644 index 000000000..a33a13ee6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test @@ -0,0 +1,14 @@ +--TEST-- +sandbox tag +--TEMPLATE-- +{%- sandbox %} + {%- include "foo.twig" %} + + {% if 1 %} + {%- include "foo.twig" %} + {% endif %} +{%- endsandbox %} +--TEMPLATE(foo.twig)-- +foo +--EXCEPTION-- +Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 5. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test new file mode 100644 index 000000000..de20f3dba --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test @@ -0,0 +1,22 @@ +--TEST-- +sandbox tag +--TEMPLATE-- +{%- sandbox %} + {%- include "foo.twig" %} +{%- endsandbox %} + +{%- sandbox %} + {%- include "foo.twig" %} + {%- include "foo.twig" %} +{%- endsandbox %} + +{%- sandbox %}{% include "foo.twig" %}{% endsandbox %} +--TEMPLATE(foo.twig)-- +foo +--DATA-- +return array() +--EXPECT-- +foo +foo +foo +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test new file mode 100644 index 000000000..a5a9f830e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test @@ -0,0 +1,20 @@ +--TEST-- +"set" tag +--TEMPLATE-- +{% set foo = 'foo' %} +{% set bar = 'foo
    ' %} + +{{ foo }} +{{ bar }} + +{% set foo, bar = 'foo', 'bar' %} + +{{ foo }}{{ bar }} +--DATA-- +return array() +--EXPECT-- +foo +foo<br /> + + +foobar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test new file mode 100644 index 000000000..ec657f005 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test @@ -0,0 +1,9 @@ +--TEST-- +"set" tag block empty capture +--TEMPLATE-- +{% set foo %}{% endset %} + +{% if foo %}FAIL{% endif %} +--DATA-- +return array() +--EXPECT-- diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test new file mode 100644 index 000000000..f156a1a7f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test @@ -0,0 +1,10 @@ +--TEST-- +"set" tag block capture +--TEMPLATE-- +{% set foo %}f
    o
    o{% endset %} + +{{ foo }} +--DATA-- +return array() +--EXPECT-- +f
    o
    o diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test new file mode 100644 index 000000000..8ff434a01 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test @@ -0,0 +1,12 @@ +--TEST-- +"set" tag +--TEMPLATE-- +{% set foo, bar = 'foo' ~ 'bar', 'bar' ~ 'foo' %} + +{{ foo }} +{{ bar }} +--DATA-- +return array() +--EXPECT-- +foobar +barfoo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test new file mode 100644 index 000000000..dd06dec25 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test @@ -0,0 +1,12 @@ +--TEST-- +"spaceless" tag removes whites between HTML tags +--TEMPLATE-- +{% spaceless %} + +
    foo
    + +{% endspaceless %} +--DATA-- +return array() +--EXPECT-- +
    foo
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test new file mode 100644 index 000000000..789b4ba80 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test @@ -0,0 +1,8 @@ +--TEST-- +"§" custom tag +--TEMPLATE-- +{% § %} +--DATA-- +return array() +--EXPECT-- +§ diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test new file mode 100644 index 000000000..1d2273f88 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test @@ -0,0 +1,74 @@ +--TEST-- +Whitespace trimming on tags. +--TEMPLATE-- +{{ 5 * '{#-'|length }} +{{ '{{-'|length * 5 + '{%-'|length }} + +Trim on control tag: +{% for i in range(1, 9) -%} + {{ i }} +{%- endfor %} + + +Trim on output tag: +{% for i in range(1, 9) %} + {{- i -}} +{% endfor %} + + +Trim comments: + +{#- Invisible -#} + +After the comment. + +Trim leading space: +{% if leading %} + + {{- leading }} +{% endif %} + +{%- if leading %} + {{- leading }} + +{%- endif %} + + +Trim trailing space: +{% if trailing -%} + {{ trailing -}} + +{% endif -%} + +Combined: + +{%- if both -%} +
      +
    • {{- both -}}
    • +
    + +{%- endif -%} + +end +--DATA-- +return array('leading' => 'leading space', 'trailing' => 'trailing space', 'both' => 'both') +--EXPECT-- +15 +18 + +Trim on control tag: +123456789 + +Trim on output tag: +123456789 + +Trim comments:After the comment. + +Trim leading space: +leading space +leading space + +Trim trailing space: +trailing spaceCombined:
      +
    • both
    • +
    end diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test new file mode 100644 index 000000000..f887006f6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test @@ -0,0 +1,12 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "blocks.twig" with content as foo %} + +{{ block('foo') }} +--TEMPLATE(blocks.twig)-- +{% block content 'foo' %} +--DATA-- +return array() +--EXPECT-- +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test new file mode 100644 index 000000000..7364d76de --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test @@ -0,0 +1,12 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "blocks.twig" %} + +{{ block('content') }} +--TEMPLATE(blocks.twig)-- +{% block content 'foo' %} +--DATA-- +return array() +--EXPECT-- +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test new file mode 100644 index 000000000..b551a1e60 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test @@ -0,0 +1,22 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "foo.twig" %} + +{{ block('content') }} +{{ block('foo') }} +{{ block('bar') }} +--TEMPLATE(foo.twig)-- +{% use "bar.twig" %} + +{% block content 'foo' %} +{% block foo 'foo' %} +--TEMPLATE(bar.twig)-- +{% block content 'bar' %} +{% block bar 'bar' %} +--DATA-- +return array() +--EXPECT-- +foo +foo +bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test new file mode 100644 index 000000000..05cca682e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test @@ -0,0 +1,10 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "foo.twig" %} +--TEMPLATE(foo.twig)-- +{% use "bar.twig" %} +--TEMPLATE(bar.twig)-- +--DATA-- +return array() +--EXPECT-- diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test new file mode 100644 index 000000000..0d0d470ee --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test @@ -0,0 +1,25 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "parent.twig" %} + +{{ block('container') }} +--TEMPLATE(parent.twig)-- +{% use "ancestor.twig" %} + +{% block sub_container %} +
    overridden sub_container
    +{% endblock %} +--TEMPLATE(ancestor.twig)-- +{% block container %} +
    {{ block('sub_container') }}
    +{% endblock %} + +{% block sub_container %} +
    sub_container
    +{% endblock %} +--DATA-- +return array() +--EXPECT-- +
    overridden sub_container
    +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test new file mode 100644 index 000000000..df95599ce --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test @@ -0,0 +1,24 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "ancestor.twig" %} +{% use "parent.twig" %} + +{{ block('container') }} +--TEMPLATE(parent.twig)-- +{% block sub_container %} +
    overridden sub_container
    +{% endblock %} +--TEMPLATE(ancestor.twig)-- +{% block container %} +
    {{ block('sub_container') }}
    +{% endblock %} + +{% block sub_container %} +
    sub_container
    +{% endblock %} +--DATA-- +return array() +--EXPECT-- +
    overridden sub_container
    +
    diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test new file mode 100644 index 000000000..198be0c5c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test @@ -0,0 +1,21 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "foo.twig" %} +{% use "bar.twig" %} + +{{ block('content') }} +{{ block('foo') }} +{{ block('bar') }} +--TEMPLATE(foo.twig)-- +{% block content 'foo' %} +{% block foo 'foo' %} +--TEMPLATE(bar.twig)-- +{% block content 'bar' %} +{% block bar 'bar' %} +--DATA-- +return array() +--EXPECT-- +bar +foo +bar diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test new file mode 100644 index 000000000..8de871a8a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test @@ -0,0 +1,23 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use "foo.twig" with content as foo_content %} +{% use "bar.twig" %} + +{{ block('content') }} +{{ block('foo') }} +{{ block('bar') }} +{{ block('foo_content') }} +--TEMPLATE(foo.twig)-- +{% block content 'foo' %} +{% block foo 'foo' %} +--TEMPLATE(bar.twig)-- +{% block content 'bar' %} +{% block bar 'bar' %} +--DATA-- +return array() +--EXPECT-- +bar +foo +bar +foo diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test new file mode 100644 index 000000000..59db23d95 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test @@ -0,0 +1,24 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use 'file2.html.twig' with foobar as base_base_foobar %} +{% block foobar %} + {{- block('base_base_foobar') -}} + Content of block (second override) +{% endblock foobar %} +--TEMPLATE(file2.html.twig)-- +{% use 'file1.html.twig' with foobar as base_foobar %} +{% block foobar %} + {{- block('base_foobar') -}} + Content of block (first override) +{% endblock foobar %} +--TEMPLATE(file1.html.twig)-- +{% block foobar -%} + Content of block +{% endblock foobar %} +--DATA-- +return array() +--EXPECT-- +Content of block +Content of block (first override) +Content of block (second override) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test new file mode 100644 index 000000000..d3f302df0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test @@ -0,0 +1,24 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use 'file2.html.twig'%} +{% block foobar %} + {{- parent() -}} + Content of block (second override) +{% endblock foobar %} +--TEMPLATE(file2.html.twig)-- +{% use 'file1.html.twig' %} +{% block foobar %} + {{- parent() -}} + Content of block (first override) +{% endblock foobar %} +--TEMPLATE(file1.html.twig)-- +{% block foobar -%} + Content of block +{% endblock foobar %} +--DATA-- +return array() +--EXPECT-- +Content of block +Content of block (first override) +Content of block (second override) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test new file mode 100644 index 000000000..95b55a469 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test @@ -0,0 +1,38 @@ +--TEST-- +"use" tag +--TEMPLATE-- +{% use 'file2.html.twig' %} +{% use 'file1.html.twig' with foo %} +{% block foo %} + {{- parent() -}} + Content of foo (second override) +{% endblock foo %} +{% block bar %} + {{- parent() -}} + Content of bar (second override) +{% endblock bar %} +--TEMPLATE(file2.html.twig)-- +{% use 'file1.html.twig' %} +{% block foo %} + {{- parent() -}} + Content of foo (first override) +{% endblock foo %} +{% block bar %} + {{- parent() -}} + Content of bar (first override) +{% endblock bar %} +--TEMPLATE(file1.html.twig)-- +{% block foo -%} + Content of foo +{% endblock foo %} +{% block bar -%} + Content of bar +{% endblock bar %} +--DATA-- +return array() +--EXPECT-- +Content of foo +Content of foo (first override) +Content of foo (second override) +Content of bar +Content of bar (second override) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test new file mode 100644 index 000000000..a95be5572 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test @@ -0,0 +1,10 @@ +--TEST-- +"verbatim" tag +--TEMPLATE-- +{% verbatim %} +{{ foo }} +{% endverbatim %} +--DATA-- +return array() +--EXPECT-- +{{ foo }} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test new file mode 100644 index 000000000..28626a816 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test @@ -0,0 +1,10 @@ +--TEST-- +"verbatim" tag +--TEMPLATE-- +{% verbatim %} +{{ foo }} +{% endraw %} +--DATA-- +return array() +--EXCEPTION-- +Twig_Error_Syntax: Unexpected end of file: Unclosed "verbatim" block in "index.twig" at line 2. diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test new file mode 100644 index 000000000..eb6104446 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test @@ -0,0 +1,56 @@ +--TEST-- +"verbatim" tag +--TEMPLATE-- +1*** + +{%- verbatim %} + {{ 'bla' }} +{% endverbatim %} + +1*** +2*** + +{%- verbatim -%} + {{ 'bla' }} +{% endverbatim %} + +2*** +3*** + +{%- verbatim -%} + {{ 'bla' }} +{% endverbatim -%} + +3*** +4*** + +{%- verbatim -%} + {{ 'bla' }} +{%- endverbatim %} + +4*** +5*** + +{%- verbatim -%} + {{ 'bla' }} +{%- endverbatim -%} + +5*** +--DATA-- +return array() +--EXPECT-- +1*** + {{ 'bla' }} + + +1*** +2***{{ 'bla' }} + + +2*** +3***{{ 'bla' }} +3*** +4***{{ 'bla' }} + +4*** +5***{{ 'bla' }}5*** diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test new file mode 100644 index 000000000..1429d3753 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test @@ -0,0 +1,24 @@ +--TEST-- +array index test +--TEMPLATE-- +{% for key, value in days %} +{{ key }} +{% endfor %} +--DATA-- +return array('days' => array( + 1 => array('money' => 9), + 2 => array('money' => 21), + 3 => array('money' => 38), + 4 => array('money' => 6), + 18 => array('money' => 6), + 19 => array('money' => 3), + 31 => array('money' => 11), +)); +--EXPECT-- +1 +2 +3 +4 +18 +19 +31 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test new file mode 100644 index 000000000..60218ac04 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test @@ -0,0 +1,14 @@ +--TEST-- +"const" test +--TEMPLATE-- +{{ 8 is constant('E_NOTICE') ? 'ok' : 'no' }} +{{ 'bar' is constant('TwigTestFoo::BAR_NAME') ? 'ok' : 'no' }} +{{ value is constant('TwigTestFoo::BAR_NAME') ? 'ok' : 'no' }} +{{ 2 is constant('ARRAY_AS_PROPS', object) ? 'ok' : 'no' }} +--DATA-- +return array('value' => 'bar', 'object' => new ArrayObject(array('hi'))); +--EXPECT-- +ok +ok +ok +ok \ No newline at end of file diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test new file mode 100644 index 000000000..d4e204efa --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test @@ -0,0 +1,129 @@ +--TEST-- +"defined" test +--TEMPLATE-- +{{ definedVar is defined ? 'ok' : 'ko' }} +{{ definedVar is not defined ? 'ko' : 'ok' }} +{{ undefinedVar is defined ? 'ko' : 'ok' }} +{{ undefinedVar is not defined ? 'ok' : 'ko' }} +{{ zeroVar is defined ? 'ok' : 'ko' }} +{{ nullVar is defined ? 'ok' : 'ko' }} +{{ nested.definedVar is defined ? 'ok' : 'ko' }} +{{ nested['definedVar'] is defined ? 'ok' : 'ko' }} +{{ nested.definedVar is not defined ? 'ko' : 'ok' }} +{{ nested.undefinedVar is defined ? 'ko' : 'ok' }} +{{ nested['undefinedVar'] is defined ? 'ko' : 'ok' }} +{{ nested.undefinedVar is not defined ? 'ok' : 'ko' }} +{{ nested.zeroVar is defined ? 'ok' : 'ko' }} +{{ nested.nullVar is defined ? 'ok' : 'ko' }} +{{ nested.definedArray.0 is defined ? 'ok' : 'ko' }} +{{ nested['definedArray'][0] is defined ? 'ok' : 'ko' }} +{{ object.foo is defined ? 'ok' : 'ko' }} +{{ object.undefinedMethod is defined ? 'ko' : 'ok' }} +{{ object.getFoo() is defined ? 'ok' : 'ko' }} +{{ object.getFoo('a') is defined ? 'ok' : 'ko' }} +{{ object.undefinedMethod() is defined ? 'ko' : 'ok' }} +{{ object.undefinedMethod('a') is defined ? 'ko' : 'ok' }} +{{ object.self.foo is defined ? 'ok' : 'ko' }} +{{ object.self.undefinedMethod is defined ? 'ko' : 'ok' }} +{{ object.undefinedMethod.self is defined ? 'ko' : 'ok' }} +{{ 0 is defined ? 'ok' : 'ko' }} +{{ "foo" is defined ? 'ok' : 'ko' }} +{{ true is defined ? 'ok' : 'ko' }} +{{ false is defined ? 'ok' : 'ko' }} +{{ null is defined ? 'ok' : 'ko' }} +{{ [1, 2] is defined ? 'ok' : 'ko' }} +{{ { foo: "bar" } is defined ? 'ok' : 'ko' }} +--DATA-- +return array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'nullVar' => null, + 'nested' => array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'nullVar' => null, + 'definedArray' => array(0), + ), + 'object' => new TwigTestFoo(), +); +--EXPECT-- +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +--DATA-- +return array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'nullVar' => null, + 'nested' => array( + 'definedVar' => 'defined', + 'zeroVar' => 0, + 'nullVar' => null, + 'definedArray' => array(0), + ), + 'object' => new TwigTestFoo(), +); +--CONFIG-- +return array('strict_variables' => false) +--EXPECT-- +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test new file mode 100644 index 000000000..a776d032b --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test @@ -0,0 +1,45 @@ +--TEST-- +"empty" test +--TEMPLATE-- +{{ foo is empty ? 'ok' : 'ko' }} +{{ bar is empty ? 'ok' : 'ko' }} +{{ foobar is empty ? 'ok' : 'ko' }} +{{ array is empty ? 'ok' : 'ko' }} +{{ zero is empty ? 'ok' : 'ko' }} +{{ string is empty ? 'ok' : 'ko' }} +{{ countable_empty is empty ? 'ok' : 'ko' }} +{{ countable_not_empty is empty ? 'ok' : 'ko' }} +{{ markup_empty is empty ? 'ok' : 'ko' }} +{{ markup_not_empty is empty ? 'ok' : 'ko' }} +--DATA-- + +class CountableStub implements Countable +{ + private $items; + + public function __construct(array $items) + { + $this->items = $items; + } + + public function count() + { + return count($this->items); + } +} +return array( + 'foo' => '', 'bar' => null, 'foobar' => false, 'array' => array(), 'zero' => 0, 'string' => '0', + 'countable_empty' => new CountableStub(array()), 'countable_not_empty' => new CountableStub(array(1, 2)), + 'markup_empty' => new Twig_Markup('', 'UTF-8'), 'markup_not_empty' => new Twig_Markup('test', 'UTF-8'), +); +--EXPECT-- +ok +ok +ok +ok +ko +ko +ok +ko +ok +ko diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test new file mode 100644 index 000000000..695b4c2f8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test @@ -0,0 +1,14 @@ +--TEST-- +"even" test +--TEMPLATE-- +{{ 1 is even ? 'ko' : 'ok' }} +{{ 2 is even ? 'ok' : 'ko' }} +{{ 1 is not even ? 'ok' : 'ko' }} +{{ 2 is not even ? 'ko' : 'ok' }} +--DATA-- +return array() +--EXPECT-- +ok +ok +ok +ok diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test new file mode 100644 index 000000000..545f51f81 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test @@ -0,0 +1,128 @@ +--TEST-- +Twig supports the in operator +--TEMPLATE-- +{% if bar in foo %} +TRUE +{% endif %} +{% if not (bar in foo) %} +{% else %} +TRUE +{% endif %} +{% if bar not in foo %} +{% else %} +TRUE +{% endif %} +{% if 'a' in bar %} +TRUE +{% endif %} +{% if 'c' not in bar %} +TRUE +{% endif %} +{% if '' in bar %} +TRUE +{% endif %} +{% if '' in '' %} +TRUE +{% endif %} +{% if '0' not in '' %} +TRUE +{% endif %} +{% if 'a' not in '0' %} +TRUE +{% endif %} +{% if '0' in '0' %} +TRUE +{% endif %} + +{{ false in [0, 1] ? 'TRUE' : 'FALSE' }} +{{ true in [0, 1] ? 'TRUE' : 'FALSE' }} +{{ '0' in [0, 1] ? 'TRUE' : 'FALSE' }} +{{ '' in [0, 1] ? 'TRUE' : 'FALSE' }} +{{ 0 in ['', 1] ? 'TRUE' : 'FALSE' }} + +{{ '' in 'foo' ? 'TRUE' : 'FALSE' }} +{{ 0 in 'foo' ? 'TRUE' : 'FALSE' }} +{{ false in 'foo' ? 'TRUE' : 'FALSE' }} +{{ false in '100' ? 'TRUE' : 'FALSE' }} +{{ true in '100' ? 'TRUE' : 'FALSE' }} + +{{ [] in [true, false] ? 'TRUE' : 'FALSE' }} +{{ [] in [true, ''] ? 'TRUE' : 'FALSE' }} +{{ [] in [true, []] ? 'TRUE' : 'FALSE' }} + +{{ resource ? 'TRUE' : 'FALSE' }} +{{ resource in 'foo'~resource ? 'TRUE' : 'FALSE' }} +{{ object in 'stdClass' ? 'TRUE' : 'FALSE' }} +{{ [] in 'Array' ? 'TRUE' : 'FALSE' }} +{{ dir_object in 'foo'~dir_object ? 'TRUE' : 'FALSE' }} + +{{ ''~resource in resource ? 'TRUE' : 'FALSE' }} +{{ 'stdClass' in object ? 'TRUE' : 'FALSE' }} +{{ 'Array' in [] ? 'TRUE' : 'FALSE' }} +{{ ''~dir_object in dir_object ? 'TRUE' : 'FALSE' }} + +{{ resource in [''~resource] ? 'TRUE' : 'FALSE' }} +{{ resource in [resource + 1 - 1] ? 'TRUE' : 'FALSE' }} +{{ dir_object in [''~dir_object] ? 'TRUE' : 'FALSE' }} + +{{ 5 in 125 ? 'TRUE' : 'FALSE' }} +{{ 5 in '125' ? 'TRUE' : 'FALSE' }} +{{ '5' in 125 ? 'TRUE' : 'FALSE' }} +{{ '5' in '125' ? 'TRUE' : 'FALSE' }} + +{{ 5.5 in 125.5 ? 'TRUE' : 'FALSE' }} +{{ 5.5 in '125.5' ? 'TRUE' : 'FALSE' }} +{{ '5.5' in 125.5 ? 'TRUE' : 'FALSE' }} +--DATA-- +return array('bar' => 'bar', 'foo' => array('bar' => 'bar'), 'dir_object' => new SplFileInfo(dirname(__FILE__)), 'object' => new stdClass(), 'resource' => opendir(dirname(__FILE__))) +--EXPECT-- +TRUE +TRUE +TRUE +TRUE +TRUE +TRUE +TRUE +TRUE +TRUE +TRUE + +TRUE +TRUE +TRUE +TRUE +TRUE + +TRUE +FALSE +FALSE +FALSE +FALSE + +TRUE +FALSE +TRUE + +TRUE +FALSE +FALSE +FALSE +FALSE + +FALSE +FALSE +FALSE +FALSE + +FALSE +FALSE +FALSE + +FALSE +TRUE +FALSE +TRUE + +FALSE +TRUE +FALSE diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test new file mode 100644 index 000000000..8e08061bb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test @@ -0,0 +1,19 @@ +--TEST-- +Twig supports the in operator when using objects +--TEMPLATE-- +{% if object in object_list %} +TRUE +{% endif %} +--DATA-- +$foo = new TwigTestFoo(); +$foo1 = new TwigTestFoo(); + +$foo->position = $foo1; +$foo1->position = $foo; + +return array( + 'object' => $foo, + 'object_list' => array($foo1, $foo), +); +--EXPECT-- +TRUE diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test new file mode 100644 index 000000000..ec5255013 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test @@ -0,0 +1,19 @@ +--TEST-- +"iterable" test +--TEMPLATE-- +{{ foo is iterable ? 'ok' : 'ko' }} +{{ traversable is iterable ? 'ok' : 'ko' }} +{{ obj is iterable ? 'ok' : 'ko' }} +{{ val is iterable ? 'ok' : 'ko' }} +--DATA-- +return array( + 'foo' => array(), + 'traversable' => new ArrayIterator(array()), + 'obj' => new stdClass(), + 'val' => 'test', +); +--EXPECT-- +ok +ok +ko +ko \ No newline at end of file diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test new file mode 100644 index 000000000..3d148c893 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test @@ -0,0 +1,30 @@ +--TEST-- +Twig supports the ?? operator +--TEMPLATE-- +{{ 'OK' ?? 'KO' }} +{{ null ?? 'OK' }} +{{ bar ?? 'KO' }} +{{ baz ?? 'OK' }} +{{ foo.bar ?? 'KO' }} +{{ foo.missing ?? 'OK' }} +{{ foo.bar.baz.missing ?? 'OK' }} +{{ foo['bar'] ?? 'KO' }} +{{ foo['missing'] ?? 'OK' }} +{{ nope ?? nada ?? 'OK' }} +{{ 1 + nope ?? nada ?? 2 }} +{{ 1 + nope ?? 3 + nada ?? 2 }} +--DATA-- +return array('bar' => 'OK', 'foo' => array('bar' => 'OK')) +--EXPECT-- +OK +OK +OK +OK +OK +OK +OK +OK +OK +OK +3 +6 diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test new file mode 100644 index 000000000..1b8311e3d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test @@ -0,0 +1,10 @@ +--TEST-- +"odd" test +--TEMPLATE-- +{{ 1 is odd ? 'ok' : 'ko' }} +{{ 2 is odd ? 'ko' : 'ok' }} +--DATA-- +return array() +--EXPECT-- +ok +ok \ No newline at end of file diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php new file mode 100644 index 000000000..0647891b6 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php @@ -0,0 +1,254 @@ +position = 0; + } + + public function current() + { + return $this->array[$this->position]; + } + + public function key() + { + return 'a'; + } + + public function next() + { + ++$this->position; + } + + public function valid() + { + return isset($this->array[$this->position]); + } +} + +class TwigTestTokenParser_§ extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node_Print(new Twig_Node_Expression_Constant('§', -1), -1); + } + + public function getTag() + { + return '§'; + } +} + +class TwigTestExtension extends Twig_Extension +{ + public function getTokenParsers() + { + return array( + new TwigTestTokenParser_§(), + ); + } + + public function getFilters() + { + return array( + new Twig_SimpleFilter('§', array($this, '§Filter')), + new Twig_SimpleFilter('escape_and_nl2br', array($this, 'escape_and_nl2br'), array('needs_environment' => true, 'is_safe' => array('html'))), + new Twig_SimpleFilter('nl2br', array($this, 'nl2br'), array('pre_escape' => 'html', 'is_safe' => array('html'))), + new Twig_SimpleFilter('escape_something', array($this, 'escape_something'), array('is_safe' => array('something'))), + new Twig_SimpleFilter('preserves_safety', array($this, 'preserves_safety'), array('preserves_safety' => array('html'))), + new Twig_SimpleFilter('static_call_string', 'TwigTestExtension::staticCall'), + new Twig_SimpleFilter('static_call_array', array('TwigTestExtension', 'staticCall')), + new Twig_SimpleFilter('magic_call', array($this, 'magicCall')), + new Twig_SimpleFilter('magic_call_string', 'TwigTestExtension::magicStaticCall'), + new Twig_SimpleFilter('magic_call_array', array('TwigTestExtension', 'magicStaticCall')), + new Twig_SimpleFilter('*_path', array($this, 'dynamic_path')), + new Twig_SimpleFilter('*_foo_*_bar', array($this, 'dynamic_foo')), + ); + } + + public function getFunctions() + { + return array( + new Twig_SimpleFunction('§', array($this, '§Function')), + new Twig_SimpleFunction('safe_br', array($this, 'br'), array('is_safe' => array('html'))), + new Twig_SimpleFunction('unsafe_br', array($this, 'br')), + new Twig_SimpleFunction('static_call_string', 'TwigTestExtension::staticCall'), + new Twig_SimpleFunction('static_call_array', array('TwigTestExtension', 'staticCall')), + new Twig_SimpleFunction('*_path', array($this, 'dynamic_path')), + new Twig_SimpleFunction('*_foo_*_bar', array($this, 'dynamic_foo')), + ); + } + + public function getTests() + { + return array( + new Twig_SimpleTest('multi word', array($this, 'is_multi_word')), + ); + } + + public function §Filter($value) + { + return "§{$value}§"; + } + + public function §Function($value) + { + return "§{$value}§"; + } + + /** + * nl2br which also escapes, for testing escaper filters. + */ + public function escape_and_nl2br($env, $value, $sep = '
    ') + { + return $this->nl2br(twig_escape_filter($env, $value, 'html'), $sep); + } + + /** + * nl2br only, for testing filters with pre_escape. + */ + public function nl2br($value, $sep = '
    ') + { + // not secure if $value contains html tags (not only entities) + // don't use + return str_replace("\n", "$sep\n", $value); + } + + public function dynamic_path($element, $item) + { + return $element.'/'.$item; + } + + public function dynamic_foo($foo, $bar, $item) + { + return $foo.'/'.$bar.'/'.$item; + } + + public function escape_something($value) + { + return strtoupper($value); + } + + public function preserves_safety($value) + { + return strtoupper($value); + } + + public static function staticCall($value) + { + return "*$value*"; + } + + public function br() + { + return '
    '; + } + + public function is_multi_word($value) + { + return false !== strpos($value, ' '); + } + + public function __call($method, $arguments) + { + if ('magicCall' !== $method) { + throw new BadMethodCallException('Unexpected call to __call'); + } + + return 'magic_'.$arguments[0]; + } + + public static function __callStatic($method, $arguments) + { + if ('magicStaticCall' !== $method) { + throw new BadMethodCallException('Unexpected call to __callStatic'); + } + + return 'static_magic_'.$arguments[0]; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test new file mode 100644 index 000000000..d9c1d5085 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test @@ -0,0 +1,8 @@ +--TEST-- +Old test classes usage +--TEMPLATE-- +{{ 'foo' is multi word ? 'yes' : 'no' }} +--DATA-- +return array() +--EXPECT-- +no diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php new file mode 100644 index 000000000..055a61707 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php @@ -0,0 +1,54 @@ + new Twig_Test_Method($this, 'is_multi_word'), + ); + } + + public function is_multi_word($value) + { + return false !== strpos($value, ' '); + } + + public function getName() + { + return 'legacy_integration_test'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LexerTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LexerTest.php new file mode 100644 index 000000000..ecc1184d4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/LexerTest.php @@ -0,0 +1,312 @@ +getMockBuilder('Twig_LoaderInterface')->getMock()); + $lexer = new Twig_Lexer($env); + + $env->disableDebug(); + $this->assertSame('', $lexer->tokenize('foo')->getSource()); + + $env->enableDebug(); + $this->assertSame('foo', $lexer->tokenize('foo')->getSource()); + } + + public function testNameLabelForTag() + { + $template = '{% § %}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + + $stream->expect(Twig_Token::BLOCK_START_TYPE); + $this->assertSame('§', $stream->expect(Twig_Token::NAME_TYPE)->getValue()); + } + + public function testNameLabelForFunction() + { + $template = '{{ §() }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + + $stream->expect(Twig_Token::VAR_START_TYPE); + $this->assertSame('§', $stream->expect(Twig_Token::NAME_TYPE)->getValue()); + } + + public function testBracketsNesting() + { + $template = '{{ {"a":{"b":"c"}} }}'; + + $this->assertEquals(2, $this->countToken($template, Twig_Token::PUNCTUATION_TYPE, '{')); + $this->assertEquals(2, $this->countToken($template, Twig_Token::PUNCTUATION_TYPE, '}')); + } + + protected function countToken($template, $type, $value = null) + { + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + + $count = 0; + while (!$stream->isEOF()) { + $token = $stream->next(); + if ($type === $token->getType()) { + if (null === $value || $value === $token->getValue()) { + ++$count; + } + } + } + + return $count; + } + + public function testLineDirective() + { + $template = "foo\n" + ."bar\n" + ."{% line 10 %}\n" + ."{{\n" + ."baz\n" + ."}}\n"; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + + // foo\nbar\n + $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine()); + // \n (after {% line %}) + $this->assertSame(10, $stream->expect(Twig_Token::TEXT_TYPE)->getLine()); + // {{ + $this->assertSame(11, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine()); + // baz + $this->assertSame(12, $stream->expect(Twig_Token::NAME_TYPE)->getLine()); + } + + public function testLineDirectiveInline() + { + $template = "foo\n" + ."bar{% line 10 %}{{\n" + ."baz\n" + ."}}\n"; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + + // foo\nbar + $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine()); + // {{ + $this->assertSame(10, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine()); + // baz + $this->assertSame(11, $stream->expect(Twig_Token::NAME_TYPE)->getLine()); + } + + public function testLongComments() + { + $template = '{# '.str_repeat('*', 100000).' #}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $lexer->tokenize($template); + + // should not throw an exception + } + + public function testLongVerbatim() + { + $template = '{% verbatim %}'.str_repeat('*', 100000).'{% endverbatim %}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $lexer->tokenize($template); + + // should not throw an exception + } + + public function testLongVar() + { + $template = '{{ '.str_repeat('x', 100000).' }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $lexer->tokenize($template); + + // should not throw an exception + } + + public function testLongBlock() + { + $template = '{% '.str_repeat('x', 100000).' %}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $lexer->tokenize($template); + + // should not throw an exception + } + + public function testBigNumbers() + { + $template = '{{ 922337203685477580700 }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + $stream->next(); + $node = $stream->next(); + $this->assertEquals('922337203685477580700', $node->getValue()); + } + + public function testStringWithEscapedDelimiter() + { + $tests = array( + "{{ 'foo \' bar' }}" => 'foo \' bar', + '{{ "foo \" bar" }}' => 'foo " bar', + ); + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + foreach ($tests as $template => $expected) { + $stream = $lexer->tokenize($template); + $stream->expect(Twig_Token::VAR_START_TYPE); + $stream->expect(Twig_Token::STRING_TYPE, $expected); + } + } + + public function testStringWithInterpolation() + { + $template = 'foo {{ "bar #{ baz + 1 }" }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + $stream->expect(Twig_Token::TEXT_TYPE, 'foo '); + $stream->expect(Twig_Token::VAR_START_TYPE); + $stream->expect(Twig_Token::STRING_TYPE, 'bar '); + $stream->expect(Twig_Token::INTERPOLATION_START_TYPE); + $stream->expect(Twig_Token::NAME_TYPE, 'baz'); + $stream->expect(Twig_Token::OPERATOR_TYPE, '+'); + $stream->expect(Twig_Token::NUMBER_TYPE, '1'); + $stream->expect(Twig_Token::INTERPOLATION_END_TYPE); + $stream->expect(Twig_Token::VAR_END_TYPE); + } + + public function testStringWithEscapedInterpolation() + { + $template = '{{ "bar \#{baz+1}" }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + $stream->expect(Twig_Token::VAR_START_TYPE); + $stream->expect(Twig_Token::STRING_TYPE, 'bar #{baz+1}'); + $stream->expect(Twig_Token::VAR_END_TYPE); + } + + public function testStringWithHash() + { + $template = '{{ "bar # baz" }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + $stream->expect(Twig_Token::VAR_START_TYPE); + $stream->expect(Twig_Token::STRING_TYPE, 'bar # baz'); + $stream->expect(Twig_Token::VAR_END_TYPE); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unclosed """ + */ + public function testStringWithUnterminatedInterpolation() + { + $template = '{{ "bar #{x" }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $lexer->tokenize($template); + } + + public function testStringWithNestedInterpolations() + { + $template = '{{ "bar #{ "foo#{bar}" }" }}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + $stream->expect(Twig_Token::VAR_START_TYPE); + $stream->expect(Twig_Token::STRING_TYPE, 'bar '); + $stream->expect(Twig_Token::INTERPOLATION_START_TYPE); + $stream->expect(Twig_Token::STRING_TYPE, 'foo'); + $stream->expect(Twig_Token::INTERPOLATION_START_TYPE); + $stream->expect(Twig_Token::NAME_TYPE, 'bar'); + $stream->expect(Twig_Token::INTERPOLATION_END_TYPE); + $stream->expect(Twig_Token::INTERPOLATION_END_TYPE); + $stream->expect(Twig_Token::VAR_END_TYPE); + } + + public function testStringWithNestedInterpolationsInBlock() + { + $template = '{% foo "bar #{ "foo#{bar}" }" %}'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + $stream->expect(Twig_Token::BLOCK_START_TYPE); + $stream->expect(Twig_Token::NAME_TYPE, 'foo'); + $stream->expect(Twig_Token::STRING_TYPE, 'bar '); + $stream->expect(Twig_Token::INTERPOLATION_START_TYPE); + $stream->expect(Twig_Token::STRING_TYPE, 'foo'); + $stream->expect(Twig_Token::INTERPOLATION_START_TYPE); + $stream->expect(Twig_Token::NAME_TYPE, 'bar'); + $stream->expect(Twig_Token::INTERPOLATION_END_TYPE); + $stream->expect(Twig_Token::INTERPOLATION_END_TYPE); + $stream->expect(Twig_Token::BLOCK_END_TYPE); + } + + public function testOperatorEndingWithALetterAtTheEndOfALine() + { + $template = "{{ 1 and\n0}}"; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $stream = $lexer->tokenize($template); + $stream->expect(Twig_Token::VAR_START_TYPE); + $stream->expect(Twig_Token::NUMBER_TYPE, 1); + $stream->expect(Twig_Token::OPERATOR_TYPE, 'and'); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unclosed "variable" at line 3 + */ + public function testUnterminatedVariable() + { + $template = ' + +{{ + +bar + + +'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $lexer->tokenize($template); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unclosed "block" at line 3 + */ + public function testUnterminatedBlock() + { + $template = ' + +{% + +bar + + +'; + + $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $lexer->tokenize($template); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php new file mode 100644 index 000000000..1369a6bd0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php @@ -0,0 +1,97 @@ + 'bar')); + + $this->assertEquals('bar', $loader->getSource('foo')); + } + + /** + * @expectedException Twig_Error_Loader + */ + public function testGetSourceWhenTemplateDoesNotExist() + { + $loader = new Twig_Loader_Array(array()); + + $loader->getSource('foo'); + } + + public function testGetCacheKey() + { + $loader = new Twig_Loader_Array(array('foo' => 'bar')); + + $this->assertEquals('bar', $loader->getCacheKey('foo')); + } + + /** + * @expectedException Twig_Error_Loader + */ + public function testGetCacheKeyWhenTemplateDoesNotExist() + { + $loader = new Twig_Loader_Array(array()); + + $loader->getCacheKey('foo'); + } + + public function testSetTemplate() + { + $loader = new Twig_Loader_Array(array()); + $loader->setTemplate('foo', 'bar'); + + $this->assertEquals('bar', $loader->getSource('foo')); + } + + public function testIsFresh() + { + $loader = new Twig_Loader_Array(array('foo' => 'bar')); + $this->assertTrue($loader->isFresh('foo', time())); + } + + /** + * @expectedException Twig_Error_Loader + */ + public function testIsFreshWhenTemplateDoesNotExist() + { + $loader = new Twig_Loader_Array(array()); + + $loader->isFresh('foo', time()); + } + + public function testTemplateReference() + { + $name = new Twig_Test_Loader_TemplateReference('foo'); + $loader = new Twig_Loader_Array(array('foo' => 'bar')); + + $loader->getCacheKey($name); + $loader->getSource($name); + $loader->isFresh($name, time()); + $loader->setTemplate($name, 'foobar'); + } +} + +class Twig_Test_Loader_TemplateReference +{ + private $name; + + public function __construct($name) + { + $this->name = $name; + } + + public function __toString() + { + return $this->name; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php new file mode 100644 index 000000000..2dc9e5f4c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php @@ -0,0 +1,79 @@ + 'bar')), + new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')), + )); + + $this->assertEquals('bar', $loader->getSource('foo')); + $this->assertEquals('foo', $loader->getSource('bar')); + } + + /** + * @expectedException Twig_Error_Loader + */ + public function testGetSourceWhenTemplateDoesNotExist() + { + $loader = new Twig_Loader_Chain(array()); + + $loader->getSource('foo'); + } + + public function testGetCacheKey() + { + $loader = new Twig_Loader_Chain(array( + new Twig_Loader_Array(array('foo' => 'bar')), + new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')), + )); + + $this->assertEquals('bar', $loader->getCacheKey('foo')); + $this->assertEquals('foo', $loader->getCacheKey('bar')); + } + + /** + * @expectedException Twig_Error_Loader + */ + public function testGetCacheKeyWhenTemplateDoesNotExist() + { + $loader = new Twig_Loader_Chain(array()); + + $loader->getCacheKey('foo'); + } + + public function testAddLoader() + { + $loader = new Twig_Loader_Chain(); + $loader->addLoader(new Twig_Loader_Array(array('foo' => 'bar'))); + + $this->assertEquals('bar', $loader->getSource('foo')); + } + + public function testExists() + { + $loader1 = $this->getMockBuilder('Twig_Loader_Array')->setMethods(array('exists', 'getSource'))->disableOriginalConstructor()->getMock(); + $loader1->expects($this->once())->method('exists')->will($this->returnValue(false)); + $loader1->expects($this->never())->method('getSource'); + + $loader2 = $this->getMockBuilder('Twig_LoaderInterface')->getMock(); + $loader2->expects($this->once())->method('getSource')->will($this->returnValue('content')); + + $loader = new Twig_Loader_Chain(); + $loader->addLoader($loader1); + $loader->addLoader($loader2); + + $this->assertTrue($loader->exists('foo')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php new file mode 100644 index 000000000..b7e2b9a0f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php @@ -0,0 +1,195 @@ +getCacheKey($template); + $this->fail(); + } catch (Twig_Error_Loader $e) { + $this->assertNotContains('Unable to find template', $e->getMessage()); + } + } + + public function getSecurityTests() + { + return array( + array("AutoloaderTest\0.php"), + array('..\\AutoloaderTest.php'), + array('..\\\\\\AutoloaderTest.php'), + array('../AutoloaderTest.php'), + array('..////AutoloaderTest.php'), + array('./../AutoloaderTest.php'), + array('.\\..\\AutoloaderTest.php'), + array('././././././../AutoloaderTest.php'), + array('.\\./.\\./.\\./../AutoloaderTest.php'), + array('foo/../../AutoloaderTest.php'), + array('foo\\..\\..\\AutoloaderTest.php'), + array('foo/../bar/../../AutoloaderTest.php'), + array('foo/bar/../../../AutoloaderTest.php'), + array('filters/../../AutoloaderTest.php'), + array('filters//..//..//AutoloaderTest.php'), + array('filters\\..\\..\\AutoloaderTest.php'), + array('filters\\\\..\\\\..\\\\AutoloaderTest.php'), + array('filters\\//../\\/\\..\\AutoloaderTest.php'), + array('/../AutoloaderTest.php'), + ); + } + + /** + * @dataProvider getBasePaths + */ + public function testPaths($basePath) + { + $loader = new Twig_Loader_Filesystem(array($basePath.'/normal', $basePath.'/normal_bis')); + $loader->setPaths(array($basePath.'/named', $basePath.'/named_bis'), 'named'); + $loader->addPath($basePath.'/named_ter', 'named'); + $loader->addPath($basePath.'/normal_ter'); + $loader->prependPath($basePath.'/normal_final'); + $loader->prependPath($basePath.'/named/../named_quater', 'named'); + $loader->prependPath($basePath.'/named_final', 'named'); + + $this->assertEquals(array( + $basePath.'/normal_final', + $basePath.'/normal', + $basePath.'/normal_bis', + $basePath.'/normal_ter', + ), $loader->getPaths()); + $this->assertEquals(array( + $basePath.'/named_final', + $basePath.'/named/../named_quater', + $basePath.'/named', + $basePath.'/named_bis', + $basePath.'/named_ter', + ), $loader->getPaths('named')); + + // do not use realpath here as it would make the test unuseful + $this->assertEquals(str_replace('\\', '/', $basePath.'/named_quater/named_absolute.html'), str_replace('\\', '/', $loader->getCacheKey('@named/named_absolute.html'))); + $this->assertEquals("path (final)\n", $loader->getSource('index.html')); + $this->assertEquals("path (final)\n", $loader->getSource('@__main__/index.html')); + $this->assertEquals("named path (final)\n", $loader->getSource('@named/index.html')); + } + + public function getBasePaths() + { + return array( + array(dirname(__FILE__).'/Fixtures'), + array('test/Twig/Tests/Loader/Fixtures'), + ); + } + + public function testEmptyConstructor() + { + $loader = new Twig_Loader_Filesystem(); + $this->assertEquals(array(), $loader->getPaths()); + } + + public function testGetNamespaces() + { + $loader = new Twig_Loader_Filesystem(sys_get_temp_dir()); + $this->assertEquals(array(Twig_Loader_Filesystem::MAIN_NAMESPACE), $loader->getNamespaces()); + + $loader->addPath(sys_get_temp_dir(), 'named'); + $this->assertEquals(array(Twig_Loader_Filesystem::MAIN_NAMESPACE, 'named'), $loader->getNamespaces()); + } + + public function testFindTemplateExceptionNamespace() + { + $basePath = dirname(__FILE__).'/Fixtures'; + + $loader = new Twig_Loader_Filesystem(array($basePath.'/normal')); + $loader->addPath($basePath.'/named', 'named'); + + try { + $loader->getSource('@named/nowhere.html'); + } catch (Exception $e) { + $this->assertInstanceof('Twig_Error_Loader', $e); + $this->assertContains('Unable to find template "@named/nowhere.html"', $e->getMessage()); + } + } + + public function testFindTemplateWithCache() + { + $basePath = dirname(__FILE__).'/Fixtures'; + + $loader = new Twig_Loader_Filesystem(array($basePath.'/normal')); + $loader->addPath($basePath.'/named', 'named'); + + // prime the cache for index.html in the named namespace + $namedSource = $loader->getSource('@named/index.html'); + $this->assertEquals("named path\n", $namedSource); + + // get index.html from the main namespace + $this->assertEquals("path\n", $loader->getSource('index.html')); + } + + public function testLoadTemplateAndRenderBlockWithCache() + { + $loader = new Twig_Loader_Filesystem(array()); + $loader->addPath(dirname(__FILE__).'/Fixtures/themes/theme2'); + $loader->addPath(dirname(__FILE__).'/Fixtures/themes/theme1'); + $loader->addPath(dirname(__FILE__).'/Fixtures/themes/theme1', 'default_theme'); + + $twig = new Twig_Environment($loader); + + $template = $twig->loadTemplate('blocks.html.twig'); + $this->assertSame('block from theme 1', $template->renderBlock('b1', array())); + + $template = $twig->loadTemplate('blocks.html.twig'); + $this->assertSame('block from theme 2', $template->renderBlock('b2', array())); + } + + public function getArrayInheritanceTests() + { + return array( + 'valid array inheritance' => array('array_inheritance_valid_parent.html.twig'), + 'array inheritance with null first template' => array('array_inheritance_null_parent.html.twig'), + 'array inheritance with empty first template' => array('array_inheritance_empty_parent.html.twig'), + 'array inheritance with non-existent first template' => array('array_inheritance_nonexistent_parent.html.twig'), + ); + } + + /** + * @dataProvider getArrayInheritanceTests + * + * @param $templateName string Template name with array inheritance + */ + public function testArrayInheritance($templateName) + { + $loader = new Twig_Loader_Filesystem(array()); + $loader->addPath(dirname(__FILE__).'/Fixtures/inheritance'); + + $twig = new Twig_Environment($loader); + + $template = $twig->loadTemplate($templateName); + $this->assertSame('VALID Child', $template->renderBlock('body', array())); + } + + /** + * @requires PHP 5.3 + */ + public function testLoadTemplateFromPhar() + { + $loader = new Twig_Loader_Filesystem(array()); + // phar-sample.phar was created with the following script: + // $f = new Phar('phar-test.phar'); + // $f->addFromString('hello.twig', 'hello from phar'); + $loader->addPath('phar://'.dirname(__FILE__).'/Fixtures/phar/phar-sample.phar'); + $this->assertSame('hello from phar', $loader->getSource('hello.twig')); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_empty_parent.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_empty_parent.html.twig new file mode 100644 index 000000000..6977ebf66 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_empty_parent.html.twig @@ -0,0 +1,3 @@ +{% extends ['','parent.html.twig'] %} + +{% block body %}{{ parent() }} Child{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_nonexistent_parent.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_nonexistent_parent.html.twig new file mode 100644 index 000000000..5b50a8b21 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_nonexistent_parent.html.twig @@ -0,0 +1,3 @@ +{% extends ['nonexistent.html.twig','parent.html.twig'] %} + +{% block body %}{{ parent() }} Child{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_null_parent.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_null_parent.html.twig new file mode 100644 index 000000000..a16b3aded --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_null_parent.html.twig @@ -0,0 +1,3 @@ +{% extends [null,'parent.html.twig'] %} + +{% block body %}{{ parent() }} Child{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_valid_parent.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_valid_parent.html.twig new file mode 100644 index 000000000..4940dad41 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/array_inheritance_valid_parent.html.twig @@ -0,0 +1,3 @@ +{% extends ['parent.html.twig','spare_parent.html.twig'] %} + +{% block body %}{{ parent() }} Child{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/parent.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/parent.html.twig new file mode 100644 index 000000000..d594c0ed4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/parent.html.twig @@ -0,0 +1 @@ +{% block body %}VALID{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/spare_parent.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/spare_parent.html.twig new file mode 100644 index 000000000..70b7360a2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/inheritance/spare_parent.html.twig @@ -0,0 +1 @@ +{% block body %}SPARE PARENT{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html new file mode 100644 index 000000000..9e5449c7c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named/index.html @@ -0,0 +1 @@ +named path diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html new file mode 100644 index 000000000..d3a272b19 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_bis/index.html @@ -0,0 +1 @@ +named path (bis) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html new file mode 100644 index 000000000..9f05d1507 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_final/index.html @@ -0,0 +1 @@ +named path (final) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html new file mode 100644 index 000000000..b1fb5f5d7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html @@ -0,0 +1 @@ +named path (quater) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html new file mode 100644 index 000000000..24fb68ad2 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/named_ter/index.html @@ -0,0 +1 @@ +named path (ter) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html new file mode 100644 index 000000000..e7a8fd4d0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal/index.html @@ -0,0 +1 @@ +path diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html new file mode 100644 index 000000000..bfa916049 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_bis/index.html @@ -0,0 +1 @@ +path (bis) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html new file mode 100644 index 000000000..73a089bbd --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_final/index.html @@ -0,0 +1 @@ +path (final) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html new file mode 100644 index 000000000..b7ad97d8f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/normal_ter/index.html @@ -0,0 +1 @@ +path (ter) diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/phar/phar-sample.phar b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/phar/phar-sample.phar new file mode 100644 index 000000000..092bbfae3 Binary files /dev/null and b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/phar/phar-sample.phar differ diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme1/blocks.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme1/blocks.html.twig new file mode 100644 index 000000000..dd0cbc2e7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme1/blocks.html.twig @@ -0,0 +1,3 @@ +{% block b1 %}block from theme 1{% endblock %} + +{% block b2 %}block from theme 1{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme2/blocks.html.twig b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme2/blocks.html.twig new file mode 100644 index 000000000..07cf9db0d --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Loader/Fixtures/themes/theme2/blocks.html.twig @@ -0,0 +1,3 @@ +{% use '@default_theme/blocks.html.twig' %} + +{% block b2 %}block from theme 2{% endblock %} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php new file mode 100644 index 000000000..942aff9e3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php @@ -0,0 +1,33 @@ +markTestSkipped('Skip under HHVM as the behavior is not the same as plain PHP (which is an edge case anyway)'); + } + + $twig = new Twig_Environment(new Twig_Loader_Array(array('index' => '{{ d1.date }}{{ d2.date }}')), array( + 'debug' => true, + 'cache' => false, + 'autoescape' => false, + )); + + $d1 = new DateTime(); + $d2 = new DateTime(); + $output = $twig->render('index', compact('d1', 'd2')); + + // If it fails, PHP will crash. + $this->assertEquals($output, $d1->date.$d2->date); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php new file mode 100644 index 000000000..25d16023f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php @@ -0,0 +1,32 @@ +assertEquals($body, $node->getNode('body')); + $this->assertTrue($node->getAttribute('value')); + } + + public function getTests() + { + $body = new Twig_Node(array(new Twig_Node_Text('foo', 1))); + $node = new Twig_Node_AutoEscape(true, $body, 1); + + return array( + array($node, "// line 1\necho \"foo\";"), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php new file mode 100644 index 000000000..84dac9bfa --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php @@ -0,0 +1,31 @@ +assertEquals('foo', $node->getAttribute('name')); + } + + public function getTests() + { + return array( + array(new Twig_Node_BlockReference('foo', 1), <<displayBlock('foo', \$context, \$blocks); +EOF + ), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php new file mode 100644 index 000000000..e7246dcc3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php @@ -0,0 +1,39 @@ +assertEquals($body, $node->getNode('body')); + $this->assertEquals('foo', $node->getAttribute('name')); + } + + public function getTests() + { + $body = new Twig_Node_Text('foo', 1); + $node = new Twig_Node_Block('foo', $body, 1); + + return array( + array($node, <<assertEquals($expr, $node->getNode('expr')); + } + + public function getTests() + { + $tests = array(); + + $expr = new Twig_Node_Expression_Constant('foo', 1); + $node = new Twig_Node_Do($expr, 1); + $tests[] = array($node, "// line 1\n\"foo\";"); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php new file mode 100644 index 000000000..4f83ab176 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php @@ -0,0 +1,37 @@ +assertEquals($foo, $node->getNode(1)); + } + + public function getTests() + { + $elements = array( + new Twig_Node_Expression_Constant('foo', 1), + new Twig_Node_Expression_Constant('bar', 1), + + new Twig_Node_Expression_Constant('bar', 1), + new Twig_Node_Expression_Constant('foo', 1), + ); + $node = new Twig_Node_Expression_Array($elements, 1); + + return array( + array($node, 'array("foo" => "bar", "bar" => "foo")'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php new file mode 100644 index 000000000..bf365de49 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php @@ -0,0 +1,29 @@ +assertEquals('foo', $node->getAttribute('name')); + } + + public function getTests() + { + $node = new Twig_Node_Expression_AssignName('foo', 1); + + return array( + array($node, '$context["foo"]'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php new file mode 100644 index 000000000..02310a1b0 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_Add($left, $right, 1); + + return array( + array($node, '(1 + 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php new file mode 100644 index 000000000..2df3c8e45 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_And($left, $right, 1); + + return array( + array($node, '(1 && 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php new file mode 100644 index 000000000..759e48289 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_Concat($left, $right, 1); + + return array( + array($node, '(1 . 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php new file mode 100644 index 000000000..0e54b10a3 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_Div($left, $right, 1); + + return array( + array($node, '(1 / 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php new file mode 100644 index 000000000..5813dce6e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_FloorDiv($left, $right, 1); + + return array( + array($node, '(int) floor((1 / 2))'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php new file mode 100644 index 000000000..4c663c787 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_Mod($left, $right, 1); + + return array( + array($node, '(1 % 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php new file mode 100644 index 000000000..e92c95e64 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_Mul($left, $right, 1); + + return array( + array($node, '(1 * 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php new file mode 100644 index 000000000..ec37c83eb --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_Or($left, $right, 1); + + return array( + array($node, '(1 || 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php new file mode 100644 index 000000000..061cb270f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php @@ -0,0 +1,34 @@ +assertEquals($left, $node->getNode('left')); + $this->assertEquals($right, $node->getNode('right')); + } + + public function getTests() + { + $left = new Twig_Node_Expression_Constant(1, 1); + $right = new Twig_Node_Expression_Constant(2, 1); + $node = new Twig_Node_Expression_Binary_Sub($left, $right, 1); + + return array( + array($node, '(1 - 2)'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php new file mode 100644 index 000000000..28c8148ff --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php @@ -0,0 +1,147 @@ + 'function', 'name' => 'date')); + $this->assertEquals(array('U', null), $node->getArguments('date', array('format' => 'U', 'timestamp' => null))); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Positional arguments cannot be used after named arguments for function "date". + */ + public function testGetArgumentsWhenPositionalArgumentsAfterNamedArguments() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date')); + $node->getArguments('date', array('timestamp' => 123456, 'Y-m-d')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Argument "format" is defined twice for function "date". + */ + public function testGetArgumentsWhenArgumentIsDefinedTwice() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date')); + $node->getArguments('date', array('Y-m-d', 'format' => 'U')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown argument "unknown" for function "date(format, timestamp)". + */ + public function testGetArgumentsWithWrongNamedArgumentName() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date')); + $node->getArguments('date', array('Y-m-d', 'timestamp' => null, 'unknown' => '')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown arguments "unknown1", "unknown2" for function "date(format, timestamp)". + */ + public function testGetArgumentsWithWrongNamedArgumentNames() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date')); + $node->getArguments('date', array('Y-m-d', 'timestamp' => null, 'unknown1' => '', 'unknown2' => '')); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Argument "case_sensitivity" could not be assigned for function "substr_compare(main_str, str, offset, length, case_sensitivity)" because it is mapped to an internal PHP function which cannot determine default value for optional argument "length". + */ + public function testResolveArgumentsWithMissingValueForOptionalArgument() + { + if (defined('HHVM_VERSION')) { + $this->markTestSkipped('Skip under HHVM as the behavior is not the same as plain PHP (which is an edge case anyway)'); + } + + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'substr_compare')); + $node->getArguments('substr_compare', array('abcd', 'bc', 'offset' => 1, 'case_sensitivity' => true)); + } + + public function testResolveArgumentsOnlyNecessaryArgumentsForCustomFunction() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'custom_function')); + + $this->assertEquals(array('arg1'), $node->getArguments(array($this, 'customFunction'), array('arg1' => 'arg1'))); + } + + public function testGetArgumentsForStaticMethod() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'custom_static_function')); + $this->assertEquals(array('arg1'), $node->getArguments(__CLASS__.'::customStaticFunction', array('arg1' => 'arg1'))); + } + + /** + * @expectedException LogicException + * @expectedExceptionMessage The last parameter of "Twig_Tests_Node_Expression_CallTest::customFunctionWithArbitraryArguments" for function "foo" must be an array with default value, eg. "array $arg = array()". + */ + public function testResolveArgumentsWithMissingParameterForArbitraryArguments() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'foo', 'is_variadic' => true)); + $node->getArguments(array($this, 'customFunctionWithArbitraryArguments'), array()); + } + + public static function customStaticFunction($arg1, $arg2 = 'default', $arg3 = array()) + { + } + + public function customFunction($arg1, $arg2 = 'default', $arg3 = array()) + { + } + + public function customFunctionWithArbitraryArguments() + { + } + + /** + * @expectedException LogicException + * @expectedExceptionMessageRegExp #^The last parameter of "custom_Twig_Tests_Node_Expression_CallTest_function" for function "foo" must be an array with default value, eg\. "array \$arg \= array\(\)"\.$# + */ + public function testResolveArgumentsWithMissingParameterForArbitraryArgumentsOnFunction() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'foo', 'is_variadic' => true)); + $node->getArguments('custom_Twig_Tests_Node_Expression_CallTest_function', array()); + } + + /** + * @expectedException LogicException + * @expectedExceptionMessageRegExp #^The last parameter of "CallableTestClass\:\:__invoke" for function "foo" must be an array with default value, eg\. "array \$arg \= array\(\)"\.$# + */ + public function testResolveArgumentsWithMissingParameterForArbitraryArgumentsOnObject() + { + $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'foo', 'is_variadic' => true)); + $node->getArguments(new CallableTestClass(), array()); + } +} + +class Twig_Tests_Node_Expression_Call extends Twig_Node_Expression_Call +{ + public function getArguments($callable, $arguments) + { + return parent::getArguments($callable, $arguments); + } +} + +class CallableTestClass +{ + public function __invoke($required) + { + } +} + +function custom_Twig_Tests_Node_Expression_CallTest_function($required) +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php new file mode 100644 index 000000000..a3e8badff --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php @@ -0,0 +1,38 @@ +assertEquals($expr1, $node->getNode('expr1')); + $this->assertEquals($expr2, $node->getNode('expr2')); + $this->assertEquals($expr3, $node->getNode('expr3')); + } + + public function getTests() + { + $tests = array(); + + $expr1 = new Twig_Node_Expression_Constant(1, 1); + $expr2 = new Twig_Node_Expression_Constant(2, 1); + $expr3 = new Twig_Node_Expression_Constant(3, 1); + $node = new Twig_Node_Expression_Conditional($expr1, $expr2, $expr3, 1); + $tests[] = array($node, '((1) ? (2) : (3))'); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php new file mode 100644 index 000000000..2ff931822 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php @@ -0,0 +1,30 @@ +assertEquals('foo', $node->getAttribute('value')); + } + + public function getTests() + { + $tests = array(); + + $node = new Twig_Node_Expression_Constant('foo', 1); + $tests[] = array($node, '"foo"'); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php new file mode 100644 index 000000000..773375c94 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php @@ -0,0 +1,154 @@ +assertEquals($expr, $node->getNode('node')); + $this->assertEquals($name, $node->getNode('filter')); + $this->assertEquals($args, $node->getNode('arguments')); + } + + public function getTests() + { + $environment = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $environment->addFilter(new Twig_SimpleFilter('bar', 'bar', array('needs_environment' => true))); + $environment->addFilter(new Twig_SimpleFilter('barbar', 'twig_tests_filter_barbar', array('needs_context' => true, 'is_variadic' => true))); + + $tests = array(); + + $expr = new Twig_Node_Expression_Constant('foo', 1); + $node = $this->createFilter($expr, 'upper'); + $node = $this->createFilter($node, 'number_format', array(new Twig_Node_Expression_Constant(2, 1), new Twig_Node_Expression_Constant('.', 1), new Twig_Node_Expression_Constant(',', 1))); + + if (function_exists('mb_get_info')) { + $tests[] = array($node, 'twig_number_format_filter($this->env, twig_upper_filter($this->env, "foo"), 2, ".", ",")'); + } else { + $tests[] = array($node, 'twig_number_format_filter($this->env, strtoupper("foo"), 2, ".", ",")'); + } + + // named arguments + $date = new Twig_Node_Expression_Constant(0, 1); + $node = $this->createFilter($date, 'date', array( + 'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1), + 'format' => new Twig_Node_Expression_Constant('d/m/Y H:i:s P', 1), + )); + $tests[] = array($node, 'twig_date_format_filter($this->env, 0, "d/m/Y H:i:s P", "America/Chicago")'); + + // skip an optional argument + $date = new Twig_Node_Expression_Constant(0, 1); + $node = $this->createFilter($date, 'date', array( + 'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1), + )); + $tests[] = array($node, 'twig_date_format_filter($this->env, 0, null, "America/Chicago")'); + + // underscores vs camelCase for named arguments + $string = new Twig_Node_Expression_Constant('abc', 1); + $node = $this->createFilter($string, 'reverse', array( + 'preserve_keys' => new Twig_Node_Expression_Constant(true, 1), + )); + $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)'); + $node = $this->createFilter($string, 'reverse', array( + 'preserveKeys' => new Twig_Node_Expression_Constant(true, 1), + )); + $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)'); + + // filter as an anonymous function + if (PHP_VERSION_ID >= 50300) { + $node = $this->createFilter(new Twig_Node_Expression_Constant('foo', 1), 'anonymous'); + $tests[] = array($node, 'call_user_func_array($this->env->getFilter(\'anonymous\')->getCallable(), array("foo"))'); + } + + // needs environment + $node = $this->createFilter($string, 'bar'); + $tests[] = array($node, 'bar($this->env, "abc")', $environment); + + $node = $this->createFilter($string, 'bar', array(new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'bar($this->env, "abc", "bar")', $environment); + + // arbitrary named arguments + $node = $this->createFilter($string, 'barbar'); + $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc")', $environment); + + $node = $this->createFilter($string, 'barbar', array('foo' => new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc", null, null, array("foo" => "bar"))', $environment); + + $node = $this->createFilter($string, 'barbar', array('arg2' => new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc", null, "bar")', $environment); + + $node = $this->createFilter($string, 'barbar', array( + new Twig_Node_Expression_Constant('1', 1), + new Twig_Node_Expression_Constant('2', 1), + new Twig_Node_Expression_Constant('3', 1), + 'foo' => new Twig_Node_Expression_Constant('bar', 1), + )); + $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc", "1", "2", array(0 => "3", "foo" => "bar"))', $environment); + + return $tests; + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown argument "foobar" for filter "date(format, timezone)" at line 1. + */ + public function testCompileWithWrongNamedArgumentName() + { + $date = new Twig_Node_Expression_Constant(0, 1); + $node = $this->createFilter($date, 'date', array( + 'foobar' => new Twig_Node_Expression_Constant('America/Chicago', 1), + )); + + $compiler = $this->getCompiler(); + $compiler->compile($node); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Value for argument "from" is required for filter "replace". + */ + public function testCompileWithMissingNamedArgument() + { + $value = new Twig_Node_Expression_Constant(0, 1); + $node = $this->createFilter($value, 'replace', array( + 'to' => new Twig_Node_Expression_Constant('foo', 1), + )); + + $compiler = $this->getCompiler(); + $compiler->compile($node); + } + + protected function createFilter($node, $name, array $arguments = array()) + { + $name = new Twig_Node_Expression_Constant($name, 1); + $arguments = new Twig_Node($arguments); + + return new Twig_Node_Expression_Filter($node, $name, $arguments, 1); + } + + protected function getEnvironment() + { + if (PHP_VERSION_ID >= 50300) { + return include 'PHP53/FilterInclude.php'; + } + + return parent::getEnvironment(); + } +} + +function twig_tests_filter_barbar($context, $string, $arg1 = null, $arg2 = null, array $args = array()) +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php new file mode 100644 index 000000000..2e82e2f11 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php @@ -0,0 +1,110 @@ +assertEquals($name, $node->getAttribute('name')); + $this->assertEquals($args, $node->getNode('arguments')); + } + + public function getTests() + { + $environment = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $environment->addFunction(new Twig_SimpleFunction('foo', 'foo', array())); + $environment->addFunction(new Twig_SimpleFunction('bar', 'bar', array('needs_environment' => true))); + $environment->addFunction(new Twig_SimpleFunction('foofoo', 'foofoo', array('needs_context' => true))); + $environment->addFunction(new Twig_SimpleFunction('foobar', 'foobar', array('needs_environment' => true, 'needs_context' => true))); + $environment->addFunction(new Twig_SimpleFunction('barbar', 'twig_tests_function_barbar', array('is_variadic' => true))); + + $tests = array(); + + $node = $this->createFunction('foo'); + $tests[] = array($node, 'foo()', $environment); + + $node = $this->createFunction('foo', array(new Twig_Node_Expression_Constant('bar', 1), new Twig_Node_Expression_Constant('foobar', 1))); + $tests[] = array($node, 'foo("bar", "foobar")', $environment); + + $node = $this->createFunction('bar'); + $tests[] = array($node, 'bar($this->env)', $environment); + + $node = $this->createFunction('bar', array(new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'bar($this->env, "bar")', $environment); + + $node = $this->createFunction('foofoo'); + $tests[] = array($node, 'foofoo($context)', $environment); + + $node = $this->createFunction('foofoo', array(new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'foofoo($context, "bar")', $environment); + + $node = $this->createFunction('foobar'); + $tests[] = array($node, 'foobar($this->env, $context)', $environment); + + $node = $this->createFunction('foobar', array(new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'foobar($this->env, $context, "bar")', $environment); + + // named arguments + $node = $this->createFunction('date', array( + 'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1), + 'date' => new Twig_Node_Expression_Constant(0, 1), + )); + $tests[] = array($node, 'twig_date_converter($this->env, 0, "America/Chicago")'); + + // arbitrary named arguments + $node = $this->createFunction('barbar'); + $tests[] = array($node, 'twig_tests_function_barbar()', $environment); + + $node = $this->createFunction('barbar', array('foo' => new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'twig_tests_function_barbar(null, null, array("foo" => "bar"))', $environment); + + $node = $this->createFunction('barbar', array('arg2' => new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'twig_tests_function_barbar(null, "bar")', $environment); + + $node = $this->createFunction('barbar', array( + new Twig_Node_Expression_Constant('1', 1), + new Twig_Node_Expression_Constant('2', 1), + new Twig_Node_Expression_Constant('3', 1), + 'foo' => new Twig_Node_Expression_Constant('bar', 1), + )); + $tests[] = array($node, 'twig_tests_function_barbar("1", "2", array(0 => "3", "foo" => "bar"))', $environment); + + // function as an anonymous function + if (PHP_VERSION_ID >= 50300) { + $node = $this->createFunction('anonymous', array(new Twig_Node_Expression_Constant('foo', 1))); + $tests[] = array($node, 'call_user_func_array($this->env->getFunction(\'anonymous\')->getCallable(), array("foo"))'); + } + + return $tests; + } + + protected function createFunction($name, array $arguments = array()) + { + return new Twig_Node_Expression_Function($name, new Twig_Node($arguments), 1); + } + + protected function getEnvironment() + { + if (PHP_VERSION_ID >= 50300) { + return include 'PHP53/FunctionInclude.php'; + } + + return parent::getEnvironment(); + } +} + +function twig_tests_function_barbar($arg1 = null, $arg2 = null, array $args = array()) +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php new file mode 100644 index 000000000..2764478c4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php @@ -0,0 +1,50 @@ +addElement(new Twig_Node_Expression_Name('foo', 1)); + $args->addElement(new Twig_Node_Expression_Constant('bar', 1)); + $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::ARRAY_CALL, 1); + + $this->assertEquals($expr, $node->getNode('node')); + $this->assertEquals($attr, $node->getNode('attribute')); + $this->assertEquals($args, $node->getNode('arguments')); + $this->assertEquals(Twig_Template::ARRAY_CALL, $node->getAttribute('type')); + } + + public function getTests() + { + $tests = array(); + + $expr = new Twig_Node_Expression_Name('foo', 1); + $attr = new Twig_Node_Expression_Constant('bar', 1); + $args = new Twig_Node_Expression_Array(array(), 1); + $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::ANY_CALL, 1); + $tests[] = array($node, sprintf('%s%s, "bar", array())', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1))); + + $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::ARRAY_CALL, 1); + $tests[] = array($node, sprintf('%s%s, "bar", array(), "array")', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1))); + + $args = new Twig_Node_Expression_Array(array(), 1); + $args->addElement(new Twig_Node_Expression_Name('foo', 1)); + $args->addElement(new Twig_Node_Expression_Constant('bar', 1)); + $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::METHOD_CALL, 1); + $tests[] = array($node, sprintf('%s%s, "bar", array(0 => %s, 1 => "bar"), "method")', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1), $this->getVariableGetter('foo'))); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php new file mode 100644 index 000000000..57a6ed758 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php @@ -0,0 +1,35 @@ +assertEquals('foo', $node->getAttribute('name')); + } + + public function getTests() + { + $node = new Twig_Node_Expression_Name('foo', 1); + $context = new Twig_Node_Expression_Name('_context', 1); + + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => true)); + $env1 = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => false)); + + return array( + array($node, "// line 1\n".(PHP_VERSION_ID >= 50400 ? '(isset($context["foo"]) ? $context["foo"] : $this->getContext($context, "foo"))' : '$this->getContext($context, "foo")'), $env), + array($node, $this->getVariableGetter('foo', 1), $env1), + array($context, "// line 1\n\$context"), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php new file mode 100644 index 000000000..b5394bcf4 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php @@ -0,0 +1,6 @@ +addFilter(new Twig_SimpleFilter('anonymous', function () {})); + +return $env; diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php new file mode 100644 index 000000000..e8f68c728 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php @@ -0,0 +1,6 @@ +addFunction(new Twig_SimpleFunction('anonymous', function () {})); + +return $env; diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php new file mode 100644 index 000000000..9f818bc41 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php @@ -0,0 +1,6 @@ +addTest(new Twig_SimpleTest('anonymous', function () {})); + +return $env; diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php new file mode 100644 index 000000000..ab2bbe074 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php @@ -0,0 +1,28 @@ +assertEquals('foo', $node->getAttribute('name')); + } + + public function getTests() + { + $tests = array(); + $tests[] = array(new Twig_Node_Expression_Parent('foo', 1), '$this->renderParentBlock("foo", $context, $blocks)'); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php new file mode 100644 index 000000000..a5f96d245 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php @@ -0,0 +1,82 @@ +assertEquals($expr, $node->getNode('node')); + $this->assertEquals($args, $node->getNode('arguments')); + $this->assertEquals($name, $node->getAttribute('name')); + } + + public function getTests() + { + $environment = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $environment->addTest(new Twig_SimpleTest('barbar', 'twig_tests_test_barbar', array('is_variadic' => true, 'need_context' => true))); + + $tests = array(); + + $expr = new Twig_Node_Expression_Constant('foo', 1); + $node = new Twig_Node_Expression_Test_Null($expr, 'null', new Twig_Node(array()), 1); + $tests[] = array($node, '(null === "foo")'); + + // test as an anonymous function + if (PHP_VERSION_ID >= 50300) { + $node = $this->createTest(new Twig_Node_Expression_Constant('foo', 1), 'anonymous', array(new Twig_Node_Expression_Constant('foo', 1))); + $tests[] = array($node, 'call_user_func_array($this->env->getTest(\'anonymous\')->getCallable(), array("foo", "foo"))'); + } + + // arbitrary named arguments + $string = new Twig_Node_Expression_Constant('abc', 1); + $node = $this->createTest($string, 'barbar'); + $tests[] = array($node, 'twig_tests_test_barbar("abc")', $environment); + + $node = $this->createTest($string, 'barbar', array('foo' => new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'twig_tests_test_barbar("abc", null, null, array("foo" => "bar"))', $environment); + + $node = $this->createTest($string, 'barbar', array('arg2' => new Twig_Node_Expression_Constant('bar', 1))); + $tests[] = array($node, 'twig_tests_test_barbar("abc", null, "bar")', $environment); + + $node = $this->createTest($string, 'barbar', array( + new Twig_Node_Expression_Constant('1', 1), + new Twig_Node_Expression_Constant('2', 1), + new Twig_Node_Expression_Constant('3', 1), + 'foo' => new Twig_Node_Expression_Constant('bar', 1), + )); + $tests[] = array($node, 'twig_tests_test_barbar("abc", "1", "2", array(0 => "3", "foo" => "bar"))', $environment); + + return $tests; + } + + protected function createTest($node, $name, array $arguments = array()) + { + return new Twig_Node_Expression_Test($node, $name, new Twig_Node($arguments), 1); + } + + protected function getEnvironment() + { + if (PHP_VERSION_ID >= 50300) { + return include 'PHP53/TestInclude.php'; + } + + return parent::getEnvironment(); + } +} + +function twig_tests_test_barbar($string, $arg1 = null, $arg2 = null, array $args = array()) +{ +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php new file mode 100644 index 000000000..b63337117 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php @@ -0,0 +1,32 @@ +assertEquals($expr, $node->getNode('node')); + } + + public function getTests() + { + $node = new Twig_Node_Expression_Constant(1, 1); + $node = new Twig_Node_Expression_Unary_Neg($node, 1); + + return array( + array($node, '-1'), + array(new Twig_Node_Expression_Unary_Neg($node, 1), '- -1'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php new file mode 100644 index 000000000..d7c6f85e7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php @@ -0,0 +1,31 @@ +assertEquals($expr, $node->getNode('node')); + } + + public function getTests() + { + $node = new Twig_Node_Expression_Constant(1, 1); + $node = new Twig_Node_Expression_Unary_Not($node, 1); + + return array( + array($node, '!1'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php new file mode 100644 index 000000000..057250f37 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php @@ -0,0 +1,31 @@ +assertEquals($expr, $node->getNode('node')); + } + + public function getTests() + { + $node = new Twig_Node_Expression_Constant(1, 1); + $node = new Twig_Node_Expression_Unary_Pos($node, 1); + + return array( + array($node, '+1'), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php new file mode 100644 index 000000000..2bf4c7b43 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php @@ -0,0 +1,191 @@ +setAttribute('with_loop', false); + + $this->assertEquals($keyTarget, $node->getNode('key_target')); + $this->assertEquals($valueTarget, $node->getNode('value_target')); + $this->assertEquals($seq, $node->getNode('seq')); + $this->assertTrue($node->getAttribute('ifexpr')); + $this->assertEquals('Twig_Node_If', get_class($node->getNode('body'))); + $this->assertEquals($body, $node->getNode('body')->getNode('tests')->getNode(1)->getNode(0)); + $this->assertFalse($node->hasNode('else')); + + $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1); + $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1); + $node->setAttribute('with_loop', false); + $this->assertEquals($else, $node->getNode('else')); + } + + public function getTests() + { + $tests = array(); + + $keyTarget = new Twig_Node_Expression_AssignName('key', 1); + $valueTarget = new Twig_Node_Expression_AssignName('item', 1); + $seq = new Twig_Node_Expression_Name('items', 1); + $ifexpr = null; + $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1); + $else = null; + $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1); + $node->setAttribute('with_loop', false); + + $tests[] = array($node, <<getVariableGetter('items')}); +foreach (\$context['_seq'] as \$context["key"] => \$context["item"]) { + echo {$this->getVariableGetter('foo')}; +} +\$_parent = \$context['_parent']; +unset(\$context['_seq'], \$context['_iterated'], \$context['key'], \$context['item'], \$context['_parent'], \$context['loop']); +\$context = array_intersect_key(\$context, \$_parent) + \$_parent; +EOF + ); + + $keyTarget = new Twig_Node_Expression_AssignName('k', 1); + $valueTarget = new Twig_Node_Expression_AssignName('v', 1); + $seq = new Twig_Node_Expression_Name('values', 1); + $ifexpr = null; + $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1); + $else = null; + $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1); + $node->setAttribute('with_loop', true); + + $tests[] = array($node, <<getVariableGetter('values')}); +\$context['loop'] = array( + 'parent' => \$context['_parent'], + 'index0' => 0, + 'index' => 1, + 'first' => true, +); +if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) { + \$length = count(\$context['_seq']); + \$context['loop']['revindex0'] = \$length - 1; + \$context['loop']['revindex'] = \$length; + \$context['loop']['length'] = \$length; + \$context['loop']['last'] = 1 === \$length; +} +foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) { + echo {$this->getVariableGetter('foo')}; + ++\$context['loop']['index0']; + ++\$context['loop']['index']; + \$context['loop']['first'] = false; + if (isset(\$context['loop']['length'])) { + --\$context['loop']['revindex0']; + --\$context['loop']['revindex']; + \$context['loop']['last'] = 0 === \$context['loop']['revindex0']; + } +} +\$_parent = \$context['_parent']; +unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']); +\$context = array_intersect_key(\$context, \$_parent) + \$_parent; +EOF + ); + + $keyTarget = new Twig_Node_Expression_AssignName('k', 1); + $valueTarget = new Twig_Node_Expression_AssignName('v', 1); + $seq = new Twig_Node_Expression_Name('values', 1); + $ifexpr = new Twig_Node_Expression_Constant(true, 1); + $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1); + $else = null; + $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1); + $node->setAttribute('with_loop', true); + + $tests[] = array($node, <<getVariableGetter('values')}); +\$context['loop'] = array( + 'parent' => \$context['_parent'], + 'index0' => 0, + 'index' => 1, + 'first' => true, +); +foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) { + if (true) { + echo {$this->getVariableGetter('foo')}; + ++\$context['loop']['index0']; + ++\$context['loop']['index']; + \$context['loop']['first'] = false; + } +} +\$_parent = \$context['_parent']; +unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']); +\$context = array_intersect_key(\$context, \$_parent) + \$_parent; +EOF + ); + + $keyTarget = new Twig_Node_Expression_AssignName('k', 1); + $valueTarget = new Twig_Node_Expression_AssignName('v', 1); + $seq = new Twig_Node_Expression_Name('values', 1); + $ifexpr = null; + $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1); + $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1); + $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1); + $node->setAttribute('with_loop', true); + + $tests[] = array($node, <<getVariableGetter('values')}); +\$context['_iterated'] = false; +\$context['loop'] = array( + 'parent' => \$context['_parent'], + 'index0' => 0, + 'index' => 1, + 'first' => true, +); +if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) { + \$length = count(\$context['_seq']); + \$context['loop']['revindex0'] = \$length - 1; + \$context['loop']['revindex'] = \$length; + \$context['loop']['length'] = \$length; + \$context['loop']['last'] = 1 === \$length; +} +foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) { + echo {$this->getVariableGetter('foo')}; + \$context['_iterated'] = true; + ++\$context['loop']['index0']; + ++\$context['loop']['index']; + \$context['loop']['first'] = false; + if (isset(\$context['loop']['length'])) { + --\$context['loop']['revindex0']; + --\$context['loop']['revindex']; + \$context['loop']['last'] = 0 === \$context['loop']['revindex0']; + } +} +if (!\$context['_iterated']) { + echo {$this->getVariableGetter('foo')}; +} +\$_parent = \$context['_parent']; +unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']); +\$context = array_intersect_key(\$context, \$_parent) + \$_parent; +EOF + ); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php new file mode 100644 index 000000000..4ab0e4cc7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php @@ -0,0 +1,88 @@ +assertEquals($t, $node->getNode('tests')); + $this->assertFalse($node->hasNode('else')); + + $else = new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1); + $node = new Twig_Node_If($t, $else, 1); + $this->assertEquals($else, $node->getNode('else')); + } + + public function getTests() + { + $tests = array(); + + $t = new Twig_Node(array( + new Twig_Node_Expression_Constant(true, 1), + new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1), + ), array(), 1); + $else = null; + $node = new Twig_Node_If($t, $else, 1); + + $tests[] = array($node, <<getVariableGetter('foo')}; +} +EOF + ); + + $t = new Twig_Node(array( + new Twig_Node_Expression_Constant(true, 1), + new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1), + new Twig_Node_Expression_Constant(false, 1), + new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1), + ), array(), 1); + $else = null; + $node = new Twig_Node_If($t, $else, 1); + + $tests[] = array($node, <<getVariableGetter('foo')}; +} elseif (false) { + echo {$this->getVariableGetter('bar')}; +} +EOF + ); + + $t = new Twig_Node(array( + new Twig_Node_Expression_Constant(true, 1), + new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1), + ), array(), 1); + $else = new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1); + $node = new Twig_Node_If($t, $else, 1); + + $tests[] = array($node, <<getVariableGetter('foo')}; +} else { + echo {$this->getVariableGetter('bar')}; +} +EOF + ); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php new file mode 100644 index 000000000..36525b251 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php @@ -0,0 +1,40 @@ +assertEquals($macro, $node->getNode('expr')); + $this->assertEquals($var, $node->getNode('var')); + } + + public function getTests() + { + $tests = array(); + + $macro = new Twig_Node_Expression_Constant('foo.twig', 1); + $var = new Twig_Node_Expression_AssignName('macro', 1); + $node = new Twig_Node_Import($macro, $var, 1); + + $tests[] = array($node, <<loadTemplate("foo.twig", null, 1); +EOF + ); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php new file mode 100644 index 000000000..d801f3387 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php @@ -0,0 +1,83 @@ +assertFalse($node->hasNode('variables')); + $this->assertEquals($expr, $node->getNode('expr')); + $this->assertFalse($node->getAttribute('only')); + + $vars = new Twig_Node_Expression_Array(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Constant(true, 1)), 1); + $node = new Twig_Node_Include($expr, $vars, true, false, 1); + $this->assertEquals($vars, $node->getNode('variables')); + $this->assertTrue($node->getAttribute('only')); + } + + public function getTests() + { + $tests = array(); + + $expr = new Twig_Node_Expression_Constant('foo.twig', 1); + $node = new Twig_Node_Include($expr, null, false, false, 1); + $tests[] = array($node, <<loadTemplate("foo.twig", null, 1)->display(\$context); +EOF + ); + + $expr = new Twig_Node_Expression_Conditional( + new Twig_Node_Expression_Constant(true, 1), + new Twig_Node_Expression_Constant('foo', 1), + new Twig_Node_Expression_Constant('foo', 1), + 0 + ); + $node = new Twig_Node_Include($expr, null, false, false, 1); + $tests[] = array($node, <<loadTemplate(((true) ? ("foo") : ("foo")), null, 1)->display(\$context); +EOF + ); + + $expr = new Twig_Node_Expression_Constant('foo.twig', 1); + $vars = new Twig_Node_Expression_Array(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Constant(true, 1)), 1); + $node = new Twig_Node_Include($expr, $vars, false, false, 1); + $tests[] = array($node, <<loadTemplate("foo.twig", null, 1)->display(array_merge(\$context, array("foo" => true))); +EOF + ); + + $node = new Twig_Node_Include($expr, $vars, true, false, 1); + $tests[] = array($node, <<loadTemplate("foo.twig", null, 1)->display(array("foo" => true)); +EOF + ); + + $node = new Twig_Node_Include($expr, $vars, true, true, 1); + $tests[] = array($node, <<loadTemplate("foo.twig", null, 1)->display(array("foo" => true)); +} catch (Twig_Error_Loader \$e) { + // ignore missing template +} +EOF + ); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php new file mode 100644 index 000000000..c7edfa251 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php @@ -0,0 +1,74 @@ +assertEquals($body, $node->getNode('body')); + $this->assertEquals($arguments, $node->getNode('arguments')); + $this->assertEquals('foo', $node->getAttribute('name')); + } + + public function getTests() + { + $body = new Twig_Node_Text('foo', 1); + $arguments = new Twig_Node(array( + 'foo' => new Twig_Node_Expression_Constant(null, 1), + 'bar' => new Twig_Node_Expression_Constant('Foo', 1), + ), array(), 1); + $node = new Twig_Node_Macro('foo', $body, $arguments, 1); + + if (PHP_VERSION_ID >= 50600) { + $declaration = ', ...$__varargs__'; + $varargs = '$__varargs__'; + } else { + $declaration = ''; + $varargs = 'func_num_args() > 2 ? array_slice(func_get_args(), 2) : array()'; + } + + return array( + array($node, <<env->mergeGlobals(array( + "foo" => \$__foo__, + "bar" => \$__bar__, + "varargs" => $varargs, + )); + + \$blocks = array(); + + ob_start(); + try { + echo "foo"; + } catch (Exception \$e) { + ob_end_clean(); + + throw \$e; + } catch (Throwable \$e) { + ob_end_clean(); + + throw \$e; + } + + return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset()); +} +EOF + ), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php new file mode 100644 index 000000000..10cf93be8 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php @@ -0,0 +1,198 @@ +assertEquals($body, $node->getNode('body')); + $this->assertEquals($blocks, $node->getNode('blocks')); + $this->assertEquals($macros, $node->getNode('macros')); + $this->assertEquals($parent, $node->getNode('parent')); + $this->assertEquals($filename, $node->getAttribute('filename')); + } + + public function getTests() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + + $tests = array(); + + $body = new Twig_Node_Text('foo', 1); + $extends = null; + $blocks = new Twig_Node(); + $macros = new Twig_Node(); + $traits = new Twig_Node(); + $filename = 'foo.twig'; + + $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename); + $tests[] = array($node, <<parent = false; + + \$this->blocks = array( + ); + } + + protected function doDisplay(array \$context, array \$blocks = array()) + { + // line 1 + echo "foo"; + } + + public function getTemplateName() + { + return "foo.twig"; + } + + public function getDebugInfo() + { + return array ( 19 => 1,); + } + + public function getSource() + { + return ""; + } +} +EOF + , $twig, true); + + $import = new Twig_Node_Import(new Twig_Node_Expression_Constant('foo.twig', 1), new Twig_Node_Expression_AssignName('macro', 1), 2); + + $body = new Twig_Node(array($import)); + $extends = new Twig_Node_Expression_Constant('layout.twig', 1); + + $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename); + $tests[] = array($node, <<parent = \$this->loadTemplate("layout.twig", "foo.twig", 1); + \$this->blocks = array( + ); + } + + protected function doGetParent(array \$context) + { + return "layout.twig"; + } + + protected function doDisplay(array \$context, array \$blocks = array()) + { + // line 2 + \$context["macro"] = \$this->loadTemplate("foo.twig", "foo.twig", 2); + // line 1 + \$this->parent->display(\$context, array_merge(\$this->blocks, \$blocks)); + } + + public function getTemplateName() + { + return "foo.twig"; + } + + public function isTraitable() + { + return false; + } + + public function getDebugInfo() + { + return array ( 26 => 1, 24 => 2, 11 => 1,); + } + + public function getSource() + { + return ""; + } +} +EOF + , $twig, true); + + $set = new Twig_Node_Set(false, new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 4))), new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 4))), 4); + $body = new Twig_Node(array($set)); + $extends = new Twig_Node_Expression_Conditional( + new Twig_Node_Expression_Constant(true, 2), + new Twig_Node_Expression_Constant('foo', 2), + new Twig_Node_Expression_Constant('foo', 2), + 2 + ); + + $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $filename, '{{ foo }}'); + $tests[] = array($node, <<loadTemplate(((true) ? ("foo") : ("foo")), "foo.twig", 2); + } + + protected function doDisplay(array \$context, array \$blocks = array()) + { + // line 4 + \$context["foo"] = "foo"; + // line 2 + \$this->getParent(\$context)->display(\$context, array_merge(\$this->blocks, \$blocks)); + } + + public function getTemplateName() + { + return "foo.twig"; + } + + public function isTraitable() + { + return false; + } + + public function getDebugInfo() + { + return array ( 17 => 2, 15 => 4, 9 => 2,); + } + + public function getSource() + { + return "{{ foo }}"; + } +} +EOF + , $twig, true); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php new file mode 100644 index 000000000..4e0990fac --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php @@ -0,0 +1,29 @@ +assertEquals($expr, $node->getNode('expr')); + } + + public function getTests() + { + $tests = array(); + $tests[] = array(new Twig_Node_Print(new Twig_Node_Expression_Constant('foo', 1), 1), "// line 1\necho \"foo\";"); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php new file mode 100644 index 000000000..56f487730 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php @@ -0,0 +1,44 @@ +assertEquals($body, $node->getNode('body')); + } + + public function getTests() + { + $tests = array(); + + $body = new Twig_Node_Text('foo', 1); + $node = new Twig_Node_Sandbox($body, 1); + + $tests[] = array($node, <<env->getExtension('Twig_Extension_Sandbox'); +if (!\$alreadySandboxed = \$sandbox->isSandboxed()) { + \$sandbox->enableSandbox(); +} +echo "foo"; +if (!\$alreadySandboxed) { + \$sandbox->disableSandbox(); +} +EOF + ); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php new file mode 100644 index 000000000..8bc8a755c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php @@ -0,0 +1,33 @@ +assertEquals($expr, $node->getNode('expr')); + } + + public function getTests() + { + $tests = array(); + + $tests[] = array(new Twig_Node_SandboxedPrint(new Twig_Node_Expression_Constant('foo', 1), 1), <<env->getExtension('Twig_Extension_Sandbox')->ensureToStringAllowed("foo"); +EOF + ); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php new file mode 100644 index 000000000..62ad2803e --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php @@ -0,0 +1,69 @@ +assertEquals($names, $node->getNode('names')); + $this->assertEquals($values, $node->getNode('values')); + $this->assertFalse($node->getAttribute('capture')); + } + + public function getTests() + { + $tests = array(); + + $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1); + $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1)), array(), 1); + $node = new Twig_Node_Set(false, $names, $values, 1); + $tests[] = array($node, <<env->getCharset()); +EOF + ); + + $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1); + $values = new Twig_Node_Text('foo', 1); + $node = new Twig_Node_Set(true, $names, $values, 1); + $tests[] = array($node, <<env->getCharset()); +EOF + ); + + $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1), new Twig_Node_Expression_AssignName('bar', 1)), array(), 1); + $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Name('bar', 1)), array(), 1); + $node = new Twig_Node_Set(false, $names, $values, 1); + $tests[] = array($node, <<getVariableGetter('bar')}); +EOF + ); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php new file mode 100644 index 000000000..222ca0920 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php @@ -0,0 +1,37 @@ +
    foo
    ', 1))); + $node = new Twig_Node_Spaceless($body, 1); + + $this->assertEquals($body, $node->getNode('body')); + } + + public function getTests() + { + $body = new Twig_Node(array(new Twig_Node_Text('
    foo
    ', 1))); + $node = new Twig_Node_Spaceless($body, 1); + + return array( + array($node, <<
    foo
    "; +echo trim(preg_replace('/>\s+<', ob_get_clean())); +EOF + ), + ); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php new file mode 100644 index 000000000..ceaf67f4c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php @@ -0,0 +1,28 @@ +assertEquals('foo', $node->getAttribute('data')); + } + + public function getTests() + { + $tests = array(); + $tests[] = array(new Twig_Node_Text('foo', 1), "// line 1\necho \"foo\";"); + + return $tests; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php new file mode 100644 index 000000000..f9cae311c --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php @@ -0,0 +1,124 @@ +getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + + $stream = $env->parse($env->tokenize('{{ block("foo") }}', 'index')); + + $node = $stream->getNode('body')->getNode(0); + + $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node)); + $this->assertTrue($node->getAttribute('output')); + } + + public function testRenderParentBlockOptimizer() + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + + $stream = $env->parse($env->tokenize('{% extends "foo" %}{% block content %}{{ parent() }}{% endblock %}', 'index')); + + $node = $stream->getNode('blocks')->getNode('content')->getNode(0)->getNode('body'); + + $this->assertEquals('Twig_Node_Expression_Parent', get_class($node)); + $this->assertTrue($node->getAttribute('output')); + } + + public function testRenderVariableBlockOptimizer() + { + if (PHP_VERSION_ID >= 50400) { + return; + } + + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false)); + $stream = $env->parse($env->tokenize('{{ block(name|lower) }}', 'index')); + + $node = $stream->getNode('body')->getNode(0)->getNode(1); + + $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node)); + $this->assertTrue($node->getAttribute('output')); + } + + /** + * @dataProvider getTestsForForOptimizer + */ + public function testForOptimizer($template, $expected) + { + $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false)); + + $stream = $env->parse($env->tokenize($template, 'index')); + + foreach ($expected as $target => $withLoop) { + $this->assertTrue($this->checkForConfiguration($stream, $target, $withLoop), sprintf('variable %s is %soptimized', $target, $withLoop ? 'not ' : '')); + } + } + + public function getTestsForForOptimizer() + { + return array( + array('{% for i in foo %}{% endfor %}', array('i' => false)), + + array('{% for i in foo %}{{ loop.index }}{% endfor %}', array('i' => true)), + + array('{% for i in foo %}{% for j in foo %}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)), + + array('{% for i in foo %}{% include "foo" %}{% endfor %}', array('i' => true)), + + array('{% for i in foo %}{% include "foo" only %}{% endfor %}', array('i' => false)), + + array('{% for i in foo %}{% include "foo" with { "foo": "bar" } only %}{% endfor %}', array('i' => false)), + + array('{% for i in foo %}{% include "foo" with { "foo": loop.index } only %}{% endfor %}', array('i' => true)), + + array('{% for i in foo %}{% for j in foo %}{{ loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => true)), + + array('{% for i in foo %}{% for j in foo %}{{ loop.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)), + + array('{% for i in foo %}{% set l = loop %}{% for j in foo %}{{ l.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => false)), + + array('{% for i in foo %}{% for j in foo %}{{ foo.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)), + + array('{% for i in foo %}{% for j in foo %}{{ loop["parent"].loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)), + + array('{% for i in foo %}{{ include("foo") }}{% endfor %}', array('i' => true)), + + array('{% for i in foo %}{{ include("foo", with_context = false) }}{% endfor %}', array('i' => false)), + + array('{% for i in foo %}{{ include("foo", with_context = true) }}{% endfor %}', array('i' => true)), + + array('{% for i in foo %}{{ include("foo", { "foo": "bar" }, with_context = false) }}{% endfor %}', array('i' => false)), + + array('{% for i in foo %}{{ include("foo", { "foo": loop.index }, with_context = false) }}{% endfor %}', array('i' => true)), + ); + } + + public function checkForConfiguration(Twig_NodeInterface $node = null, $target, $withLoop) + { + if (null === $node) { + return; + } + + foreach ($node as $n) { + if ($n instanceof Twig_Node_For) { + if ($target === $n->getNode('value_target')->getAttribute('name')) { + return $withLoop == $n->getAttribute('with_loop'); + } + } + + $ret = $this->checkForConfiguration($n, $target, $withLoop); + if (null !== $ret) { + return $ret; + } + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ParserTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ParserTest.php new file mode 100644 index 000000000..afea63d54 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/ParserTest.php @@ -0,0 +1,196 @@ +getParser(); + $parser->setMacro('parent', $this->getMockBuilder('Twig_Node_Macro')->disableOriginalConstructor()->getMock()); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "foo" tag. Did you mean "for" at line 1? + */ + public function testUnknownTag() + { + $stream = new Twig_TokenStream(array( + new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1), + new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1), + new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1), + new Twig_Token(Twig_Token::EOF_TYPE, '', 1), + )); + $parser = new Twig_Parser(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $parser->parse($stream); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage Unknown "foobar" tag at line 1. + */ + public function testUnknownTagWithoutSuggestions() + { + $stream = new Twig_TokenStream(array( + new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1), + new Twig_Token(Twig_Token::NAME_TYPE, 'foobar', 1), + new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1), + new Twig_Token(Twig_Token::EOF_TYPE, '', 1), + )); + $parser = new Twig_Parser(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock())); + $parser->parse($stream); + } + + /** + * @dataProvider getFilterBodyNodesData + */ + public function testFilterBodyNodes($input, $expected) + { + $parser = $this->getParser(); + + $this->assertEquals($expected, $parser->filterBodyNodes($input)); + } + + public function getFilterBodyNodesData() + { + return array( + array( + new Twig_Node(array(new Twig_Node_Text(' ', 1))), + new Twig_Node(array()), + ), + array( + $input = new Twig_Node(array(new Twig_Node_Set(false, new Twig_Node(), new Twig_Node(), 1))), + $input, + ), + array( + $input = new Twig_Node(array(new Twig_Node_Set(true, new Twig_Node(), new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1))))), 1))), + $input, + ), + ); + } + + /** + * @dataProvider getFilterBodyNodesDataThrowsException + * @expectedException Twig_Error_Syntax + */ + public function testFilterBodyNodesThrowsException($input) + { + $parser = $this->getParser(); + + $parser->filterBodyNodes($input); + } + + public function getFilterBodyNodesDataThrowsException() + { + return array( + array(new Twig_Node_Text('foo', 1)), + array(new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1)))))), + ); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedExceptionMessage A template that extends another one cannot start with a byte order mark (BOM); it must be removed at line 1 + */ + public function testFilterBodyNodesWithBOM() + { + $parser = $this->getParser(); + $parser->filterBodyNodes(new Twig_Node_Text(chr(0xEF).chr(0xBB).chr(0xBF), 1)); + } + + public function testParseIsReentrant() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array( + 'autoescape' => false, + 'optimizations' => 0, + )); + $twig->addTokenParser(new TestTokenParser()); + + $parser = new Twig_Parser($twig); + + $parser->parse(new Twig_TokenStream(array( + new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1), + new Twig_Token(Twig_Token::NAME_TYPE, 'test', 1), + new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1), + new Twig_Token(Twig_Token::VAR_START_TYPE, '', 1), + new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1), + new Twig_Token(Twig_Token::VAR_END_TYPE, '', 1), + new Twig_Token(Twig_Token::EOF_TYPE, '', 1), + ))); + + $this->assertNull($parser->getParent()); + } + + // The getVarName() must not depend on the template loaders, + // If this test does not throw any exception, that's good. + // see https://github.com/symfony/symfony/issues/4218 + public function testGetVarName() + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array( + 'autoescape' => false, + 'optimizations' => 0, + )); + + $twig->parse($twig->tokenize(<<getMockBuilder('Twig_LoaderInterface')->getMock())); + $parser->setParent(new Twig_Node()); + $parser->stream = $this->getMockBuilder('Twig_TokenStream')->disableOriginalConstructor()->getMock(); + + return $parser; + } +} + +class TestParser extends Twig_Parser +{ + public $stream; + + public function filterBodyNodes(Twig_NodeInterface $node) + { + return parent::filterBodyNodes($node); + } +} + +class TestTokenParser extends Twig_TokenParser +{ + public function parse(Twig_Token $token) + { + // simulate the parsing of another template right in the middle of the parsing of the current template + $this->parser->parse(new Twig_TokenStream(array( + new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1), + new Twig_Token(Twig_Token::NAME_TYPE, 'extends', 1), + new Twig_Token(Twig_Token::STRING_TYPE, 'base', 1), + new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1), + new Twig_Token(Twig_Token::EOF_TYPE, '', 1), + ))); + + $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); + + return new Twig_Node(array()); + } + + public function getTag() + { + return 'test'; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php new file mode 100644 index 000000000..da97f478a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php @@ -0,0 +1,101 @@ +getMockBuilder('Twig_Profiler_Profile')->disableOriginalConstructor()->getMock(); + + $profile->expects($this->any())->method('isRoot')->will($this->returnValue(true)); + $profile->expects($this->any())->method('getName')->will($this->returnValue('main')); + $profile->expects($this->any())->method('getDuration')->will($this->returnValue(1)); + $profile->expects($this->any())->method('getMemoryUsage')->will($this->returnValue(0)); + $profile->expects($this->any())->method('getPeakMemoryUsage')->will($this->returnValue(0)); + + $subProfiles = array( + $this->getIndexProfile( + array( + $this->getEmbeddedBlockProfile(), + $this->getEmbeddedTemplateProfile( + array( + $this->getIncludedTemplateProfile(), + ) + ), + $this->getMacroProfile(), + $this->getEmbeddedTemplateProfile( + array( + $this->getIncludedTemplateProfile(), + ) + ), + ) + ), + ); + + $profile->expects($this->any())->method('getProfiles')->will($this->returnValue($subProfiles)); + $profile->expects($this->any())->method('getIterator')->will($this->returnValue(new ArrayIterator($subProfiles))); + + return $profile; + } + + private function getIndexProfile(array $subProfiles = array()) + { + return $this->generateProfile('main', 1, true, 'template', 'index.twig', $subProfiles); + } + + private function getEmbeddedBlockProfile(array $subProfiles = array()) + { + return $this->generateProfile('body', 0.0001, false, 'block', 'embedded.twig', $subProfiles); + } + + private function getEmbeddedTemplateProfile(array $subProfiles = array()) + { + return $this->generateProfile('main', 0.0001, true, 'template', 'embedded.twig', $subProfiles); + } + + private function getIncludedTemplateProfile(array $subProfiles = array()) + { + return $this->generateProfile('main', 0.0001, true, 'template', 'included.twig', $subProfiles); + } + + private function getMacroProfile(array $subProfiles = array()) + { + return $this->generateProfile('foo', 0.0001, false, 'macro', 'index.twig', $subProfiles); + } + + /** + * @param string $name + * @param float $duration + * @param bool $isTemplate + * @param string $type + * @param string $templateName + * @param array $subProfiles + * + * @return Twig_Profiler_Profile + */ + private function generateProfile($name, $duration, $isTemplate, $type, $templateName, array $subProfiles = array()) + { + $profile = $this->getMockBuilder('Twig_Profiler_Profile')->disableOriginalConstructor()->getMock(); + + $profile->expects($this->any())->method('isRoot')->will($this->returnValue(false)); + $profile->expects($this->any())->method('getName')->will($this->returnValue($name)); + $profile->expects($this->any())->method('getDuration')->will($this->returnValue($duration)); + $profile->expects($this->any())->method('getMemoryUsage')->will($this->returnValue(0)); + $profile->expects($this->any())->method('getPeakMemoryUsage')->will($this->returnValue(0)); + $profile->expects($this->any())->method('isTemplate')->will($this->returnValue($isTemplate)); + $profile->expects($this->any())->method('getType')->will($this->returnValue($type)); + $profile->expects($this->any())->method('getTemplate')->will($this->returnValue($templateName)); + $profile->expects($this->any())->method('getProfiles')->will($this->returnValue($subProfiles)); + $profile->expects($this->any())->method('getIterator')->will($this->returnValue(new ArrayIterator($subProfiles))); + + return $profile; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php new file mode 100644 index 000000000..1a1b9d299 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php @@ -0,0 +1,32 @@ +assertStringMatchesFormat(<<index.twig//1 %d %d %d +index.twig==>embedded.twig::block(body)//1 %d %d 0 +index.twig==>embedded.twig//2 %d %d %d +embedded.twig==>included.twig//2 %d %d %d +index.twig==>index.twig::macro(foo)//1 %d %d %d +EOF + , $dumper->dump($this->getProfile())); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php new file mode 100644 index 000000000..66a68c4be --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php @@ -0,0 +1,30 @@ +assertStringMatchesFormat(<<main %d.%dms/%d% +└ index.twig %d.%dms/%d% + └ embedded.twig::block(body) + └ embedded.twig + │ └ included.twig + └ index.twig::macro(foo) + └ embedded.twig + └ included.twig + +EOF + , $dumper->dump($this->getProfile())); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php new file mode 100644 index 000000000..e2ea165ac --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php @@ -0,0 +1,30 @@ +assertStringMatchesFormat(<<dump($this->getProfile())); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php new file mode 100644 index 000000000..f786f06ca --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php @@ -0,0 +1,100 @@ +assertEquals('template', $profile->getTemplate()); + $this->assertEquals('type', $profile->getType()); + $this->assertEquals('name', $profile->getName()); + } + + public function testIsRoot() + { + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT); + $this->assertTrue($profile->isRoot()); + + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::TEMPLATE); + $this->assertFalse($profile->isRoot()); + } + + public function testIsTemplate() + { + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::TEMPLATE); + $this->assertTrue($profile->isTemplate()); + + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT); + $this->assertFalse($profile->isTemplate()); + } + + public function testIsBlock() + { + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::BLOCK); + $this->assertTrue($profile->isBlock()); + + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT); + $this->assertFalse($profile->isBlock()); + } + + public function testIsMacro() + { + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::MACRO); + $this->assertTrue($profile->isMacro()); + + $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT); + $this->assertFalse($profile->isMacro()); + } + + public function testGetAddProfile() + { + $profile = new Twig_Profiler_Profile(); + $profile->addProfile($a = new Twig_Profiler_Profile()); + $profile->addProfile($b = new Twig_Profiler_Profile()); + + $this->assertSame(array($a, $b), $profile->getProfiles()); + $this->assertSame(array($a, $b), iterator_to_array($profile)); + } + + public function testGetDuration() + { + $profile = new Twig_Profiler_Profile(); + usleep(1); + $profile->leave(); + + $this->assertTrue($profile->getDuration() > 0, sprintf('Expected duration > 0, got: %f', $profile->getDuration())); + } + + public function testSerialize() + { + $profile = new Twig_Profiler_Profile('template', 'type', 'name'); + $profile1 = new Twig_Profiler_Profile('template1', 'type1', 'name1'); + $profile->addProfile($profile1); + $profile->leave(); + $profile1->leave(); + + $profile2 = unserialize(serialize($profile)); + $profiles = $profile->getProfiles(); + $this->assertCount(1, $profiles); + $profile3 = $profiles[0]; + + $this->assertEquals($profile->getTemplate(), $profile2->getTemplate()); + $this->assertEquals($profile->getType(), $profile2->getType()); + $this->assertEquals($profile->getName(), $profile2->getName()); + $this->assertEquals($profile->getDuration(), $profile2->getDuration()); + + $this->assertEquals($profile1->getTemplate(), $profile3->getTemplate()); + $this->assertEquals($profile1->getType(), $profile3->getType()); + $this->assertEquals($profile1->getName(), $profile3->getName()); + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/TemplateTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/TemplateTest.php new file mode 100644 index 000000000..ba10e6895 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/TemplateTest.php @@ -0,0 +1,689 @@ +getMockForAbstractClass('Twig_Template', array(), '', false); + $template->displayBlock('foo', array(), array('foo' => array(new stdClass(), 'foo'))); + } + + /** + * @dataProvider getAttributeExceptions + */ + public function testGetAttributeExceptions($template, $message, $useExt) + { + $name = 'index_'.($useExt ? 1 : 0); + $templates = array( + $name => $template.$useExt, // appending $useExt makes the template content unique + ); + + $env = new Twig_Environment(new Twig_Loader_Array($templates), array('strict_variables' => true)); + if (!$useExt) { + $env->addNodeVisitor(new CExtDisablingNodeVisitor()); + } + $template = $env->loadTemplate($name); + + $context = array( + 'string' => 'foo', + 'null' => null, + 'empty_array' => array(), + 'array' => array('foo' => 'foo'), + 'array_access' => new Twig_TemplateArrayAccessObject(), + 'magic_exception' => new Twig_TemplateMagicPropertyObjectWithException(), + 'object' => new stdClass(), + ); + + try { + $template->render($context); + $this->fail('Accessing an invalid attribute should throw an exception.'); + } catch (Twig_Error_Runtime $e) { + $this->assertSame(sprintf($message, $name), $e->getMessage()); + } + } + + public function getAttributeExceptions() + { + $tests = array( + array('{{ string["a"] }}', 'Impossible to access a key ("a") on a string variable ("foo") in "%s" at line 1.', false), + array('{{ null["a"] }}', 'Impossible to access a key ("a") on a null variable in "%s" at line 1.', false), + array('{{ empty_array["a"] }}', 'Key "a" does not exist as the array is empty in "%s" at line 1.', false), + array('{{ array["a"] }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1.', false), + array('{{ array_access["a"] }}', 'Key "a" in object with ArrayAccess of class "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1.', false), + array('{{ string.a }}', 'Impossible to access an attribute ("a") on a string variable ("foo") in "%s" at line 1.', false), + array('{{ string.a() }}', 'Impossible to invoke a method ("a") on a string variable ("foo") in "%s" at line 1.', false), + array('{{ null.a }}', 'Impossible to access an attribute ("a") on a null variable in "%s" at line 1.', false), + array('{{ null.a() }}', 'Impossible to invoke a method ("a") on a null variable in "%s" at line 1.', false), + array('{{ empty_array.a }}', 'Key "a" does not exist as the array is empty in "%s" at line 1.', false), + array('{{ array.a }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1.', false), + array('{{ attribute(array, -10) }}', 'Key "-10" for array with keys "foo" does not exist in "%s" at line 1.', false), + array('{{ array_access.a }}', 'Neither the property "a" nor one of the methods "a()", "geta()"/"isa()" or "__call()" exist and have public access in class "Twig_TemplateArrayAccessObject" in "%s" at line 1.', false), + array('{% from _self import foo %}{% macro foo(obj) %}{{ obj.missing_method() }}{% endmacro %}{{ foo(array_access) }}', 'Neither the property "missing_method" nor one of the methods "missing_method()", "getmissing_method()"/"ismissing_method()" or "__call()" exist and have public access in class "Twig_TemplateArrayAccessObject" in "%s" at line 1.', false), + array('{{ magic_exception.test }}', 'An exception has been thrown during the rendering of a template ("Hey! Don\'t try to isset me!") in "%s" at line 1.', false), + array('{{ object["a"] }}', 'Impossible to access a key "a" on an object of class "stdClass" that does not implement ArrayAccess interface in "%s" at line 1.', false), + ); + + if (function_exists('twig_template_get_attributes')) { + foreach (array_slice($tests, 0) as $test) { + $test[2] = true; + $tests[] = $test; + } + } + + return $tests; + } + + /** + * @dataProvider getGetAttributeWithSandbox + */ + public function testGetAttributeWithSandbox($object, $item, $allowed, $useExt) + { + $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + $policy = new Twig_Sandbox_SecurityPolicy(array(), array(), array(/*method*/), array(/*prop*/), array()); + $twig->addExtension(new Twig_Extension_Sandbox($policy, !$allowed)); + $template = new Twig_TemplateTest($twig, $useExt); + + try { + $template->getAttribute($object, $item, array(), 'any'); + + if (!$allowed) { + $this->fail(); + } + } catch (Twig_Sandbox_SecurityError $e) { + if ($allowed) { + $this->fail(); + } + + $this->assertContains('is not allowed', $e->getMessage()); + } + } + + public function getGetAttributeWithSandbox() + { + $tests = array( + array(new Twig_TemplatePropertyObject(), 'defined', false, false), + array(new Twig_TemplatePropertyObject(), 'defined', true, false), + array(new Twig_TemplateMethodObject(), 'defined', false, false), + array(new Twig_TemplateMethodObject(), 'defined', true, false), + ); + + if (function_exists('twig_template_get_attributes')) { + foreach (array_slice($tests, 0) as $test) { + $test[3] = true; + $tests[] = $test; + } + } + + return $tests; + } + + /** + * @dataProvider getGetAttributeWithTemplateAsObject + */ + public function testGetAttributeWithTemplateAsObject($useExt) + { + $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), $useExt); + $template1 = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), false); + + $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'string')); + $this->assertEquals('some_string', $template->getAttribute($template1, 'string')); + + $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'true')); + $this->assertEquals('1', $template->getAttribute($template1, 'true')); + + $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'zero')); + $this->assertEquals('0', $template->getAttribute($template1, 'zero')); + + $this->assertNotInstanceof('Twig_Markup', $template->getAttribute($template1, 'empty')); + $this->assertSame('', $template->getAttribute($template1, 'empty')); + + $this->assertFalse($template->getAttribute($template1, 'env', array(), Twig_Template::ANY_CALL, true)); + $this->assertFalse($template->getAttribute($template1, 'environment', array(), Twig_Template::ANY_CALL, true)); + $this->assertFalse($template->getAttribute($template1, 'getEnvironment', array(), Twig_Template::METHOD_CALL, true)); + $this->assertFalse($template->getAttribute($template1, 'displayWithErrorHandling', array(), Twig_Template::METHOD_CALL, true)); + } + + public function getGetAttributeWithTemplateAsObject() + { + $bools = array( + array(false), + ); + + if (function_exists('twig_template_get_attributes')) { + $bools[] = array(true); + } + + return $bools; + } + + /** + * @dataProvider getTestsDependingOnExtensionAvailability + */ + public function testGetAttributeOnArrayWithConfusableKey($useExt = false) + { + $template = new Twig_TemplateTest( + new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), + $useExt + ); + + $array = array('Zero', 'One', -1 => 'MinusOne', '' => 'EmptyString', '1.5' => 'FloatButString', '01' => 'IntegerButStringWithLeadingZeros'); + + $this->assertSame('Zero', $array[false]); + $this->assertSame('One', $array[true]); + $this->assertSame('One', $array[1.5]); + $this->assertSame('One', $array['1']); + $this->assertSame('MinusOne', $array[-1.5]); + $this->assertSame('FloatButString', $array['1.5']); + $this->assertSame('IntegerButStringWithLeadingZeros', $array['01']); + $this->assertSame('EmptyString', $array[null]); + + $this->assertSame('Zero', $template->getAttribute($array, false), 'false is treated as 0 when accessing an array (equals PHP behavior)'); + $this->assertSame('One', $template->getAttribute($array, true), 'true is treated as 1 when accessing an array (equals PHP behavior)'); + $this->assertSame('One', $template->getAttribute($array, 1.5), 'float is casted to int when accessing an array (equals PHP behavior)'); + $this->assertSame('One', $template->getAttribute($array, '1'), '"1" is treated as integer 1 when accessing an array (equals PHP behavior)'); + $this->assertSame('MinusOne', $template->getAttribute($array, -1.5), 'negative float is casted to int when accessing an array (equals PHP behavior)'); + $this->assertSame('FloatButString', $template->getAttribute($array, '1.5'), '"1.5" is treated as-is when accessing an array (equals PHP behavior)'); + $this->assertSame('IntegerButStringWithLeadingZeros', $template->getAttribute($array, '01'), '"01" is treated as-is when accessing an array (equals PHP behavior)'); + $this->assertSame('EmptyString', $template->getAttribute($array, null), 'null is treated as "" when accessing an array (equals PHP behavior)'); + } + + public function getTestsDependingOnExtensionAvailability() + { + if (function_exists('twig_template_get_attributes')) { + return array(array(false), array(true)); + } + + return array(array(false)); + } + + /** + * @dataProvider getGetAttributeTests + */ + public function testGetAttribute($defined, $value, $object, $item, $arguments, $type, $useExt = false) + { + $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), $useExt); + + $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type)); + } + + /** + * @dataProvider getGetAttributeTests + */ + public function testGetAttributeStrict($defined, $value, $object, $item, $arguments, $type, $useExt = false, $exceptionMessage = null) + { + $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => true)), $useExt); + + if ($defined) { + $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type)); + } else { + try { + $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type)); + + throw new Exception('Expected Twig_Error_Runtime exception.'); + } catch (Twig_Error_Runtime $e) { + if (null !== $exceptionMessage) { + $this->assertSame($exceptionMessage, $e->getMessage()); + } + } + } + } + + /** + * @dataProvider getGetAttributeTests + */ + public function testGetAttributeDefined($defined, $value, $object, $item, $arguments, $type, $useExt = false) + { + $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), $useExt); + + $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true)); + } + + /** + * @dataProvider getGetAttributeTests + */ + public function testGetAttributeDefinedStrict($defined, $value, $object, $item, $arguments, $type, $useExt = false) + { + $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => true)), $useExt); + + $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true)); + } + + /** + * @dataProvider getTestsDependingOnExtensionAvailability + */ + public function testGetAttributeCallExceptions($useExt = false) + { + $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), $useExt); + + $object = new Twig_TemplateMagicMethodExceptionObject(); + + $this->assertNull($template->getAttribute($object, 'foo')); + } + + public function getGetAttributeTests() + { + $array = array( + 'defined' => 'defined', + 'zero' => 0, + 'null' => null, + '1' => 1, + 'bar' => true, + '09' => '09', + '+4' => '+4', + ); + + $objectArray = new Twig_TemplateArrayAccessObject(); + $stdObject = (object) $array; + $magicPropertyObject = new Twig_TemplateMagicPropertyObject(); + $propertyObject = new Twig_TemplatePropertyObject(); + $propertyObject1 = new Twig_TemplatePropertyObjectAndIterator(); + $propertyObject2 = new Twig_TemplatePropertyObjectAndArrayAccess(); + $propertyObject3 = new Twig_TemplatePropertyObjectDefinedWithUndefinedValue(); + $methodObject = new Twig_TemplateMethodObject(); + $magicMethodObject = new Twig_TemplateMagicMethodObject(); + + $anyType = Twig_Template::ANY_CALL; + $methodType = Twig_Template::METHOD_CALL; + $arrayType = Twig_Template::ARRAY_CALL; + + $basicTests = array( + // array(defined, value, property to fetch) + array(true, 'defined', 'defined'), + array(false, null, 'undefined'), + array(false, null, 'protected'), + array(true, 0, 'zero'), + array(true, 1, 1), + array(true, 1, 1.0), + array(true, null, 'null'), + array(true, true, 'bar'), + array(true, '09', '09'), + array(true, '+4', '+4'), + ); + $testObjects = array( + // array(object, type of fetch) + array($array, $arrayType), + array($objectArray, $arrayType), + array($stdObject, $anyType), + array($magicPropertyObject, $anyType), + array($methodObject, $methodType), + array($methodObject, $anyType), + array($propertyObject, $anyType), + array($propertyObject1, $anyType), + array($propertyObject2, $anyType), + ); + + $tests = array(); + foreach ($testObjects as $testObject) { + foreach ($basicTests as $test) { + // properties cannot be numbers + if (($testObject[0] instanceof stdClass || $testObject[0] instanceof Twig_TemplatePropertyObject) && is_numeric($test[2])) { + continue; + } + + if ('+4' === $test[2] && $methodObject === $testObject[0]) { + continue; + } + + $tests[] = array($test[0], $test[1], $testObject[0], $test[2], array(), $testObject[1]); + } + } + + // additional properties tests + $tests = array_merge($tests, array( + array(true, null, $propertyObject3, 'foo', array(), $anyType), + )); + + // additional method tests + $tests = array_merge($tests, array( + array(true, 'defined', $methodObject, 'defined', array(), $methodType), + array(true, 'defined', $methodObject, 'DEFINED', array(), $methodType), + array(true, 'defined', $methodObject, 'getDefined', array(), $methodType), + array(true, 'defined', $methodObject, 'GETDEFINED', array(), $methodType), + array(true, 'static', $methodObject, 'static', array(), $methodType), + array(true, 'static', $methodObject, 'getStatic', array(), $methodType), + + array(true, '__call_undefined', $magicMethodObject, 'undefined', array(), $methodType), + array(true, '__call_UNDEFINED', $magicMethodObject, 'UNDEFINED', array(), $methodType), + )); + + // add the same tests for the any type + foreach ($tests as $test) { + if ($anyType !== $test[5]) { + $test[5] = $anyType; + $tests[] = $test; + } + } + + $methodAndPropObject = new Twig_TemplateMethodAndPropObject(); + + // additional method tests + $tests = array_merge($tests, array( + array(true, 'a', $methodAndPropObject, 'a', array(), $anyType), + array(true, 'a', $methodAndPropObject, 'a', array(), $methodType), + array(false, null, $methodAndPropObject, 'a', array(), $arrayType), + + array(true, 'b_prop', $methodAndPropObject, 'b', array(), $anyType), + array(true, 'b', $methodAndPropObject, 'B', array(), $anyType), + array(true, 'b', $methodAndPropObject, 'b', array(), $methodType), + array(true, 'b', $methodAndPropObject, 'B', array(), $methodType), + array(false, null, $methodAndPropObject, 'b', array(), $arrayType), + + array(false, null, $methodAndPropObject, 'c', array(), $anyType), + array(false, null, $methodAndPropObject, 'c', array(), $methodType), + array(false, null, $methodAndPropObject, 'c', array(), $arrayType), + + )); + + // tests when input is not an array or object + $tests = array_merge($tests, array( + array(false, null, 42, 'a', array(), $anyType, false, 'Impossible to access an attribute ("a") on a integer variable ("42").'), + array(false, null, 'string', 'a', array(), $anyType, false, 'Impossible to access an attribute ("a") on a string variable ("string").'), + array(false, null, array(), 'a', array(), $anyType, false, 'Key "a" does not exist as the array is empty.'), + )); + + // add twig_template_get_attributes tests + + if (function_exists('twig_template_get_attributes')) { + foreach (array_slice($tests, 0) as $test) { + $test = array_pad($test, 7, null); + $test[6] = true; + $tests[] = $test; + } + } + + return $tests; + } +} + +class Twig_TemplateTest extends Twig_Template +{ + protected $useExtGetAttribute = false; + + public function __construct(Twig_Environment $env, $useExtGetAttribute = false) + { + parent::__construct($env); + $this->useExtGetAttribute = $useExtGetAttribute; + self::$cache = array(); + } + + public function getZero() + { + return 0; + } + + public function getEmpty() + { + return ''; + } + + public function getString() + { + return 'some_string'; + } + + public function getTrue() + { + return true; + } + + public function getTemplateName() + { + } + + public function getDebugInfo() + { + return array(); + } + + public function getSource() + { + return ''; + } + + protected function doGetParent(array $context) + { + } + + protected function doDisplay(array $context, array $blocks = array()) + { + } + + public function getAttribute($object, $item, array $arguments = array(), $type = Twig_Template::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false) + { + if ($this->useExtGetAttribute) { + return twig_template_get_attributes($this, $object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck); + } else { + return parent::getAttribute($object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck); + } + } +} + +class Twig_TemplateArrayAccessObject implements ArrayAccess +{ + protected $protected = 'protected'; + + public $attributes = array( + 'defined' => 'defined', + 'zero' => 0, + 'null' => null, + '1' => 1, + 'bar' => true, + '09' => '09', + '+4' => '+4', + ); + + public function offsetExists($name) + { + return array_key_exists($name, $this->attributes); + } + + public function offsetGet($name) + { + return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null; + } + + public function offsetSet($name, $value) + { + } + + public function offsetUnset($name) + { + } +} + +class Twig_TemplateMagicPropertyObject +{ + public $defined = 'defined'; + + public $attributes = array( + 'zero' => 0, + 'null' => null, + '1' => 1, + 'bar' => true, + '09' => '09', + '+4' => '+4', + ); + + protected $protected = 'protected'; + + public function __isset($name) + { + return array_key_exists($name, $this->attributes); + } + + public function __get($name) + { + return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null; + } +} + +class Twig_TemplateMagicPropertyObjectWithException +{ + public function __isset($key) + { + throw new Exception('Hey! Don\'t try to isset me!'); + } +} + +class Twig_TemplatePropertyObject +{ + public $defined = 'defined'; + public $zero = 0; + public $null = null; + public $bar = true; + + protected $protected = 'protected'; +} + +class Twig_TemplatePropertyObjectAndIterator extends Twig_TemplatePropertyObject implements IteratorAggregate +{ + public function getIterator() + { + return new ArrayIterator(array('foo', 'bar')); + } +} + +class Twig_TemplatePropertyObjectAndArrayAccess extends Twig_TemplatePropertyObject implements ArrayAccess +{ + private $data = array(); + + public function offsetExists($offset) + { + return array_key_exists($offset, $this->data); + } + + public function offsetGet($offset) + { + return $this->offsetExists($offset) ? $this->data[$offset] : 'n/a'; + } + + public function offsetSet($offset, $value) + { + } + + public function offsetUnset($offset) + { + } +} + +class Twig_TemplatePropertyObjectDefinedWithUndefinedValue +{ + public $foo; + + public function __construct() + { + $this->foo = @$notExist; + } +} + +class Twig_TemplateMethodObject +{ + public function getDefined() + { + return 'defined'; + } + + public function get1() + { + return 1; + } + + public function get09() + { + return '09'; + } + + public function getZero() + { + return 0; + } + + public function getNull() + { + } + + public function isBar() + { + return true; + } + + protected function getProtected() + { + return 'protected'; + } + + public static function getStatic() + { + return 'static'; + } +} + +class Twig_TemplateMethodAndPropObject +{ + private $a = 'a_prop'; + public function getA() + { + return 'a'; + } + + public $b = 'b_prop'; + public function getB() + { + return 'b'; + } + + private $c = 'c_prop'; + private function getC() + { + return 'c'; + } +} + +class Twig_TemplateMagicMethodObject +{ + public function __call($method, $arguments) + { + return '__call_'.$method; + } +} + +class Twig_TemplateMagicMethodExceptionObject +{ + public function __call($method, $arguments) + { + throw new BadMethodCallException(sprintf('Unknown method "%s".', $method)); + } +} + +class CExtDisablingNodeVisitor implements Twig_NodeVisitorInterface +{ + public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) + { + if ($node instanceof Twig_Node_Expression_GetAttr) { + $node->setAttribute('disable_c_ext', true); + } + + return $node; + } + + public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env) + { + return $node; + } + + public function getPriority() + { + return 0; + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php new file mode 100644 index 000000000..5ac3a286f --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php @@ -0,0 +1,70 @@ +isEOF()) { + $token = $stream->next(); + + $repr[] = $token->getValue(); + } + $this->assertEquals('1, 2, 3, 4, 5, 6, 7', implode(', ', $repr), '->next() advances the pointer and returns the current token'); + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedMessage Unexpected end of template + */ + public function testEndOfTemplateNext() + { + $stream = new Twig_TokenStream(array( + new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1), + )); + while (!$stream->isEOF()) { + $stream->next(); + } + } + + /** + * @expectedException Twig_Error_Syntax + * @expectedMessage Unexpected end of template + */ + public function testEndOfTemplateLook() + { + $stream = new Twig_TokenStream(array( + new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1), + )); + while (!$stream->isEOF()) { + $stream->look(); + $stream->next(); + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/escapingTest.php b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/escapingTest.php new file mode 100644 index 000000000..e5b90935a --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/Twig/Tests/escapingTest.php @@ -0,0 +1,320 @@ + ''', + '"' => '"', + '<' => '<', + '>' => '>', + '&' => '&', + ); + + protected $htmlAttrSpecialChars = array( + '\'' => ''', + /* Characters beyond ASCII value 255 to unicode escape */ + 'Ā' => 'Ā', + /* Immune chars excluded */ + ',' => ',', + '.' => '.', + '-' => '-', + '_' => '_', + /* Basic alnums excluded */ + 'a' => 'a', + 'A' => 'A', + 'z' => 'z', + 'Z' => 'Z', + '0' => '0', + '9' => '9', + /* Basic control characters and null */ + "\r" => ' ', + "\n" => ' ', + "\t" => ' ', + "\0" => '�', // should use Unicode replacement char + /* Encode chars as named entities where possible */ + '<' => '<', + '>' => '>', + '&' => '&', + '"' => '"', + /* Encode spaces for quoteless attribute protection */ + ' ' => ' ', + ); + + protected $jsSpecialChars = array( + /* HTML special chars - escape without exception to hex */ + '<' => '\\x3C', + '>' => '\\x3E', + '\'' => '\\x27', + '"' => '\\x22', + '&' => '\\x26', + /* Characters beyond ASCII value 255 to unicode escape */ + 'Ā' => '\\u0100', + /* Immune chars excluded */ + ',' => ',', + '.' => '.', + '_' => '_', + /* Basic alnums excluded */ + 'a' => 'a', + 'A' => 'A', + 'z' => 'z', + 'Z' => 'Z', + '0' => '0', + '9' => '9', + /* Basic control characters and null */ + "\r" => '\\x0D', + "\n" => '\\x0A', + "\t" => '\\x09', + "\0" => '\\x00', + /* Encode spaces for quoteless attribute protection */ + ' ' => '\\x20', + ); + + protected $urlSpecialChars = array( + /* HTML special chars - escape without exception to percent encoding */ + '<' => '%3C', + '>' => '%3E', + '\'' => '%27', + '"' => '%22', + '&' => '%26', + /* Characters beyond ASCII value 255 to hex sequence */ + 'Ā' => '%C4%80', + /* Punctuation and unreserved check */ + ',' => '%2C', + '.' => '.', + '_' => '_', + '-' => '-', + ':' => '%3A', + ';' => '%3B', + '!' => '%21', + /* Basic alnums excluded */ + 'a' => 'a', + 'A' => 'A', + 'z' => 'z', + 'Z' => 'Z', + '0' => '0', + '9' => '9', + /* Basic control characters and null */ + "\r" => '%0D', + "\n" => '%0A', + "\t" => '%09', + "\0" => '%00', + /* PHP quirks from the past */ + ' ' => '%20', + '~' => '~', + '+' => '%2B', + ); + + protected $cssSpecialChars = array( + /* HTML special chars - escape without exception to hex */ + '<' => '\\3C ', + '>' => '\\3E ', + '\'' => '\\27 ', + '"' => '\\22 ', + '&' => '\\26 ', + /* Characters beyond ASCII value 255 to unicode escape */ + 'Ā' => '\\100 ', + /* Immune chars excluded */ + ',' => '\\2C ', + '.' => '\\2E ', + '_' => '\\5F ', + /* Basic alnums excluded */ + 'a' => 'a', + 'A' => 'A', + 'z' => 'z', + 'Z' => 'Z', + '0' => '0', + '9' => '9', + /* Basic control characters and null */ + "\r" => '\\D ', + "\n" => '\\A ', + "\t" => '\\9 ', + "\0" => '\\0 ', + /* Encode spaces for quoteless attribute protection */ + ' ' => '\\20 ', + ); + + protected $env; + + protected function setUp() + { + $this->env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()); + } + + public function testHtmlEscapingConvertsSpecialChars() + { + foreach ($this->htmlSpecialChars as $key => $value) { + $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html'), 'Failed to escape: '.$key); + } + } + + public function testHtmlAttributeEscapingConvertsSpecialChars() + { + foreach ($this->htmlAttrSpecialChars as $key => $value) { + $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html_attr'), 'Failed to escape: '.$key); + } + } + + public function testJavascriptEscapingConvertsSpecialChars() + { + foreach ($this->jsSpecialChars as $key => $value) { + $this->assertEquals($value, twig_escape_filter($this->env, $key, 'js'), 'Failed to escape: '.$key); + } + } + + public function testJavascriptEscapingReturnsStringIfZeroLength() + { + $this->assertEquals('', twig_escape_filter($this->env, '', 'js')); + } + + public function testJavascriptEscapingReturnsStringIfContainsOnlyDigits() + { + $this->assertEquals('123', twig_escape_filter($this->env, '123', 'js')); + } + + public function testCssEscapingConvertsSpecialChars() + { + foreach ($this->cssSpecialChars as $key => $value) { + $this->assertEquals($value, twig_escape_filter($this->env, $key, 'css'), 'Failed to escape: '.$key); + } + } + + public function testCssEscapingReturnsStringIfZeroLength() + { + $this->assertEquals('', twig_escape_filter($this->env, '', 'css')); + } + + public function testCssEscapingReturnsStringIfContainsOnlyDigits() + { + $this->assertEquals('123', twig_escape_filter($this->env, '123', 'css')); + } + + public function testUrlEscapingConvertsSpecialChars() + { + foreach ($this->urlSpecialChars as $key => $value) { + $this->assertEquals($value, twig_escape_filter($this->env, $key, 'url'), 'Failed to escape: '.$key); + } + } + + /** + * Range tests to confirm escaped range of characters is within OWASP recommendation. + */ + + /** + * Only testing the first few 2 ranges on this prot. function as that's all these + * other range tests require. + */ + public function testUnicodeCodepointConversionToUtf8() + { + $expected = ' ~ޙ'; + $codepoints = array(0x20, 0x7e, 0x799); + $result = ''; + foreach ($codepoints as $value) { + $result .= $this->codepointToUtf8($value); + } + $this->assertEquals($expected, $result); + } + + /** + * Convert a Unicode Codepoint to a literal UTF-8 character. + * + * @param int $codepoint Unicode codepoint in hex notation + * + * @return string UTF-8 literal string + */ + protected function codepointToUtf8($codepoint) + { + if ($codepoint < 0x80) { + return chr($codepoint); + } + if ($codepoint < 0x800) { + return chr($codepoint >> 6 & 0x3f | 0xc0) + .chr($codepoint & 0x3f | 0x80); + } + if ($codepoint < 0x10000) { + return chr($codepoint >> 12 & 0x0f | 0xe0) + .chr($codepoint >> 6 & 0x3f | 0x80) + .chr($codepoint & 0x3f | 0x80); + } + if ($codepoint < 0x110000) { + return chr($codepoint >> 18 & 0x07 | 0xf0) + .chr($codepoint >> 12 & 0x3f | 0x80) + .chr($codepoint >> 6 & 0x3f | 0x80) + .chr($codepoint & 0x3f | 0x80); + } + throw new Exception('Codepoint requested outside of Unicode range.'); + } + + public function testJavascriptEscapingEscapesOwaspRecommendedRanges() + { + $immune = array(',', '.', '_'); // Exceptions to escaping ranges + for ($chr = 0; $chr < 0xFF; ++$chr) { + if ($chr >= 0x30 && $chr <= 0x39 + || $chr >= 0x41 && $chr <= 0x5A + || $chr >= 0x61 && $chr <= 0x7A) { + $literal = $this->codepointToUtf8($chr); + $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js')); + } else { + $literal = $this->codepointToUtf8($chr); + if (in_array($literal, $immune)) { + $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js')); + } else { + $this->assertNotEquals( + $literal, + twig_escape_filter($this->env, $literal, 'js'), + "$literal should be escaped!"); + } + } + } + } + + public function testHtmlAttributeEscapingEscapesOwaspRecommendedRanges() + { + $immune = array(',', '.', '-', '_'); // Exceptions to escaping ranges + for ($chr = 0; $chr < 0xFF; ++$chr) { + if ($chr >= 0x30 && $chr <= 0x39 + || $chr >= 0x41 && $chr <= 0x5A + || $chr >= 0x61 && $chr <= 0x7A) { + $literal = $this->codepointToUtf8($chr); + $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr')); + } else { + $literal = $this->codepointToUtf8($chr); + if (in_array($literal, $immune)) { + $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr')); + } else { + $this->assertNotEquals( + $literal, + twig_escape_filter($this->env, $literal, 'html_attr'), + "$literal should be escaped!"); + } + } + } + } + + public function testCssEscapingEscapesOwaspRecommendedRanges() + { + // CSS has no exceptions to escaping ranges + for ($chr = 0; $chr < 0xFF; ++$chr) { + if ($chr >= 0x30 && $chr <= 0x39 + || $chr >= 0x41 && $chr <= 0x5A + || $chr >= 0x61 && $chr <= 0x7A) { + $literal = $this->codepointToUtf8($chr); + $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'css')); + } else { + $literal = $this->codepointToUtf8($chr); + $this->assertNotEquals( + $literal, + twig_escape_filter($this->env, $literal, 'css'), + "$literal should be escaped!"); + } + } + } +} diff --git a/dkan/.ahoy/site/vendor/twig/twig/test/bootstrap.php b/dkan/.ahoy/site/vendor/twig/twig/test/bootstrap.php new file mode 100644 index 000000000..aecb976f7 --- /dev/null +++ b/dkan/.ahoy/site/vendor/twig/twig/test/bootstrap.php @@ -0,0 +1,13 @@ + $PHPENV_ROOT/versions/$(phpenv global)/etc/conf.d/memory.ini + - echo "always_populate_raw_post_data = -1" > $PHPENV_ROOT/versions/$(phpenv global)/etc/conf.d/deprecated.ini override: - printenv - mkdir $CIRCLE_ARTIFACTS/junit @@ -54,8 +60,8 @@ dependencies: #- sh -e /etc/init.d/xvfb start #- sleep 3 - - wget http://selenium-release.storage.googleapis.com/2.49/selenium-server-standalone-2.49.1.jar - - java -jar selenium-server-standalone-2.49.1.jar -p 4444 : + - wget http://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-2.53.1.jar + - java -jar selenium-server-standalone-2.53.1.jar -p 4444 : background: true post: - sudo apt-get install -y x11vnc @@ -65,7 +71,8 @@ dependencies: ## Customize test commands test: override: - - bash dkan/test/circle-behat.sh docroot/profiles/dkan/test/features: + - ruby dkan/.ahoy/.scripts/circle-behat.rb docroot/profiles/dkan/test/features: + timeout: 1200 parallel: true post: - echo $CIRCLE_ARTIFACTS; cp -av dkan/test/assets $CIRCLE_ARTIFACTS: diff --git a/dkan/dkan.info b/dkan/dkan.info index c450de5e6..7b0fe3a10 100644 --- a/dkan/dkan.info +++ b/dkan/dkan.info @@ -1,7 +1,7 @@ name = DKAN core = 7.x exclusive = TRUE -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan ; Core diff --git a/dkan/drupal-org.make b/dkan/drupal-org.make index 0c5d8db03..b643b528e 100644 --- a/dkan/drupal-org.make +++ b/dkan/drupal-org.make @@ -2,15 +2,17 @@ api: '2' core: 7.x includes: -- https://raw.githubusercontent.com/NuCivic/dkan_dataset/7.x-1.12.10/dkan_dataset.make -- https://raw.githubusercontent.com/NuCivic/dkan_datastore/7.x-1.12.10/dkan_datastore.make -- https://raw.githubusercontent.com/NuCivic/dkan_workflow/7.x-1.12.10/dkan_workflow.make +- https://raw.githubusercontent.com/NuCivic/dkan_dataset/7.x-1.12.11/dkan_dataset.make +- https://raw.githubusercontent.com/NuCivic/dkan_datastore/7.x-1.12.11/dkan_datastore.make +- https://raw.githubusercontent.com/NuCivic/dkan_workflow/7.x-1.12.11/dkan_workflow.make - https://raw.githubusercontent.com/NuCivic/visualization_entity/7.x-1.0-beta1/visualization_entity.make - modules/dkan/dkan_data_story/dkan_data_story.make - modules/dkan/dkan_topics/dkan_topics.make projects: manualcrop: version: '1.5' + patch: + 2504119: https://www.drupal.org/files/issues/multiple_versions-2504119-26.patch tablefield: version: '2.4' simple_gmap: @@ -39,19 +41,19 @@ projects: download: type: git url: https://github.com/NuCivic/dkan_dataset.git - tag: 7.x-1.12.10 + tag: 7.x-1.12.11 dkan_datastore: subdir: dkan download: type: git url: https://github.com/NuCivic/dkan_datastore.git - tag: 7.x-1.12.10 + tag: 7.x-1.12.11 dkan_workflow: subdir: dkan download: type: git url: https://github.com/NuCivic/dkan_workflow.git - tag: 7.x-1.12.10 + tag: 7.x-1.12.11 visualization_entity: download: type: git @@ -89,6 +91,7 @@ projects: 1: patches/fontyourface-no-ajax-browse-view.patch 2: patches/fontyourface-clear-css-cache.patch 2644694: https://www.drupal.org/files/issues/browse-fonts-page-uses-disabled-font-2644694.patch + 2816837: https://www.drupal.org/files/issues/font_your_face-remove_div_general_text_option-D7.patch imagecache_actions: version: '1.7' type: module @@ -159,7 +162,7 @@ projects: download: type: git url: https://github.com/NuCivic/nuboot_radix.git - tag: 7.x-1.12.10 + tag: 7.x-1.12.11 type: theme radix: type: theme @@ -190,11 +193,9 @@ libraries: directory_name: font_awesome spyc: download: - type: get - url: https://raw.github.com/mustangostang/spyc/79f61969f63ee77e0d9460bc254a27a671b445f3/spyc.php - filename: "../spyc.php" - directory_name: lib - destination: modules/contrib/services/servers/rest_server + type: file + url: https://raw.github.com/mustangostang/spyc/master/Spyc.php + directory_name: spyc defaults: projects: subdir: contrib diff --git a/dkan/modules/contrib/services/servers/rest_server/lib/spyc.php b/dkan/libraries/spyc/Spyc.php similarity index 83% rename from dkan/modules/contrib/services/servers/rest_server/lib/spyc.php rename to dkan/libraries/spyc/Spyc.php index e19d56203..f3d47c212 100644 --- a/dkan/modules/contrib/services/servers/rest_server/lib/spyc.php +++ b/dkan/libraries/spyc/Spyc.php @@ -1,10 +1,10 @@ * @author Chris Wanstrath - * @link http://code.google.com/p/spyc/ + * @link https://github.com/mustangostang/spyc/ * @copyright Copyright 2005-2006 Chris Wanstrath, 2006-2011 Vlad Andersen * @license http://www.opensource.org/licenses/mit-license.php MIT License * @package Spyc @@ -32,6 +32,19 @@ function spyc_load_file ($file) { } } +if (!function_exists('spyc_dump')) { + /** + * Dumps array to YAML. + * @param array $data Array. + * @return string + */ + function spyc_dump ($data) { + return Spyc::YAMLDump($data, false, false, true); + } +} + +if (!class_exists('Spyc')) { + /** * The Simple PHP YAML Class. * @@ -63,7 +76,7 @@ class Spyc { /** * Setting this to true will force YAMLDump to enclose any string value in * quotes. False by default. - * + * * @var bool */ public $setting_dump_force_quotes = false; @@ -143,7 +156,7 @@ public static function YAMLLoad($input) { /** * Load a string of YAML into a PHP array statically * - * The load method, when supplied with a YAML string, will do its best + * The load method, when supplied with a YAML string, will do its best * to convert YAML in a string into a PHP array. Pretty simple. * * Note: use this function if you don't want files from the file system @@ -183,10 +196,11 @@ public static function YAMLLoadString($input) { * @param array $array PHP array * @param int $indent Pass in false to use the default, which is 2 * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) + * @param int $no_opening_dashes Do not start YAML file with "---\n" */ - public static function YAMLDump($array,$indent = false,$wordwrap = false) { + public static function YAMLDump($array, $indent = false, $wordwrap = false, $no_opening_dashes = false) { $spyc = new Spyc; - return $spyc->dump($array,$indent,$wordwrap); + return $spyc->dump($array, $indent, $wordwrap, $no_opening_dashes); } @@ -210,7 +224,7 @@ public static function YAMLDump($array,$indent = false,$wordwrap = false) { * @param int $indent Pass in false to use the default, which is 2 * @param int $wordwrap Pass in 0 for no wordwrap, false for default (40) */ - public function dump($array,$indent = false,$wordwrap = false) { + public function dump($array,$indent = false,$wordwrap = false, $no_opening_dashes = false) { // Dumps to some very clean YAML. We'll have to add some more features // and options soon. And better support for folding. @@ -228,11 +242,12 @@ public function dump($array,$indent = false,$wordwrap = false) { } // New YAML document - $string = "---\n"; + $string = ""; + if (!$no_opening_dashes) $string = "---\n"; // Start at the base of the array and move through it. if ($array) { - $array = (array)$array; + $array = (array)$array; $previous_key = -1; foreach ($array as $key => $value) { if (!isset($first_key)) $first_key = $key; @@ -252,6 +267,7 @@ public function dump($array,$indent = false,$wordwrap = false) { * @param $indent The indent of the current node */ private function _yamlize($key,$value,$indent, $previous_key = -1, $first_key = 0, $source_array = null) { + if(is_object($value)) $value = (array)$value; if (is_array($value)) { if (empty ($value)) return $this->_dumpNode($key, array(), $indent, $previous_key, $first_key, $source_array); @@ -302,7 +318,7 @@ private function _yamlizeArray($array,$indent) { private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key = 0, $source_array = null) { // do some folding here, for blocks if (is_string ($value) && ((strpos($value,"\n") !== false || strpos($value,": ") !== false || strpos($value,"- ") !== false || - strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, ' ') !== false || + strpos($value,"*") !== false || strpos($value,"#") !== false || strpos($value,"<") !== false || strpos($value,">") !== false || strpos ($value, '%') !== false || strpos ($value, ' ') !== false || strpos($value,"[") !== false || strpos($value,"]") !== false || strpos($value,"{") !== false || strpos($value,"}") !== false) || strpos($value,"&") !== false || strpos($value, "'") !== false || strpos($value, "!") === 0 || substr ($value, -1, 1) == ':') ) { @@ -312,16 +328,17 @@ private function _dumpNode($key, $value, $indent, $previous_key = -1, $first_key } if ($value === array()) $value = '[ ]'; - if (in_array ($value, array ('true', 'TRUE', 'false', 'FALSE', 'y', 'Y', 'n', 'N', 'null', 'NULL'), true)) { - $value = $this->_doLiteralBlock($value,$indent); + if ($value === "") $value = '""'; + if (self::isTranslationWord($value)) { + $value = $this->_doLiteralBlock($value, $indent); } if (trim ($value) != $value) $value = $this->_doLiteralBlock($value,$indent); if (is_bool($value)) { - $value = ($value) ? "true" : "false"; + $value = $value ? "true" : "false"; } - + if ($value === null) $value = 'null'; if ($value === "'" . self::REMPTY . "'") $value = null; @@ -357,9 +374,17 @@ private function _doLiteralBlock($value,$indent) { } $exploded = explode("\n",$value); $newValue = '|'; - $indent += $this->_dumpIndent; + if (isset($exploded[0]) && ($exploded[0] == "|" || $exploded[0] == "|-" || $exploded[0] == ">")) { + $newValue = $exploded[0]; + unset($exploded[0]); + } + $indent += $this->_dumpIndent; $spaces = str_repeat(' ',$indent); foreach ($exploded as $line) { + $line = trim($line); + if (strpos($line, '"') === 0 && strrpos($line, '"') == (strlen($line)-1) || strpos($line, "'") === 0 && strrpos($line, "'") == (strlen($line)-1)) { + $line = substr($line, 1, -1); + } $newValue .= "\n" . $spaces . ($line); } return $newValue; @@ -382,12 +407,68 @@ private function _doFolding($value,$indent) { } else { if ($this->setting_dump_force_quotes && is_string ($value) && $value !== self::REMPTY) $value = '"' . $value . '"'; + if (is_numeric($value) && is_string($value)) + $value = '"' . $value . '"'; } return $value; } + private function isTrueWord($value) { + $words = self::getTranslations(array('true', 'on', 'yes', 'y')); + return in_array($value, $words, true); + } + + private function isFalseWord($value) { + $words = self::getTranslations(array('false', 'off', 'no', 'n')); + return in_array($value, $words, true); + } + + private function isNullWord($value) { + $words = self::getTranslations(array('null', '~')); + return in_array($value, $words, true); + } + + private function isTranslationWord($value) { + return ( + self::isTrueWord($value) || + self::isFalseWord($value) || + self::isNullWord($value) + ); + } + + /** + * Coerce a string into a native type + * Reference: http://yaml.org/type/bool.html + * TODO: Use only words from the YAML spec. + * @access private + * @param $value The value to coerce + */ + private function coerceValue(&$value) { + if (self::isTrueWord($value)) { + $value = true; + } else if (self::isFalseWord($value)) { + $value = false; + } else if (self::isNullWord($value)) { + $value = null; + } + } + + /** + * Given a set of words, perform the appropriate translations on them to + * match the YAML 1.1 specification for type coercing. + * @param $words The words to translate + * @access private + */ + private static function getTranslations(array $words) { + $result = array(); + foreach ($words as $i) { + $result = array_merge($result, array(ucfirst($i), strtoupper($i), strtolower($i))); + } + return $result; + } + // LOADING FUNCTIONS private function __load($input) { @@ -403,7 +484,7 @@ private function __loadString($input) { private function loadWithSource($Source) { if (empty ($Source)) return array(); if ($this->setting_use_syck_is_possible && function_exists ('syck_load')) { - $array = syck_load (implode ('', $Source)); + $array = syck_load (implode ("\n", $Source)); return is_array($array) ? $array : array(); } @@ -413,7 +494,7 @@ private function loadWithSource($Source) { $cnt = count($Source); for ($i = 0; $i < $cnt; $i++) { $line = $Source[$i]; - + $this->indent = strlen($line) - strlen(ltrim($line)); $tempPath = $this->getParentPathByIndent($this->indent); $line = self::stripIndent($line, $this->indent); @@ -425,7 +506,7 @@ private function loadWithSource($Source) { if ($literalBlockStyle) { $line = rtrim ($line, $literalBlockStyle . " \n"); $literalBlock = ''; - $line .= $this->LiteralPlaceHolder; + $line .= ' '.$this->LiteralPlaceHolder; $literal_block_indent = strlen($Source[$i+1]) - strlen(ltrim($Source[$i+1])); while (++$i < $cnt && $this->literalBlockContinues($Source[$i], $this->indent)) { $literalBlock = $this->addLiteralLine($literalBlock, $Source[$i], $literalBlockStyle, $literal_block_indent); @@ -433,18 +514,16 @@ private function loadWithSource($Source) { $i--; } + // Strip out comments + if (strpos ($line, '#')) { + $line = preg_replace('/\s*#([^"\']+)$/','',$line); + } + while (++$i < $cnt && self::greedilyNeedNextLine($line)) { $line = rtrim ($line, " \n\t\r") . ' ' . ltrim ($Source[$i], " \t"); } $i--; - - - if (strpos ($line, '#')) { - if (strpos ($line, '"') === false && strpos ($line, "'") === false) - $line = preg_replace('/\s+#(.+)$/','',$line); - } - $lineArray = $this->_parseLine($line); if ($literalBlockStyle) @@ -463,7 +542,7 @@ private function loadWithSource($Source) { private function loadFromSource ($input) { if (!empty($input) && strpos($input, "\n") === false && file_exists($input)) - return file($input); + $input = file_get_contents($input); return $this->loadFromString($input); } @@ -505,9 +584,9 @@ private function _parseLine($line) { return $this->returnArrayElement($line); if ($this->isPlainArray($line)) - return $this->returnPlainArray($line); - - + return $this->returnPlainArray($line); + + return $this->returnKeyValuePair($line); } @@ -519,7 +598,7 @@ private function _parseLine($line) { * @return mixed */ private function _toType($value) { - if ($value === '') return null; + if ($value === '') return ""; $first_character = $value[0]; $last_character = substr($value, -1, 1); @@ -531,14 +610,16 @@ private function _toType($value) { $is_quoted = true; } while (0); - if ($is_quoted) - return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\'\'' => '\'', '\\\'' => '\'')); - + if ($is_quoted) { + $value = str_replace('\n', "\n", $value); + if ($first_character == "'") + return strtr(substr ($value, 1, -1), array ('\'\'' => '\'', '\\\''=> '\'')); + return strtr(substr ($value, 1, -1), array ('\\"' => '"', '\\\''=> '\'')); + } + if (strpos($value, ' #') !== false && !$is_quoted) $value = preg_replace('/\s+#(.+)$/','',$value); - if (!$is_quoted) $value = str_replace('\n', "\n", $value); - if ($first_character == '[' && $last_character == ']') { // Take out strings sequences and mappings $innerValue = trim(substr ($value, 1, -1)); @@ -560,7 +641,7 @@ private function _toType($value) { $value = $this->_toType($value); return array($key => $value); } - + if ($first_character == '{' && $last_character == '}') { $innerValue = trim(substr ($value, 1, -1)); if ($innerValue === '') return array(); @@ -586,20 +667,17 @@ private function _toType($value) { if ( is_numeric($value) && preg_match ('/^(-|)[1-9]+[0-9]*$/', $value) ){ $intvalue = (int)$value; - if ($intvalue != PHP_INT_MAX) + if ($intvalue != PHP_INT_MAX && $intvalue != ~PHP_INT_MAX) $value = $intvalue; return $value; } - if (in_array($value, - array('true', 'on', '+', 'yes', 'y', 'True', 'TRUE', 'On', 'ON', 'YES', 'Yes', 'Y'))) { - return true; + if (is_numeric($value) && preg_match('/^0[xX][0-9a-fA-F]+$/', $value)) { + // Hexadecimal value. + return hexdec($value); } - if (in_array(strtolower($value), - array('false', 'off', '-', 'no', 'n'))) { - return false; - } + $this->coerceValue($value); if (is_numeric($value)) { if ($value === '0') return 0; @@ -607,7 +685,7 @@ private function _toType($value) { $value = (float)$value; return $value; } - + return $value; } @@ -625,6 +703,15 @@ private function _inlineEscape($inline) { $seqs = array(); $maps = array(); $saved_strings = array(); + $saved_empties = array(); + + // Check for empty strings + $regex = '/("")|(\'\')/'; + if (preg_match_all($regex,$inline,$strings)) { + $saved_empties = $strings[0]; + $inline = preg_replace($regex,'YAMLEmpty',$inline); + } + unset($regex); // Check for strings $regex = '/(?:(")|(?:\'))((?(1)[^"]+|[^\']+))(?(1)"|\')/'; @@ -634,6 +721,8 @@ private function _inlineEscape($inline) { } unset($regex); + // echo $inline; + $i = 0; do { @@ -653,7 +742,8 @@ private function _inlineEscape($inline) { } while (strpos ($inline, '[') !== false || strpos ($inline, '{') !== false); - $explode = explode(', ',$inline); + $explode = explode(',',$inline); + $explode = array_map('trim', $explode); $stringi = 0; $i = 0; while (1) { @@ -695,6 +785,17 @@ private function _inlineEscape($inline) { } } + + // Re-add the empties + if (!empty($saved_empties)) { + foreach ($explode as $key => $value) { + while (strpos($value,'YAMLEmpty') !== false) { + $explode[$key] = preg_replace('/YAMLEmpty/', '', $value, 1); + $value = $explode[$key]; + } + } + } + $finished = true; foreach ($explode as $key => $value) { if (strpos($value,'YAMLSeq') !== false) { @@ -706,14 +807,18 @@ private function _inlineEscape($inline) { if (strpos($value,'YAMLString') !== false) { $finished = false; break; } + if (strpos($value,'YAMLEmpty') !== false) { + $finished = false; break; + } } if ($finished) break; $i++; - if ($i > 10) + if ($i > 10) break; // Prevent infinite loops. } + return $explode; } @@ -738,7 +843,7 @@ private function referenceContentsByAlias ($alias) { private function addArrayInline ($array, $indent) { $CommonGroupPath = $this->path; if (empty ($array)) return false; - + foreach ($array as $k => $_) { $this->addArray(array($k => $_), $indent); $this->path = $CommonGroupPath; @@ -752,7 +857,7 @@ private function addArray ($incoming_data, $incoming_indent) { if (count ($incoming_data) > 1) return $this->addArrayInline ($incoming_data, $incoming_indent); - + $key = key ($incoming_data); $value = isset($incoming_data[$key]) ? $incoming_data[$key] : null; if ($key === '__!YAMLZero') $key = '0'; @@ -768,7 +873,7 @@ private function addArray ($incoming_data, $incoming_indent) { } - + $history = array(); // Unfolding inner array tree. $history[] = $_arr = $this->result; @@ -911,11 +1016,11 @@ private static function isEmpty ($line) { private function isArrayElement ($line) { - if (!$line) return false; - if ($line[0] != '-') return false; + if (!$line || !is_scalar($line)) return false; + if (substr($line, 0, 2) != '- ') return false; if (strlen ($line) > 3) if (substr($line,0,3) == '---') return false; - + return true; } @@ -939,7 +1044,7 @@ private static function unquote ($value) { } private function startsMappedSequence ($line) { - return ($line[0] == '-' && substr ($line, -1, 1) == ':'); + return (substr($line, 0, 2) == '- ' && substr ($line, -1, 1) == ':'); } private function returnMappedSequence ($line) { @@ -950,7 +1055,16 @@ private function returnMappedSequence ($line) { return array($array); } + private function checkKeysInValue($value) { + if (strchr('[{"\'', $value[0]) === false) { + if (strchr($value, ': ') !== false) { + throw new Exception('Too many keys: '.$value); + } + } + } + private function returnMappedValue ($line) { + $this->checkKeysInValue($line); $array = array(); $key = self::unquote (trim(substr($line,0,-1))); $array[$key] = ''; @@ -960,19 +1074,19 @@ private function returnMappedValue ($line) { private function startsMappedValue ($line) { return (substr ($line, -1, 1) == ':'); } - + private function isPlainArray ($line) { return ($line[0] == '[' && substr ($line, -1, 1) == ']'); } - + private function returnPlainArray ($line) { - return $this->_toType($line); - } + return $this->_toType($line); + } private function returnKeyValuePair ($line) { $array = array(); $key = ''; - if (strpos ($line, ':')) { + if (strpos ($line, ': ')) { // It's a key/value pair most likely // If the key is in double quotes pull it out if (($line[0] == '"' || $line[0] == "'") && preg_match('/^(["\'](.*)["\'](\s)*:)/',$line,$matches)) { @@ -980,10 +1094,10 @@ private function returnKeyValuePair ($line) { $key = $matches[2]; } else { // Do some guesswork as to the key and the value - $explode = explode(':',$line); - $key = trim($explode[0]); - array_shift($explode); - $value = trim(implode(':',$explode)); + $explode = explode(': ', $line); + $key = trim(array_shift($explode)); + $value = trim(implode(': ', $explode)); + $this->checkKeysInValue($value); } // Set the type of the value. Int, string, etc $value = $this->_toType($value); @@ -1002,12 +1116,15 @@ private function returnArrayElement ($line) { $array = array(); $value = trim(substr($line,1)); $value = $this->_toType($value); + if ($this->isArrayElement($value)) { + $value = $this->returnArrayElement($value); + } $array[] = $value; return $array; } - private function nodeContainsGroup ($line) { + private function nodeContainsGroup ($line) { $symbolsForReference = 'A-z0-9_\-'; if (strpos($line, '&') === false && strpos($line, '*') === false) return false; // Please die fast ;-) if ($line[0] == '&' && preg_match('/^(&['.$symbolsForReference.']+)/', $line, $matches)) return $matches[1]; @@ -1030,17 +1147,15 @@ private function stripGroup ($line, $group) { return $line; } } +} // Enable use of Spyc from command line -// The syntax is the following: php spyc.php spyc.yaml - -define ('SPYC_FROM_COMMAND_LINE', false); +// The syntax is the following: php Spyc.php spyc.yaml do { - if (!SPYC_FROM_COMMAND_LINE) break; + if (PHP_SAPI != 'cli') break; if (empty ($_SERVER['argc']) || $_SERVER['argc'] < 2) break; - if (empty ($_SERVER['PHP_SELF']) || $_SERVER['PHP_SELF'] != 'spyc.php') break; + if (empty ($_SERVER['PHP_SELF']) || FALSE === strpos ($_SERVER['PHP_SELF'], 'Spyc.php') ) break; $file = $argv[1]; - printf ("Spyc loading file: %s\n", $file); - print_r (spyc_load_file ($file)); -} while (0); \ No newline at end of file + echo json_encode (spyc_load_file ($file)); +} while (0); diff --git a/dkan/modules/contrib/data/data.info b/dkan/modules/contrib/data/data.info index 7cc78b7a4..9b4e0ccc4 100644 --- a/dkan/modules/contrib/data/data.info +++ b/dkan/modules/contrib/data/data.info @@ -11,9 +11,9 @@ files[] = tests/data.test files[] = tests/data.test.inc files[] = views/views_handler_field_data_markup.inc -; Information added by Drupal.org packaging script on 2016-05-26 -version = "7.x-1.0-alpha8+0-dev" +; Information added by Drupal.org packaging script on 2016-10-26 +version = "7.x-1.0-alpha8+1-dev" core = "7.x" project = "data" -datestamp = "1464294497" +datestamp = "1477465151" diff --git a/dkan/modules/contrib/data/data_entity/data_entity.admin.inc b/dkan/modules/contrib/data/data_entity/data_entity.admin.inc index 5c358c1ff..35725aeb0 100644 --- a/dkan/modules/contrib/data/data_entity/data_entity.admin.inc +++ b/dkan/modules/contrib/data/data_entity/data_entity.admin.inc @@ -21,7 +21,7 @@ function data_entity_admin_entity_type_form($form, &$form_state, $table) { $id_field_options = array(); foreach ($schema['fields'] as $field_name => $field) { - if (in_array($field['type'], array('serial','int'))) { + if (in_array($field['type'], array('serial', 'int'))) { $id_field_options[$field_name] = $field_name; } } @@ -179,7 +179,6 @@ function theme_data_entity_admin_entity_form($variables) { } function data_entity_admin_entity_form_submit($form, &$form_state) { - //dsm($form_state['values']); $table = $form_state['values']['table']; // Update meta data. diff --git a/dkan/modules/contrib/data/data_entity/data_entity.info b/dkan/modules/contrib/data/data_entity/data_entity.info index 5f62f3fb9..818484284 100644 --- a/dkan/modules/contrib/data/data_entity/data_entity.info +++ b/dkan/modules/contrib/data/data_entity/data_entity.info @@ -12,9 +12,9 @@ files[] = data_entity.entity.inc files[] = views/data_entity.views.inc files[] = views/data_entity_views_handler_field_edit_link.inc -; Information added by Drupal.org packaging script on 2016-05-26 -version = "7.x-1.0-alpha8+0-dev" +; Information added by Drupal.org packaging script on 2016-10-26 +version = "7.x-1.0-alpha8+1-dev" core = "7.x" project = "data" -datestamp = "1464294497" +datestamp = "1477465151" diff --git a/dkan/modules/contrib/data/data_entity/views/data_entity.views.inc b/dkan/modules/contrib/data/data_entity/views/data_entity.views.inc index aaff52e39..b4209c15a 100644 --- a/dkan/modules/contrib/data/data_entity/views/data_entity.views.inc +++ b/dkan/modules/contrib/data/data_entity/views/data_entity.views.inc @@ -20,7 +20,7 @@ function data_entity_views_data_alter(&$data) { ); // Support for Editable Views module. - if ($table->meta['is_entity_type']){ + if ($table->meta['is_entity_type']) { $data[$table_name]['table']['entity type'] = 'data_' . $table_name; } } diff --git a/dkan/modules/contrib/data/data_search/data_search.info b/dkan/modules/contrib/data/data_search/data_search.info index 693f82bad..7f5770460 100644 --- a/dkan/modules/contrib/data/data_search/data_search.info +++ b/dkan/modules/contrib/data/data_search/data_search.info @@ -5,9 +5,9 @@ dependencies[] = data dependencies[] = search core = 6.x -; Information added by Drupal.org packaging script on 2016-05-26 -version = "7.x-1.0-alpha8+0-dev" +; Information added by Drupal.org packaging script on 2016-10-26 +version = "7.x-1.0-alpha8+1-dev" core = "7.x" project = "data" -datestamp = "1464294497" +datestamp = "1477465151" diff --git a/dkan/modules/contrib/data/data_ui/data_ui.admin.inc b/dkan/modules/contrib/data/data_ui/data_ui.admin.inc index aaa15ed08..af46cca4f 100644 --- a/dkan/modules/contrib/data/data_ui/data_ui.admin.inc +++ b/dkan/modules/contrib/data/data_ui/data_ui.admin.inc @@ -43,7 +43,7 @@ function data_ui_manage() { $status = t('Default'); $operations[] = l(t('Override'), 'admin/structure/data/edit/' . $table->get('name')); } - else if ($table->get('export_type') == (EXPORT_IN_CODE | EXPORT_IN_DATABASE)) { + elseif ($table->get('export_type') == (EXPORT_IN_CODE | EXPORT_IN_DATABASE)) { $status = t('Overridden'); $operations[] = l(t('Edit'), 'admin/structure/data/edit/' . $table->get('name')); $operations[] = l(t('Revert'), 'admin/structure/data/revert/' . $table->get('name')); @@ -308,13 +308,13 @@ function data_ui_create_form($form, &$form_state) { $form['name'] = array( '#type' => 'textfield', '#title' => t('Table name'), - '#description' => t('Machine readable name of the table - e. g. "my_table". Must only contain lower case letters and _.'), + '#description' => t('Machine readable name of the table - e.g. "my_table". Must only contain lower case letters and _.'), '#required' => TRUE, ); $form['title'] = array( '#type' => 'textfield', '#title' => t('Table title'), - '#description' => t('Natural name of the table - e. g. "My Table".'), + '#description' => t('Natural name of the table - e.g. "My Table".'), '#required' => TRUE, ); $form['field_num'] = array( @@ -364,7 +364,7 @@ function data_ui_create_form_validate($form, &$form_state) { form_set_error('field_num', t('Enter a number greater than 0.')); } } - // Check for dupes. + // Check for duplicates. if (isset($form_state['values']['fields'])) { $names = array(); foreach ($form_state['values']['fields'] as $field) { @@ -682,7 +682,7 @@ function data_ui_edit_form_submit($form, &$form_state) { drupal_set_message(t('Deleted field !field_name', array('!field_name' => check_plain($field_name)))); } else { - drupal_set_message('You cannot delete all fields from a table, drop the table instead.', 'error'); + drupal_set_message(t('You cannot delete all fields from a table, drop the table instead.'), 'error'); } } } diff --git a/dkan/modules/contrib/data/data_ui/data_ui.info b/dkan/modules/contrib/data/data_ui/data_ui.info index 6164aa823..b4096632e 100644 --- a/dkan/modules/contrib/data/data_ui/data_ui.info +++ b/dkan/modules/contrib/data/data_ui/data_ui.info @@ -5,9 +5,9 @@ dependencies[] = data dependencies[] = schema core = 7.x -; Information added by Drupal.org packaging script on 2016-05-26 -version = "7.x-1.0-alpha8+0-dev" +; Information added by Drupal.org packaging script on 2016-10-26 +version = "7.x-1.0-alpha8+1-dev" core = "7.x" project = "data" -datestamp = "1464294497" +datestamp = "1477465151" diff --git a/dkan/modules/contrib/data/data_ui/tests/data_ui.test b/dkan/modules/contrib/data/data_ui/tests/data_ui.test index 2657aed11..ac4ce7be0 100644 --- a/dkan/modules/contrib/data/data_ui/tests/data_ui.test +++ b/dkan/modules/contrib/data/data_ui/tests/data_ui.test @@ -4,7 +4,7 @@ * Data UI tests. */ -require_once(drupal_get_path('module', 'data') .'/tests/data.test.inc'); +require_once(drupal_get_path('module', 'data') . '/tests/data.test.inc'); /** * Test basic Data API functionality. @@ -43,7 +43,7 @@ class DataTestCaseUI extends DataTestCase { public function testCRUDTable() { $table_name = $this->createTable(5); // @todo: edit table. - $this->drupalGet('admin/build/data/export/'. $table_name); + $this->drupalGet('admin/build/data/export/' . $table_name); $this->dropTable($table_name); } @@ -171,11 +171,11 @@ class DataTestCaseUI extends DataTestCase { $fields = $this->randomFields($num_fields); $edit = $this->formatEditFields($fields); $this->drupalPost(NULL, $edit, 'Create'); - $this->assertText('Created table '. $table_name); + $this->assertText('Created table ' . $table_name); // Test schema in DB. // @todo: why do we need to clear the cache here? - if ($schema = drupal_get_schema($table_name, true)) { + if ($schema = drupal_get_schema($table_name, TRUE)) { foreach ($schema['primary key'] as $key) { if (is_array($key)) { $primary_keys[] = $key[0]; @@ -203,7 +203,7 @@ class DataTestCaseUI extends DataTestCase { $this->fail('Could not create schema - invalid schema definition?'); } - $this->assertTrue(db_table_exists($table_name), 'Table '. $table_name .' exists in database.'); + $this->assertTrue(db_table_exists($table_name), 'Table ' . $table_name . ' exists in database.'); return $table_name; } @@ -212,11 +212,11 @@ class DataTestCaseUI extends DataTestCase { * Drop a table. */ protected function dropTable($table_name) { - $this->drupalPost('admin/build/data/drop/'. $table_name, array(), 'Drop'); + $this->drupalPost('admin/build/data/drop/' . $table_name, array(), 'Drop'); $exists = db_result(db_query('SELECT name FROM {data_tables} WHERE name = "%s"', $table_name)); $this->assertFalse($exists, 'Table removed from data_tables table.'); - $this->assertFalse(drupal_get_schema($table_name, true), 'Table '. $table_name .' removed from schema API.'); - $this->assertFalse(db_table_exists($table_name), 'Table '. $table_name .' removed from DB.'); + $this->assertFalse(drupal_get_schema($table_name, TRUE), 'Table ' . $table_name . ' removed from schema API.'); + $this->assertFalse(db_table_exists($table_name), 'Table ' . $table_name . ' removed from DB.'); } /** @@ -312,4 +312,4 @@ class DataTestCaseUI extends DataTestCase { $names[$name] = $name; return $name; } -} \ No newline at end of file +} diff --git a/dkan/modules/contrib/data/data_ui/tests/data_ui_test.info b/dkan/modules/contrib/data/data_ui/tests/data_ui_test.info index 1f82d2f57..584303aab 100644 --- a/dkan/modules/contrib/data/data_ui/tests/data_ui_test.info +++ b/dkan/modules/contrib/data/data_ui/tests/data_ui_test.info @@ -5,9 +5,9 @@ version = VERSION core = 7.x hidden = TRUE -; Information added by Drupal.org packaging script on 2016-05-26 -version = "7.x-1.0-alpha8+0-dev" +; Information added by Drupal.org packaging script on 2016-10-26 +version = "7.x-1.0-alpha8+1-dev" core = "7.x" project = "data" -datestamp = "1464294497" +datestamp = "1477465151" diff --git a/dkan/modules/contrib/data/tests/data.test b/dkan/modules/contrib/data/tests/data.test index 0989fc538..5ac7773d9 100644 --- a/dkan/modules/contrib/data/tests/data.test +++ b/dkan/modules/contrib/data/tests/data.test @@ -4,7 +4,7 @@ * Data module tests. */ -require_once(drupal_get_path('module', 'data') .'/tests/data.test.inc'); +require_once(drupal_get_path('module', 'data') . '/tests/data.test.inc'); /** * Test basic Data API functionality. @@ -40,7 +40,7 @@ class DataTestCaseAPI extends DataTestCase { return; } else { - $this->assertTrue(db_table_exists($table->get('name')), 'Created table '. $table->get('name')); + $this->assertTrue(db_table_exists($table->get('name')), 'Created table ' . $table->get('name')); $schema = drupal_get_schema($table->get('name')); $this->assertTrue(!empty($schema), 'Schema information is available.'); } @@ -86,7 +86,7 @@ class DataTestCaseAPI extends DataTestCase { // Create table and drop it again. $table = data_create_table($table_name, $this->testSchema()); - $this->assertTrue(!empty($table), 'Created table with same name '. $table_name); + $this->assertTrue(!empty($table), 'Created table with same name ' . $table_name); // Delete table. $table->drop($table_name); @@ -199,4 +199,4 @@ class DataTestCaseAPI extends DataTestCase { $this->assertTrue(empty($meta_before), "DataTable::link(): The meta is empty before executing it"); $this->assertTrue(!empty($meta_after), "DataTable::link(): The meta is not empty after executing it"); } -} \ No newline at end of file +} diff --git a/dkan/modules/contrib/entity_path/PATCHES.txt b/dkan/modules/contrib/entity_path/PATCHES.txt index 936343137..5e4e3c447 100644 --- a/dkan/modules/contrib/entity_path/PATCHES.txt +++ b/dkan/modules/contrib/entity_path/PATCHES.txt @@ -1,4 +1,4 @@ The following patches have been applied to this project: -- https://www.drupal.org/files/issues/entity-path-mysql-5-7_1.diff +- https://www.drupal.org/files/issues/entity-path-mysql-5-7_3.diff This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/entity_path/entity_path.install b/dkan/modules/contrib/entity_path/entity_path.install index b2a51582f..e50a9febc 100644 --- a/dkan/modules/contrib/entity_path/entity_path.install +++ b/dkan/modules/contrib/entity_path/entity_path.install @@ -113,7 +113,6 @@ function entity_path_update_7101() { * Updates cid for MySQL 5.7 compatibility. */ function entity_path_update_7102() { - db_drop_primary_key('cid'); $cid = array( 'type' => 'serial', 'unsigned' => TRUE, diff --git a/dkan/modules/contrib/fontyourface/PATCHES.txt b/dkan/modules/contrib/fontyourface/PATCHES.txt index 322b79933..fff17b3cd 100644 --- a/dkan/modules/contrib/fontyourface/PATCHES.txt +++ b/dkan/modules/contrib/fontyourface/PATCHES.txt @@ -2,5 +2,6 @@ The following patches have been applied to this project: - fontyourface-no-ajax-browse-view.patch - fontyourface-clear-css-cache.patch - https://www.drupal.org/files/issues/browse-fonts-page-uses-disabled-font-2644694.patch +- https://www.drupal.org/files/issues/font_your_face-remove_div_general_text_option-D7.patch This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/fontyourface_ui.module b/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/fontyourface_ui.module index 3fc8b3d88..b25ca3323 100644 --- a/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/fontyourface_ui.module +++ b/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/fontyourface_ui.module @@ -859,7 +859,7 @@ function fontyourface_ui_apply_by_selector_form($form, &$form_state) { 'h1' => 'h1', 'h2' => 'h2', 'h3' => 'h3', - 'p, div' => t('standard text') . ' (p, div)', + 'p' => t('standard text') . ' (p)', 'body' => t('everything') . ' (body)', ); diff --git a/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/add_form.js b/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/add_form.js index a8301d44a..5811335b2 100644 --- a/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/add_form.js +++ b/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/add_form.js @@ -31,7 +31,7 @@ var fontyourfaceSampleMarkup = ''; if (selector && selector.length > 0) { - var select = $('') .change(fontyourfaceCssSelectChange) .insertBefore(input); diff --git a/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/apply.js b/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/apply.js index b308988c7..265243482 100644 --- a/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/apply.js +++ b/dkan/modules/contrib/fontyourface/modules/fontyourface_ui/js/apply.js @@ -11,7 +11,7 @@ var input = $(this); var selector = input.val(); - var select = $('') + var select = $('') .change(fontyourfaceCssSelectChange) .insertBefore(input.parent()); diff --git a/dkan/modules/contrib/manualcrop/PATCHES.txt b/dkan/modules/contrib/manualcrop/PATCHES.txt new file mode 100644 index 000000000..3350d2bfe --- /dev/null +++ b/dkan/modules/contrib/manualcrop/PATCHES.txt @@ -0,0 +1,4 @@ +The following patches have been applied to this project: +- https://www.drupal.org/files/issues/multiple_versions-2504119-26.patch + +This file was automatically generated by Drush Make (http://drupal.org/project/drush). diff --git a/dkan/modules/contrib/manualcrop/README.txt b/dkan/modules/contrib/manualcrop/README.txt index 406c58ee4..f2876ef4d 100644 --- a/dkan/modules/contrib/manualcrop/README.txt +++ b/dkan/modules/contrib/manualcrop/README.txt @@ -20,15 +20,15 @@ Installation Start by downloading and installing the Libraries 2.x module. Next download and extract the imagesLoaded plugin, rename the extracted folder to -"jquery.imagesloaded" and place it under "sites/all/libraries". The plugin should -now be located at "sites/all/libraries/jquery.imagesloaded/jquery.imagesloaded.min.js". +"imagesloaded" and place it under "sites/all/libraries". The plugin should +now be located at "sites/all/libraries/imagesloaded/jquery.imagesloaded.min.js" Please note that the 3.x version can also be used, but it depends on jQuery 1.5 which can only be obtained by installing the jQuery Update module. Now download and extract the imgAreaSelect plugin, rename extracted folder to -"jquery.imgareaselect" and copy it into "sites/all/libraries". The plugin should -now be located at "sites/all/libraries/jquery.imgareaselect/scripts/jquery.imgareaselect.min.js". +"imgareaselect" and copy it into "sites/all/libraries". The plugin should +now be located at "sites/all/libraries/imgareaselect/jquery.imgareaselect.dev.js". When finished you can activate the module via the Modules page! diff --git a/dkan/modules/contrib/manualcrop/manualcrop.install b/dkan/modules/contrib/manualcrop/manualcrop.install index 02567b69c..2f8da7418 100644 --- a/dkan/modules/contrib/manualcrop/manualcrop.install +++ b/dkan/modules/contrib/manualcrop/manualcrop.install @@ -28,7 +28,7 @@ function manualcrop_requirements($phase) { $requirements[$name] = array( 'title' => $info['name'], 'value' => $t('Not installed'), - 'description' => $t('Download and copy the @name library to %path.', array( + 'description' => $info['error message'] . '
    ' . $t('Download and copy the @name library to %path.', array( '@link' => $info['vendor url'], '@name' => $info['name'], '%path' => 'sites/all/libraries/' . $name, diff --git a/dkan/modules/contrib/manualcrop/manualcrop.make.example b/dkan/modules/contrib/manualcrop/manualcrop.make.example index 696b388d2..15b573b9f 100644 --- a/dkan/modules/contrib/manualcrop/manualcrop.make.example +++ b/dkan/modules/contrib/manualcrop/manualcrop.make.example @@ -13,10 +13,10 @@ api = 2 ; imagesLoaded. libraries[jquery.imagesloaded][download][type] = file -libraries[jquery.imagesloaded][download][url] = https://github.com/desandro/imagesloaded/archive/v2.1.2.tar.gz -libraries[jquery.imagesloaded][download][subtree] = imagesloaded-2.1.2 +libraries[jquery.imagesloaded][download][url] = "https://github.com/desandro/imagesloaded/archive/v2.1.2.tar.gz" +libraries[jquery.imagesloaded][download][subtree] = "imagesloaded-2.1.2" ; imgAreaSelect. libraries[jquery.imgareaselect][download][type] = file -libraries[jquery.imgareaselect][download][url] = http://odyniec.net/projects/imgareaselect/jquery.imgareaselect-0.9.10.zip -libraries[jquery.imgareaselect][download][subtree] = jquery.imgareaselect-0.9.10 +libraries[jquery.imgareaselect][download][url] = "https://github.com/odyniec/imgareaselect/archive/v0.9.11-rc.1.tar.gz" +libraries[jquery.imgareaselect][download][subtree] = "imgareaselect-0.9.11-rc.1" diff --git a/dkan/modules/contrib/manualcrop/manualcrop.module b/dkan/modules/contrib/manualcrop/manualcrop.module index 3486c67bb..6a3dc2fc3 100644 --- a/dkan/modules/contrib/manualcrop/manualcrop.module +++ b/dkan/modules/contrib/manualcrop/manualcrop.module @@ -104,24 +104,51 @@ function manualcrop_libraries_info() { $libraries['jquery.imagesloaded'] = array( 'name' => 'imagesLoaded', - 'vendor url' => 'http://desandro.github.io/imagesloaded', + 'vendor url' => 'http://imagesloaded.desandro.com/', + 'version callback' => 'imagesloaded_get_version', 'version arguments' => array( - 'file' => 'jquery.imagesloaded.js', - 'pattern' => '# v([0-9\.]+)#', - 'lines' => 5, + 'pattern' => '#imagesLoaded.*v([0-9\.]+)#', + 'lines' => 3, 'cols' => 40, ), - 'files' => array( - 'js' => array( - 'jquery.imagesloaded.min.js', + 'versions' => array( + '2.1.2' => array( + 'files' => array( + 'js' => array( + 'jquery.imagesloaded.min.js', + ), + ), + 'variants' => array( + 'source' => array( + 'files' => array( + 'js' => array( + 'jquery.imagesloaded.js', + ), + ), + ), + ), ), - ), - 'variants' => array( - 'source' => array( + '3.1.5' => array( 'files' => array( 'js' => array( - 'jquery.imagesloaded.js', + 'imagesloaded.pkgd.min.js', + ), + ), + 'variants' => array( + 'packaged' => array( + 'files' => array( + 'js' => array( + 'imagesloaded.pkgd.js', + ), + ), ), + 'source' => array( + 'files' => array( + 'js' => array( + 'imagesloaded.js', + ), + ), + ), ), ), ), @@ -131,17 +158,21 @@ function manualcrop_libraries_info() { 'name' => 'imgAreaSelect', 'vendor url' => 'http://odyniec.net/projects/imgareaselect', 'version arguments' => array( - 'file' => 'scripts/jquery.imgareaselect.js', - 'pattern' => '#version ([0-9\.]+)#', - 'lines' => 10, - 'cols' => 20, + 'file' => 'imgareaselect.jquery.json', + 'pattern' => '#"version"[\t ]*:[\t ]*"([^"]+)"#', + 'lines' => 6, + 'cols' => 30, ), - 'files' => array( - 'js' => array( - 'scripts/jquery.imgareaselect.min.js', - ), - 'css' => array( - 'css/imgareaselect-animated.css', + 'versions' => array( + '0.9.11-rc.1' => array( + 'files' => array( + 'js' => array( + 'jquery.imgareaselect.dev.js', + ), + 'css' => array( + 'distfiles/css/imgareaselect-animated.css', + ), + ), ), ), 'variants' => array( @@ -171,6 +202,41 @@ function manualcrop_libraries_info() { return $libraries; } +/** + * Custom function to get imagesLoaded library version. + */ +function imagesloaded_get_version($library, $options) { + // Provide defaults. + $options += array( + 'pattern' => '', + 'lines' => 20, + 'cols' => 200, + ); + + // Get list of possible filenames. + $filenames = array( + 'jquery.imagesloaded.js', + 'imagesloaded.pkgd.min.js', + 'imagesloaded.pkgd.js', + 'imagesloaded.js', + ); + + foreach ($filenames as $filename) { + $file = DRUPAL_ROOT . '/' . $library['library path'] . '/' . $filename; + if (file_exists($file)) { + $file = fopen($file, 'r'); + while ($options['lines'] && $line = fgets($file, $options['cols'])) { + if (preg_match($options['pattern'], $line, $version)) { + fclose($file); + return $version[1]; + } + $options['lines']--; + } + fclose($file); + } + } +} + /** * Implements hook_file_type_delete(). */ diff --git a/dkan/modules/contrib/open_data_schema_map/README.md b/dkan/modules/contrib/open_data_schema_map/README.md index 0851c6c6d..8e273919c 100644 --- a/dkan/modules/contrib/open_data_schema_map/README.md +++ b/dkan/modules/contrib/open_data_schema_map/README.md @@ -1,15 +1,13 @@ -**DEPRECATED BRANCH** - -Please note that the master branch of this module, which was the default branch for the first two years of its life, has been abandonded in favor of the 7.x-1.x brach, as we move into a noral release cycle for it. No further commits will be made or merged to this branch. Please update any makefiles that point to it; future releases of DKAN will point to specific versions. - [![Circle CI](https://circleci.com/gh/NuCivic/open_data_schema_map.svg?style=svg)](https://circleci.com/gh/NuCivic/open_data_schema_map) Open Data Schema Map ==================== -This module provides a flexible way to expose your Drupal content via APIs following specific Open Data schemas. Currently, the [CKAN](http://docs.ckan.org/en/ckan-1.8/domain-model-dataset.html) and [Project Open Data schemas](http://project-open-data.github.io/schema/) are provided, but new schemas can be easily added through your own modules. A user interface is in place to create endpoints and map fields from the chosen schema to Drupal content using tokens. +This module provides a flexible way to expose your Drupal content via APIs following specific Open Data schemas. Currently, the [CKAN](http://docs.ckan.org/en/ckan-1.8/domain-model-dataset.html), [Project Open Data](http://project-open-data.github.io/schema/) and [DCAT-AP](https://joinup.ec.europa.eu/asset/dcat_application_profile/description) schemas are provided, but new schemas can be easily added through your own modules. A user interface is in place to create endpoints and map fields from the chosen schema to Drupal content using tokens. + +This module was developed as part of the DKAN project, but will work on an Drupal 7 site. A [separate module exists for DKAN-specific implementation](https://github.com/NuCivic/open_data_schema_map_dkan). -DKAN-specific implementation: https://github.com/NuCivic/open_data_schema_map_dkan +Note that serious performance issues can result if you do not follow recommendations in the [ODSM File Cache section](#the-odsm-file-cache). ## Basic concepts @@ -54,19 +52,19 @@ The results of the API call can be filtered by a particular field via arguments ### Field Mapping -The API form presents you with a field for each field in your schema. Map the fields using Drupal's token system. Note: using more than one token in a single field may produce unexpected results and is not recommended. +The API form presents you with a field for each field in your schema. Map the fields using Drupal's token system. Note: using more than one token in a single field may produce unexpected results and is not recommended. #### Multi-value fields For Drupal multi-value entity reference fields, the schema can use an array to instruct the API to iterate over each value and map the referenced data to multiple schema fields. For instance, in the CKAN schema, tags are described like this in schema_ckan.json: -``` +``` "tags": { "title":"Tags", "description":"", "anyOf": [ { - "type": "array", + "type": "array", "items": { "type": "object", "properties": { @@ -119,7 +117,7 @@ We've isolated xml output into its own module. A few reasons why: + It relies on a composer dependency + This module is distributed with dkan, a drupal installation profile, and we don't have a way of installing composer dependencies while building the distro with ```drush make``` -+ We don't want to force all this trouble on users that just want ***json output*** ++ We don't want to force all this trouble on users that just want ***json output*** Because of all this, if you still want to use xml output for your odsm endpoints (we don't judge), you need to: @@ -143,40 +141,44 @@ If you need instructions to install composer globally in your system please refe Date formats can be chanaged manually by changing the "Medium" date time format in "admin/config/regional/date-time" or in code by using one of the alter hooks: ![screen shot 2014-09-04 at 11 15 01 am](https://cloud.githubusercontent.com/assets/512243/4152408/a9cb06b2-344e-11e4-84c8-c2174b5fc566.png) -## Drush +## A Note on XML Output -### odsm-filecache -#### Use: -The Open Data Schema Map module now defines a drush command called `odsm-filecache`. This command takes as its argument the machine name for an ODSM endpoint. For example: +Open Data Schema Map provides an XML output format. This is provided via a separate submodule in the `modules/` folder for historical reasons, but should be refactored into the main ODSM module in a future release. -``` -drush odsm-filecache data_json_1_1; -``` +XML endpoints still require a _schema_ defined in JSON. Defining your own XML endpoint may be less than intuitive for the time beind, but take a look at the [DCAT schema module](https://github.com/NuCivic/open_data_schema_map/tree/master/modules/open_data_schema_dcat) for a model. -The above command triggers the processing for the endpoint defined for the data_json_1_1 ODSM API and results in the following cached file being generated on completion: +## The ODSM File Cache -``` -public://odsm_cache_data_json_1_1 -``` +Open Data Schema Map endpoints that list a large number of entities -- Project Open Data (`data.json`), the CKAN Package List (`/api/3/action/package_list`) and DCAT-AP Catalog (`catalog.xml`) -- perform a full entity load for each record listed in order to perform the token replacements. This can cause a major performance hit each time any of these URLs is hit on a site with more than a few dozen datasets, and on a site with thousands the response time can be two minutes or more. -The command `odsm-filecache` is a direct callback to `open_data_schema_map_file_cache_endpoint` which wraps ` open_data_schema_map_render_api` with some logic for dumping output to a file. +Open Data Schema Map includes a file caching function to save a snapshot of any endpoint as a static file to be served up quickly, with very few hits to the database. -In order to enable the cached version of an API endpoint you need to run the command above replacing `data_json_1_1` with -the machine name of the ODSM endpoint to be cached. +File caches at present can only be generated by a Drush command. The recommended usage on a production website is to set up a cron job or use a task runner like [Jenkins](https://jenkins.io/) to regenerate the file caches for your performance-intensive endpoints daily, at whatever time your site experiences the least amount of traffic. The trade-off of course is that any additions or changes to your site will not be reflected on these endpoints until they are regenerated. -In order to update this cache you need to re-run the command that generated it. +An administrative UI to regenerate a file cache manually may be included in a future release. -We recommend you set up a cron job to run the command on a regular schedule, perhaps in sync with your data harvesting schedule. +### Use -## Contributing +The Drush command supplied by Open Data Schema Map is `odsm-filecache` (also available simply as the alias `odsmfc`). This command takes as its argument the machine name for an ODSM endpoint. For example: -We are accepting issues in the dkan issue thread only -> https://github.com/NuCivic/dkan/issues -> Please label your issue as **"component: open_data_schema_map"** after submitting so we can identify problems and feature requests faster. +``` +drush odsm-filecache data_json_1_1 +``` -If you can, please cross-reference commits in this repo to the corresponding issue in the dkan issue thread. You can do that easily adding this text: +This will render the full `data_json_1_1` endpoint (which is the `data.json` implementation that ships with DKAN) to the filesystem, saving it to: ``` -NuCivic/dkan#issue_id -``` +public://odsm_cache_data_json_1_1 +``` + +Now a hit to `/data.json` will be routed to this file, which in most cases will actually live at `/sites/default/files/odsm_cache_data_json_1_1`. + +## Schema Validation + +Both the Project Open Data and DCAT-AP schemas ship with validation tools you can access from the Drupal admin menu. More documentation on this feature coming soon... + +## Community -to any commit message or comment replacing **issue_id** with the corresponding issue id. +We are accepting issues for Open Data Schema Map in the [DKAN issue queue](https://github.com/NuCivic/dkan/issues) only. Please label your issue as **"Component: ODSM"** after submitting so we can identify problems and feature requests faster. +If submitting a pull request to this project, please try to link your PR to the corresponding issue in the DKAN issue thread. \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/autoload.php b/dkan/modules/contrib/open_data_schema_map/autoload.php similarity index 67% rename from dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/autoload.php rename to dkan/modules/contrib/open_data_schema_map/autoload.php index 6c8f3c303..6c08e1850 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/autoload.php +++ b/dkan/modules/contrib/open_data_schema_map/autoload.php @@ -2,6 +2,6 @@ // autoload.php @generated by Composer -require_once __DIR__ . '/composer' . '/autoload_real.php'; +require_once __DIR__ . '/autoload' . '/autoload_real.php'; return ComposerAutoloaderInit775b31f43d75f28d0fc5be013aa427a5::getLoader(); diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/ClassLoader.php b/dkan/modules/contrib/open_data_schema_map/autoload/ClassLoader.php similarity index 100% rename from dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/ClassLoader.php rename to dkan/modules/contrib/open_data_schema_map/autoload/ClassLoader.php diff --git a/dkan/modules/contrib/open_data_schema_map/autoload/autoload_classmap.php b/dkan/modules/contrib/open_data_schema_map/autoload/autoload_classmap.php new file mode 100644 index 000000000..a17f542f4 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/autoload/autoload_classmap.php @@ -0,0 +1,20 @@ + array($vendorDir), +); diff --git a/dkan/modules/contrib/open_data_schema_map/autoload/autoload_psr4.php b/dkan/modules/contrib/open_data_schema_map/autoload/autoload_psr4.php new file mode 100644 index 000000000..fa983f92f --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/autoload/autoload_psr4.php @@ -0,0 +1,22 @@ + array($library_path), +); diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_real.php b/dkan/modules/contrib/open_data_schema_map/autoload/autoload_real.php similarity index 100% rename from dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/autoload_real.php rename to dkan/modules/contrib/open_data_schema_map/autoload/autoload_real.php diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_ckan/open_data_schema_ckan.info b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_ckan/open_data_schema_ckan.info index c94630689..99f403d6f 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_ckan/open_data_schema_ckan.info +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_ckan/open_data_schema_ckan.info @@ -2,7 +2,7 @@ name = CKAN Schema description = Provides CKAN Schema for Open Data Schema Map. core = 7.x package = Open Data -version = 7.x-1.x +version = 7.x-1.12.11 dependencies[] = features dependencies[] = open_data_schema_map dependencies[] = pathauto diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/README.md b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/README.md new file mode 100644 index 000000000..9b5adc6f6 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/README.md @@ -0,0 +1,10 @@ +# Open Data Schema Map: DCAT-AP + +Schema module to provide endpoints for [DCAT-AP, the DCAT Application profile for data portals in Europe](https://joinup.ec.europa.eu/asset/dcat_application_profile/asset_release/dcat-ap-v11). The schema provided is in JSON but includes XML prefixes, and is indended primarily for output to XML/RDF. + +Two schemas are actually provided: + +* **DCAT Catalog:** Can be used to create an entire data catalog, usually in XML format and exposed at `/catalog.xml`. +* **DCAT Dataset**: Schema for providing a single-dataset endpoint + +[DKAN's implementation](https://github.com/NuCivic/open_data_schema_map_dkan) adds meta links in page headers to catalog.xml, and links in each dataset page (as well as header links) to the dataset-specific endpoints. diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/dataset-1.1.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/dataset-1.1.json new file mode 100644 index 000000000..02201c9d9 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/dataset-1.1.json @@ -0,0 +1,216 @@ + { + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "http://jsonschema.net", + "type": "object", + "title": "European Data Portal DKAN Schema", + "description": "European Data Portal DKAN Schema - Based on DCAT-AP Draft 5", + "title": "DCAT", + "properties": { + "@rdf:about": { + "id": "http://jsonschema.net/@rdf:about", + "type": "string", + "title": "rdf:about" + }, + "dct:title": { + "id": "http://jsonschema.net/dct:title", + "type": "string", + "title": "title" + }, + "dct:description": { + "id": "http://jsonschema.net/dct:description", + "type": "string", + "title": "description" + }, + "dcat:keyword": { + "id": "http://jsonschema.net/dcat:keyword", + "type": "array", + "title": "dcat:keyword", + "items": { + "id": "http://jsonschema.net/tags/0", + "type": "object", + "title": "item", + "properties": { + "title": { + "id": "http://jsonschema.net/tags/0/title", + "type": "string", + "title": "title" + } + } + } + }, + "dcat:theme": { + "id": "http://jsonschema.net/dcat:theme", + "type": "string", + "title": "theme" + }, + "dct:identifier": { + "id": "http://jsonschema.net/dct:identifier", + "type": "string", + "title": "identifier" + }, + "dct:issued": { + "id": "http://jsonschema.net/dct:issued", + "type": "string", + "title": "issued" + }, + "dct:modified": { + "id": "http://jsonschema.net/dct:modified", + "type": "string", + "title": "modified" + }, + "owl:versionInfo": { + "id": "http://jsonschema.net/owl:versionInfo", + "type": "string", + "title": "versionInfo" + }, + "adms:versionNotes": { + "id": "http://jsonschema.net/adms:versionNotes", + "type": "string", + "title": "versionNotes" + }, + "dct:language": { + "id": "http://jsonschema.net/dct:language", + "type": "array", + "title": "language", + "items": { + "type": "string" + } + }, + "dcat:landingPage": { + "id": "http://jsonschema.net/dcat:landingPage", + "type": "string", + "title": "landingPage" + }, + "dct:accrualPeriodicity": { + "id": "http://jsonschema.net/dct:accrualPeriodicity", + "type": "string", + "title": "accrualPeriodicity" + }, + "dct:conformsTo": { + "id": "http://jsonschema.net/dct:conformsTo", + "type": "array", + "title": "conformsTo", + "items": { + "type": "string" + } + }, + "dct:accessRights": { + "id": "http://jsonschema.net/dct:accessRights", + "type": "string", + "title": "accessRights" + }, + "dct:provenance": { + "id": "http://jsonschema.net/dct:provenance", + "type": "string", + "title": "Provenance" + }, + "dct:type": { + "id": "http://jsonschema.net/dct:type", + "type": "string", + "title": "Type" + }, + "dct:hasVersion": { + "id": "http://jsonschema.net/dct:hasVersion", + "type": "array", + "title": "hasVersion", + "items": { + "type": "string" + } + }, + "dct:isVersionOf": { + "id": "http://jsonschema.net/dct:isVersionOf", + "type": "array", + "title": "VersionOf", + "items": { + "type": "string" + } + }, + "dct:source": { + "id": "http://jsonschema.net/dct:source", + "type": "array", + "title": "Source", + "items": { + "type": "string" + } + }, + "adms:sample": { + "id": "http://jsonschema.net/adms:sample", + "type": "array", + "title": "Sample", + "items": { + "type": "string" + } + }, + "dct:spatial": { + "id": "http://jsonschema.net/dct:spatial", + "type": "string", + "title": "Spatial" + }, + "dct:temporal": { + "id": "http://jsonschema.net/dct:temporal", + "title": "Temporal", + "anyOf": [ + { + "type": "array", + "items": { + "id": "http://jsonschema.net/dct:temporal/0", + "type": "object", + "title": "item", + "properties": { + "schema:startDate": { + "id": "http://jsonschema.net/dct:temporal/0/startDate", + "type": "string", + "title": "start Date" + }, + "schema:endDate": { + "id": "http://jsonschema.net/dct:temporal/0/endDate", + "type": "string", + "title": "End Date" + } + } + } + } + ] + }, + "dct:publisher": { + "id": "http://jsonschema.net/dct:publisher", + "type": "string", + "title": "Publisher" + }, + "dcat:contactPoint": { + "title": "ContactPoint", + "anyOf": [ + { + "type": "array", + "id": "http://jsonschema.net/dcat:contactPoint", + "items": { + "$ref": "vcard.json", + "minItems": 1, + "uniqueItems": true + } + } + ] + }, + "dcat:Distribution": { + "title": "Distribution", + "description": "A container for the array of Distribution objects", + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "distribution.json", + "minItems": 1, + "uniqueItems": true + } + }, + { + "type": "null" + }, + { + "type": "string", + "pattern": "^(\\[\\[REDACTED).*?(\\]\\])$" + } + ] + } + } + } diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/dcatap-1.1.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/dcatap-1.1.json new file mode 100644 index 000000000..02201c9d9 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/dcatap-1.1.json @@ -0,0 +1,216 @@ + { + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "http://jsonschema.net", + "type": "object", + "title": "European Data Portal DKAN Schema", + "description": "European Data Portal DKAN Schema - Based on DCAT-AP Draft 5", + "title": "DCAT", + "properties": { + "@rdf:about": { + "id": "http://jsonschema.net/@rdf:about", + "type": "string", + "title": "rdf:about" + }, + "dct:title": { + "id": "http://jsonschema.net/dct:title", + "type": "string", + "title": "title" + }, + "dct:description": { + "id": "http://jsonschema.net/dct:description", + "type": "string", + "title": "description" + }, + "dcat:keyword": { + "id": "http://jsonschema.net/dcat:keyword", + "type": "array", + "title": "dcat:keyword", + "items": { + "id": "http://jsonschema.net/tags/0", + "type": "object", + "title": "item", + "properties": { + "title": { + "id": "http://jsonschema.net/tags/0/title", + "type": "string", + "title": "title" + } + } + } + }, + "dcat:theme": { + "id": "http://jsonschema.net/dcat:theme", + "type": "string", + "title": "theme" + }, + "dct:identifier": { + "id": "http://jsonschema.net/dct:identifier", + "type": "string", + "title": "identifier" + }, + "dct:issued": { + "id": "http://jsonschema.net/dct:issued", + "type": "string", + "title": "issued" + }, + "dct:modified": { + "id": "http://jsonschema.net/dct:modified", + "type": "string", + "title": "modified" + }, + "owl:versionInfo": { + "id": "http://jsonschema.net/owl:versionInfo", + "type": "string", + "title": "versionInfo" + }, + "adms:versionNotes": { + "id": "http://jsonschema.net/adms:versionNotes", + "type": "string", + "title": "versionNotes" + }, + "dct:language": { + "id": "http://jsonschema.net/dct:language", + "type": "array", + "title": "language", + "items": { + "type": "string" + } + }, + "dcat:landingPage": { + "id": "http://jsonschema.net/dcat:landingPage", + "type": "string", + "title": "landingPage" + }, + "dct:accrualPeriodicity": { + "id": "http://jsonschema.net/dct:accrualPeriodicity", + "type": "string", + "title": "accrualPeriodicity" + }, + "dct:conformsTo": { + "id": "http://jsonschema.net/dct:conformsTo", + "type": "array", + "title": "conformsTo", + "items": { + "type": "string" + } + }, + "dct:accessRights": { + "id": "http://jsonschema.net/dct:accessRights", + "type": "string", + "title": "accessRights" + }, + "dct:provenance": { + "id": "http://jsonschema.net/dct:provenance", + "type": "string", + "title": "Provenance" + }, + "dct:type": { + "id": "http://jsonschema.net/dct:type", + "type": "string", + "title": "Type" + }, + "dct:hasVersion": { + "id": "http://jsonschema.net/dct:hasVersion", + "type": "array", + "title": "hasVersion", + "items": { + "type": "string" + } + }, + "dct:isVersionOf": { + "id": "http://jsonschema.net/dct:isVersionOf", + "type": "array", + "title": "VersionOf", + "items": { + "type": "string" + } + }, + "dct:source": { + "id": "http://jsonschema.net/dct:source", + "type": "array", + "title": "Source", + "items": { + "type": "string" + } + }, + "adms:sample": { + "id": "http://jsonschema.net/adms:sample", + "type": "array", + "title": "Sample", + "items": { + "type": "string" + } + }, + "dct:spatial": { + "id": "http://jsonschema.net/dct:spatial", + "type": "string", + "title": "Spatial" + }, + "dct:temporal": { + "id": "http://jsonschema.net/dct:temporal", + "title": "Temporal", + "anyOf": [ + { + "type": "array", + "items": { + "id": "http://jsonschema.net/dct:temporal/0", + "type": "object", + "title": "item", + "properties": { + "schema:startDate": { + "id": "http://jsonschema.net/dct:temporal/0/startDate", + "type": "string", + "title": "start Date" + }, + "schema:endDate": { + "id": "http://jsonschema.net/dct:temporal/0/endDate", + "type": "string", + "title": "End Date" + } + } + } + } + ] + }, + "dct:publisher": { + "id": "http://jsonschema.net/dct:publisher", + "type": "string", + "title": "Publisher" + }, + "dcat:contactPoint": { + "title": "ContactPoint", + "anyOf": [ + { + "type": "array", + "id": "http://jsonschema.net/dcat:contactPoint", + "items": { + "$ref": "vcard.json", + "minItems": 1, + "uniqueItems": true + } + } + ] + }, + "dcat:Distribution": { + "title": "Distribution", + "description": "A container for the array of Distribution objects", + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "distribution.json", + "minItems": 1, + "uniqueItems": true + } + }, + { + "type": "null" + }, + { + "type": "string", + "pattern": "^(\\[\\[REDACTED).*?(\\]\\])$" + } + ] + } + } + } diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/distribution.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/distribution.json new file mode 100644 index 000000000..2d70e5586 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/distribution.json @@ -0,0 +1,73 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "http://jsonschema.net/dcat:Distribution", + "type": "object", + "title": "resources", + "properties": { + "dct:title": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:title", + "type": "string", + "title": "Title" + }, + "dct:description": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:description", + "type": "string", + "title": "Description" + }, + "dct:issued": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:issued", + "type": "string", + "title": "Issued" + }, + "dct:modified": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:modified", + "type": "string", + "title": "Modified" + }, + "dct:license": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:locense", + "type": "string", + "title": "License" + }, + "dct:rights": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:rights", + "type": "string", + "title": "Rights" + }, + "dcat:accessURL": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:accessURL", + "type": "string", + "title": "accessURL" + }, + "dcat:downloadURL": { + "id": "http://jsonschema.net/dcat:Distribution/0/dcat:downloadURL", + "type": "string", + "title": "DownloadURL" + }, + "dcat:mediaType": { + "id": "http://jsonschema.net/dcat:Distribution/0/dcat:mediaType", + "type": "string", + "title": "mediaType" + }, + "dct:format": { + "id": "http://jsonschema.net/dcat:Distribution/0/dct:format", + "type": "string", + "title": "Format" + }, + "dcat:byteSize": { + "id": "http://jsonschema.net/dcat:Distribution/0/dcat:byteSize", + "type": "string", + "title": "byteSize" + }, + "foaf:page": { + "id": "http://jsonschema.net/foaf:page", + "type": "array", + "title": "foaf page", + "items": { + "type": "string" + } + } + } +} + + diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/vcard.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/vcard.json new file mode 100644 index 000000000..a98bd28fc --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/data/vcard.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "http://jsonschema.net/vcard", + "type": "object", + "title": "vcard", + "properties": { + "vcard:fn": { + "id": "http://jsonschema.net/dcat:Distribution/0/vcard:fn", + "type": "string", + "title": "Name" + }, + "vcard:hasTelephone": { + "id": "http://jsonschema.net/dcat:Distribution/0/vcard:hasTelephone", + "type": "string", + "title": "Telephone" + }, + "vcard:hasEmail": { + "id": "http://jsonschema.net/dcat:Distribution/0/vcard:hasEmail", + "type": "string", + "title": "Email" + }, + "vcard:hasURL": { + "id": "http://jsonschema.net/dcat:Distribution/0/vcard:hasURL", + "type": "string", + "title": "URL" + } + } +} + + diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/dcatValidator.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/dcatValidator.php new file mode 100644 index 000000000..10e31d897 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/dcatValidator.php @@ -0,0 +1,94 @@ +url = $url; + $this->errors = array(); + } + + public function getDataRDF() + { + if (!isset($this->dataset)) { + $this->dataset = array(); + $data = json_decode(file_get_contents($this->url)); + + $this->dataRDF = $data; + + foreach($this->dataRDF as $dataset) { + $this->dataset[$dataset->{"dct:identifier"}] = $dataset; + } + } + } + + public function getDataset($id) + { + return $this->dataset[$id]; + } + + public function getIdentifiers() + { + $this->identifers = array(); + $data = $this->dataRDF; + foreach ($data as $dataset) { + $this->identifiers[] = $dataset->{"dct:identifier"}; + } + } + + public function process($id) { + $retriever = new UriRetriever; + $schemaFolder = DRUPAL_ROOT . '/' . drupal_get_path('module', 'open_data_schema_dcat') . '/data'; + $schema = $retriever->retrieve('file://' . $schemaFolder . '/distribution.json'); + $data = $this->getDataset($id); + + RefResolver::$maxDepth = 10; + $refResolver = new RefResolver($retriever); + $refResolver->resolve($schema, 'file://' . $schemaFolder . '/'); + $validator = new Validator(); + $validator->check($data, $schema); + return $validator; + } + + public function datasetCount() + { + $this->getDataRDF(); + return count($this->dataset); + } + + public function processAll() { + $this->getDataRDF(); + $retriever = new UriRetriever; + $this->getIdentifiers(); + $this->validated = array(); + foreach ($this->identifiers as $id) { + $validator = $this->process($id); + + if ($validator->isValid()) { + } + else { + foreach ($validator->getErrors() as $error) { + $this->errors[] = array('id' => $id, 'property' => $error['property'], 'error' => $error['message']); + } + } + } + } + + public function getErrors() { + return $this->errors; + } +} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.info b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.info new file mode 100644 index 000000000..d71f77f4d --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.info @@ -0,0 +1,9 @@ +name = DCAT Schema +description = Provides DCAT Schema for Open Data Schema Map. +core = 7.x +package = Open Data +version = 7.x-1.12.11 +dependencies[] = features +dependencies[] = open_data_schema_map +dependencies[] = open_data_schema_map_xml_output +dependencies[] = pathauto diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.module b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.module new file mode 100644 index 000000000..0a32caaca --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.module @@ -0,0 +1,233 @@ + 'DCAT validation', + 'name' => 'dcat', + 'page callback' => 'open_data_schema_dcat_validation_page', + 'file' => 'open_data_schema_dcat.pages.inc', + 'file path' => drupal_get_path('module', 'open_data_schema_dcat'), + ); +} + +/** + * Implements hook_open_data_schema(). + */ +function open_data_schema_dcat_open_data_schema() { + $schemas_path = DRUPAL_ROOT . '/' . drupal_get_path('module', 'open_data_schema_dcat') . '/data/'; + return array( + array( + 'short_name' => 'dcat', + 'title' => 'DCAT-AP', + 'schema_file' => $schemas_path . 'dcatap-1.1.json', + 'description' => t('DCAT Schema. See https://gitlab.com/european-data-portal/ckan-dcatap-schema/blob/master/ckan-dcatap-1.1.json for more awesome details.'), + ), + array( + 'short_name' => 'dcat_dataset', + 'title' => 'DCAT-AP (Dataset)', + 'schema_file' => $schemas_path . 'dataset-1.1.json', + 'description' => t('DCAT Schema (Dataset). See https://gitlab.com/european-data-portal/ckan-dcatap-schema/blob/master/ckan-dcatap-1.1.json for more awesome details.'), + ), + ); +} + +/** + * Implements hook_open_data_schema_fill_references(). + */ +function open_data_schema_dcat_open_data_schema_fill_references($schema_name, &$schema) { + $module_path = DRUPAL_ROOT . '/' . drupal_get_path('module', 'open_data_schema_dcat'); + switch ($schema_name) { + case 'dcat': + case 'dcat_dataset': + $references = array( + 'dcat:Distribution', + 'dcat:contactPoint', + ); + $files = array(); + // Process $ref keys to include referenced json file. + foreach ($references as $key) { + $json = $module_path . '/data/'; + if (isset($schema['properties'][$key]['anyOf'])) { + $json = $json . $schema['properties'][$key]['anyOf'][0]['items']['$ref']; + } + elseif(isset($schema['properties'][$key]['$ref'])) { + $json = $json . $schema['properties'][$key]['$ref']; + } + $json = file_get_contents($json); + $json = drupal_json_decode($json); + unset($json['$schema']); + unset($json['id']); + if (isset($schema['properties'][$key]['anyOf'])) { + unset($json['title']); + unset($schema['properties'][$key]['anyOf'][0]['items']['$ref']); + if (isset($schema['properties'][$key]['anyOf'][0]['items']['minItems'])) { + $schema['properties'][$key]['anyOf'][0]['minItems'] = $schema['properties'][$key]['anyOf'][0]['items']['minItems']; + } + if ($schema['properties'][$key]['anyOf'][0]['items']['uniqueItems']) { + $schema['properties'][$key]['anyOf'][0]['uniqueItems'] = $schema['properties'][$key]['anyOf'][0]['items']['uniqueItems']; + } + $schema['properties'][$key]['anyOf'][0]['uniqueItems'] = $schema['properties'][$key]['anyOf'][0]['items']['uniqueItems']; + $schema['properties'][$key]['anyOf'][0]['items'] = $json; + } + else { + $schema['properties'][$key] = $json; + } + } + break; + } +} + +/** + * Implements hook_open_data_schema_map_xml_output_render_data_alter(). + */ +function open_data_schema_dcat_open_data_schema_map_xml_output_render_data_alter(&$xml, &$api) { + global $base_url; + + //If is dcat schema then add attributes on the xml root + if ($api->api_schema == 'dcat' || $api->api_schema == 'dcat_dataset') { + $xml['@xmlns:foaf'] = "http://xmlns.com/foaf/0.1/"; + $xml['@xmlns:owl'] = "http://www.w3.org/2002/07/owl#"; + $xml['@xmlns:rdfs'] = "http://www.w3.org/2000/01/rdf-schema#"; + $xml['@xmlns:rdf'] = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; + $xml['@xmlns:dcat'] = "http://www.w3.org/ns/dcat#"; + $xml['@xmlns:dct'] = "http://purl.org/dc/terms/"; + $xml['@xmlns:adms'] = "http://www.w3.org/ns/adms#"; + $xml['@xmlns:dc'] = "http://purl.org/dc/elements/1.1/"; + $xml['@xmlns:time'] = "http://www.w3.org/2006/time#"; + $xml['@xmlns:dcterms'] = "http://purl.org/dc/terms/"; + $xml['@xmlns:vcard'] = "http://www.w3.org/2006/vcard/ns#"; + + //Fix some data output (datetimes format, ...). + if (!empty($xml['dcat:Dataset'])) { + foreach ($xml['dcat:Dataset'] as &$dataset) { + if (isset($dataset['dct:temporal'])) { + $dataset['dct:temporal'][0]['schema:startDate']['@rdf:datatype'] = 'http://www.w3.org/2001/XMLSchema#date'; + $dataset['dct:temporal'][0]['schema:endDate']['@rdf:datatype'] = 'http://www.w3.org/2001/XMLSchema#date'; + $dataset['dct:temporal']['dct:PeriodOfTime'] = $dataset['dct:temporal']; + unset ($dataset['dct:temporal']); + } + } + } + + if ($api->api_schema == 'dcat') { + //Add catalog information + $catalog = array( + 'dct:title' => variable_get('site_name', t('Dataset')), + 'dct:description' => variable_get('site_slogan', t('Description')), + 'dcterms:publisher' => array('@rdf:nodeID' => "_n0"), + 'foaf:homepage' => $base_url . '/search/type/dataset', + 'rdf:type' => array('@rdf:resource' => 'http://www.w3.org/ns/dcat#Dataset'), + ); + + $publisher = array( + 'rdf:Description' => array('@rdf:nodeID' => '_n0', 'foaf:name' => 'DKAN', 'rdf:type' => array('@rdf:resource' => 'http://xmlns.com/foaf/0.1/Agent')) + ); + + $xml = array('dcat:Catalog' => $catalog) + $xml + $publisher; + } + } +} + +/** + * Implements hook_page_alter(). + */ +function open_data_schema_dcat_page_alter(&$page) { + + //If is the homepage then add the alternative url for catalog.xml + if (drupal_is_front_page()) { + drupal_add_html_head_link(array('rel' => 'alternate', 'type' => 'application/rdf+xml', 'href' => url('catalog.xml', array('absolute' => TRUE)))); + } + + //If is a dataset node add the link with filter for the specific dataset + $node = menu_get_object(); + + if (is_object($node) && $node->type == 'dataset') { + $uuid = $node->uuid; + $alias = drupal_get_path_alias('node/' . $node->nid); + drupal_add_html_head_link(array('rel' => 'alternate', 'type' => 'application/rdf+xml', 'href' => url($alias . '.xml', array('absolute' => TRUE)))); + } +} + +/** + * Implements hook_url_inbound_alter(). + */ +function open_data_schema_dcat_url_inbound_alter(&$path, $original_path, $path_language) { + // While the path for single-dataset endpoints appears to be catalog/dataset.xml + // in admin/config/services/odsm, it gets rewritten as [dataset URL].xml + $extension = pathinfo($path, PATHINFO_EXTENSION); + + if ($extension == 'xml') { + //Is trying to get dcat information from dataset? + $path_alias = preg_replace('/\\.[^.\\s]{3,4}$/', '', $path); + $internal_path = drupal_lookup_path('source', $path_alias, $path_language); + $internal_path = explode('/', $internal_path); + + if (count($internal_path) == 2 && $internal_path[0] == 'node' && is_numeric($internal_path[1])) { + $dataset = node_load($internal_path[1]); + + if ($dataset->type == 'dataset') { + //Use dcat dataset endpoint + $path = 'catalog/dataset.xml'; + $_GET['dct:identifier'] = $dataset->uuid; + } + } + } +} + +/** + * Implements hook_url_outbound_alter(). + */ +function open_data_schema_dcat_url_outbound_alter(&$path, &$options, $original_path) { + // See above. Rewites outbound links for dataset-specific endpoints + if (preg_match('|^catalog/dataset\.xml(/.*)?|', $path, $matches)) { + if (isset($options['query']['dct:identifier'])) { + $uuid = $options['query']['dct:identifier']; + $node = current(entity_uuid_load('node', array($uuid))); + $path_alias = drupal_lookup_path('alias', 'node/' . $node->nid); + + $path = "$path_alias" . ".xml"; + } + } +} + +/** + * Validates individual datasets. + */ +function open_data_schema_dcat_process_validate($url, $clear_cache = FALSE) { + include 'dcatValidator.php'; + if (!$clear_cache && $cache = cache_get('dcat_validate_result')) { + $results = $cache->data; + $results['cache_date'] = $cache->created; + } + else { + $dcatValidator = new dcatValidator\validate($url); + $dcatValidator->processAll(); + $count = $dcatValidator->datasetCount(); + $ids = array(); + $error_datasets = array(); + $total_errors = 0; + if ($errors = $dcatValidator->getErrors()) { + $total_errors = count($errors); + foreach ($errors as $error) { + $error_datasets[$error['id']] = 1; + } + $errors = open_data_schema_validation_process_errors($errors); + } + $results = array( + 'errors' => $errors, + 'count' => $count, + 'total_errors' => $total_errors, + 'error_datasets' => $error_datasets, + ); + $cache = cache_set('dcat_validate_result', $results, 'cache'); + } + return $results; +} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.pages.inc b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.pages.inc new file mode 100644 index 000000000..1ec076a29 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_dcat/open_data_schema_dcat.pages.inc @@ -0,0 +1,65 @@ + array(t('Total Datasets'), t('Datasets with Errors'), t('Errors')), 'rows' => $total)); + $render['total'] = array( + '#type'=> 'markup', + '#markup' => $total_table, + ); + if ($results['errors']) { + $headers = array('id', 'property', 'error', 'link'); + $table = theme('table', array('header' => $headers, 'rows' => $results['errors'])); + $render['fieldset'] = array( + '#type' => 'fieldset', + '#title' => 'errors', + '#attributes' => array('class' => array('collapsible', 'collapsed')), + 'content' => array( + '#markup' => $table, + ), + '#attached' => array('js' => array('misc/collapse.js', 'misc/form.js')), + ); + } + + return drupal_render($cache_form) . drupal_render($render); +} +/** + * Returns the render array for the form. + */ +function open_data_schema_dcat_validate_cache_clear($form, $form_state, $created) { + $form['cache'] = array( + '#type' => 'markup', + '#markup' => t('Result cached %date.', array('%date' => date('F j, Y, g:i a', $created))), + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Clear cache'), + ); + return $form; +} + +/** + * Add a submit handler/function to the form. + */ +function open_data_schema_dcat_validate_cache_clear_submit($form, &$form_state) { + cache_clear_all('dcat_validate_result', 'cache'); + drupal_set_message(t('The DCAT cache has been cleared.')); +} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload.php new file mode 100644 index 000000000..9b6542afa --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0 class loader + * + * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + + private $classMapAuthoritative = false; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-0 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 + if ('\\' == $class[0]) { + $class = substr($class, 1); + } + + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative) { + return false; + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if ($file === null && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if ($file === null) { + // Remember that this class does not exist. + return $this->classMap[$class] = false; + } + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { + if (0 === strpos($class, $prefix)) { + foreach ($this->prefixDirsPsr4[$prefix] as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload/autoload_classmap.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload/autoload_classmap.php new file mode 100644 index 000000000..3505b11c1 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload/autoload_classmap.php @@ -0,0 +1,14 @@ + array($library_path), +); diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload/autoload_real.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload/autoload_real.php new file mode 100644 index 000000000..91f2b65e8 --- /dev/null +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/autoload/autoload_real.php @@ -0,0 +1,49 @@ + $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + $loader->register(true); + + return $loader; + } +} + +function composerRequire8809d634254749879f507faa3331a906($file) +{ + require $file; +} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/composer.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/composer.json deleted file mode 100644 index 69ed8e093..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/composer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "require": { - "symfony/serializer": "*" - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.info b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.info index e4673d5c5..b806feccc 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.info +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.info @@ -2,5 +2,5 @@ name = Project Open Data Schema XML Output description = Provides xml output for for Open Data Schema Map. core = 7.x package = Open Data -version = 7.x-1.x +version = 7.x-1.12.11 dependencies[] = open_data_schema_map diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.install b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.install index d2fd1742f..23631054e 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.install +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.install @@ -6,8 +6,22 @@ */ +/** + * Implements hook_install(). + */ +function open_data_schema_map_xml_output_install() { + open_data_schema_map_xml_output_add_new_schema_fields(); +} + + +/** + * Implements hook_update_N(). + */ function open_data_schema_map_xml_output_update_7001() { + open_data_schema_map_xml_output_add_new_schema_fields(); +} +function open_data_schema_map_xml_output_add_new_schema_fields() { $column = array( 'type' => 'varchar', 'description' => "XML Root", diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.module b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.module index 78aef3609..55061198e 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.module +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_map_xml_output/open_data_schema_map_xml_output.module @@ -4,7 +4,8 @@ * @file * Provides XML output for Open Data Schema Map. */ -include __DIR__ . '/vendor/autoload.php'; +$module_path = drupal_get_path('module', 'open_data_schema_map_xml_output'); +include implode('/', array($module_path, 'autoload.php')); use Symfony\Component\Serializer\Serializer; use Symfony\Component\Serializer\Encoder\XmlEncoder; @@ -13,6 +14,26 @@ use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; define("DEFAULT_XML_ROOT", "records"); define("DEFAULT_XML_TAG", "record"); +/** + * Implements hook_schema_alter(). + */ +function open_data_schema_map_xml_output_schema_alter(&$schema) { + $schema['open_data_schema_map']['fields']['xml_root'] = array( + 'type' => 'varchar', + 'description' => "XML Root", + 'length' => 60, + 'not null' => False, + 'default' => 'records' + ); + $schema['open_data_schema_map']['fields']['xml_defaulttag'] = array( + 'type' => 'varchar', + 'description' => "XML Defaulttag", + 'length' => 60, + 'not null' => False, + 'default' => 'record' + ); +} + /** * Implements hook_odsm_form_alter(). */ @@ -21,7 +42,8 @@ function open_data_schema_map_xml_output_odsm_form_alter(&$form, $api) { '#title' => 'XML Root', '#type' => 'textfield', '#description' => t('(XML only) Enter the XML Root Name (default: records).'), - '#required' => False, + '#required' => FALSE, + '#default_value' => $api->xml_root, '#weight' => 3, '#states' => array( 'visible' => array( @@ -33,7 +55,8 @@ function open_data_schema_map_xml_output_odsm_form_alter(&$form, $api) { '#title' => 'XML Default Node', '#type' => 'textfield', '#description' => t('(XML only) Enter the XML Default Node Name (default: record).'), - '#required' => False, + '#required' => FALSE, + '#default_value' => $api->xml_defaulttag, '#weight' => 4, '#states' => array( 'visible' => array( @@ -71,7 +94,6 @@ function open_data_schema_map_xml_output_odsm_output_format() { function open_data_schema_map_xml_output_render($api, $result) { // We are returning XML, so tell the browser. - drupal_add_http_header('Content-Type', 'application/xml'); $xml_root = DEFAULT_XML_ROOT; $xml_defaulttag = DEFAULT_XML_TAG; if (isset($api->xml_root) && $api->xml_root != '') { @@ -85,10 +107,13 @@ function open_data_schema_map_xml_output_render($api, $result) { $xml[$xml_defaulttag] = $result; unset($xml[$xml_defaulttag]['key']); - // Serialize + //Allow alter xml before create the output + drupal_alter('open_data_schema_map_xml_output_render_data', $xml, $api); + $encoders = array( new XmlEncoder($xml_root) ); + $normalizers = array(new GetSetMethodNormalizer()); $serializer = new Serializer($normalizers, $encoders); diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/composer.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/composer.json deleted file mode 100644 index 0e6f35bd2..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/composer.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "require": { - "justinrainbow/json-schema": "~1.3" - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.info b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.info index f4d48aedf..4e39179e6 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.info +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.info @@ -2,6 +2,6 @@ name = POD Schema description = Provides POD Schema for Open Data Schema Map. core = 7.x package = Open Data -version = 7.x-1.x +version = 7.x-1.12.11 dependencies[] = features dependencies[] = open_data_schema_map diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.module b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.module index f177ef5e3..1c21ad201 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.module +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/open_data_schema_pod.module @@ -8,20 +8,18 @@ require_once('podValidator.php'); /** - * Implements hook_menu(). + * Implements hook_open_data_schema_map_validation(). */ -function open_data_schema_pod_menu() { - $items['admin/config/services/odsm/validate/pod'] = array( +function open_data_schema_pod_open_data_schema_map_validation() { + return array( 'title' => 'Project Open Data validation', + 'name' => 'pod', 'page callback' => 'open_data_schema_pod_validation_page', - 'page arguments' => array(), - 'access arguments' => array('Administer Open Data Schema Mapper'), - 'type' => MENU_NORMAL_ITEM, 'file' => 'open_data_schema_pod.pages.inc', + 'file path' => drupal_get_path('module', 'open_data_schema_pod'), ); - - return $items; } + /** * Implements hook_open_data_schema(). */ @@ -166,7 +164,7 @@ function open_data_schema_pod_open_data_schema_map_results_alter(&$result, $mach } if (isset($dataset['distribution'])) { foreach ($dataset['distribution'] as $num => $dist) { - if ($dist['format'] && !$dist['mediaType']) { + if ($dist['format'] && $dist['format'] != 'data' && !$dist['mediaType']) { include_once DRUPAL_ROOT . '/includes/file.mimetypes.inc'; $map = file_mimetype_mapping(); $dataset['distribution'][$num]['mediaType'] = isset($map['mimetypes'][$map['extensions'][$dist['format']]]) ? $map['mimetypes'][$map['extensions'][$dist['format']]] : 'text/html'; @@ -324,71 +322,6 @@ function open_data_schema_pod_open_data_schema_fill_references($schema_name, &$s } } -/** - * Implements hook_tokens_alter(). - */ -function open_data_schema_pod_tokens_alter(array &$replacements, array $context) { - if (isset($replacements['[node:field-odfe-program-code]']) && !empty($context['data']['node']->field_odfe_program_code['und'])) { - $field = array(); - foreach ($context['data']['node']->field_odfe_program_code['und'] as $key => $item) { - $field[] = str_replace("-", ":", $item['value']); - } - $replacements['[node:field-odfe-program-code]'] = implode(", ", $field); - } - if (isset($replacements['[node:field_related_content]']) && isset($context['data']['node']->field_related_content['und'])) { - $field = array(); - foreach ($context['data']['node']->field_related_content['und'] as $key => $item) { - $field[] = $item['url']; - } - $replacements['[node:field_related_content]'] = implode(", ", $field); - } - if (isset($replacements['[node:field-frequency]']) && isset($context['data']['node']->field_frequency['und'])) { - $replacements['[node:field-frequency]'] = open_data_schema_pod_accrual_iso_8601_value($replacements['[node:field-frequency]']); - } -} - -/** - * Provides value for human readable name. - */ -function open_data_schema_pod_accrual_iso_8601_value($name) { - if ($name == 'Annually') { - $name = 'Annual'; - } - $iso = open_data_schema_pod_accrual_iso_8601(); - if (isset($iso[$name])) { - return $iso[$name]; - } - else { - return ''; - } -} - -/** - * Provides iso 8601 accrual periodicity. - */ -function open_data_schema_pod_accrual_iso_8601() { - return array( - 'Decennial' => 'R/P10Y', - 'Quadrennial' => 'R/P4Y', - 'Annual' => 'R/P1Y', - 'Bimonthly' => 'R/P2M', - 'Semiweekly' => 'R/P3.5D', - 'Daily' => 'R/P1D', - 'Biweekly' => 'R/P2W', - 'Semiannual' => 'R/P6M', - 'Biennial' => 'R/P2Y', - 'Triennial' => 'R/P3Y', - 'Three times a week' => 'R/P0.33W', - 'Three times a month' => 'R/P0.33M', - 'Continuously updated' => 'R/PT1S', - 'Monthly' => 'R/P1M', - 'Quarterly' => ' R/P3M', - 'Semimonthly' => 'R/P0.5M', - 'Three times a year' => 'R/P4M', - 'Weekly' => 'R/P1W', - ); -} - /** * Validates individual datasets. */ @@ -409,7 +342,7 @@ function open_data_schema_pod_process_validate($url, $clear_cache = FALSE) { foreach ($errors as $error) { $error_datasets[$error['id']] = 1; } - $errors = open_data_schema_pod_validation_process_errors($errors); + $errors = open_data_schema_validation_process_errors($errors); } $results = array( 'errors' => $errors, @@ -421,22 +354,3 @@ function open_data_schema_pod_process_validate($url, $clear_cache = FALSE) { } return $results; } - -/** - * Adds node links to errors. - */ -function open_data_schema_pod_validation_process_errors($rows) { - foreach ($rows as $key => $row) { - if (!isset($ids[$row['id']])) { - $nid = entity_get_id_by_uuid('node', array($row['id'])); - $nid = $nid[$row['id']]; - $node = node_load($nid); - $ids[$row['id']] = $node; - } - else { - $node = $ids[$row['id']]; - } - $rows[$key]['title'] = l($node->title,'node/' . $node->nid); - } - return $rows; -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/podValidator.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/podValidator.php index 2318910fc..1bfbc82cf 100644 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/podValidator.php +++ b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/podValidator.php @@ -2,7 +2,7 @@ namespace podValidator; -include 'vendor/autoload.php'; +include __DIR__ . '/../../autoload.php'; use JsonSchema\Uri\UriRetriever; use JsonSchema\RefResolver; diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/installed.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/installed.json deleted file mode 100644 index a8fb75cad..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/composer/installed.json +++ /dev/null @@ -1,70 +0,0 @@ -[ - { - "name": "justinrainbow/json-schema", - "version": "1.4.4", - "version_normalized": "1.4.4.0", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "8dc9b9d85ab639ca60ab4608b34c1279d6ae7bce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/8dc9b9d85ab639ca60ab4608b34c1279d6ae7bce", - "reference": "8dc9b9d85ab639ca60ab4608b34c1279d6ae7bce", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "json-schema/json-schema-test-suite": "1.1.0", - "phpdocumentor/phpdocumentor": "~2", - "phpunit/phpunit": "~3.7" - }, - "time": "2015-07-14 16:29:50", - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "JsonSchema": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ] - } -] diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/.travis.yml b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/.travis.yml deleted file mode 100644 index 52484dc69..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/.travis.yml +++ /dev/null @@ -1,27 +0,0 @@ -language: php - -matrix: - fast_finish: true - include: - - php: 5.3.3 - - php: 5.3 - - php: 5.4 - - php: 5.5 - - php: 5.6 - env: CHECK_LINKS=true BUILD_DOCS=true - - php: 7 - - php: hhvm - allow_failures: - - php: 7 - -before_install: - - composer selfupdate - -install: - - travis_retry composer install --no-interaction --prefer-source - - if [[ "$CHECK_LINKS" == "true" ]]; then sudo apt-get -y install pypy python-sphinx graphviz; fi - -script: - - vendor/bin/phpunit --coverage-text - - if [[ "$CHECK_LINKS" == "true" ]]; then cd docs && make linkcheck && cd ..; fi - - if [[ "$BUILD_DOCS" == "true" ]]; then vendor/bin/phpdoc -d src -t docs-api; fi diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/LICENSE b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/LICENSE deleted file mode 100644 index 6210e7c3d..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2008, Gradua Networks -Author: Bruno Prieto Reis -All rights reserved. - - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the Gradua Networks nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/README.md b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/README.md deleted file mode 100644 index 3f9c58c39..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# JSON Schema for PHP - -[![Build Status](https://travis-ci.org/justinrainbow/json-schema.svg?branch=master)](https://travis-ci.org/justinrainbow/json-schema) -[![Latest Stable Version](https://poser.pugx.org/justinrainbow/json-schema/v/stable.png)](https://packagist.org/packages/justinrainbow/json-schema) -[![Total Downloads](https://poser.pugx.org/justinrainbow/json-schema/downloads.png)](https://packagist.org/packages/justinrainbow/json-schema) - -A PHP Implementation for validating `JSON` Structures against a given `Schema`. - -See [json-schema](http://json-schema.org/) for more details. - -## Installation - -### Library - - $ git clone https://github.com/justinrainbow/json-schema.git - -### Dependencies - -#### [`Composer`](https://github.com/composer/composer) (*will use the Composer ClassLoader*) - - $ wget http://getcomposer.org/composer.phar - $ php composer.phar require justinrainbow/json-schema:~1.3 - -## Usage - -```php -retrieve('file://' . realpath('schema.json')); -$data = json_decode(file_get_contents('data.json')); - -// If you use $ref or if you are unsure, resolve those references here -// This modifies the $schema object -$refResolver = new JsonSchema\RefResolver($retriever); -$refResolver->resolve($schema, 'file://' . __DIR__); - -// Validate -$validator = new JsonSchema\Validator(); -$validator->check($data, $schema); - -if ($validator->isValid()) { - echo "The supplied JSON validates against the schema.\n"; -} else { - echo "JSON does not validate. Violations:\n"; - foreach ($validator->getErrors() as $error) { - echo sprintf("[%s] %s\n", $error['property'], $error['message']); - } -} -``` - -## Running the tests - - $ vendor/bin/phpunit diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/composer.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/composer.json deleted file mode 100644 index 7b70f785b..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/composer.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "justinrainbow/json-schema", - "description": "A library to validate a json schema.", - "keywords": ["json", "schema"], - "homepage": "https://github.com/justinrainbow/json-schema", - "type": "library", - "license": "BSD-3-Clause", - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "repositories": [{ - "type": "package", - "package": { - "name": "json-schema/JSON-Schema-Test-Suite", - "version": "1.1.0", - "source": { - "url": "https://github.com/json-schema/JSON-Schema-Test-Suite", - "type": "git", - "reference": "1.1.0" - } - } - }], - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "json-schema/JSON-Schema-Test-Suite": "1.1.0", - "phpunit/phpunit": "~3.7", - "phpdocumentor/phpdocumentor": "~2" - }, - "autoload": { - "psr-0": { "JsonSchema": "src/" } - }, - "autoload-dev": { - "psr-0": { "JsonSchema": "tests/" } - }, - "bin": ["bin/validate-json"], - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/Makefile b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/Makefile deleted file mode 100644 index 47a0dd871..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/JsonSchema.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/JsonSchema.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/JsonSchema" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/JsonSchema" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/_static/.gitkeep b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/_static/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/_templates/.gitkeep b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/_templates/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/conf.py b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/conf.py deleted file mode 100644 index 34fcff0dc..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/conf.py +++ /dev/null @@ -1,241 +0,0 @@ -# -*- coding: utf-8 -*- -# -# JsonSchema documentation build configuration file, created by -# sphinx-quickstart on Sat Dec 10 15:34:44 2011. -# -# This file is execfile()d with the current directory set to its containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys, os - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ----------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'JsonSchema' -copyright = u'2011, Justin Rainbow, Bruno Prieto Reis' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = '1.0.0' -# The full version, including alpha/beta/rc tags. -release = '1.0.0' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -#language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['_build'] - -# The reST default role (used for this markup: `text`) to use for all documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - - -# -- Options for HTML output --------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -#html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -#html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -#html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -#html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Output file base name for HTML help builder. -htmlhelp_basename = 'JsonSchemadoc' - - -# -- Options for LaTeX output -------------------------------------------------- - -latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). -latex_documents = [ - ('index', 'JsonSchema.tex', u'JsonSchema Documentation', - u'Justin Rainbow, Bruno Prieto Reis', 'manual'), -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - - -# -- Options for manual page output -------------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'jsonschema', u'JsonSchema Documentation', - [u'Justin Rainbow, Bruno Prieto Reis'], 1) -] - -# If true, show URL addresses after external links. -#man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------------ - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ('index', 'JsonSchema', u'JsonSchema Documentation', u'Justin Rainbow, Bruno Prieto Reis', - 'JsonSchema', 'One line description of project.', 'Miscellaneous'), -] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/index.rst b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/index.rst deleted file mode 100644 index 32cddb6c8..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/index.rst +++ /dev/null @@ -1,62 +0,0 @@ -.. JsonSchema documentation master file, created by - sphinx-quickstart on Sat Dec 10 15:34:44 2011. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to JsonSchema's documentation! -====================================== - -Contents: - -.. toctree:: - :maxdepth: 2 - - -Installation ------------- - -.. code-block:: console - - git clone https://github.com/justinrainbow/json-schema.git - -Composer method -^^^^^^^^^^^^^^^ - -Add the `justinrainbow/json-schema` package to your `composer.json` file. - -.. code-block:: javascript - - { - "require": { - "justinrainbow/json-schema": "1.1.*" - } - } - -Then just run the usual `php composer.phar install` to install. - -Usage ------ - -.. code-block:: php - - validate(json_decode($json), json_decode($schema)); - - if ($result->valid) { - echo "The supplied JSON validates against the schema.\n"; - } else { - echo "JSON does not validate. Violations:\n"; - foreach ($result->errors as $error) { - echo "[{$error['property']}] {$error['message']}\n"; - } - } - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/make.bat b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/make.bat deleted file mode 100644 index ecb021019..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/docs/make.bat +++ /dev/null @@ -1,190 +0,0 @@ -@ECHO OFF - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set BUILDDIR=_build -set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . -set I18NSPHINXOPTS=%SPHINXOPTS% . -if NOT "%PAPER%" == "" ( - set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% - set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% -) - -if "%1" == "" goto help - -if "%1" == "help" ( - :help - echo.Please use `make ^` where ^ is one of - echo. html to make standalone HTML files - echo. dirhtml to make HTML files named index.html in directories - echo. singlehtml to make a single large HTML file - echo. pickle to make pickle files - echo. json to make JSON files - echo. htmlhelp to make HTML files and a HTML help project - echo. qthelp to make HTML files and a qthelp project - echo. devhelp to make HTML files and a Devhelp project - echo. epub to make an epub - echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter - echo. text to make text files - echo. man to make manual pages - echo. texinfo to make Texinfo files - echo. gettext to make PO message catalogs - echo. changes to make an overview over all changed/added/deprecated items - echo. linkcheck to check all external links for integrity - echo. doctest to run all doctests embedded in the documentation if enabled - goto end -) - -if "%1" == "clean" ( - for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i - del /q /s %BUILDDIR%\* - goto end -) - -if "%1" == "html" ( - %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/html. - goto end -) - -if "%1" == "dirhtml" ( - %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. - goto end -) - -if "%1" == "singlehtml" ( - %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. - goto end -) - -if "%1" == "pickle" ( - %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the pickle files. - goto end -) - -if "%1" == "json" ( - %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can process the JSON files. - goto end -) - -if "%1" == "htmlhelp" ( - %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run HTML Help Workshop with the ^ -.hhp project file in %BUILDDIR%/htmlhelp. - goto end -) - -if "%1" == "qthelp" ( - %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; now you can run "qcollectiongenerator" with the ^ -.qhcp project file in %BUILDDIR%/qthelp, like this: - echo.^> qcollectiongenerator %BUILDDIR%\qthelp\JsonSchema.qhcp - echo.To view the help file: - echo.^> assistant -collectionFile %BUILDDIR%\qthelp\JsonSchema.ghc - goto end -) - -if "%1" == "devhelp" ( - %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. - goto end -) - -if "%1" == "epub" ( - %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The epub file is in %BUILDDIR%/epub. - goto end -) - -if "%1" == "latex" ( - %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex - if errorlevel 1 exit /b 1 - echo. - echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. - goto end -) - -if "%1" == "text" ( - %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The text files are in %BUILDDIR%/text. - goto end -) - -if "%1" == "man" ( - %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The manual pages are in %BUILDDIR%/man. - goto end -) - -if "%1" == "texinfo" ( - %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. - goto end -) - -if "%1" == "gettext" ( - %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale - if errorlevel 1 exit /b 1 - echo. - echo.Build finished. The message catalogs are in %BUILDDIR%/locale. - goto end -) - -if "%1" == "changes" ( - %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes - if errorlevel 1 exit /b 1 - echo. - echo.The overview file is in %BUILDDIR%/changes. - goto end -) - -if "%1" == "linkcheck" ( - %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck - if errorlevel 1 exit /b 1 - echo. - echo.Link check complete; look for any errors in the above output ^ -or in %BUILDDIR%/linkcheck/output.txt. - goto end -) - -if "%1" == "doctest" ( - %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest - if errorlevel 1 exit /b 1 - echo. - echo.Testing of doctests in the sources finished, look at the ^ -results in %BUILDDIR%/doctest/output.txt. - goto end -) - -:end diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php deleted file mode 100644 index 89baafb01..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class CollectionConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - public function check($value, $schema = null, $path = null, $i = null) - { - // Verify minItems - if (isset($schema->minItems) && count($value) < $schema->minItems) { - $this->addError($path, "There must be a minimum of " . $schema->minItems . " items in the array"); - } - - // Verify maxItems - if (isset($schema->maxItems) && count($value) > $schema->maxItems) { - $this->addError($path, "There must be a maximum of " . $schema->maxItems . " items in the array"); - } - - // Verify uniqueItems - if (isset($schema->uniqueItems)) { - $unique = $value; - if (is_array($value) && count($value)) { - $unique = array_map(function($e) { return var_export($e, true); }, $value); - } - if (count(array_unique($unique)) != count($value)) { - $this->addError($path, "There are no duplicates allowed in the array"); - } - } - - // Verify items - if (isset($schema->items)) { - $this->validateItems($value, $schema, $path, $i); - } - } - - /** - * Validates the items - * - * @param array $value - * @param \stdClass $schema - * @param string $path - * @param string $i - */ - protected function validateItems($value, $schema = null, $path = null, $i = null) - { - if (is_object($schema->items)) { - // just one type definition for the whole array - foreach ($value as $k => $v) { - $initErrors = $this->getErrors(); - - // First check if its defined in "items" - $this->checkUndefined($v, $schema->items, $path, $k); - - // Recheck with "additionalItems" if the first test fails - if (count($initErrors) < count($this->getErrors()) && (isset($schema->additionalItems) && $schema->additionalItems !== false)) { - $secondErrors = $this->getErrors(); - $this->checkUndefined($v, $schema->additionalItems, $path, $k); - } - - // Reset errors if needed - if (isset($secondErrors) && count($secondErrors) < count($this->getErrors())) { - $this->errors = $secondErrors; - } else if (isset($secondErrors) && count($secondErrors) === count($this->getErrors())) { - $this->errors = $initErrors; - } - } - } else { - // Defined item type definitions - foreach ($value as $k => $v) { - if (array_key_exists($k, $schema->items)) { - $this->checkUndefined($v, $schema->items[$k], $path, $k); - } else { - // Additional items - if (property_exists($schema, 'additionalItems')) { - if ($schema->additionalItems !== false) { - $this->checkUndefined($v, $schema->additionalItems, $path, $k); - } else { - $this->addError( - $path, 'The item ' . $i . '[' . $k . '] is not defined and the definition does not allow additional items'); - } - } else { - // Should be valid against an empty schema - $this->checkUndefined($v, new \stdClass(), $path, $k); - } - } - } - - // Treat when we have more schema definitions than values, not for empty arrays - if(count($value) > 0) { - for ($k = count($value); $k < count($schema->items); $k++) { - $this->checkUndefined(new UndefinedConstraint(), $schema->items[$k], $path, $k); - } - } - } - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php deleted file mode 100644 index b7781bc9d..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/Constraint.php +++ /dev/null @@ -1,264 +0,0 @@ - - * @author Bruno Prieto Reis - */ -abstract class Constraint implements ConstraintInterface -{ - protected $checkMode = self::CHECK_MODE_NORMAL; - protected $uriRetriever; - protected $errors = array(); - protected $inlineSchemaProperty = '$schema'; - - const CHECK_MODE_NORMAL = 1; - const CHECK_MODE_TYPE_CAST = 2; - - /** - * @param int $checkMode - * @param UriRetriever $uriRetriever - */ - public function __construct($checkMode = self::CHECK_MODE_NORMAL, UriRetriever $uriRetriever = null) - { - $this->checkMode = $checkMode; - $this->uriRetriever = $uriRetriever; - } - - /** - * @return UriRetriever $uriRetriever - */ - public function getUriRetriever() - { - if (is_null($this->uriRetriever)) - { - $this->setUriRetriever(new UriRetriever); - } - - return $this->uriRetriever; - } - - /** - * @param UriRetriever $uriRetriever - */ - public function setUriRetriever(UriRetriever $uriRetriever) - { - $this->uriRetriever = $uriRetriever; - } - - /** - * {@inheritDoc} - */ - public function addError($path, $message) - { - $this->errors[] = array( - 'property' => $path, - 'message' => $message - ); - } - - /** - * {@inheritDoc} - */ - public function addErrors(array $errors) - { - $this->errors = array_merge($this->errors, $errors); - } - - /** - * {@inheritDoc} - */ - public function getErrors() - { - return $this->errors; - } - - /** - * {@inheritDoc} - */ - public function isValid() - { - return !$this->getErrors(); - } - - /** - * Clears any reported errors. Should be used between - * multiple validation checks. - */ - public function reset() - { - $this->errors = array(); - } - - /** - * Bubble down the path - * - * @param string $path Current path - * @param mixed $i What to append to the path - * - * @return string - */ - protected function incrementPath($path, $i) - { - if ($path !== '') { - if (is_int($i)) { - $path .= '[' . $i . ']'; - } elseif ($i == '') { - $path .= ''; - } else { - $path .= '.' . $i; - } - } else { - $path = $i; - } - - return $path; - } - - /** - * Validates an array - * - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - */ - protected function checkArray($value, $schema = null, $path = null, $i = null) - { - $validator = new CollectionConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i); - - $this->addErrors($validator->getErrors()); - } - - /** - * Validates an object - * - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - * @param mixed $patternProperties - */ - protected function checkObject($value, $schema = null, $path = null, $i = null, $patternProperties = null) - { - $validator = new ObjectConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i, $patternProperties); - - $this->addErrors($validator->getErrors()); - } - - /** - * Validates the type of a property - * - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - */ - protected function checkType($value, $schema = null, $path = null, $i = null) - { - $validator = new TypeConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i); - - $this->addErrors($validator->getErrors()); - } - - /** - * Checks a undefined element - * - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - */ - protected function checkUndefined($value, $schema = null, $path = null, $i = null) - { - $validator = new UndefinedConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i); - - $this->addErrors($validator->getErrors()); - } - - /** - * Checks a string element - * - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - */ - protected function checkString($value, $schema = null, $path = null, $i = null) - { - $validator = new StringConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i); - - $this->addErrors($validator->getErrors()); - } - - /** - * Checks a number element - * - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - */ - protected function checkNumber($value, $schema = null, $path = null, $i = null) - { - $validator = new NumberConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i); - - $this->addErrors($validator->getErrors()); - } - - /** - * Checks a enum element - * - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - */ - protected function checkEnum($value, $schema = null, $path = null, $i = null) - { - $validator = new EnumConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i); - - $this->addErrors($validator->getErrors()); - } - - protected function checkFormat($value, $schema = null, $path = null, $i = null) - { - $validator = new FormatConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema, $path, $i); - - $this->addErrors($validator->getErrors()); - } - - /** - * @param string $uri JSON Schema URI - * @return string JSON Schema contents - */ - protected function retrieveUri($uri) - { - if (null === $this->uriRetriever) { - $this->setUriRetriever(new UriRetriever); - } - $jsonSchema = $this->uriRetriever->retrieve($uri); - // TODO validate using schema - return $jsonSchema; - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php deleted file mode 100644 index 7f65c8e9f..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ConstraintInterface.php +++ /dev/null @@ -1,58 +0,0 @@ - - */ -interface ConstraintInterface -{ - /** - * returns all collected errors - * - * @return array - */ - public function getErrors(); - - /** - * adds errors to this validator - * - * @param array $errors - */ - public function addErrors(array $errors); - - /** - * adds an error - * - * @param $path - * @param $message - */ - public function addError($path, $message); - - /** - * checks if the validator has not raised errors - * - * @return boolean - */ - public function isValid(); - - /** - * invokes the validation of an element - * - * @abstract - * @param mixed $value - * @param mixed $schema - * @param mixed $path - * @param mixed $i - */ - public function check($value, $schema = null, $path = null, $i = null); -} \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php deleted file mode 100644 index ceffb7c6b..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/EnumConstraint.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class EnumConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - public function check($element, $schema = null, $path = null, $i = null) - { - // Only validate enum if the attribute exists - if ($element instanceof UndefinedConstraint && (!isset($schema->required) || !$schema->required)) { - return; - } - - foreach ($schema->enum as $enum) { - $type = gettype($element); - if ($type === gettype($enum)) { - if ($type == "object") { - if ($element == $enum) - return; - } else { - if ($element === $enum) - return; - - } - } - } - - $this->addError($path, "Does not have a value in the enumeration " . print_r($schema->enum, true)); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php deleted file mode 100644 index 8f6fba2f5..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/FormatConstraint.php +++ /dev/null @@ -1,164 +0,0 @@ - - * @link http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.23 - */ -class FormatConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - public function check($element, $schema = null, $path = null, $i = null) - { - if (!isset($schema->format)) { - return; - } - - switch ($schema->format) { - case 'date': - if (!$date = $this->validateDateTime($element, 'Y-m-d')) { - $this->addError($path, sprintf('Invalid date %s, expected format YYYY-MM-DD', json_encode($element))); - } - break; - - case 'time': - if (!$this->validateDateTime($element, 'H:i:s')) { - $this->addError($path, sprintf('Invalid time %s, expected format hh:mm:ss', json_encode($element))); - } - break; - - case 'date-time': - if (!$this->validateDateTime($element, 'Y-m-d\TH:i:s\Z') && - !$this->validateDateTime($element, 'Y-m-d\TH:i:s.u\Z') && - !$this->validateDateTime($element, 'Y-m-d\TH:i:sP') && - !$this->validateDateTime($element, 'Y-m-d\TH:i:sO') - ) { - $this->addError($path, sprintf('Invalid date-time %s, expected format YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DDThh:mm:ss+hh:mm', json_encode($element))); - } - break; - - case 'utc-millisec': - if (!$this->validateDateTime($element, 'U')) { - $this->addError($path, sprintf('Invalid time %s, expected integer of milliseconds since Epoch', json_encode($element))); - } - break; - - case 'regex': - if (!$this->validateRegex($element)) { - $this->addError($path, 'Invalid regex format ' . $element); - } - break; - - case 'color': - if (!$this->validateColor($element)) { - $this->addError($path, "Invalid color"); - } - break; - - case 'style': - if (!$this->validateStyle($element)) { - $this->addError($path, "Invalid style"); - } - break; - - case 'phone': - if (!$this->validatePhone($element)) { - $this->addError($path, "Invalid phone number"); - } - break; - - case 'uri': - if (null === filter_var($element, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE)) { - $this->addError($path, "Invalid URL format"); - } - break; - - case 'email': - if (null === filter_var($element, FILTER_VALIDATE_EMAIL, FILTER_NULL_ON_FAILURE)) { - $this->addError($path, "Invalid email"); - } - break; - - case 'ip-address': - case 'ipv4': - if (null === filter_var($element, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV4)) { - $this->addError($path, "Invalid IP address"); - } - break; - - case 'ipv6': - if (null === filter_var($element, FILTER_VALIDATE_IP, FILTER_NULL_ON_FAILURE | FILTER_FLAG_IPV6)) { - $this->addError($path, "Invalid IP address"); - } - break; - - case 'host-name': - case 'hostname': - if (!$this->validateHostname($element)) { - $this->addError($path, "Invalid hostname"); - } - break; - - default: - // Do nothing so that custom formats can be used. - break; - } - } - - protected function validateDateTime($datetime, $format) - { - $dt = \DateTime::createFromFormat($format, $datetime); - - if (!$dt) { - return false; - } - - return $datetime === $dt->format($format); - } - - protected function validateRegex($regex) - { - return false !== @preg_match('/' . $regex . '/', ''); - } - - protected function validateColor($color) - { - if (in_array(strtolower($color), array('aqua', 'black', 'blue', 'fuchsia', - 'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'orange', 'purple', - 'red', 'silver', 'teal', 'white', 'yellow'))) { - return true; - } - - return preg_match('/^#([a-f0-9]{3}|[a-f0-9]{6})$/i', $color); - } - - protected function validateStyle($style) - { - $properties = explode(';', rtrim($style, ';')); - $invalidEntries = preg_grep('/^\s*[-a-z]+\s*:\s*.+$/i', $properties, PREG_GREP_INVERT); - - return empty($invalidEntries); - } - - protected function validatePhone($phone) - { - return preg_match('/^\+?(\(\d{3}\)|\d{3}) \d{3} \d{4}$/', $phone); - } - - protected function validateHostname($host) - { - return preg_match('/^[_a-z]+\.([_a-z]+\.?)+$/i', $host); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php deleted file mode 100644 index 602b39471..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/NumberConstraint.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class NumberConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - public function check($element, $schema = null, $path = null, $i = null) - { - // Verify minimum - if (isset($schema->exclusiveMinimum)) { - if (isset($schema->minimum)) { - if ($schema->exclusiveMinimum && $element === $schema->minimum) { - $this->addError($path, "Must have a minimum value greater than boundary value of " . $schema->minimum); - } else if ($element < $schema->minimum) { - $this->addError($path, "Must have a minimum value of " . $schema->minimum); - } - } else { - $this->addError($path, "Use of exclusiveMinimum requires presence of minimum"); - } - } else if (isset($schema->minimum) && $element < $schema->minimum) { - $this->addError($path, "Must have a minimum value of " . $schema->minimum); - } - - // Verify maximum - if (isset($schema->exclusiveMaximum)) { - if (isset($schema->maximum)) { - if ($schema->exclusiveMaximum && $element === $schema->maximum) { - $this->addError($path, "Must have a maximum value less than boundary value of " . $schema->maximum); - } else if ($element > $schema->maximum) { - $this->addError($path, "Must have a maximum value of " . $schema->maximum); - } - } else { - $this->addError($path, "Use of exclusiveMaximum requires presence of maximum"); - } - } else if (isset($schema->maximum) && $element > $schema->maximum) { - $this->addError($path, "Must have a maximum value of " . $schema->maximum); - } - - // Verify divisibleBy - Draft v3 - if (isset($schema->divisibleBy) && $this->fmod($element, $schema->divisibleBy) != 0) { - $this->addError($path, "Is not divisible by " . $schema->divisibleBy); - } - - // Verify multipleOf - Draft v4 - if (isset($schema->multipleOf) && $this->fmod($element, $schema->multipleOf) != 0) { - $this->addError($path, "Must be a multiple of " . $schema->multipleOf); - } - - $this->checkFormat($element, $schema, $path, $i); - } - - private function fmod($number1, $number2) - { - $modulus = fmod($number1, $number2); - $precision = abs(0.0000000001); - $diff = (float)($modulus - $number2); - - if (-$precision < $diff && $diff < $precision) { - return 0.0; - } - - $decimals1 = mb_strpos($number1, ".") ? mb_strlen($number1) - mb_strpos($number1, ".") - 1 : 0; - $decimals2 = mb_strpos($number2, ".") ? mb_strlen($number2) - mb_strpos($number2, ".") - 1 : 0; - - return (float)round($modulus, max($decimals1, $decimals2)); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php deleted file mode 100644 index baccc239a..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/ObjectConstraint.php +++ /dev/null @@ -1,140 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class ObjectConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - function check($element, $definition = null, $path = null, $additionalProp = null, $patternProperties = null) - { - if ($element instanceof UndefinedConstraint) { - return; - } - - $matches = array(); - if ($patternProperties) { - $matches = $this->validatePatternProperties($element, $path, $patternProperties); - } - - if ($definition) { - // validate the definition properties - $this->validateDefinition($element, $definition, $path); - } - - // additional the element properties - $this->validateElement($element, $matches, $definition, $path, $additionalProp); - } - - public function validatePatternProperties($element, $path, $patternProperties) - { - $matches = array(); - foreach ($patternProperties as $pregex => $schema) { - // Validate the pattern before using it to test for matches - if (@preg_match('/'. $pregex . '/', '') === false) { - $this->addError($path, 'The pattern "' . $pregex . '" is invalid'); - continue; - } - foreach ($element as $i => $value) { - if (preg_match('/' . $pregex . '/', $i)) { - $matches[] = $i; - $this->checkUndefined($value, $schema ? : new \stdClass(), $path, $i); - } - } - } - return $matches; - } - - /** - * Validates the element properties - * - * @param \stdClass $element Element to validate - * @param array $matches Matches from patternProperties (if any) - * @param \stdClass $objectDefinition ObjectConstraint definition - * @param string $path Path to test? - * @param mixed $additionalProp Additional properties - */ - public function validateElement($element, $matches, $objectDefinition = null, $path = null, $additionalProp = null) - { - foreach ($element as $i => $value) { - - $property = $this->getProperty($element, $i, new UndefinedConstraint()); - $definition = $this->getProperty($objectDefinition, $i); - - // no additional properties allowed - if (!in_array($i, $matches) && $additionalProp === false && $this->inlineSchemaProperty !== $i && !$definition) { - $this->addError($path, "The property - " . $i . " - is not defined and the definition does not allow additional properties"); - } - - // additional properties defined - if (!in_array($i, $matches) && $additionalProp && !$definition) { - if ($additionalProp === true) { - $this->checkUndefined($value, null, $path, $i); - } else { - $this->checkUndefined($value, $additionalProp, $path, $i); - } - } - - // property requires presence of another - $require = $this->getProperty($definition, 'requires'); - if ($require && !$this->getProperty($element, $require)) { - $this->addError($path, "The presence of the property " . $i . " requires that " . $require . " also be present"); - } - - if (!$definition) { - // normal property verification - $this->checkUndefined($value, new \stdClass(), $path, $i); - } - } - } - - /** - * Validates the definition properties - * - * @param \stdClass $element Element to validate - * @param \stdClass $objectDefinition ObjectConstraint definition - * @param string $path Path? - */ - public function validateDefinition($element, $objectDefinition = null, $path = null) - { - foreach ($objectDefinition as $i => $value) { - $property = $this->getProperty($element, $i, new UndefinedConstraint()); - $definition = $this->getProperty($objectDefinition, $i); - $this->checkUndefined($property, $definition, $path, $i); - } - } - - /** - * retrieves a property from an object or array - * - * @param mixed $element Element to validate - * @param string $property Property to retrieve - * @param mixed $fallback Default value if property is not found - * - * @return mixed - */ - protected function getProperty($element, $property, $fallback = null) - { - if (is_array($element) /*$this->checkMode == self::CHECK_MODE_TYPE_CAST*/) { - return array_key_exists($property, $element) ? $element[$property] : $fallback; - } elseif (is_object($element)) { - return property_exists($element, $property) ? $element->$property : $fallback; - } - - return $fallback; - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php deleted file mode 100644 index b856a114a..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/SchemaConstraint.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class SchemaConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - public function check($element, $schema = null, $path = null, $i = null) - { - if ($schema !== null) { - // passed schema - $this->checkUndefined($element, $schema, '', ''); - } elseif (property_exists($element, $this->inlineSchemaProperty)) { - // inline schema - $this->checkUndefined($element, $element->{$this->inlineSchemaProperty}, '', ''); - } else { - throw new InvalidArgumentException('no schema found to verify against'); - } - } -} \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php deleted file mode 100644 index 94023f46f..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/StringConstraint.php +++ /dev/null @@ -1,51 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class StringConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - public function check($element, $schema = null, $path = null, $i = null) - { - // Verify maxLength - if (isset($schema->maxLength) && $this->strlen($element) > $schema->maxLength) { - $this->addError($path, "Must be at most " . $schema->maxLength . " characters long"); - } - - //verify minLength - if (isset($schema->minLength) && $this->strlen($element) < $schema->minLength) { - $this->addError($path, "Must be at least " . $schema->minLength . " characters long"); - } - - // Verify a regex pattern - if (isset($schema->pattern) && !preg_match('#' . str_replace('#', '\\#', $schema->pattern) . '#', $element)) { - $this->addError($path, "Does not match the regex pattern " . $schema->pattern); - } - - $this->checkFormat($element, $schema, $path, $i); - } - - private function strlen($string) - { - if (extension_loaded('mbstring')) { - return mb_strlen($string, mb_detect_encoding($string)); - } else { - return strlen($string); - } - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php deleted file mode 100644 index 183181572..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php +++ /dev/null @@ -1,141 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class TypeConstraint extends Constraint -{ - /** - * @var array|string[] type wordings for validation error messages - */ - static $wording = array( - 'integer' => 'an integer', - 'number' => 'a number', - 'boolean' => 'a boolean', - 'object' => 'an object', - 'array' => 'an array', - 'string' => 'a string', - 'null' => 'a null', - 'any' => NULL, // validation of 'any' is always true so is not needed in message wording - 0 => NULL, // validation of a false-y value is always true, so not needed as well - ); - - /** - * {@inheritDoc} - */ - public function check($value = null, $schema = null, $path = null, $i = null) - { - $type = isset($schema->type) ? $schema->type : null; - $isValid = true; - - if (is_array($type)) { - // @TODO refactor - $validatedOneType = false; - $errors = array(); - foreach ($type as $tp) { - $validator = new TypeConstraint($this->checkMode); - $subSchema = new \stdClass(); - $subSchema->type = $tp; - $validator->check($value, $subSchema, $path, null); - $error = $validator->getErrors(); - - if (!count($error)) { - $validatedOneType = true; - break; - } - - $errors = $error; - } - - if (!$validatedOneType) { - $this->addErrors($errors); - - return; - } - } elseif (is_object($type)) { - $this->checkUndefined($value, $type, $path); - } else { - $isValid = $this->validateType($value, $type); - } - - if ($isValid === false) { - if (!isset(self::$wording[$type])) { - throw new StandardUnexpectedValueException( - sprintf( - "No wording for %s available, expected wordings are: [%s]", - var_export($type, true), - implode(', ', array_filter(self::$wording))) - ); - } - $this->addError($path, gettype($value) . " value found, but " . self::$wording[$type] . " is required"); - } - } - - /** - * Verifies that a given value is of a certain type - * - * @param mixed $value Value to validate - * @param string $type TypeConstraint to check against - * - * @return boolean - * - * @throws InvalidArgumentException - */ - protected function validateType($value, $type) - { - //mostly the case for inline schema - if (!$type) { - return true; - } - - if ('integer' === $type) { - return is_int($value); - } - - if ('number' === $type) { - return is_numeric($value) && !is_string($value); - } - - if ('boolean' === $type) { - return is_bool($value); - } - - if ('object' === $type) { - return is_object($value); - //return ($this::CHECK_MODE_TYPE_CAST == $this->checkMode) ? is_array($value) : is_object($value); - } - - if ('array' === $type) { - return is_array($value); - } - - if ('string' === $type) { - return is_string($value); - } - - if ('null' === $type) { - return is_null($value); - } - - if ('any' === $type) { - return true; - } - - throw new InvalidArgumentException((is_object($value) ? 'object' : $value) . ' is an invalid type for ' . $type); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php deleted file mode 100644 index 78950a66c..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/UndefinedConstraint.php +++ /dev/null @@ -1,307 +0,0 @@ - - * @author Bruno Prieto Reis - */ -class UndefinedConstraint extends Constraint -{ - /** - * {@inheritDoc} - */ - public function check($value, $schema = null, $path = null, $i = null) - { - if (is_null($schema)) { - return; - } - - if (!is_object($schema)) { - throw new InvalidArgumentException( - 'Given schema must be an object in ' . $path - . ' but is a ' . gettype($schema) - ); - } - - $i = is_null($i) ? "" : $i; - $path = $this->incrementPath($path, $i); - - // check special properties - $this->validateCommonProperties($value, $schema, $path); - - // check allOf, anyOf, and oneOf properties - $this->validateOfProperties($value, $schema, $path); - - // check known types - $this->validateTypes($value, $schema, $path, $i); - } - - /** - * Validates the value against the types - * - * @param mixed $value - * @param mixed $schema - * @param string $path - * @param string $i - */ - public function validateTypes($value, $schema = null, $path = null, $i = null) - { - // check array - if (is_array($value)) { - $this->checkArray($value, $schema, $path, $i); - } - - // check object - if (is_object($value) && (isset($schema->properties) || isset($schema->patternProperties))) { - $this->checkObject( - $value, - isset($schema->properties) ? $schema->properties : null, - $path, - isset($schema->additionalProperties) ? $schema->additionalProperties : null, - isset($schema->patternProperties) ? $schema->patternProperties : null - ); - } - - // check string - if (is_string($value)) { - $this->checkString($value, $schema, $path, $i); - } - - // check numeric - if (is_numeric($value)) { - $this->checkNumber($value, $schema, $path, $i); - } - - // check enum - if (isset($schema->enum)) { - $this->checkEnum($value, $schema, $path, $i); - } - } - - /** - * Validates common properties - * - * @param mixed $value - * @param mixed $schema - * @param string $path - * @param string $i - */ - protected function validateCommonProperties($value, $schema = null, $path = null, $i = "") - { - // if it extends another schema, it must pass that schema as well - if (isset($schema->extends)) { - if (is_string($schema->extends)) { - $schema->extends = $this->validateUri($schema, $schema->extends); - } - if (is_array($schema->extends)) { - foreach ($schema->extends as $extends) { - $this->checkUndefined($value, $extends, $path, $i); - } - } else { - $this->checkUndefined($value, $schema->extends, $path, $i); - } - } - - // Verify required values - if (is_object($value)) { - - if (!($value instanceof UndefinedConstraint) && isset($schema->required) && is_array($schema->required) ) { - // Draft 4 - Required is an array of strings - e.g. "required": ["foo", ...] - foreach ($schema->required as $required) { - if (!property_exists($value, $required)) { - $this->addError($required, "The property " . $required . " is required"); - } - } - } else if (isset($schema->required) && !is_array($schema->required)) { - // Draft 3 - Required attribute - e.g. "foo": {"type": "string", "required": true} - if ( $schema->required && $value instanceof UndefinedConstraint) { - $this->addError($path, "Is missing and it is required"); - } - } - } - - // Verify type - if (!($value instanceof UndefinedConstraint)) { - $this->checkType($value, $schema, $path); - } - - // Verify disallowed items - if (isset($schema->disallow)) { - $initErrors = $this->getErrors(); - - $typeSchema = new \stdClass(); - $typeSchema->type = $schema->disallow; - $this->checkType($value, $typeSchema, $path); - - // if no new errors were raised it must be a disallowed value - if (count($this->getErrors()) == count($initErrors)) { - $this->addError($path, "Disallowed value was matched"); - } else { - $this->errors = $initErrors; - } - } - - if (isset($schema->not)) { - $initErrors = $this->getErrors(); - $this->checkUndefined($value, $schema->not, $path, $i); - - // if no new errors were raised then the instance validated against the "not" schema - if (count($this->getErrors()) == count($initErrors)) { - $this->addError($path, "Matched a schema which it should not"); - } else { - $this->errors = $initErrors; - } - } - - // Verify minimum and maximum number of properties - if (is_object($value)) { - if (isset($schema->minProperties)) { - if (count(get_object_vars($value)) < $schema->minProperties) { - $this->addError($path, "Must contain a minimum of " . $schema->minProperties . " properties"); - } - } - if (isset($schema->maxProperties)) { - if (count(get_object_vars($value)) > $schema->maxProperties) { - $this->addError($path, "Must contain no more than " . $schema->maxProperties . " properties"); - } - } - } - - // Verify that dependencies are met - if (is_object($value) && isset($schema->dependencies)) { - $this->validateDependencies($value, $schema->dependencies, $path); - } - } - - /** - * Validate allOf, anyOf, and oneOf properties - * - * @param mixed $value - * @param mixed $schema - * @param string $path - * @param string $i - */ - protected function validateOfProperties($value, $schema, $path, $i = "") - { - // Verify type - if ($value instanceof UndefinedConstraint) { - return; - } - - if (isset($schema->allOf)) { - $isValid = true; - foreach ($schema->allOf as $allOf) { - $initErrors = $this->getErrors(); - $this->checkUndefined($value, $allOf, $path, $i); - $isValid = $isValid && (count($this->getErrors()) == count($initErrors)); - } - if (!$isValid) { - $this->addError($path, "Failed to match all schemas"); - } - } - - if (isset($schema->anyOf)) { - $isValid = false; - $startErrors = $this->getErrors(); - foreach ($schema->anyOf as $anyOf) { - $initErrors = $this->getErrors(); - $this->checkUndefined($value, $anyOf, $path, $i); - if ($isValid = (count($this->getErrors()) == count($initErrors))) { - break; - } - } - if (!$isValid) { - $this->addError($path, "Failed to match at least one schema"); - } else { - $this->errors = $startErrors; - } - } - - if (isset($schema->oneOf)) { - $allErrors = array(); - $matchedSchemas = 0; - $startErrors = $this->getErrors(); - foreach ($schema->oneOf as $oneOf) { - $this->errors = array(); - $this->checkUndefined($value, $oneOf, $path, $i); - if (count($this->getErrors()) == 0) { - $matchedSchemas++; - } - $allErrors = array_merge($allErrors, array_values($this->getErrors())); - } - if ($matchedSchemas !== 1) { - $this->addErrors( - array_merge( - $allErrors, - array(array( - 'property' => $path, - 'message' => "failed to match exactly one schema" - ),), - $startErrors - ) - ); - } else { - $this->errors = $startErrors; - } - } - } - - /** - * Validate dependencies - * - * @param mixed $value - * @param mixed $dependencies - * @param string $path - * @param string $i - */ - protected function validateDependencies($value, $dependencies, $path, $i = "") - { - foreach ($dependencies as $key => $dependency) { - if (property_exists($value, $key)) { - if (is_string($dependency)) { - // Draft 3 string is allowed - e.g. "dependencies": {"bar": "foo"} - if (!property_exists($value, $dependency)) { - $this->addError($path, "$key depends on $dependency and $dependency is missing"); - } - } else if (is_array($dependency)) { - // Draft 4 must be an array - e.g. "dependencies": {"bar": ["foo"]} - foreach ($dependency as $d) { - if (!property_exists($value, $d)) { - $this->addError($path, "$key depends on $d and $d is missing"); - } - } - } else if (is_object($dependency)) { - // Schema - e.g. "dependencies": {"bar": {"properties": {"foo": {...}}}} - $this->checkUndefined($value, $dependency, $path, $i); - } - } - } - } - - protected function validateUri($schema, $schemaUri = null) - { - $resolver = new UriResolver(); - $retriever = $this->getUriRetriever(); - - $jsonSchema = null; - if ($resolver->isValid($schemaUri)) { - $schemaId = property_exists($schema, 'id') ? $schema->id : null; - $jsonSchema = $retriever->retrieve($schemaId, $schemaUri); - } - - return $jsonSchema; - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php deleted file mode 100644 index ec702a799..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,17 +0,0 @@ - - * @see README.md - */ -class RefResolver -{ - /** - * HACK to prevent too many recursive expansions. - * Happens e.g. when you want to validate a schema against the schema - * definition. - * - * @var integer - */ - protected static $depth = 0; - - /** - * maximum references depth - * @var integer - */ - public static $maxDepth = 7; - - /** - * @var UriRetrieverInterface - */ - protected $uriRetriever = null; - - /** - * @param UriRetriever $retriever - */ - public function __construct($retriever = null) - { - $this->uriRetriever = $retriever; - } - - /** - * Retrieves a given schema given a ref and a source URI - * - * @param string $ref Reference from schema - * @param string $sourceUri URI where original schema was located - * @return object Schema - */ - public function fetchRef($ref, $sourceUri) - { - $retriever = $this->getUriRetriever(); - $jsonSchema = $retriever->retrieve($ref, $sourceUri); - $this->resolve($jsonSchema); - - return $jsonSchema; - } - - /** - * Return the URI Retriever, defaulting to making a new one if one - * was not yet set. - * - * @return UriRetriever - */ - public function getUriRetriever() - { - if (is_null($this->uriRetriever)) { - $this->setUriRetriever(new UriRetriever); - } - - return $this->uriRetriever; - } - - /** - * Resolves all $ref references for a given schema. Recurses through - * the object to resolve references of any child schemas. - * - * The 'format' property is omitted because it isn't required for - * validation. Theoretically, this class could be extended to look - * for URIs in formats: "These custom formats MAY be expressed as - * an URI, and this URI MAY reference a schema of that format." - * - * The 'id' property is not filled in, but that could be made to happen. - * - * @param object $schema JSON Schema to flesh out - * @param string $sourceUri URI where this schema was located - */ - public function resolve($schema, $sourceUri = null) - { - if (self::$depth > self::$maxDepth) { - throw new JsonDecodingException(JSON_ERROR_DEPTH); - } - ++self::$depth; - - if (! is_object($schema)) { - --self::$depth; - return; - } - - if (null === $sourceUri && ! empty($schema->id)) { - $sourceUri = $schema->id; - } - - // Resolve $ref first - $this->resolveRef($schema, $sourceUri); - - // These properties are just schemas - // eg. items can be a schema or an array of schemas - foreach (array('additionalItems', 'additionalProperties', 'extends', 'items') as $propertyName) { - $this->resolveProperty($schema, $propertyName, $sourceUri); - } - - // These are all potentially arrays that contain schema objects - // eg. type can be a value or an array of values/schemas - // eg. items can be a schema or an array of schemas - foreach (array('disallow', 'extends', 'items', 'type', 'allOf', 'anyOf', 'oneOf') as $propertyName) { - $this->resolveArrayOfSchemas($schema, $propertyName, $sourceUri); - } - - // These are all objects containing properties whose values are schemas - foreach (array('dependencies', 'patternProperties', 'properties') as $propertyName) { - $this->resolveObjectOfSchemas($schema, $propertyName, $sourceUri); - } - - --self::$depth; - } - - /** - * Given an object and a property name, that property should be an - * array whose values can be schemas. - * - * @param object $schema JSON Schema to flesh out - * @param string $propertyName Property to work on - * @param string $sourceUri URI where this schema was located - */ - public function resolveArrayOfSchemas($schema, $propertyName, $sourceUri) - { - if (! isset($schema->$propertyName) || ! is_array($schema->$propertyName)) { - return; - } - - foreach ($schema->$propertyName as $possiblySchema) { - $this->resolve($possiblySchema, $sourceUri); - } - } - - /** - * Given an object and a property name, that property should be an - * object whose properties are schema objects. - * - * @param object $schema JSON Schema to flesh out - * @param string $propertyName Property to work on - * @param string $sourceUri URI where this schema was located - */ - public function resolveObjectOfSchemas($schema, $propertyName, $sourceUri) - { - if (! isset($schema->$propertyName) || ! is_object($schema->$propertyName)) { - return; - } - - foreach (get_object_vars($schema->$propertyName) as $possiblySchema) { - $this->resolve($possiblySchema, $sourceUri); - } - } - - /** - * Given an object and a property name, that property should be a - * schema object. - * - * @param object $schema JSON Schema to flesh out - * @param string $propertyName Property to work on - * @param string $sourceUri URI where this schema was located - */ - public function resolveProperty($schema, $propertyName, $sourceUri) - { - if (! isset($schema->$propertyName)) { - return; - } - - $this->resolve($schema->$propertyName, $sourceUri); - } - - /** - * Look for the $ref property in the object. If found, remove the - * reference and augment this object with the contents of another - * schema. - * - * @param object $schema JSON Schema to flesh out - * @param string $sourceUri URI where this schema was located - */ - public function resolveRef($schema, $sourceUri) - { - $ref = '$ref'; - - if (empty($schema->$ref)) { - return; - } - - $refSchema = $this->fetchRef($schema->$ref, $sourceUri); - unset($schema->$ref); - - // Augment the current $schema object with properties fetched - foreach (get_object_vars($refSchema) as $prop => $value) { - $schema->$prop = $value; - } - } - - /** - * Set URI Retriever for use with the Ref Resolver - * - * @param UriRetriever $retriever - * @return $this for chaining - */ - public function setUriRetriever(UriRetriever $retriever) - { - $this->uriRetriever = $retriever; - - return $this; - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php deleted file mode 100644 index f924ad8fe..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/AbstractRetriever.php +++ /dev/null @@ -1,29 +0,0 @@ - - */ -abstract class AbstractRetriever implements UriRetrieverInterface -{ - /** - * Media content type - * @var string - */ - protected $contentType; - - /** - * {@inheritDoc} - * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::getContentType() - */ - public function getContentType() - { - return $this->contentType; - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php deleted file mode 100644 index cd8414f3f..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/Curl.php +++ /dev/null @@ -1,79 +0,0 @@ - - */ -class Curl extends AbstractRetriever -{ - protected $messageBody; - - public function __construct() - { - if (!function_exists('curl_init')) { - throw new \RuntimeException("cURL not installed"); - } - } - - /** - * {@inheritDoc} - * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() - */ - public function retrieve($uri) - { - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_URL, $uri); - curl_setopt($ch, CURLOPT_HEADER, true); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: ' . Validator::SCHEMA_MEDIA_TYPE)); - - $response = curl_exec($ch); - if (false === $response) { - throw new \JsonSchema\Exception\ResourceNotFoundException('JSON schema not found'); - } - - $this->fetchMessageBody($response); - $this->fetchContentType($response); - - curl_close($ch); - - return $this->messageBody; - } - - /** - * @param string $response cURL HTTP response - */ - private function fetchMessageBody($response) - { - preg_match("/(?:\r\n){2}(.*)$/ms", $response, $match); - $this->messageBody = $match[1]; - } - - /** - * @param string $response cURL HTTP response - * @return boolean Whether the Content-Type header was found or not - */ - protected function fetchContentType($response) - { - if (0 < preg_match("/Content-Type:(\V*)/ims", $response, $match)) { - $this->contentType = trim($match[1]); - - return true; - } - - return false; - } -} \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php deleted file mode 100644 index bc43de6dd..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/FileGetContents.php +++ /dev/null @@ -1,87 +0,0 @@ - - */ -class FileGetContents extends AbstractRetriever -{ - protected $messageBody; - - /** - * {@inheritDoc} - * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() - */ - public function retrieve($uri) - { - $context = stream_context_create(array( - 'http' => array( - 'method' => 'GET', - 'header' => "Accept: " . Validator::SCHEMA_MEDIA_TYPE - ))); - - set_error_handler(function() use ($uri) { - throw new ResourceNotFoundException('JSON schema not found at ' . $uri); - }); - $response = file_get_contents($uri); - restore_error_handler(); - - if (false === $response) { - throw new ResourceNotFoundException('JSON schema not found at ' . $uri); - } - if ($response == '' - && substr($uri, 0, 7) == 'file://' && substr($uri, -1) == '/' - ) { - throw new ResourceNotFoundException('JSON schema not found at ' . $uri); - } - - $this->messageBody = $response; - if (! empty($http_response_header)) { - $this->fetchContentType($http_response_header); - } else { - // Could be a "file://" url or something else - fake up the response - $this->contentType = null; - } - - return $this->messageBody; - } - - /** - * @param array $headers HTTP Response Headers - * @return boolean Whether the Content-Type header was found or not - */ - private function fetchContentType(array $headers) - { - foreach ($headers as $header) { - if ($this->contentType = self::getContentTypeMatchInHeader($header)) { - return true; - } - } - - return false; - } - - /** - * @param string $header - * @return string|null - */ - protected static function getContentTypeMatchInHeader($header) - { - if (0 < preg_match("/Content-Type:(\V*)/ims", $header, $match)) { - return trim($match[1]); - } - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php deleted file mode 100644 index 7652c4243..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/PredefinedArray.php +++ /dev/null @@ -1,54 +0,0 @@ - '{ ... }', - * 'http://acme.com/schemas/address#' => '{ ... }', - * )) - * - * $schema = $retriever->retrieve('http://acme.com/schemas/person#'); - */ -class PredefinedArray extends AbstractRetriever -{ - /** - * Contains schemas as URI => JSON - * @var array - */ - private $schemas; - - /** - * Constructor - * - * @param array $schemas - * @param string $contentType - */ - public function __construct(array $schemas, $contentType = Validator::SCHEMA_MEDIA_TYPE) - { - $this->schemas = $schemas; - $this->contentType = $contentType; - } - - /** - * {@inheritDoc} - * @see \JsonSchema\Uri\Retrievers\UriRetrieverInterface::retrieve() - */ - public function retrieve($uri) - { - if (!array_key_exists($uri, $this->schemas)) { - throw new \JsonSchema\Exception\ResourceNotFoundException(sprintf( - 'The JSON schema "%s" was not found.', - $uri - )); - } - - return $this->schemas[$uri]; - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php deleted file mode 100644 index c32499899..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/Retrievers/UriRetrieverInterface.php +++ /dev/null @@ -1,32 +0,0 @@ - - */ -interface UriRetrieverInterface -{ - /** - * Retrieve a schema from the specified URI - * @param string $uri URI that resolves to a JSON schema - * @throws \JsonSchema\Exception\ResourceNotFoundException - * @return mixed string|null - */ - public function retrieve($uri); - - /** - * Get media content type - * @return string - */ - public function getContentType(); -} \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php deleted file mode 100644 index 978411454..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php +++ /dev/null @@ -1,157 +0,0 @@ - - */ -class UriResolver -{ - /** - * Parses a URI into five main components - * - * @param string $uri - * @return array - */ - public function parse($uri) - { - preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); - - $components = array(); - if (5 < count($match)) { - $components = array( - 'scheme' => $match[2], - 'authority' => $match[4], - 'path' => $match[5] - ); - } - if (7 < count($match)) { - $components['query'] = $match[7]; - } - if (9 < count($match)) { - $components['fragment'] = $match[9]; - } - - return $components; - } - - /** - * Builds a URI based on n array with the main components - * - * @param array $components - * @return string - */ - public function generate(array $components) - { - $uri = $components['scheme'] . '://' - . $components['authority'] - . $components['path']; - - if (array_key_exists('query', $components)) { - $uri .= $components['query']; - } - if (array_key_exists('fragment', $components)) { - $uri .= '#' . $components['fragment']; - } - - return $uri; - } - - /** - * Resolves a URI - * - * @param string $uri Absolute or relative - * @param string $baseUri Optional base URI - * @return string Absolute URI - */ - public function resolve($uri, $baseUri = null) - { - if ($uri == '') { - return $baseUri; - } - - $components = $this->parse($uri); - $path = $components['path']; - - if (! empty($components['scheme'])) { - return $uri; - } - $baseComponents = $this->parse($baseUri); - $basePath = $baseComponents['path']; - - $baseComponents['path'] = self::combineRelativePathWithBasePath($path, $basePath); - if (isset($components['fragment'])) { - $baseComponents['fragment'] = $components['fragment']; - } - - return $this->generate($baseComponents); - } - - /** - * Tries to glue a relative path onto an absolute one - * - * @param string $relativePath - * @param string $basePath - * @return string Merged path - * @throws UriResolverException - */ - public static function combineRelativePathWithBasePath($relativePath, $basePath) - { - $relativePath = self::normalizePath($relativePath); - if ($relativePath == '') { - return $basePath; - } - if ($relativePath{0} == '/') { - return $relativePath; - } - - $basePathSegments = explode('/', $basePath); - - preg_match('|^/?(\.\./(?:\./)*)*|', $relativePath, $match); - $numLevelUp = strlen($match[0]) /3 + 1; - if ($numLevelUp >= count($basePathSegments)) { - throw new UriResolverException(sprintf("Unable to resolve URI '%s' from base '%s'", $relativePath, $basePath)); - } - - $basePathSegments = array_slice($basePathSegments, 0, -$numLevelUp); - $path = preg_replace('|^/?(\.\./(\./)*)*|', '', $relativePath); - - return implode('/', $basePathSegments) . '/' . $path; - } - - /** - * Normalizes a URI path component by removing dot-slash and double slashes - * - * @param string $path - * @return string - */ - private static function normalizePath($path) - { - $path = preg_replace('|((?parse($uri); - - return !empty($components); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php deleted file mode 100644 index c723cd978..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php +++ /dev/null @@ -1,289 +0,0 @@ - - */ -class UriRetriever -{ - /** - * @var null|UriRetrieverInterface - */ - protected $uriRetriever = null; - - /** - * @var array|object[] - * @see loadSchema - */ - private $schemaCache = array(); - - /** - * Guarantee the correct media type was encountered - * - * @param UriRetrieverInterface $uriRetriever - * @param string $uri - * @return bool|void - */ - public function confirmMediaType($uriRetriever, $uri) - { - $contentType = $uriRetriever->getContentType(); - - if (is_null($contentType)) { - // Well, we didn't get an invalid one - return; - } - - if (Validator::SCHEMA_MEDIA_TYPE === $contentType) { - return; - } - - if (substr($uri, 0, 23) == 'http://json-schema.org/') { - //HACK; they deliver broken content types - return true; - } - - throw new InvalidSchemaMediaTypeException(sprintf('Media type %s expected', Validator::SCHEMA_MEDIA_TYPE)); - } - - /** - * Get a URI Retriever - * - * If none is specified, sets a default FileGetContents retriever and - * returns that object. - * - * @return UriRetrieverInterface - */ - public function getUriRetriever() - { - if (is_null($this->uriRetriever)) { - $this->setUriRetriever(new FileGetContents); - } - - return $this->uriRetriever; - } - - /** - * Resolve a schema based on pointer - * - * URIs can have a fragment at the end in the format of - * #/path/to/object and we are to look up the 'path' property of - * the first object then the 'to' and 'object' properties. - * - * @param object $jsonSchema JSON Schema contents - * @param string $uri JSON Schema URI - * @return object JSON Schema after walking down the fragment pieces - * - * @throws ResourceNotFoundException - */ - public function resolvePointer($jsonSchema, $uri) - { - $resolver = new UriResolver(); - $parsed = $resolver->parse($uri); - if (empty($parsed['fragment'])) { - return $jsonSchema; - } - - $path = explode('/', $parsed['fragment']); - while ($path) { - $pathElement = array_shift($path); - if (! empty($pathElement)) { - $pathElement = str_replace('~1', '/', $pathElement); - $pathElement = str_replace('~0', '~', $pathElement); - if (! empty($jsonSchema->$pathElement)) { - $jsonSchema = $jsonSchema->$pathElement; - } else { - throw new ResourceNotFoundException( - 'Fragment "' . $parsed['fragment'] . '" not found' - . ' in ' . $uri - ); - } - - if (! is_object($jsonSchema)) { - throw new ResourceNotFoundException( - 'Fragment part "' . $pathElement . '" is no object ' - . ' in ' . $uri - ); - } - } - } - - return $jsonSchema; - } - - /** - * Retrieve a URI - * - * @param string $uri JSON Schema URI - * @param string|null $baseUri - * @return object JSON Schema contents - */ - public function retrieve($uri, $baseUri = null) - { - $resolver = new UriResolver(); - $resolvedUri = $fetchUri = $resolver->resolve($uri, $baseUri); - - //fetch URL without #fragment - $arParts = $resolver->parse($resolvedUri); - if (isset($arParts['fragment'])) { - unset($arParts['fragment']); - $fetchUri = $resolver->generate($arParts); - } - - $jsonSchema = $this->loadSchema($fetchUri); - - // Use the JSON pointer if specified - $jsonSchema = $this->resolvePointer($jsonSchema, $resolvedUri); - - if ($jsonSchema instanceof \stdClass) { - $jsonSchema->id = $resolvedUri; - } - - return $jsonSchema; - } - - /** - * Fetch a schema from the given URI, json-decode it and return it. - * Caches schema objects. - * - * @param string $fetchUri Absolute URI - * - * @return object JSON schema object - */ - protected function loadSchema($fetchUri) - { - if (isset($this->schemaCache[$fetchUri])) { - return $this->schemaCache[$fetchUri]; - } - - $uriRetriever = $this->getUriRetriever(); - $contents = $this->uriRetriever->retrieve($fetchUri); - $this->confirmMediaType($uriRetriever, $fetchUri); - $jsonSchema = json_decode($contents); - - if (JSON_ERROR_NONE < $error = json_last_error()) { - throw new JsonDecodingException($error); - } - - $this->schemaCache[$fetchUri] = $jsonSchema; - - return $jsonSchema; - } - - /** - * Set the URI Retriever - * - * @param UriRetrieverInterface $uriRetriever - * @return $this for chaining - */ - public function setUriRetriever(UriRetrieverInterface $uriRetriever) - { - $this->uriRetriever = $uriRetriever; - - return $this; - } - - /** - * Parses a URI into five main components - * - * @param string $uri - * @return array - */ - public function parse($uri) - { - preg_match('|^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?|', $uri, $match); - - $components = array(); - if (5 < count($match)) { - $components = array( - 'scheme' => $match[2], - 'authority' => $match[4], - 'path' => $match[5] - ); - } - - if (7 < count($match)) { - $components['query'] = $match[7]; - } - - if (9 < count($match)) { - $components['fragment'] = $match[9]; - } - - return $components; - } - - /** - * Builds a URI based on n array with the main components - * - * @param array $components - * @return string - */ - public function generate(array $components) - { - $uri = $components['scheme'] . '://' - . $components['authority'] - . $components['path']; - - if (array_key_exists('query', $components)) { - $uri .= $components['query']; - } - - if (array_key_exists('fragment', $components)) { - $uri .= $components['fragment']; - } - - return $uri; - } - - /** - * Resolves a URI - * - * @param string $uri Absolute or relative - * @param string $baseUri Optional base URI - * @return string - */ - public function resolve($uri, $baseUri = null) - { - $components = $this->parse($uri); - $path = $components['path']; - - if ((array_key_exists('scheme', $components)) && ('http' === $components['scheme'])) { - return $uri; - } - - $baseComponents = $this->parse($baseUri); - $basePath = $baseComponents['path']; - - $baseComponents['path'] = UriResolver::combineRelativePathWithBasePath($path, $basePath); - - return $this->generate($baseComponents); - } - - /** - * @param string $uri - * @return boolean - */ - public function isValid($uri) - { - $components = $this->parse($uri); - - return !empty($components); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php deleted file mode 100644 index b1f39695d..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/src/JsonSchema/Validator.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @author Bruno Prieto Reis - * @see README.md - */ -class Validator extends Constraint -{ - const SCHEMA_MEDIA_TYPE = 'application/schema+json'; - - /** - * Validates the given data against the schema and returns an object containing the results - * Both the php object and the schema are supposed to be a result of a json_decode call. - * The validation works as defined by the schema proposal in http://json-schema.org - * - * {@inheritDoc} - */ - public function check($value, $schema = null, $path = null, $i = null) - { - $validator = new SchemaConstraint($this->checkMode, $this->uriRetriever); - $validator->check($value, $schema); - - $this->addErrors(array_unique($validator->getErrors(), SORT_REGULAR)); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/AdditionalPropertiesTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/AdditionalPropertiesTest.php deleted file mode 100644 index 07e7f098d..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/AdditionalPropertiesTest.php +++ /dev/null @@ -1,143 +0,0 @@ - '', - 'message' => 'The property - additionalProp - is not defined and the definition does not allow additional properties' - ) - ) - ), - array( - '{ - "prop":"1", - "additionalProp":"2" - }', - '{ - "type":"object", - "properties":{ - "prop":{"type":"string"} - }, - "additionalProperties": false - }', - Validator::CHECK_MODE_TYPE_CAST - ), - array( - '{ - "prop":"1", - "additionalProp":2 - }', - '{ - "type":"object", - "properties":{ - "prop":{"type":"string"} - }, - "additionalProperties": {"type":"string"} - }' - ), - array( - '{ - "prop":"1", - "additionalProp":2 - }', - '{ - "type":"object", - "properties":{ - "prop":{"type":"string"} - }, - "additionalProperties": {"type":"string"} - }', - Validator::CHECK_MODE_TYPE_CAST - ) - ); - } - - public function getValidTests() - { - return array( - array( - '{ - "prop":"1", - "additionalProp":"2" - }', - '{ - "type":"object", - "properties":{ - "prop":{"type":"string"} - } - }' - ), - array( - '{ - "prop":"1", - "additionalProp":"2" - }', - '{ - "type":"object", - "properties":{ - "prop":{"type":"string"} - } - }', - Validator::CHECK_MODE_TYPE_CAST - ), - array( - '{ - "prop":"1", - "additionalProp":"2" - }', - '{ - "type":"object", - "properties":{ - "prop":{"type":"string"} - }, - "additionalProperties": {"type":"string"} - }' - ), - array( - '{ - "prop":"1", - "additionalProp":[] - }', - '{ - "type":"object", - "properties":{ - "prop":{"type":"string"} - }, - "additionalProperties": true - }' - ) - ); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/ArraysTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/ArraysTest.php deleted file mode 100644 index 1fef244c5..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/ArraysTest.php +++ /dev/null @@ -1,156 +0,0 @@ -check(json_decode($input), json_decode($schema)); - - if (array() !== $errors) { - $this->assertEquals($errors, $validator->getErrors(), print_r($validator->getErrors(),true)); - } - $this->assertFalse($validator->isValid(), print_r($validator->getErrors(), true)); - } - - /** - * @dataProvider getValidTests - */ - public function testValidCases($input, $schema, $checkMode = Validator::CHECK_MODE_NORMAL) - { - $validator = new Validator($checkMode); - - $validator->check(json_decode($input), json_decode($schema)); - $this->assertTrue($validator->isValid(), print_r($validator->getErrors(), true)); - } - - abstract public function getValidTests(); - - abstract public function getInvalidTests(); -} \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/BasicTypesTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/BasicTypesTest.php deleted file mode 100644 index 7daa43ad7..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/BasicTypesTest.php +++ /dev/null @@ -1,147 +0,0 @@ -check('10', $schema); - $this->assertEmpty($validator->getErrors()); - } - - public function testRegex() - { - $validator = new FormatConstraint(); - $schema = new \stdClass; - $schema->format = 'regex'; - - $validator->check('\d+', $schema); - $this->assertEmpty($validator->getErrors()); - - $validator->check('^(abc]', $schema); - $this->assertCount(1, $validator->getErrors()); - } - - /** - * @dataProvider getValidFormats - */ - public function testValidFormat($string, $format) - { - $validator = new FormatConstraint(); - $schema = new \stdClass; - $schema->format = $format; - - $validator->check($string, $schema); - $this->assertEmpty($validator->getErrors()); - } - - /** - * @dataProvider getInvalidFormats - */ - public function testInvalidFormat($string, $format) - { - $validator = new FormatConstraint(); - $schema = new \stdClass; - $schema->format = $format; - - $validator->check($string, $schema); - $this->assertEquals(1, count($validator->getErrors()), 'Expected 1 error'); - } - - public function getValidFormats() - { - return array( - array('2001-01-23', 'date'), - array('2000-02-29', 'date'), - - array('12:22:01', 'time'), - array('00:00:00', 'time'), - array('23:59:59', 'time'), - - array('2000-05-01T12:12:12Z', 'date-time'), - array('2000-05-01T12:12:12+0100', 'date-time'), - array('2000-05-01T12:12:12+01:00', 'date-time'), - array('2000-05-01T12:12:12.123456Z', 'date-time'), - - array('0', 'utc-millisec'), - - array('aqua', 'color'), - array('black', 'color'), - array('blue', 'color'), - array('fuchsia', 'color'), - array('gray', 'color'), - array('green', 'color'), - array('lime', 'color'), - array('maroon', 'color'), - array('navy', 'color'), - array('olive', 'color'), - array('orange', 'color'), - array('purple', 'color'), - array('red', 'color'), - array('silver', 'color'), - array('teal', 'color'), - array('white', 'color'), - array('yellow', 'color'), - array('#fff', 'color'), - array('#00cc00', 'color'), - - array('background: blue', 'style'), - array('color: #000;', 'style'), - - array('555 320 1212', 'phone'), - - array('http://bluebox.org', 'uri'), - - array('info@something.edu', 'email'), - - array('10.10.10.10', 'ip-address'), - array('127.0.0.1', 'ip-address'), - - array('::ff', 'ipv6'), - - array('www.example.com', 'host-name'), - - array('anything', '*'), - ); - } - - public function getInvalidFormats() - { - return array( - array('January 1st, 1910', 'date'), - array('199-01-1', 'date'), - array('2012-0-11', 'date'), - array('2012-10-1', 'date'), - - array('24:01:00', 'time'), - array('00:00:60', 'time'), - array('25:00:00', 'time'), - - array('1999-1-11T00:00:00Z', 'date-time'), - array('1999-01-11T00:00:00+100', 'date-time'), - array('1999-01-11T00:00:00+1:00', 'date-time'), - - array('-1', 'utc-millisec'), - array(PHP_INT_MAX, 'utc-millisec'), - - array('grey', 'color'), - array('#HHH', 'color'), - array('#000a', 'color'), - array('#aa', 'color'), - - array('background; blue', 'style'), - - array('1 123 4424', 'phone'), - - array('htt:/bluebox.org', 'uri'), - - array('info@somewhere', 'email'), - - array('256.2.2.2', 'ip-address'), - - array(':::ff', 'ipv6'), - - array('localhost', 'host-name'), - ); - } - - public function getValidTests() - { - return array( - array( - '{ "counter": "10" }', - '{ - "type": "object", - "properties": { - "counter": { - "type": "string", - "format": "regex", - "pattern": "[0-9]+" - } - } - }'), - ); - } - - public function getInvalidTests() - { - return array( - array( - '{ "counter": "blue" }', - '{ - "type": "object", - "properties": { - "counter": { - "type": "string", - "format": "regex", - "pattern": "[0-9]+" - } - } - }' - ), - array( - '{ "color": "blueberry" }', - '{ - "type": "object", - "properties": { - "color": { - "type": "string", - "format": "color" - } - } - }' - ) - ); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/MinItemsMaxItemsTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/MinItemsMaxItemsTest.php deleted file mode 100644 index 1b4778452..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/MinItemsMaxItemsTest.php +++ /dev/null @@ -1,69 +0,0 @@ -markTestSkipped('mbstring extension is not available'); - } - } - - public function getInvalidTests() - { - return array( - array( - '{ - "value":"☀" - }', - '{ - "type":"object", - "properties":{ - "value":{"type":"string","minLength":2,"maxLength":4} - } - }' - ), - array( - '{ - "value":"☀☁☂☃☺" - }', - '{ - "type":"object", - "properties":{ - "value":{"type":"string","minLength":2,"maxLength":4} - } - }' - ) - ); - } - - public function getValidTests() - { - return array( - array( - '{ - "value":"☀☁" - }', - '{ - "type":"object", - "properties":{ - "value":{"type":"string","minLength":2,"maxLength":4} - } - }' - ), - array( - '{ - "value":"☀☁☂☃" - }', - '{ - "type":"object", - "properties":{ - "value":{"type":"string","minLength":2,"maxLength":4} - } - }' - ) - ); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/MinLengthMaxLengthTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/MinLengthMaxLengthTest.php deleted file mode 100644 index 8484c4e7d..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/MinLengthMaxLengthTest.php +++ /dev/null @@ -1,70 +0,0 @@ - "prop2", - "message" => "array value found, but a string is required", - - ), - array( - "property" => "prop2", - "message" => "array value found, but a number is required", - ), - array( - "property" => "prop2", - "message" => "failed to match exactly one schema", - ), - ), - ), - array( - '{"prop1": [1,2]}', - '{ - "type": "object", - "properties": { - "prop1": { - "oneOf": [ - { - "type": "string", - "pattern": "^[a-z]*$" - }, - { - "type": "string", - "pattern": "^[A-Z]*$" - } - ] - } - } - }' - ), - array( - '{"prop1": [1,2]}', - '{ - "type": "object", - "properties": { - "prop1": { - "anyOf": [ - { - "type": "string", - "pattern": "^[A-Z]*$" - } - ] - } - } - }' - ), - array( - '{"prop1": [1,2]}', - '{ - "type": "object", - "properties": { - "prop1": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string", - "pattern": "^[A-Z]*$" - } - ] - } - } - }' - ), - array( - '{"prop1": [1,2]}', - '{ - "type": "object", - "properties": { - "prop1": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "string", - "pattern": "^[A-Z]*$" - } - ] - } - } - }' - ), - array( - '{"prop1": [1,2]}', - '{ - "type": "object", - "properties": { - "prop1": { - "anyOf": [ - { - "type": "string", - "pattern": "^[a-z]*$" - }, - { - "type": "string", - "pattern": "^[A-Z]*$" - } - ] - } - } - }' - ), - array( - '{"prop1": [1,2]}', - '{ - "type": "object", - "properties": { - "prop1": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - }, - { - "type": "string" - } - ] - } - } - }' - ) - ); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/PatternPropertiesTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/PatternPropertiesTest.php deleted file mode 100644 index ef0538809..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/PatternPropertiesTest.php +++ /dev/null @@ -1,128 +0,0 @@ - array( - 'foobar' => 'foo', - 'barfoo' => 'bar', - ) - )), - json_encode(array( - 'type' => 'object', - 'patternProperties' => array( - '^someobject$' => array( - 'type' => 'object', - 'additionalProperties' => false, - 'properties' => array( - 'barfoo' => array( - 'type' => 'string', - ), - ) - ) - ) - )) - ), - // Does not match pattern - array( - json_encode(array( - 'regex_us' => false, - )), - json_encode(array( - 'type' => 'object', - 'patternProperties' => array( - '^[a-z]+_(jp|de)$' => array( - 'type' => array('boolean') - ) - ), - "additionalProperties" => false - )) - ), - // An invalid regular expression pattern - array( - json_encode(array( - 'regex_us' => false, - )), - json_encode(array( - 'type' => 'object', - 'patternProperties' => array( - '^[a-z+_jp|de)$' => array( - 'type' => array('boolean') - ) - ), - "additionalProperties" => false - )) - ), - ); - } - - public function getValidTests() - { - return array( - array( - // validates pattern schema - json_encode(array( - 'someobject' => array( - 'foobar' => 'foo', - 'barfoo' => 'bar', - ), - 'someotherobject' => array( - 'foobar' => 1234, - ) - )), - json_encode(array( - 'type' => 'object', - 'patternProperties' => array( - '^someobject$' => array( - 'type' => 'object', - 'properties' => array( - 'foobar' => array('type' => 'string'), - 'barfoo' => array('type' => 'string'), - ), - ), - '^someotherobject$' => array( - 'type' => 'object', - 'properties' => array( - 'foobar' => array('type' => 'number'), - ), - ), - ) - )) - ), - array( - json_encode(array( - 'foobar' => true, - 'regex_us' => 'foo', - 'regex_de' => 1234 - )), - json_encode(array( - 'type' => 'object', - 'properties' => array( - 'foobar' => array('type' => 'boolean') - ), - 'patternProperties' => array( - '^[a-z]+_(us|de)$' => array( - 'type' => array('string', 'integer') - ) - ), - "additionalProperties" => false - )) - ), - ); - } -} - diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/PatternTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/PatternTest.php deleted file mode 100644 index f28a57906..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/PatternTest.php +++ /dev/null @@ -1,81 +0,0 @@ -check($document, $schema); - $error = $validator->getErrors(); - $this->assertErrorHasExpectedPropertyValue($error, "foo"); - } - - public function testErrorPropertyIsPopulatedForRequiredIfEmptyValueInInput() - { - $validator = new UndefinedConstraint(); - $document = json_decode( - '{ - "bar": 42, - "foo": null - }' - ); - $schema = json_decode( - '{ - "type": "object", - "properties": { - "foo": {"type": "number"}, - "bar": {"type": "number"} - }, - "required": ["foo"] - }' - ); - - $validator->check($document, $schema); - $error = $validator->getErrors(); - $this->assertErrorHasExpectedPropertyValue($error, "foo"); - } - - protected function assertErrorHasExpectedPropertyValue($error, $propertyValue) - { - if (!(isset($error[0]) && is_array($error[0]) && isset($error[0]['property']))) { - $this->fail( - "Malformed error response. Expected to have subset in form: array(0 => array('property' => )))" - . " . Error response was: " . json_encode($error) - ); - } - $this->assertEquals($propertyValue, $error[0]['property']); - - } - - public function getInvalidTests() - { - return array( - array( - '{}', - '{ - "type":"object", - "properties":{ - "number":{"type":"number","required":true} - } - }' - ), - array( - '{}', - '{ - "type": "object", - "properties": { - "number": {"type": "number"} - }, - "required": ["number"] - }' - ), - array( - '{ - "foo": {} - }', - '{ - "type": "object", - "properties": { - "foo": { - "type": "object", - "properties": { - "bar": {"type": "number"} - }, - "required": ["bar"] - } - } - }' - ), - array( - '{ - "bar": 1.4 - }', - '{ - "type": "object", - "properties": { - "foo": {"type": "string", "required": true}, - "bar": {"type": "number"} - }, - "required": ["bar"] - }' - ), - array( - '{}', - '{ - "required": ["foo"] - }' - ), - array( - '{ - }', - '{ - "type": "object", - "properties": { - "foo": { "required": true } - } - }' - ), - array( - '{ - "string":{} - }', - '{ - "type":"object", - "properties": { - "string":{"type":"string", "required": true} - } - }' - ), - array( - '{ - "number":{} - }', - '{ - "type":"object", - "properties": { - "number":{"type":"number", "required": true} - } - }' - ), - array( - '{ - "integer":{} - }', - '{ - "type":"object", - "properties": { - "integer":{"type":"integer", "required": true} - } - }' - ), - array( - '{ - "boolean":{} - }', - '{ - "type":"object", - "properties": { - "boolean":{"type":"boolean", "required": true} - } - }' - ), - array( - '{ - "array":{} - }', - '{ - "type":"object", - "properties": { - "array":{"type":"array", "required": true} - } - }' - ), - array( - '{ - "null":{} - }', - '{ - "type":"object", - "properties": { - "null":{"type":"null", "required": true} - } - }' - ), - array( - '{ - "foo": {"baz": 1.5} - }', - '{ - "type": "object", - "properties": { - "foo": { - "type": "object", - "properties": { - "bar": {"type": "number"} - }, - "required": ["bar"] - } - } - }' - ), - array( - '{ - "foo": {"baz": 1.5} - }', - '{ - "type": "object", - "properties": { - "foo": { - "type": "object", - "properties": { - "bar": {"type": "number", "required": true} - } - } - } - }' - ), - ); - } - - public function getValidTests() - { - return array( - array( - '{ - "number": 1.4 - }', - '{ - "type":"object", - "properties":{ - "number":{"type":"number","required":true} - } - }' - ), - array( - '{}', - '{ - "type":"object", - "properties":{ - "number":{"type":"number"} - } - }' - ), - array( - '{}', - '{ - "type":"object", - "properties":{ - "number":{"type":"number","required":false} - } - }' - ), - array( - '{ - "number": 0 - }', - '{ - "type":"object", - "properties":{ - "number":{"type":"integer","required":true} - } - }' - ), - array( - '{ - "is_active": false - }', - '{ - "type":"object", - "properties":{ - "is_active":{"type":"boolean","required":true} - } - }' - ), - array( - '{ - "status": null - }', - '{ - "type":"object", - "properties":{ - "status":{"type":"null","required":true} - } - }' - ), - array( - '{ - "users": [] - }', - '{ - "type":"object", - "properties":{ - "users":{"type":"array","required":true} - } - }' - ), - array( - '{ - "foo": "foo", - "bar": 1.4 - }', - '{ - "type": "object", - "properties": { - "foo": {"type": "string", "required": true}, - "bar": {"type": "number"} - }, - "required": ["bar"] - }' - ), - array( - '{ - "foo": {"bar": 1.5} - }', - '{ - "type": "object", - "properties": { - "foo": { - "type": "object", - "properties": { - "bar": {"type": "number"} - }, - "required": ["bar"] - } - }, - "required": ["foo"] - }' - ), - array( - '{ - "foo": {} - }', - '{ - "type": "object", - "properties": { - "foo": { "required": true } - } - }' - ), - array( - '{ - "boo": {"bar": 1.5} - }', - '{ - "type": "object", - "properties": { - "foo": { - "type": "object", - "properties": { - "bar": {"type": "number"} - }, - "required": ["bar"] - } - } - }' - ), - array( - '{ - "boo": {"bar": 1.5} - }', - '{ - "type": "object", - "properties": { - "foo": { - "type": "object", - "properties": { - "bar": {"type": "number", "required": true} - } - } - } - }' - ), - ); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/SelfDefinedSchemaTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/SelfDefinedSchemaTest.php deleted file mode 100644 index 8b0a98194..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/SelfDefinedSchemaTest.php +++ /dev/null @@ -1,63 +0,0 @@ - - */ -class TypeTest extends \PHPUnit_Framework_TestCase -{ - /** - * @see testIndefiniteArticleForTypeInTypeCheckErrorMessage - * @return array - */ - public function provideIndefiniteArticlesForTypes() - { - return array( - array('integer', 'an',), - array('number', 'a',), - array('boolean', 'a',), - array('object', 'an',), - array('array', 'an',), - array('string', 'a',), - array('null', 'a', array(), 'array',), - ); - } - - /** - * @dataProvider provideIndefiniteArticlesForTypes - */ - public function testIndefiniteArticleForTypeInTypeCheckErrorMessage($type, $wording, $value = null, $label = 'NULL') - { - $constraint = new TypeConstraint(); - $constraint->check($value, (object)array('type' => $type)); - $this->assertTypeConstraintError("$label value found, but $wording $type is required", $constraint); - } - - /** - * Helper to assert an error message - * - * @param string $expected - * @param TypeConstraint $actual - */ - private function assertTypeConstraintError($expected, TypeConstraint $actual) - { - $actualErrors = $actual->getErrors(); - - $this->assertCount(1, $actualErrors, "Failed to assert that Type has exactly one error to assert the error message against."); - - $actualError = $actualErrors[0]; - - $this->assertInternalType('array', $actualError, sprintf('Failed to assert that Type error is an array, %s given', gettype($actualError))); - - $messageKey = 'message'; - $this->assertArrayHasKey( - $messageKey, $actualError, - sprintf('Failed to assert that Type error has a message key %s.', var_export($messageKey, true)) - ); - - $actualMessage = $actualError[$messageKey]; - - $this->assertEquals($expected, $actualMessage); // first equal for the diff - $this->assertSame($expected, $actualMessage); // the same for the strictness - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/UnionTypesTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/UnionTypesTest.php deleted file mode 100644 index 01e49c4ef..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Constraints/UnionTypesTest.php +++ /dev/null @@ -1,51 +0,0 @@ -getFilePaths(); - $skippedTests = $this->getSkippedTests(); - $tests = array(); - - foreach ($filePaths as $path) { - foreach (glob($path . '/*.json') as $file) { - if (!in_array(basename($file), $skippedTests)) { - $suites = json_decode(file_get_contents($file)); - foreach ($suites as $suite) { - foreach ($suite->tests as $test) { - if ($isValid === $test->valid) { - $tests[] = array(json_encode($test->data), json_encode($suite->schema)); - } - } - } - } - } - } - - return $tests; - } - - public function getInvalidTests() - { - return $this->setUpTests(false); - } - - public function getValidTests() - { - return $this->setUpTests(true); - } - - protected abstract function getFilePaths(); - - protected abstract function getSkippedTests(); -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Drafts/Draft3Test.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Drafts/Draft3Test.php deleted file mode 100644 index 0c589ff66..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Drafts/Draft3Test.php +++ /dev/null @@ -1,25 +0,0 @@ -relativeTestsRoot . '/draft3'), - realpath(__DIR__ . $this->relativeTestsRoot . '/draft3/optional') - ); - } - - protected function getSkippedTests() - { - return array( - 'ref.json', - 'refRemote.json', - 'bignum.json', - 'jsregex.json', - 'zeroTerminatedFloats.json' - ); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Drafts/Draft4Test.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Drafts/Draft4Test.php deleted file mode 100644 index 3f1d566c8..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Drafts/Draft4Test.php +++ /dev/null @@ -1,29 +0,0 @@ -relativeTestsRoot . '/draft4'), - realpath(__DIR__ . $this->relativeTestsRoot . '/draft4/optional') - ); - } - - protected function getSkippedTests() - { - return array( - // Not Yet Implemented - 'definitions.json', - // Partially Implemented - 'ref.json', - 'refRemote.json', - // Optional - 'bignum.json', - 'zeroTerminatedFloats.json' - ); - } - -} \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/RefResolverTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/RefResolverTest.php deleted file mode 100644 index 45ba71502..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/RefResolverTest.php +++ /dev/null @@ -1,358 +0,0 @@ -getMock('JsonSchema\RefResolver', array_keys($methods)); - foreach ($methods as $methodName => $methodInvocationCount) { - $resolver->expects($this->exactly($methodInvocationCount)) - ->method($methodName); - } - $resolver->resolve($input); - } - - public function resolveProvider() { - return array( - 'non-object' => array( - 'string', - array( - 'resolveRef' => 0, - 'resolveProperty' => 0, - 'resolveArrayOfSchemas' => 0, - 'resolveObjectOfSchemas' => 0 - ) - ), - 'empty object' => array( - (object) array(), - array( - 'resolveRef' => 1, - 'resolveProperty' => 4, - 'resolveArrayOfSchemas' => 7, - 'resolveObjectOfSchemas' => 3 - ) - ) - ); - } - - /** - * Helper method for resolve* methods - */ - public function helperResolveMethods($method, $input, $calls) { - $resolver = $this->getMock('JsonSchema\RefResolver', array('resolve')); - $resolver->expects($this->exactly($calls[$method])) - ->method('resolve'); - $resolver->$method($input, 'testProp', 'http://example.com/'); - } - - /** - * @dataProvider testSchemas - */ - public function testResolveArrayOfSchemas($input, $calls) { - $this->helperResolveMethods('resolveArrayOfSchemas', $input, $calls); - } - - /** - * @dataProvider testSchemas - */ - public function testResolveObjectOfSchemas($input, $calls) { - $this->helperResolveMethods('resolveObjectOfSchemas', $input, $calls); - } - - public function testSchemas() { - return array( - 'non-object' => array( - (object) array( - 'testProp' => 'string' - ), - array( - 'resolveArrayOfSchemas' => 0, - 'resolveObjectOfSchemas' => 0, - 'resolveProperty' => 0 - ) - ), - 'undefined' => array( - (object) array( - ), - array( - 'resolveArrayOfSchemas' => 0, - 'resolveObjectOfSchemas' => 0, - 'resolveProperty' => 0 - ) - ), - 'empty object' => array( - (object) array( - 'testProp' => (object) array() - ), - array( - 'resolveArrayOfSchemas' => 0, - 'resolveObjectOfSchemas' => 0, - 'resolveProperty' => 1 - ) - ), - 'filled object' => array( - (object) array( - 'testProp' => (object) array( - 'one' => array(), - 'two' => array() - ) - ), - array( - 'resolveArrayOfSchemas' => 0, - 'resolveObjectOfSchemas' => 2, - 'resolveProperty' => 1 - ) - ), - 'empty array' => array( - (object) array( - 'testProp' => array() - ), - array( - 'resolveArrayOfSchemas' => 0, - 'resolveObjectOfSchemas' => 0, - 'resolveProperty' => 1 - ) - ), - 'filled array' => array( - (object) array( - 'testProp' => array(1, 2, 3) - ), - array( - 'resolveArrayOfSchemas' => 3, - 'resolveObjectOfSchemas' => 0, - 'resolveProperty' => 1 - ) - ) - ); - } - - /** - * @dataProvider refProvider - */ - public function testResolveRef($expected, $input) { - $resolver = $this->getMock('JsonSchema\RefResolver', array('fetchRef')); - $resolver->expects($this->any()) - ->method('fetchRef') - ->will($this->returnValue((object) array( - 'this was' => array('added', 'because'), - 'the' => (object) array('$ref resolved' => true) - ))); - $resolver->resolveRef($input, 'http://example.com'); - $this->assertEquals($expected, $input); - } - - public function refProvider() { - return array( - 'no ref' => array( - (object) array('test' => 'one'), - (object) array('test' => 'one') - ), - // The $ref is not removed here - 'empty ref' => array( - (object) array( - 'test' => 'two', - '$ref' => '' - ), - (object) array( - 'test' => 'two', - '$ref' => '' - ) - ), - // $ref is removed - 'qualified ref' => array( - (object) array( - 'this is' => 'another test', - 'this was' => array('added', 'because'), - 'the' => (object) array('$ref resolved' => true) - ), - (object) array( - '$ref' => 'http://example.com/', - 'this is' => 'another test' - ) - ), - ); - } - - public function testFetchRefAbsolute() - { - $retr = new \JsonSchema\Uri\Retrievers\PredefinedArray( - array( - 'http://example.org/schema' => <<getUriRetriever()->setUriRetriever($retr); - - $this->assertEquals( - (object) array( - 'title' => 'schema', - 'type' => 'object', - 'id' => 'http://example.org/schema' - ), - $res->fetchRef('http://example.org/schema', 'http://example.org/schema') - ); - } - - public function testFetchRefAbsoluteAnchor() - { - $retr = new \JsonSchema\Uri\Retrievers\PredefinedArray( - array( - 'http://example.org/schema' => <<getUriRetriever()->setUriRetriever($retr); - - $this->assertEquals( - (object) array( - 'title' => 'foo', - 'type' => 'object', - 'id' => 'http://example.org/schema#/definitions/foo', - ), - $res->fetchRef( - 'http://example.org/schema#/definitions/foo', - 'http://example.org/schema' - ) - ); - } - - public function testFetchRefRelativeAnchor() - { - $retr = new \JsonSchema\Uri\Retrievers\PredefinedArray( - array( - 'http://example.org/schema' => <<getUriRetriever()->setUriRetriever($retr); - - $this->assertEquals( - (object) array( - 'title' => 'foo', - 'type' => 'object', - 'id' => 'http://example.org/schema#/definitions/foo', - ), - $res->fetchRef( - '#/definitions/foo', - 'http://example.org/schema' - ) - ); - } - - public function testFetchRefArray() - { - $retr = new \JsonSchema\Uri\Retrievers\PredefinedArray( - array( - 'http://example.org/array' => <<getUriRetriever()->setUriRetriever($retr); - - $this->assertEquals( - array(1, 2, 3), - $res->fetchRef('http://example.org/array', 'http://example.org/array') - ); - } - - public function testSetGetUriRetriever() - { - $retriever = new \JsonSchema\Uri\UriRetriever; - $resolver = new \JsonSchema\RefResolver; - $this->assertInstanceOf('JsonSchema\Uri\UriRetriever', $resolver->getUriRetriever()); - $this->assertInstanceOf('JsonSchema\RefResolver', $resolver->setUriRetriever($retriever)); - } - - public function testFetchRef() - { - // stub schema - $jsonSchema = new \stdClass; - $jsonSchema->id = 'stub'; - $jsonSchema->additionalItems = 'stub'; - $ref = 'ref'; - $sourceUri = null; - - - // mock retriever - $retriever = $this->getMock('JsonSchema\Uri\UriRetriever', array('retrieve')); - $retriever->expects($this->any())->method('retrieve')->will($this->returnValue($jsonSchema)); - - // stub resolver - $resolver = new \JsonSchema\RefResolver; - $resolver->setUriRetriever($retriever); - - $this->assertEquals($jsonSchema, $resolver->fetchRef($ref, $sourceUri)); - } - - /** - * @expectedException \JsonSchema\Exception\JsonDecodingException - */ - public function testMaxDepthExceeded() - { - // stub schema - $jsonSchema = new \stdClass; - $jsonSchema->id = 'stub'; - $jsonSchema->additionalItems = 'stub'; - - // mock retriever - $retriever = $this->getMock('JsonSchema\Uri\UriRetriever', array('retrieve')); - $retriever->expects($this->any())->method('retrieve')->will($this->returnValue($jsonSchema)); - - // stub resolver - \JsonSchema\RefResolver::$maxDepth = 0; - $resolver = new \JsonSchema\RefResolver($retriever); - - $resolver->resolve($jsonSchema); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Fixture/child.json b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Fixture/child.json deleted file mode 100644 index ce7d7404b..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Fixture/child.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type":"object", - "title":"parent", - "properties": - { - "parentProp": - { - "type":"boolean" - } - } -} \ No newline at end of file diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Retrievers/FileGetContentsTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Retrievers/FileGetContentsTest.php deleted file mode 100644 index 93fc7d6f5..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Retrievers/FileGetContentsTest.php +++ /dev/null @@ -1,27 +0,0 @@ -retrieve(__DIR__.'/Fixture/missing.json'); - } - - public function testFetchFile() - { - $res = new FileGetContents(); - $result = $res->retrieve(__DIR__.'/../Fixture/child.json'); - $this->assertNotEmpty($result); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Retrievers/PredefinedArrayTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Retrievers/PredefinedArrayTest.php deleted file mode 100644 index d01b835d0..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/Retrievers/PredefinedArrayTest.php +++ /dev/null @@ -1,43 +0,0 @@ -retriever = new PredefinedArray( - array( - 'http://acme.com/schemas/person#' => 'THE_PERSON_SCHEMA', - 'http://acme.com/schemas/address#' => 'THE_ADDRESS_SCHEMA', - ), - 'THE_CONTENT_TYPE' - ); - } - - public function testRetrieve() - { - $this->assertEquals('THE_PERSON_SCHEMA', $this->retriever->retrieve('http://acme.com/schemas/person#')); - $this->assertEquals('THE_ADDRESS_SCHEMA', $this->retriever->retrieve('http://acme.com/schemas/address#')); - } - - /** - * @expectedException JsonSchema\Exception\ResourceNotFoundException - */ - public function testRetrieveNonExistsingSchema() - { - $this->retriever->retrieve('http://acme.com/schemas/plop#'); - } - - public function testGetContentType() - { - $this->assertEquals('THE_CONTENT_TYPE', $this->retriever->getContentType()); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/UriResolverTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/UriResolverTest.php deleted file mode 100644 index 872972fde..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/UriResolverTest.php +++ /dev/null @@ -1,174 +0,0 @@ -resolver = new UriResolver(); - } - - public function testParse() - { - $this->assertEquals( - array( - 'scheme' => 'http', - 'authority' => 'example.org', - 'path' => '/path/to/file.json' - ), - $this->resolver->parse('http://example.org/path/to/file.json') - ); - } - - public function testParseAnchor() - { - $this->assertEquals( - array( - 'scheme' => 'http', - 'authority' => 'example.org', - 'path' => '/path/to/file.json', - 'query' => '', - 'fragment' => 'foo' - ), - $this->resolver->parse('http://example.org/path/to/file.json#foo') - ); - } - - public function testCombineRelativePathWithBasePath() - { - $this->assertEquals( - '/foo/baz.json', - UriResolver::combineRelativePathWithBasePath( - 'baz.json', - '/foo/bar.json' - ) - ); - } - - public function testCombineRelativePathWithBasePathAbsolute() - { - $this->assertEquals( - '/baz/data.json', - UriResolver::combineRelativePathWithBasePath( - '/baz/data.json', - '/foo/bar.json' - ) - ); - } - - public function testCombineRelativePathWithBasePathRelativeSub() - { - $this->assertEquals( - '/foo/baz/data.json', - UriResolver::combineRelativePathWithBasePath( - 'baz/data.json', - '/foo/bar.json' - ) - ); - } - - public function testCombineRelativePathWithBasePathNoPath() - { - //needed for anchor-only urls - $this->assertEquals( - '/foo/bar.json', - UriResolver::combineRelativePathWithBasePath( - '', - '/foo/bar.json' - ) - ); - } - - public function testResolveAbsoluteUri() - { - $this->assertEquals( - 'http://example.org/foo/bar.json', - $this->resolver->resolve( - 'http://example.org/foo/bar.json', - null - ) - ); - } - - /** - * @expectedException JsonSchema\Exception\UriResolverException - */ - public function testResolveRelativeUriNoBase() - { - $this->assertEquals( - 'http://example.org/foo/bar.json', - $this->resolver->resolve( - 'bar.json', - null - ) - ); - } - - public function testResolveRelativeUriBaseDir() - { - $this->assertEquals( - 'http://example.org/foo/bar.json', - $this->resolver->resolve( - 'bar.json', - 'http://example.org/foo/' - ) - ); - } - - public function testResolveRelativeUriBaseFile() - { - $this->assertEquals( - 'http://example.org/foo/bar.json', - $this->resolver->resolve( - 'bar.json', - 'http://example.org/foo/baz.json' - ) - ); - } - - public function testResolveAnchor() - { - $this->assertEquals( - 'http://example.org/foo/bar.json#baz', - $this->resolver->resolve( - '#baz', - 'http://example.org/foo/bar.json' - ) - ); - } - - public function testResolveAnchorWithFile() - { - $this->assertEquals( - 'http://example.org/foo/baz.json#baz', - $this->resolver->resolve( - 'baz.json#baz', - 'http://example.org/foo/bar.json' - ) - ); - } - public function testResolveAnchorAnchor() - { - $this->assertEquals( - 'http://example.org/foo/bar.json#bazinga', - $this->resolver->resolve( - '#bazinga', - 'http://example.org/foo/bar.json#baz' - ) - ); - } - - public function testResolveEmpty() - { - $this->assertEquals( - 'http://example.org/foo/bar.json', - $this->resolver->resolve( - '', - 'http://example.org/foo/bar.json' - ) - ); - } -} -?> diff --git a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/UriRetrieverTest.php b/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/UriRetrieverTest.php deleted file mode 100644 index 7409fd236..000000000 --- a/dkan/modules/contrib/open_data_schema_map/modules/open_data_schema_pod/vendor/justinrainbow/json-schema/tests/JsonSchema/Tests/Uri/UriRetrieverTest.php +++ /dev/null @@ -1,236 +0,0 @@ -validator = new Validator(); - } - - private function getRetrieverMock($returnSchema, $returnMediaType = Validator::SCHEMA_MEDIA_TYPE) - { - - $jsonSchema = json_decode($returnSchema); - - if (JSON_ERROR_NONE < $error = json_last_error()) { - throw new JsonDecodingException($error); - } - - $retriever = $this->getMock('JsonSchema\Uri\UriRetriever', array('retrieve')); - - $retriever->expects($this->at(0)) - ->method('retrieve') - ->with($this->equalTo(null), $this->equalTo('http://some.host.at/somewhere/parent')) - ->will($this->returnValue($jsonSchema)); - - return $retriever; - } - - /** - * @dataProvider jsonProvider - */ - public function testChildExtendsParentValidTest($childSchema, $parentSchema) - { - $retrieverMock = $this->getRetrieverMock($parentSchema); - - $json = '{"childProp":"infant", "parentProp":false}'; - $decodedJson = json_decode($json); - $decodedJsonSchema = json_decode($childSchema); - - $this->validator->setUriRetriever($retrieverMock); - $this->validator->check($decodedJson, $decodedJsonSchema); - $this->assertTrue($this->validator->isValid()); - } - - /** - * @dataProvider jsonProvider - */ - public function testChildExtendsParentInvalidChildTest($childSchema, $parentSchema) - { - $retrieverMock = $this->getRetrieverMock($parentSchema); - - $json = '{"childProp":1, "parentProp":false}'; - $decodedJson = json_decode($json); - $decodedJsonSchema = json_decode($childSchema); - - $this->validator->setUriRetriever($retrieverMock); - $this->validator->check($decodedJson, $decodedJsonSchema); - $this->assertFalse($this->validator->isValid()); - } - - /** - * @dataProvider jsonProvider - */ - public function testChildExtendsParentInvalidParentTest($childSchema, $parentSchema) - { - $retrieverMock = $this->getRetrieverMock($parentSchema); - - $json = '{"childProp":"infant", "parentProp":1}'; - $decodedJson = json_decode($json); - $decodedJsonSchema = json_decode($childSchema); - - $this->validator->setUriRetriever($retrieverMock); - $this->validator->check($decodedJson, $decodedJsonSchema); - $this->assertFalse($this->validator->isValid()); - } - - /** - * @dataProvider jsonProvider - */ - public function testResolveRelativeUri($childSchema, $parentSchema) - { - self::setParentSchemaExtendsValue($parentSchema, 'grandparent'); - $retrieverMock = $this->getRetrieverMock($parentSchema); - $json = '{"childProp":"infant", "parentProp":false}'; - $decodedJson = json_decode($json); - $decodedJsonSchema = json_decode($childSchema); - - $this->validator->setUriRetriever($retrieverMock); - $this->validator->check($decodedJson, $decodedJsonSchema); - $this->assertTrue($this->validator->isValid()); - } - - private static function setParentSchemaExtendsValue(&$parentSchema, $value) - { - $parentSchemaDecoded = json_decode($parentSchema, true); - $parentSchemaDecoded['extends'] = $value; - $parentSchema = json_encode($parentSchemaDecoded); - } - - public function jsonProvider() - { - $childSchema = << 'schema' - ); - - $retriever = new \JsonSchema\Uri\UriRetriever(); - $this->assertEquals( - $schema, - $retriever->resolvePointer( - $schema, 'http://example.org/schema.json' - ) - ); - } - - public function testResolvePointerFragment() - { - $schema = (object) array( - 'definitions' => (object) array( - 'foo' => (object) array( - 'title' => 'foo' - ) - ), - 'title' => 'schema' - ); - - $retriever = new \JsonSchema\Uri\UriRetriever(); - $this->assertEquals( - $schema->definitions->foo, - $retriever->resolvePointer( - $schema, 'http://example.org/schema.json#/definitions/foo' - ) - ); - } - - /** - * @expectedException JsonSchema\Exception\ResourceNotFoundException - */ - public function testResolvePointerFragmentNotFound() - { - $schema = (object) array( - 'definitions' => (object) array( - 'foo' => (object) array( - 'title' => 'foo' - ) - ), - 'title' => 'schema' - ); - - $retriever = new \JsonSchema\Uri\UriRetriever(); - $retriever->resolvePointer( - $schema, 'http://example.org/schema.json#/definitions/bar' - ); - } - - /** - * @expectedException JsonSchema\Exception\ResourceNotFoundException - */ - public function testResolvePointerFragmentNoArray() - { - $schema = (object) array( - 'definitions' => (object) array( - 'foo' => array( - 'title' => 'foo' - ) - ), - 'title' => 'schema' - ); - - $retriever = new \JsonSchema\Uri\UriRetriever(); - $retriever->resolvePointer( - $schema, 'http://example.org/schema.json#/definitions/foo' - ); - } - - /** - * @expectedException JsonSchema\Exception\UriResolverException - */ - public function testResolveExcessLevelUp() - { - $retriever = new \JsonSchema\Uri\UriRetriever(); - $retriever->resolve( - '../schema.json#', 'http://example.org/schema.json#' - ); - } -} diff --git a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.file_cache.inc b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.file_cache.inc index 4d08fedb3..655840402 100644 --- a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.file_cache.inc +++ b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.file_cache.inc @@ -37,12 +37,10 @@ function open_data_schema_map_file_cache_endpoint($machine_name) { drush_log('Beginning processing for endpoint (this could take a while)', 'success'); $render = open_data_schema_map_render_api($api); $result = $render['result']; - $output_formats = open_data_schema_map_retrieve_output_formats(); - if (in_array($api->outputformat, array_keys($output_formats))) { - // Not ready for this. We need to do some refactoring on output formats. - // $function = $output_formats[$api->outputformat]; - // $response = $function($api, $result); - $response = drupal_json_encode($result); + + // Load the correct output format, render results, and write to a file. + if ($output_format = open_data_schema_map_output_format_load($api->outputformat)) { + $response = $output_format['callback']($api, $result); drush_log('Saving ' . $filename, 'success'); file_save_data($response, $filename, FILE_EXISTS_REPLACE); drush_log($filename . ' saved', 'success'); diff --git a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.info b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.info index df070edb8..25e375a2e 100644 --- a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.info +++ b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.info @@ -2,7 +2,7 @@ name = Open Data Schema Map description = Maps entities to Open Data schemas. core = 7.x package = Open Data -version = 7.x-1.x +version = 7.x-1.12.11 dependencies[] = entity dependencies[] = entity_token dependencies[] = features diff --git a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.make b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.make index c97dd3287..bd85e7469 100644 --- a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.make +++ b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.make @@ -1,2 +1,12 @@ core = 7.x api = 2 + +libraries[symfonyserializer][type] = libraries +libraries[symfonyserializer][download][type] = "git" +libraries[symfonyserializer][download][url] = "https://github.com/symfony/serializer.git" +libraries[symfonyserializer][download][revision] = 21df995f7e74ddeb90d7ae1749e06cec7277e71a + +libraries[json-schema][type] = libraries +libraries[json-schema][download][type] = "git" +libraries[json-schema][download][url] = "https://github.com/justinrainbow/json-schema.git" +libraries[json-schema][download][tag] = 1.3.7 diff --git a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.module b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.module index 6404d4c6f..511dea532 100644 --- a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.module +++ b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.module @@ -117,6 +117,22 @@ function open_data_schema_map_menu() { 'file' => 'open_data_schema_map.pages.inc', ); + //Read validation implementation and add to menu. + foreach (module_implements('open_data_schema_map_validation') as $module) { + $data = module_invoke($module, 'open_data_schema_map_validation'); + $path = 'admin/config/services/odsm/validate/' . $data['name']; + + $items[$path] = array( + 'title' => $data['title'], + 'page callback' => $data['page callback'], + 'page arguments' => array(), + 'access arguments' => array('Administer Open Data Schema Mapper'), + 'type' => MENU_NORMAL_ITEM, + 'file' => $data['file'], + 'file path' => $data['file path'], + ); + } + return $items; } @@ -132,6 +148,30 @@ function open_data_schema_map_permission() { )); } + +/** + * Implements hook_libraries_info(). + */ +function open_data_schema_map_libraries_info() { + $libraries['symfonyserializer'] = array( + 'name' => 'Simfony Serializer', + 'vendor url' => 'https://github.com/symfony/serializer', + 'download url' => 'https://github.com/symfony/serializer/zipball/master', + 'version' => 'master', + 'files' => array(), + ); + + $libraries['json-schema'] = array( + 'name' => 'Justinrainbow JSON-Schema', + 'vendor url' => 'https://github.com/justinrainbow/json-schema.git', + 'download url' => 'https://github.com/justinrainbow/json-schema/tree/master/src/JsonSchema', + 'version' => 'master', + 'files' => array(), + ); + + return $libraries; +} + /** * Registers declared schemas. */ @@ -639,7 +679,7 @@ function open_data_schema_map_json_4($schema, $api, $defaults) { $form[$item] = array( '#title' => $data['title'], '#type' => 'fieldset', - '#description' => $data['description'], + '#description' => isset($data['description']) ? $data['description'] : '', ); $form[$item]['odsm_entity_reference'] = array( '#title' => $item . ' Multivalue Field', @@ -1084,3 +1124,90 @@ function open_data_schema_map_additional_fields_add($fields, $api) { } return $api; } + + /* + * Adds node links to errors. + */ +function open_data_schema_validation_process_errors($rows) { + foreach ($rows as $key => $row) { + if (!isset($ids[$row['id']])) { + $nid = entity_get_id_by_uuid('node', array($row['id'])); + $nid = $nid[$row['id']]; + $node = node_load($nid); + $ids[$row['id']] = $node; + } + else { + $node = $ids[$row['id']]; + } + $rows[$key]['title'] = l($node->title,'node/' . $node->nid); + } + return $rows; +} + +/** + * Implements hook_tokens_alter(). + */ +function open_data_schema_map_tokens_alter(array &$replacements, array $context) { + if (isset($replacements['[node:field-odfe-program-code]']) && !empty($context['data']['node']->field_odfe_program_code['und'])) { + $field = array(); + foreach ($context['data']['node']->field_odfe_program_code['und'] as $key => $item) { + $field[] = str_replace("-", ":", $item['value']); + } + $replacements['[node:field-odfe-program-code]'] = implode(", ", $field); + } + if (isset($replacements['[node:field_related_content]']) && isset($context['data']['node']->field_related_content['und'])) { + $field = array(); + foreach ($context['data']['node']->field_related_content['und'] as $key => $item) { + $field[] = $item['url']; + } + $replacements['[node:field_related_content]'] = implode(", ", $field); + } + if (isset($replacements['[node:field-frequency]']) && isset($context['data']['node']->field_frequency['und'])) { + $replacements['[node:field-frequency]'] = open_data_schema_map_accrual_iso_8601_value($replacements['[node:field-frequency]']); + } + if (isset($replacements['[node:field-data-dictionary]'])) { + $replacements['[node:field-data-dictionary]'] = check_url($context['data']['node']->field_data_dictionary[LANGUAGE_NONE][0]['value']); + } +} + +/** + * Provides value for human readable name. + */ +function open_data_schema_map_accrual_iso_8601_value($name) { + if ($name == 'Annually') { + $name = 'Annual'; + } + $iso = open_data_schema_map_accrual_iso_8601(); + if (isset($iso[$name])) { + return $iso[$name]; + } + else { + return ''; + } +} + +/** + * Provides iso 8601 accrual periodicity. + */ +function open_data_schema_map_accrual_iso_8601() { + return array( + 'Decennial' => 'R/P10Y', + 'Quadrennial' => 'R/P4Y', + 'Annual' => 'R/P1Y', + 'Bimonthly' => 'R/P2M', + 'Semiweekly' => 'R/P3.5D', + 'Daily' => 'R/P1D', + 'Biweekly' => 'R/P2W', + 'Semiannual' => 'R/P6M', + 'Biennial' => 'R/P2Y', + 'Triennial' => 'R/P3Y', + 'Three times a week' => 'R/P0.33W', + 'Three times a month' => 'R/P0.33M', + 'Continuously updated' => 'R/PT1S', + 'Monthly' => 'R/P1M', + 'Quarterly' => ' R/P3M', + 'Semimonthly' => 'R/P0.5M', + 'Three times a year' => 'R/P4M', + 'Weekly' => 'R/P1W', + ); +} diff --git a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.output.inc b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.output.inc index a1419b1b0..1dd5368c1 100644 --- a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.output.inc +++ b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.output.inc @@ -17,6 +17,19 @@ function open_data_schema_map_form_output_formats() { return $r; } +/** + * Returns a full, single output format array + */ +function open_data_schema_map_output_format_load($name) { + $output_formats = open_data_schema_map_retrieve_output_formats(); + if (in_array($name, array_keys($output_formats))) { + return $output_formats[$name]; + } + else { + return FALSE; + } +} + /** * Returns list of formats off hook_odsm_output_format implementations. */ @@ -58,7 +71,6 @@ function open_data_schema_map_odsm_output_format() { * Default json output. */ function open_data_schema_map_json_output($api, $results) { - drupal_add_http_header('Content-Type', 'application/json'); return drupal_json_encode($results); } @@ -67,7 +79,6 @@ function open_data_schema_map_json_output($api, $results) { */ function open_data_schema_map_json_pretty_output($api, $results) { // We are returning JSON, so tell the browser. - drupal_add_http_header('Content-Type', 'application/json'); if (isset($results)) { // The PHP version cannot change within a request. diff --git a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.pages.inc b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.pages.inc index 5262e08c3..e841100fc 100644 --- a/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.pages.inc +++ b/dkan/modules/contrib/open_data_schema_map/open_data_schema_map.pages.inc @@ -419,34 +419,37 @@ function open_data_schema_map_add_type(&$values, $mapping) { } /** - * Creates endpoint. + * Main endpoint callback */ function open_data_schema_map_endpoint($api) { + // Start by setting the content type header based on the API settings + if ($output_format = open_data_schema_map_output_format_load($api->outputformat)) { + foreach($output_format['headers'] as $key => $value) { + drupal_add_http_header($key, $value); + } + } + + // Check if a file cache exists, and simply return this if it does if (open_data_schema_map_file_cache_exits($api)) { - // This will only work for data.json (for now). $filename = open_data_schema_map_file_cache_name_helper($api); - drupal_add_http_header('Content-Type', 'application/json'); drupal_add_http_header('Expires', gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ob_clean(); flush(); readfile($filename); } + + // If not, render the results and output with the appropriate formatter else { $render = open_data_schema_map_render_api($api); $headers = $render['headers']; $result = $render['result']; - foreach ($headers as $key => $value) { - drupal_add_http_header($key, $value); - } - - $output_formats = open_data_schema_map_retrieve_output_formats(); - if (in_array($api->outputformat, array_keys($output_formats))) { - $function = $output_formats[$api->outputformat]['callback']; - foreach ($output_formats[$api->outputformat]['headers'] as $header => $value) { - - } + if ($output_format = open_data_schema_map_output_format_load($api->outputformat)) { + $function = $output_format['callback']; $response = $function($api, $result); + foreach ($headers as $key => $value) { + drupal_add_http_header($key, $value); + } echo $response; } else { diff --git a/dkan/modules/contrib/open_data_schema_map_dkan/README.md b/dkan/modules/contrib/open_data_schema_map_dkan/README.md index 50d869d2b..b3f6b3b0c 100644 --- a/dkan/modules/contrib/open_data_schema_map_dkan/README.md +++ b/dkan/modules/contrib/open_data_schema_map_dkan/README.md @@ -1,7 +1,7 @@ Open Data Schema Map DKAN ========================= -**NOTICE:** This module has been moved into [DKAN core](https://github.com/NuCivic/dkan) for release 7.x-1.13. To maintain backward compatibility with DKAN 7.x-1.12 and subsequent patch releases this project will remain on Github but new features will be applied directly to the DKAN core folder `modules/dkan/open_data_schema_map_dkan`. +**DEPRECATED:** This module has been moved into [DKAN core](https://github.com/NuCivic/dkan) for release 7.x-1.13. To maintain backward compatibility with DKAN 7.x-1.12 and subsequent patch releases this project will remain on Github but new features will be applied directly to the DKAN core folder `modules/dkan/open_data_schema_map_dkan`. Default [Open Data Schema Map](https://github.com/NuCivic/open_data_schema_map) endpoints for DKAN. Includes CKAN and Project Open Data endpoints. diff --git a/dkan/modules/contrib/recline/recline.field.inc b/dkan/modules/contrib/recline/recline.field.inc index 65d764628..c6b816a1c 100644 --- a/dkan/modules/contrib/recline/recline.field.inc +++ b/dkan/modules/contrib/recline/recline.field.inc @@ -176,7 +176,7 @@ function recline_field_widget_form(&$form, &$form_state, $field, $instance, $lan } // If file is already uploaded, but removed. elseif (isset($element['#entity']->{$element['#field_name']}) && $element['#entity']->{$element['#field_name']}) { - $default_value = $element['#entity']->{$element['#field_name']}[$element['#language']][$delta][$view]; + $default_value = isset($element['#entity']->{$element['#field_name']}[$element['#language']][$delta][$view]) ? $element['#entity']->{$element['#field_name']}[$element['#language']][$delta][$view] : ''; } // If selections are made, then file is uploaded. elseif (isset($elements[$delta]['#default_value']['view'][$view])) { @@ -413,6 +413,14 @@ function theme_recline_default_formatter($variables) { */ function recline_default_formatter_output($variables) { $file = $variables['item']; + + //Fix problem with missing information on file object. + if (!isset($file['uri']) && $file['fid']) { + $file_info = file_load($file['fid']); + $file_info = (array)$file_info; + $file = array_replace($file, $file_info); + } + $url = file_create_url($file['uri']); $icon = ''; @@ -496,10 +504,10 @@ function recline_default_formatter_output($variables) { $uuid = isset($variables['item']['entity']->uuid) ? $variables['item']['entity']->uuid : FALSE; $file_path = isset($variables['item']['uri']) ? file_create_url($variables['item']['uri']) : ''; $delimiter = isset($variables['item']['delimiter']) ? $variables['item']['delimiter'] : ','; - $real_path = drupal_realpath($variables['item']['uri']); + $real_path = drupal_realpath($file['uri']); $settings['recline'] = array( 'file' => $file_path, - 'fileType' => $variables['item']['filemime'], + 'fileType' => $file['filemime'], 'fileSize' => (file_exists($real_path)) ? filesize($real_path) : 0, 'delimiter' => $delimiter, 'uuid' => $uuid, diff --git a/dkan/modules/contrib/recline/recline.info b/dkan/modules/contrib/recline/recline.info index 8231454fa..bb65e3f8b 100644 --- a/dkan/modules/contrib/recline/recline.info +++ b/dkan/modules/contrib/recline/recline.info @@ -1,7 +1,7 @@ name = Recline.js Field description = Creates file field for visualizing data using Recline.js core = 7.x -version = 7.x-1.12.10 +version = 7.x-1.12.11 dependencies[] = libraries dependencies[] = file diff --git a/dkan/modules/contrib/recline/recline.js b/dkan/modules/contrib/recline/recline.js index e3db92369..1c3cf045e 100644 --- a/dkan/modules/contrib/recline/recline.js +++ b/dkan/modules/contrib/recline/recline.js @@ -154,7 +154,7 @@ break; case 'ckan': datasetOptions = { - endpoint: '/api', + endpoint: 'api', id: uuid, backend: 'ckan' }; diff --git a/dkan/modules/contrib/recline/recline.module b/dkan/modules/contrib/recline/recline.module index 26d0c772b..f92f4e88b 100644 --- a/dkan/modules/contrib/recline/recline.module +++ b/dkan/modules/contrib/recline/recline.module @@ -191,15 +191,18 @@ function recline_libraries_info() { 'css/map.css', 'css/multiview.css', 'css-site/pygments.css', - 'vendor/bootstrap/3.2.0/css/bootstrap.css', ), 'js' => array( - 'vendor/bootstrap/3.2.0/js/bootstrap.js', 'dist/recline.js', ), ), ); + if(!is_boostrap_available()) { + $libraries['recline']['files']['js'][] = 'vendor/bootstrap/3.2.0/js/bootstrap.js'; + $libraries['recline']['files']['css'][] = 'vendor/bootstrap/3.2.0/css/bootstrap.css'; + } + $libraries['lodash'] = array( 'name' => 'lodash', 'vendor url' => 'https://github.com/lodash/lodash', @@ -385,6 +388,28 @@ function recline_libraries_info() { return $libraries; } +/** + * Check if bootstrap is already added. + */ +function is_boostrap_available(){ + global $theme; + $themes = list_themes(); + $base_theme = drupal_find_base_themes($themes, $theme); + + if($theme == 'nuboot_radix' || in_array('NuBoot Radix', $base_theme)) { + return TRUE; + } else { + $re = '/bootstrap(\\.min)?\\.js/'; + $js = array_keys(drupal_add_js()); + foreach ($js as $j) { + if(preg_match($re, $j)) { + return TRUE; + } + } + return FALSE; + } +} + /** * Discovers extension based off of mimetype. * diff --git a/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.features.field_instance.inc b/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.features.field_instance.inc index 2e8ec623b..c959020d0 100644 --- a/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.features.field_instance.inc +++ b/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.features.field_instance.inc @@ -19,9 +19,8 @@ function dkan_data_dashboard_field_default_field_instances() { 'display' => array( 'default' => array( 'label' => 'above', - 'module' => 'text', 'settings' => array(), - 'type' => 'text_default', + 'type' => 'hidden', 'weight' => 1, ), 'search_result' => array( diff --git a/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info b/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info index 080702390..4133ced33 100644 --- a/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info +++ b/dkan/modules/dkan/dkan_data_dashboard/dkan_data_dashboard.info @@ -2,7 +2,7 @@ name = DKAN Sitewide Data Dashboard description = DKAN module for Data Dashboard content type core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_data_dashboard dependencies[] = ctools dependencies[] = features diff --git a/dkan/modules/dkan/dkan_data_story/dkan_data_story.features.field_instance.inc b/dkan/modules/dkan/dkan_data_story/dkan_data_story.features.field_instance.inc index 5611a400b..02f4b9894 100644 --- a/dkan/modules/dkan/dkan_data_story/dkan_data_story.features.field_instance.inc +++ b/dkan/modules/dkan/dkan_data_story/dkan_data_story.features.field_instance.inc @@ -19,9 +19,8 @@ function dkan_data_story_field_default_field_instances() { 'display' => array( 'default' => array( 'label' => 'hidden', - 'module' => 'text', 'settings' => array(), - 'type' => 'text_default', + 'type' => 'hidden', 'weight' => 2, ), 'search_result' => array( @@ -71,12 +70,7 @@ function dkan_data_story_field_default_field_instances() { 'display' => array( 'default' => array( 'label' => 'hidden', - 'module' => 'image', - 'settings' => array( - 'image_link' => '', - 'image_style' => 'story_image_full', - ), - 'type' => 'image', + 'type' => 'hidden', 'weight' => 1, ), 'search_result' => array( @@ -168,9 +162,8 @@ function dkan_data_story_field_default_field_instances() { 'display' => array( 'default' => array( 'label' => 'hidden', - 'module' => 'taxonomy', 'settings' => array(), - 'type' => 'taxonomy_term_reference_link', + 'type' => 'hidden', 'weight' => 3, ), 'search_result' => array( diff --git a/dkan/modules/dkan/dkan_data_story/dkan_data_story.info b/dkan/modules/dkan/dkan_data_story/dkan_data_story.info index b221ae33e..e42a6213e 100644 --- a/dkan/modules/dkan/dkan_data_story/dkan_data_story.info +++ b/dkan/modules/dkan/dkan_data_story/dkan_data_story.info @@ -2,7 +2,7 @@ name = DKAN Data Story description = Story building features for NuCivic Data. core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_data_story dependencies[] = dkan_sitewide dependencies[] = dkan_sitewide_menu diff --git a/dkan/modules/dkan/dkan_dataset/css/dkan_dataset.css b/dkan/modules/dkan/dkan_dataset/css/dkan_dataset.css index f8d8db2f6..c75dedaff 100644 --- a/dkan/modules/dkan/dkan_dataset/css/dkan_dataset.css +++ b/dkan/modules/dkan/dkan_dataset/css/dkan_dataset.css @@ -332,7 +332,7 @@ li .heading:hover { .item-list .list-group li { margin:0; } -.node-type-resource .item-list .list-group li { +.node-type-resource .pane-dkan-dataset-dkan-dataset-resource-nodes .item-list .list-group li { margin: -1px; } .node-type-resource .list-group-item { @@ -436,6 +436,10 @@ li .heading:hover { top: auto; right: auto; } +.resource-list .count-resource { + font-size: 12px; + vertical-align: baseline; +} .resource-list .label { -webkit-border-radius: 3px; -moz-border-radius: 3px; @@ -443,10 +447,10 @@ li .heading:hover { background-color: olive; color: white; display: inline; - font-size: 11px; + font-size: 12px; font-weight: bold; - line-height: 14px; - margin: 0 0 0 5px; + line-height: 16px; + margin: -3px 5px 0; padding: 1px 4px 2px; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); vertical-align: baseline; diff --git a/dkan/modules/dkan/dkan_dataset/dkan_dataset.forms.inc b/dkan/modules/dkan/dkan_dataset/dkan_dataset.forms.inc index 6672b3f7c..099df579f 100644 --- a/dkan/modules/dkan/dkan_dataset/dkan_dataset.forms.inc +++ b/dkan/modules/dkan/dkan_dataset/dkan_dataset.forms.inc @@ -185,7 +185,8 @@ function dkan_dataset_form_alter(&$form, &$form_state, $form_id) { } else { $form['actions']['submit']['#value'] = t('Finish'); - $form['#action'] = url('node/add/dataset'); + // This is here for AJAX compatibililty but causing other problems; commenting out for now + // $form['#action'] = url('node/add/dataset'); } } if ($form_id == 'resource_node_form') { @@ -263,6 +264,9 @@ function dkan_dataset_form_alter(&$form, &$form_state, $form_id) { } else { $form['#action'] = url('node/add/resource'); + if (drupal_match_path(current_path(), 'node/*/edit')) { + $form['#action'] = url('node/' . $form['#node']->nid . '/edit'); + } } if (variable_get('dkan_dataset_form_additional_info', 1 )) { if (isset($query['dataset']) || (isset($form_state['input']['field_dataset_ref']['und'][0]))) { diff --git a/dkan/modules/dkan/dkan_dataset/dkan_dataset.info b/dkan/modules/dkan/dkan_dataset/dkan_dataset.info index aafc07e62..5ad3b58ef 100644 --- a/dkan/modules/dkan/dkan_dataset/dkan_dataset.info +++ b/dkan/modules/dkan/dkan_dataset/dkan_dataset.info @@ -2,7 +2,7 @@ name = DKAN Dataset description = Custom elements for Datasets. core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_dataset dependencies[] = autocomplete_deluxe dependencies[] = beautytips diff --git a/dkan/modules/dkan/dkan_dataset/dkan_dataset.make b/dkan/modules/dkan/dkan_dataset/dkan_dataset.make index 50579864f..d0525af0a 100644 --- a/dkan/modules/dkan/dkan_dataset/dkan_dataset.make +++ b/dkan/modules/dkan/dkan_dataset/dkan_dataset.make @@ -13,10 +13,10 @@ includes[leaflet_draw_widget_make] = https://raw.githubusercontent.com/NuCivic/l ; Recline specific projects[recline][download][type] = git projects[recline][download][url] = https://github.com/NuCivic/recline.git -projects[recline][download][tag] = 7.x-1.12.10 +projects[recline][download][tag] = 7.x-1.12.11 projects[recline][subdir] = contrib -includes[recline_make] = https://raw.githubusercontent.com/NuCivic/recline/7.x-1.12.10/recline.make +includes[recline_make] = https://raw.githubusercontent.com/NuCivic/recline/7.x-1.12.11/recline.make ; Contrib Modules projects[autocomplete_deluxe][subdir] = contrib @@ -139,13 +139,13 @@ projects[og_extras][type] = module projects[open_data_schema_map][type] = module projects[open_data_schema_map][download][type] = git projects[open_data_schema_map][download][url] = https://github.com/NuCivic/open_data_schema_map.git -projects[open_data_schema_map][download][revision] = 9c5581b9344f9f39808da32ea59e59aa19f0e555 +projects[open_data_schema_map][download][tag] = 7.x-1.12.11 projects[open_data_schema_map][subdir] = contrib projects[open_data_schema_map_dkan][type] = module projects[open_data_schema_map_dkan][download][type] = git projects[open_data_schema_map_dkan][download][url] = https://github.com/NuCivic/open_data_schema_map_dkan.git -projects[open_data_schema_map_dkan][download][revision] = 439ac4b4bfde2d45f559fc31de1a9ceba118d503 +projects[open_data_schema_map_dkan][download][revision] = 50bb90ff0539f38d8e4256d0168698d393816966 projects[open_data_schema_map_dkan][subdir] = contrib projects[pathauto][version] = 1.2 diff --git a/dkan/modules/dkan/dkan_dataset/dkan_dataset.theme.inc b/dkan/modules/dkan/dkan_dataset/dkan_dataset.theme.inc index ac4a2d480..d944f6485 100644 --- a/dkan/modules/dkan/dkan_dataset/dkan_dataset.theme.inc +++ b/dkan/modules/dkan/dkan_dataset/dkan_dataset.theme.inc @@ -292,7 +292,12 @@ function theme_dkan_dataset_resource_teaser_view($vars) { } } foreach ($links_data as $term_name => $link) { - $links[] = l($term_name, $link['url'], $link['link']); + if($link['count'] > 1) { + $links[] = '' . $link['count'] . 'x ' . l($term_name, $link['url'], $link['link']); + } + else { + $links[] = l($term_name, $link['url'], $link['link']); + } } $output = theme('item_list', array('items' => $links, 'attributes' => array('class' => array('resource-list', 'clearfix')))); } diff --git a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.info b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.info index eeb403890..b8b634ac4 100644 --- a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.info +++ b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_content_types/dkan_dataset_content_types.info @@ -2,7 +2,7 @@ name = DKAN Dataset Content Types description = Custom elements for Datasets. core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_dataset_content_types dependencies[] = autocomplete_deluxe dependencies[] = ctools diff --git a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_voting/dkan_dataset_voting.info b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_voting/dkan_dataset_voting.info index eebd10329..08a406c69 100644 --- a/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_voting/dkan_dataset_voting.info +++ b/dkan/modules/dkan/dkan_dataset/modules/dkan_dataset_voting/dkan_dataset_voting.info @@ -2,7 +2,7 @@ name = DKAN Dataset Voting description = Adds voting to datasets. core = 7.x package = DKAN Features -version = 7.x-1.12.10 +version = 7.x-1.12.11 php = 5.2.4 project = dkan_dataset_voting dependencies[] = ajax_comments diff --git a/dkan/modules/dkan/dkan_datastore/dkan_datastore.info b/dkan/modules/dkan/dkan_datastore/dkan_datastore.info index c0ed325d4..da01188d4 100644 --- a/dkan/modules/dkan/dkan_datastore/dkan_datastore.info +++ b/dkan/modules/dkan/dkan_datastore/dkan_datastore.info @@ -2,7 +2,7 @@ name = DKAN Datastore description = Creates a datastore designed to make it easy to share open data. core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 dependencies[] = dkan_datastore_api dependencies[] = entity dependencies[] = feeds diff --git a/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/dkan_datastore_api.info b/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/dkan_datastore_api.info index 99d2645d2..5e980e098 100644 --- a/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/dkan_datastore_api.info +++ b/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_api/dkan_datastore_api.info @@ -1,7 +1,7 @@ name = DKAN Datastore API description = Access datastore info over json. package = DKAN API -version = 7.x-1.12.10 +version = 7.x-1.12.11 core = 7.x dependencies[] = services files[] = tests/dkan_datastore_api.test diff --git a/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_fast_import/dkan_datastore_fast_import.info b/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_fast_import/dkan_datastore_fast_import.info index d12f4d7da..88d4c1ee0 100644 --- a/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_fast_import/dkan_datastore_fast_import.info +++ b/dkan/modules/dkan/dkan_datastore/modules/dkan_datastore_fast_import/dkan_datastore_fast_import.info @@ -2,5 +2,5 @@ name = DKAN Datastore Fast Import description = Enable fast import for resources core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 dependencies[] = dkan_datastore diff --git a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.features.field_instance.inc b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.features.field_instance.inc index 820e56a7d..2621da3cf 100644 --- a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.features.field_instance.inc +++ b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.features.field_instance.inc @@ -19,9 +19,8 @@ function dkan_sitewide_field_default_field_instances() { 'display' => array( 'default' => array( 'label' => 'hidden', - 'module' => 'text', 'settings' => array(), - 'type' => 'text_default', + 'type' => 'hidden', 'weight' => 0, ), 'search_result' => array( diff --git a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info index 595baa07c..12fb27dd0 100644 --- a/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info +++ b/dkan/modules/dkan/dkan_sitewide/dkan_sitewide.info @@ -2,7 +2,7 @@ name = DKAN Sitewide description = Sitewide elements for DKAN. core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_sitewide dependencies[] = colorizer dependencies[] = conditional_styles diff --git a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_panelizer/dkan_sitewide_panelizer.info b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_panelizer/dkan_sitewide_panelizer.info index edf16428d..d517b58c0 100644 --- a/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_panelizer/dkan_sitewide_panelizer.info +++ b/dkan/modules/dkan/dkan_sitewide/modules/dkan_sitewide_panelizer/dkan_sitewide_panelizer.info @@ -2,7 +2,7 @@ name = DKAN Sitewide Panelizer description = DKAN module for simplifying the creation of panelized content core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_sitewide_panelizer dependencies[] = panelizer dependencies[] = panels diff --git a/dkan/modules/dkan/dkan_topics/dkan_topics.features.field_instance.inc b/dkan/modules/dkan/dkan_topics/dkan_topics.features.field_instance.inc index ea0cb39f5..a0cca3b29 100644 --- a/dkan/modules/dkan/dkan_topics/dkan_topics.features.field_instance.inc +++ b/dkan/modules/dkan/dkan_topics/dkan_topics.features.field_instance.inc @@ -19,9 +19,8 @@ function dkan_topics_field_default_field_instances() { 'display' => array( 'default' => array( 'label' => 'hidden', - 'module' => 'dkan_topics', 'settings' => array(), - 'type' => 'dkan_topic_formatter', + 'type' => 'hidden', 'weight' => 0, ), 'search_result' => array( @@ -113,9 +112,8 @@ function dkan_topics_field_default_field_instances() { 'display' => array( 'default' => array( 'label' => 'hidden', - 'module' => 'dkan_topics', 'settings' => array(), - 'type' => 'dkan_topic_formatter', + 'type' => 'hidden', 'weight' => 0, ), 'search_result' => array( diff --git a/dkan/modules/dkan/dkan_topics/dkan_topics.info b/dkan/modules/dkan/dkan_topics/dkan_topics.info index 0bd9a4c63..fcca1be58 100755 --- a/dkan/modules/dkan/dkan_topics/dkan_topics.info +++ b/dkan/modules/dkan/dkan_topics/dkan_topics.info @@ -2,7 +2,7 @@ name = DKAN Topics description = Categorize your data with topics to help users find what they are looking for. core = 7.x package = DKAN -version = 7.x-1.12.10 +version = 7.x-1.12.11 dependencies[] = color_field dependencies[] = conditional_fields dependencies[] = dkan_dataset_content_types diff --git a/dkan/modules/dkan/dkan_topics/dkan_topics.make b/dkan/modules/dkan/dkan_topics/dkan_topics.make index 50f0adc71..23fef4f1d 100755 --- a/dkan/modules/dkan/dkan_topics/dkan_topics.make +++ b/dkan/modules/dkan/dkan_topics/dkan_topics.make @@ -14,7 +14,7 @@ projects[taxonomy_menu][version] = 1.5 projects[color_field][version] = 1.8 projects[color_field][patch][2696505] = https://www.drupal.org/files/issues/color_field-requirements-2696505-v2.patch projects[entity_path][version] = 1.x-dev -projects[entity_path][patch][2809655] = https://www.drupal.org/files/issues/entity-path-mysql-5-7_1.diff +projects[entity_path][patch][2809655] = https://www.drupal.org/files/issues/entity-path-mysql-5-7_3.diff projects[globalredirect][version] = 1.5 ; Patches diff --git a/dkan/modules/dkan/dkan_topics/modules/dkan_default_topics/dkan_default_topics.info b/dkan/modules/dkan/dkan_topics/modules/dkan_default_topics/dkan_default_topics.info index cbf42a019..777bf2961 100755 --- a/dkan/modules/dkan/dkan_topics/modules/dkan_default_topics/dkan_default_topics.info +++ b/dkan/modules/dkan/dkan_topics/modules/dkan_default_topics/dkan_default_topics.info @@ -2,7 +2,7 @@ name = DKAN Default Topics description = Default topic terms. core = 7.x package = DKAN Features -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_default_topics dependencies[] = dkan_topics dependencies[] = taxonomy_fixtures diff --git a/dkan/modules/dkan/dkan_workflow/dkan_workflow.info b/dkan/modules/dkan/dkan_workflow/dkan_workflow.info index 66fa529d7..f65fa8e3f 100644 --- a/dkan/modules/dkan/dkan_workflow/dkan_workflow.info +++ b/dkan/modules/dkan/dkan_workflow/dkan_workflow.info @@ -2,7 +2,7 @@ name = DKAN Workflow description = NuCivic Data publication workflow and related modules core = 7.x package = DKAN Workflow -version = 7.x-1.12.10 +version = 7.x-1.12.11 project = dkan_workflow dependencies[] = dkan_workflow_permissions dependencies[] = entity diff --git a/dkan/themes/contrib/nuboot_radix/assets/css/ie8.css.map b/dkan/themes/contrib/nuboot_radix/assets/css/ie8.css.map index 3365b3887..f1f56369e 100644 --- a/dkan/themes/contrib/nuboot_radix/assets/css/ie8.css.map +++ b/dkan/themes/contrib/nuboot_radix/assets/css/ie8.css.map @@ -1 +1 @@ -{"version":3,"sources":["../stdin","base/_variables.scss"],"names":[],"mappings":"AAKA;EACC,2CAA0C,EAO1C;EARD;IAGE,oBCgB6B;IDf7B,aAAY;IACZ,0BAAY;IACZ,kEAAkE,EAClE;;AAEF;EACC,aAAY,EACZ;;AACD;EACC,uBAAuB,EACvB;;AACD;EAEI,eAAe,EAChB;;AAHH;EAKI,aAAa,EACd;;AANH;EASM,sBAAsB;EACtB,WAAU;EACV,gBAAe;EACf,oBAAoB;EACpB,oBAAmB;EACnB,uBAAsB;EACtB,wBAAwB;EACxB,mBAAkB;EAClB,eCbyB;EDczB,aAAa;EACb,eAAc;EACd,WAAU,EAKX;EAzBL;IAuBQ,cAAc,EACf;;AAxBP;;EA4BM,oBAAoB;EACpB,eCxByB;EDyBzB,2BAA2B,EAC5B","file":"ie8.css","sourcesContent":[null,"// Variables\n// -----------------------------------------------------------------------------\n\n// bootstrap specific variable. set to false if not using ruby + asset pipeline / compass.\n$bootstrap-sass-asset-helper: false !default;\n\n// Global values\n// -----------------------------------------------------------------------------\n\n// Grays\n// -----------------------------------------------------------------------------\n\n$gray-darker: lighten(#000, 13.5%) !default; // #222\n$gray-dark: lighten(#000, 20%) !default; // #333\n$gray: lighten(#000, 33.5%) !default; // #555\n$gray-light: lighten(#000, 60%) !default; // #999\n$gray-lighter: lighten(#000, 93.5%) !default; // #eee\n$smoke: #ccc;\n$shade: #F3F3F3;\n$border: #ddd;\n\n// Brand colors\n// -----------------------------------------------------------------------------\n\n$brand-primary: #0A77BD;\n$brand-secondary: #002245;\n$brand-success: #5cb85c !default;\n$brand-warning: #FFE285 !default;\n$brand-danger: #d9534f !default;\n$brand-info: #5bc0de !default;\n\n// Scaffolding\n// -----------------------------------------------------------------------------\n\n$body-bg: #fff !default;\n$text-color: $gray-dark !default;\n\n// Links\n// -----------------------------------------------------------------------------\n\n$link-color: $brand-primary !default;\n$link-hover-color: darken($link-color, 15%) !default;\n\n// Typography\n// -----------------------------------------------------------------------------\n\n$font-base:\t\t\t\t\t\t\t\t'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-sans-serif: 'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n$font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base: $font-base !default;\n\n$font-size-base: 16px !default;\n$font-size-large: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-small: ceil($font-size-base * 0.85) !default; // ~12px\n\n$font-size-h1: floor($font-size-base * 2.6) !default; // ~36px\n$font-size-h2: floor($font-size-base * 2.15) !default; // ~30px\n$font-size-h3: ceil($font-size-base * 1.7) !default; // ~24px\n$font-size-h4: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-h5: $font-size-base !default;\n$font-size-h6: ceil($font-size-base * 0.85) !default; // ~12px\n\n$line-height-base: 2 !default; // 20/14\n$line-height-computed: floor($font-size-base * $line-height-base) !default; // ~20px\n\n$headings-font-family: $font-family-base !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n\n// Iconography\n// -----------------------------------------------------------------------------\n\n$icon-fa: 'FontAwesome';\n\n// Components\n// -----------------------------------------------------------------------------\n// Based on 14px font-size and 1.428 line-height (~20px to start)\n\n$padding-base-vertical: 6px !default;\n$padding-base-horizontal: 12px !default;\n\n$padding-large-vertical: 10px !default;\n$padding-large-horizontal: 16px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 10px !default;\n\n$padding-xs-vertical: 1px !default;\n$padding-xs-horizontal: 5px !default;\n\n$line-height-large: 1.33 !default;\n$line-height-small: 1.5 !default;\n\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-small: 3px !default;\n\n$component-active-color: #fff !default;\n$component-active-bg: $brand-primary !default;\n\n$caret-width-base: 4px !default;\n$caret-width-large: 5px !default;\n\n// Tables\n// -----------------------------------------------------------------------------\n\n$table-cell-padding: 8px !default;\n$table-condensed-cell-padding: 5px !default;\n\n$table-bg: transparent !default; // overall background-color\n$table-bg-accent: #f9f9f9 !default; // for striping\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n$table-border-color: #ddd !default; // table and cell border\n\n\n// Buttons\n// -----------------------------------------------------------------------------\n\n$btn-font-weight: normal !default;\n\n$btn-default-color: #333 !default;\n$btn-default-bg: #fff !default;\n$btn-default-border: #ccc !default;\n\n$btn-primary-color: #fff !default;\n$btn-primary-bg: $brand-primary !default;\n$btn-primary-border: darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color: #fff !default;\n$btn-success-bg: $brand-success !default;\n$btn-success-border: darken($btn-success-bg, 5%) !default;\n\n$btn-warning-color: #fff !default;\n$btn-warning-bg: $brand-warning !default;\n$btn-warning-border: darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color: #fff !default;\n$btn-danger-bg: $brand-danger !default;\n$btn-danger-border: darken($btn-danger-bg, 5%) !default;\n\n$btn-info-color: #fff !default;\n$btn-info-bg: $brand-info !default;\n$btn-info-border: darken($btn-info-bg, 5%) !default;\n\n$btn-link-disabled-color: $gray-light !default;\n\n\n// Forms\n// -----------------------------------------------------------------------------\n\n$input-bg: #fff !default;\n$input-bg-disabled: $gray-lighter !default;\n\n$input-color: $gray !default;\n$input-border: #ccc !default;\n$input-border-radius: $border-radius-base !default;\n$input-border-focus: #66afe9 !default;\n\n$input-color-placeholder: $gray-light !default;\n\n$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n$legend-color: $gray-dark !default;\n$legend-border-color: #e5e5e5 !default;\n\n$input-group-addon-bg: $gray-lighter !default;\n$input-group-addon-border-color: $input-border !default;\n\n\n// Dropdowns\n// -----------------------------------------------------------------------------\n\n$dropdown-bg: #fff !default;\n$dropdown-border: rgba(0,0,0,.15) !default;\n$dropdown-fallback-border: #ccc !default;\n$dropdown-divider-bg: #e5e5e5 !default;\n\n$dropdown-link-color: $gray-dark !default;\n$dropdown-link-hover-color: darken($gray-dark, 5%) !default;\n$dropdown-link-hover-bg: #f5f5f5 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-light !default;\n\n$dropdown-header-color: $gray-light !default;\n\n\n// COMPONENT VARIABLES\n// ------------------------------------------------------------------------------------------------------\n\n\n// Z-index master list\n// -----------------------------------------------------------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n\n$zindex-navbar: 1000 !default;\n$zindex-dropdown: 1000 !default;\n$zindex-popover: 1010 !default;\n$zindex-tooltip: 1030 !default;\n$zindex-navbar-fixed: 1030 !default;\n$zindex-modal-background: 1040 !default;\n$zindex-modal: 1050 !default;\n\n// Media queries breakpoints\n// ------------------------------------------------------------------------------------------------------\n\n// Extra small screen / phone\n// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1\n$screen-xs: 480px !default;\n$screen-xs-min: $screen-xs !default;\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n// Grid system\n// ------------------------------------------------------------------------------------------------------\n\n// Number of columns in the grid system\n$grid-columns: 12 !default;\n// Padding, to be divided by two and applied to the left and right of all columns\n$grid-gutter-width: 30px !default;\n\n// Navbar collapse\n\n// Point at which the navbar becomes uncollapsed\n$grid-float-breakpoint: $screen-sm-min !default;\n// Point at which the navbar begins collapsing\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n// Navbar\n// -----------------------------------------------------------------------------\n\n// Basics of a navbar\n$navbar-height: 50px !default;\n$navbar-margin-bottom: $line-height-computed !default;\n$navbar-border-radius: $border-radius-base !default;\n$navbar-padding-horizontal: floor($grid-gutter-width / 2) !default;\n$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;\n\n$navbar-default-color: #777 !default;\n$navbar-default-bg: #f8f8f8 !default;\n$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color: #777 !default;\n$navbar-default-link-hover-color: #333 !default;\n$navbar-default-link-hover-bg: transparent !default;\n$navbar-default-link-active-color: #555 !default;\n$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color: #ccc !default;\n$navbar-default-link-disabled-bg: transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color: $navbar-default-link-color !default;\n$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg: transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg: #ddd !default;\n$navbar-default-toggle-icon-bar-bg: #ccc !default;\n$navbar-default-toggle-border-color: #ddd !default;\n\n\n// Inverted navbar\n//\n// Reset inverted navbar basics\n$navbar-inverse-color: $gray-light !default;\n$navbar-inverse-bg: #222 !default;\n$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color: $gray-light !default;\n$navbar-inverse-link-hover-color: #fff !default;\n$navbar-inverse-link-hover-bg: transparent !default;\n$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color: #444 !default;\n$navbar-inverse-link-disabled-bg: transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color: $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color: #fff !default;\n$navbar-inverse-brand-hover-bg: transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg: #333 !default;\n$navbar-inverse-toggle-icon-bar-bg: #fff !default;\n$navbar-inverse-toggle-border-color: #333 !default;\n\n\n// Navs\n// -----------------------------------------------------------------------------\n\n$nav-link-padding: 10px 15px !default;\n$nav-link-hover-bg: $gray-lighter !default;\n\n$nav-disabled-link-color: $gray-light !default;\n$nav-disabled-link-hover-color: $gray-light !default;\n\n$nav-open-link-hover-color: #fff !default;\n\n// Tabs\n$nav-tabs-border-color: #ddd !default;\n\n$nav-tabs-link-hover-border-color: $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg: $body-bg !default;\n$nav-tabs-active-link-hover-color: $gray !default;\n$nav-tabs-active-link-hover-border-color: #ddd !default;\n\n$nav-tabs-justified-link-border-color: #ddd !default;\n$nav-tabs-justified-active-link-border-color: $body-bg !default;\n\n// Pills\n$nav-pills-border-radius: $border-radius-base !default;\n$nav-pills-active-link-hover-bg: $component-active-bg !default;\n$nav-pills-active-link-hover-color: $component-active-color !default;\n\n\n// Pagination\n// -----------------------------------------------------------------------------\n\n$pagination-bg: #fff !default;\n$pagination-border: #ddd !default;\n\n$pagination-hover-bg: $gray-lighter !default;\n\n$pagination-active-bg: $brand-primary !default;\n$pagination-active-color: #fff !default;\n\n$pagination-disabled-color: $gray-light !default;\n\n\n// Pager\n// -----------------------------------------------------------------------------\n\n$pager-border-radius: 15px !default;\n$pager-disabled-color: $gray-light !default;\n\n\n// Jumbotron\n// -----------------------------------------------------------------------------\n\n$jumbotron-padding: 30px !default;\n$jumbotron-color: inherit !default;\n$jumbotron-bg: $gray-lighter !default;\n$jumbotron-heading-color: inherit !default;\n$jumbotron-font-size: ceil($font-size-base * 1.5) !default;\n\n\n// Form states and alerts\n// -----------------------------------------------------------------------------\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n// Tooltips\n// -----------------------------------------------------------------------------\n$tooltip-max-width: 200px !default;\n$tooltip-color: #fff !default;\n$tooltip-bg: #000 !default;\n\n$tooltip-arrow-width: 5px !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n// -----------------------------------------------------------------------------\n$popover-bg: #fff !default;\n$popover-max-width: 276px !default;\n$popover-border-color: rgba(0,0,0,.2) !default;\n$popover-fallback-border-color: #ccc !default;\n\n$popover-title-bg: darken($popover-bg, 3%) !default;\n\n$popover-arrow-width: 10px !default;\n$popover-arrow-color: #fff !default;\n\n$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;\n$popover-arrow-outer-color: rgba(0,0,0,.25) !default;\n$popover-arrow-outer-fallback-color: #999 !default;\n\n\n// Labels\n// -----------------------------------------------------------------------------\n\n$label-default-bg: $gray-light !default;\n$label-primary-bg: $brand-primary !default;\n$label-success-bg: $brand-success !default;\n$label-info-bg: $brand-info !default;\n$label-warning-bg: $brand-warning !default;\n$label-danger-bg: $brand-danger !default;\n\n$label-color: #fff !default;\n$label-link-hover-color: #fff !default;\n\n\n// Modals\n// -----------------------------------------------------------------------------\n$modal-inner-padding: 20px !default;\n\n$modal-title-padding: 15px !default;\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: #fff !default;\n$modal-content-border-color: rgba(0,0,0,.2) !default;\n$modal-content-fallback-border-color: #999 !default;\n\n$modal-backdrop-bg: #000 !default;\n$modal-header-border-color: #e5e5e5 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n\n\n// Alerts\n// -----------------------------------------------------------------------------\n$alert-padding: 15px !default;\n$alert-border-radius: $border-radius-base !default;\n$alert-link-font-weight: bold !default;\n\n$alert-success-bg: $state-success-bg !default;\n$alert-success-text: $state-success-text !default;\n$alert-success-border: $state-success-border !default;\n\n$alert-info-bg: $state-info-bg !default;\n$alert-info-text: $state-info-text !default;\n$alert-info-border: $state-info-border !default;\n\n$alert-warning-bg: $state-warning-bg !default;\n$alert-warning-text: $state-warning-text !default;\n$alert-warning-border: $state-warning-border !default;\n\n$alert-danger-bg: $state-danger-bg !default;\n$alert-danger-text: $state-danger-text !default;\n$alert-danger-border: $state-danger-border !default;\n\n\n// Progress bars\n// -----------------------------------------------------------------------------\n$progress-bg: #f5f5f5 !default;\n$progress-bar-color: #fff !default;\n\n$progress-bar-bg: $brand-primary !default;\n$progress-bar-success-bg: $brand-success !default;\n$progress-bar-warning-bg: $brand-warning !default;\n$progress-bar-danger-bg: $brand-danger !default;\n$progress-bar-info-bg: $brand-info !default;\n\n\n// List group\n// -----------------------------------------------------------------------------\n$list-group-bg: #fff !default;\n$list-group-border: #ddd !default;\n$list-group-border-radius: $border-radius-base !default;\n\n$list-group-hover-bg: #f5f5f5 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border: $list-group-active-bg !default;\n\n$list-group-link-color: #555 !default;\n$list-group-link-heading-color: #333 !default;\n\n\n// Panels\n// -----------------------------------------------------------------------------\n$panel-bg: #fff !default;\n$panel-inner-border: #ddd !default;\n$panel-border-radius: $border-radius-base !default;\n$panel-footer-bg: #f5f5f5 !default;\n\n$panel-default-text: $gray-dark !default;\n$panel-default-border: #ddd !default;\n$panel-default-heading-bg: #f5f5f5 !default;\n\n$panel-primary-text: #fff !default;\n$panel-primary-border: $brand-primary !default;\n$panel-primary-heading-bg: $brand-primary !default;\n\n$panel-success-text: $state-success-text !default;\n$panel-success-border: $state-success-border !default;\n$panel-success-heading-bg: $state-success-bg !default;\n\n$panel-warning-text: $state-warning-text !default;\n$panel-warning-border: $state-warning-border !default;\n$panel-warning-heading-bg: $state-warning-bg !default;\n\n$panel-danger-text: $state-danger-text !default;\n$panel-danger-border: $state-danger-border !default;\n$panel-danger-heading-bg: $state-danger-bg !default;\n\n$panel-info-text: $state-info-text !default;\n$panel-info-border: $state-info-border !default;\n$panel-info-heading-bg: $state-info-bg !default;\n\n\n// Thumbnails\n// -----------------------------------------------------------------------------\n$thumbnail-padding: 4px !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border: #ddd !default;\n$thumbnail-border-radius: $border-radius-base !default;\n\n$thumbnail-caption-color: $text-color !default;\n$thumbnail-caption-padding: 9px !default;\n\n\n// Wells\n// -----------------------------------------------------------------------------\n$well-bg: #f5f5f5 !default;\n\n\n// Badges\n// -----------------------------------------------------------------------------\n$badge-color: #fff !default;\n$badge-link-hover-color: #fff !default;\n$badge-bg: $gray-light !default;\n\n$badge-active-color: $link-color !default;\n$badge-active-bg: #fff !default;\n\n$badge-font-weight: bold !default;\n$badge-line-height: 1 !default;\n$badge-border-radius: 10px !default;\n\n\n// Breadcrumbs\n// -----------------------------------------------------------------------------\n$breadcrumb-bg: #f5f5f5 !default;\n$breadcrumb-color: #ccc !default;\n$breadcrumb-active-color: $gray-light !default;\n$breadcrumb-separator: \"/\" !default;\n\n\n// Carousel\n// ------------------------\n\n$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color: #fff !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-font-size: 20px !default;\n\n$carousel-indicator-active-bg: #fff !default;\n$carousel-indicator-border-color: #fff !default;\n\n$carousel-caption-color: #fff !default;\n\n\n// Close\n// ------------------------\n$close-font-weight: bold !default;\n$close-color: #000 !default;\n$close-text-shadow: 0 1px 0 #fff !default;\n\n\n// Code\n// ------------------------\n$code-color: #c7254e !default;\n$code-bg: #f9f2f4 !default;\n\n$pre-bg: #f5f5f5 !default;\n$pre-color: $gray-dark !default;\n$pre-border-color: #ccc !default;\n$pre-scrollable-max-height: 340px !default;\n\n// Type\n// ------------------------\n$text-muted: $gray-light !default;\n$abbr-border-color: $gray-light !default;\n$headings-small-color: $gray-light !default;\n$blockquote-small-color: $gray-light !default;\n$blockquote-border-color: $gray-lighter !default;\n$page-header-border-color: $gray-lighter !default;\n\n// Miscellaneous\n// -----------------------------------------------------------------------------\n\n// Hr border color\n$hr-border: $gray-lighter !default;\n\n// Horizontal forms & lists\n$component-offset-horizontal: 180px !default;\n\n\n// Container sizes\n// ------------------------------------------------------------------------------------------------------\n\n// Small screen / tablet\n$container-tablet: ((720px + $grid-gutter-width)) !default;\n$container-sm: $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop: ((940px + $grid-gutter-width)) !default;\n$container-md: $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop: ((1140px + $grid-gutter-width)) !default;\n$container-lg: $container-large-desktop !default;\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["../stdin","base/_variables.scss"],"names":[],"mappings":"AAKA;EACC,2CAA0C,EAO1C;EARD;IAGE,oBCgB6B;IDf7B,aAAY;IACZ,0BAAY;IACZ,kEAAkE,EAClE;;AAEF;EACC,aAAY,EACZ;;AACD;EACC,uBAAuB,EACvB;;AACD;EAEI,eAAe,EAChB;;AAHH;EAKI,aAAa,EACd;;AANH;EASM,sBAAsB;EACtB,WAAU;EACV,gBAAe;EACf,oBAAoB;EACpB,oBAAmB;EACnB,uBAAsB;EACtB,wBAAwB;EACxB,mBAAkB;EAClB,eCbyB;EDczB,aAAa;EACb,eAAc;EACd,WAAU,EAKX;EAzBL;IAuBQ,cAAc,EACf;;AAxBP;;EA4BM,oBAAoB;EACpB,eCxByB;EDyBzB,2BAA2B,EAC5B","file":"ie8.css","sourcesContent":[null,"// Variables\n// -----------------------------------------------------------------------------\n\n// bootstrap specific variable. set to false if not using ruby + asset pipeline / compass.\n$bootstrap-sass-asset-helper: false !default;\n\n// Global values\n// -----------------------------------------------------------------------------\n\n// Grays\n// -----------------------------------------------------------------------------\n\n$gray-darker: lighten(#000, 13.5%) !default; // #222\n$gray-dark: lighten(#000, 20%) !default; // #333\n$gray: lighten(#000, 33.5%) !default; // #555\n$gray-light: lighten(#000, 60%) !default; // #999\n$gray-lighter: lighten(#000, 93.5%) !default; // #eee\n$smoke: #ccc;\n$shade: #F3F3F3;\n$border: #ddd;\n\n// Brand colors\n// -----------------------------------------------------------------------------\n\n$brand-primary: #0A77BD;\n$brand-secondary: #002245;\n$brand-success: #5cb85c !default;\n$brand-warning: #FFE285 !default;\n$brand-danger: #d9534f !default;\n$brand-info: #5bc0de !default;\n\n// Scaffolding\n// -----------------------------------------------------------------------------\n\n$body-bg: #fff !default;\n$text-color: $gray-dark !default;\n\n// Links\n// -----------------------------------------------------------------------------\n\n$link-color: $brand-primary !default;\n$link-hover-color: darken($link-color, 15%) !default;\n\n// Typography\n// -----------------------------------------------------------------------------\n\n$font-base:\t\t\t\t\t\t\t\t'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-sans-serif: 'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n$font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base: $font-base !default;\n\n$font-size-base: 16px !default;\n$font-size-large: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-small: ceil($font-size-base * 0.85) !default; // ~12px\n\n$font-size-h1: floor($font-size-base * 2.6) !default; // ~36px\n$font-size-h2: floor($font-size-base * 2.15) !default; // ~30px\n$font-size-h3: ceil($font-size-base * 1.7) !default; // ~24px\n$font-size-h4: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-h5: $font-size-base !default;\n$font-size-h6: ceil($font-size-base * 0.85) !default; // ~12px\n\n$line-height-base: 2 !default; // 20/14\n$line-height-computed: floor($font-size-base * $line-height-base) !default; // ~20px\n\n$headings-font-family: $font-family-base !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n\n// Iconography\n// -----------------------------------------------------------------------------\n\n$icon-fa: 'FontAwesome';\n\n// Components\n// -----------------------------------------------------------------------------\n// Based on 14px font-size and 1.428 line-height (~20px to start)\n\n$padding-base-vertical: 6px !default;\n$padding-base-horizontal: 12px !default;\n\n$padding-large-vertical: 10px !default;\n$padding-large-horizontal: 16px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 10px !default;\n\n$padding-xs-vertical: 1px !default;\n$padding-xs-horizontal: 5px !default;\n\n$line-height-large: 1.33 !default;\n$line-height-small: 1.5 !default;\n\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-small: 3px !default;\n\n$component-active-color: #fff !default;\n$component-active-bg: $brand-primary !default;\n\n$caret-width-base: 4px !default;\n$caret-width-large: 5px !default;\n\n// Tables\n// -----------------------------------------------------------------------------\n\n$table-cell-padding: 8px !default;\n$table-condensed-cell-padding: 5px !default;\n\n$table-bg: transparent !default; // overall background-color\n$table-bg-accent: #f9f9f9 !default; // for striping\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n$table-border-color: #ddd !default; // table and cell border\n\n\n// Buttons\n// -----------------------------------------------------------------------------\n\n$btn-font-weight: normal !default;\n\n$btn-default-color: #333 !default;\n$btn-default-bg: #fff !default;\n$btn-default-border: #ccc !default;\n\n$btn-primary-color: #fff !default;\n$btn-primary-bg: $brand-primary !default;\n$btn-primary-border: darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color: #fff !default;\n$btn-success-bg: $brand-success !default;\n$btn-success-border: darken($btn-success-bg, 5%) !default;\n\n$btn-warning-color: #fff !default;\n$btn-warning-bg: $brand-warning !default;\n$btn-warning-border: darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color: #fff !default;\n$btn-danger-bg: $brand-danger !default;\n$btn-danger-border: darken($btn-danger-bg, 5%) !default;\n\n$btn-info-color: #fff !default;\n$btn-info-bg: $brand-info !default;\n$btn-info-border: darken($btn-info-bg, 5%) !default;\n\n$btn-link-disabled-color: $gray-light !default;\n\n\n// Forms\n// -----------------------------------------------------------------------------\n\n$input-bg: #fff !default;\n$input-bg-disabled: $gray-lighter !default;\n\n$input-color: $gray !default;\n$input-border: #ccc !default;\n$input-border-radius: $border-radius-base !default;\n$input-border-focus: #66afe9 !default;\n\n$input-color-placeholder: $gray-light !default;\n\n$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n$legend-color: $gray-dark !default;\n$legend-border-color: #e5e5e5 !default;\n\n$input-group-addon-bg: $gray-lighter !default;\n$input-group-addon-border-color: $input-border !default;\n\n\n// Dropdowns\n// -----------------------------------------------------------------------------\n\n$dropdown-bg: #fff !default;\n$dropdown-border: rgba(0,0,0,.15) !default;\n$dropdown-fallback-border: #ccc !default;\n$dropdown-divider-bg: #e5e5e5 !default;\n\n$dropdown-link-color: $gray-dark !default;\n$dropdown-link-hover-color: darken($gray-dark, 5%) !default;\n$dropdown-link-hover-bg: #f5f5f5 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-light !default;\n\n$dropdown-header-color: $gray-light !default;\n\n\n// COMPONENT VARIABLES\n// ------------------------------------------------------------------------------------------------------\n\n\n// Z-index master list\n// -----------------------------------------------------------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n\n$zindex-navbar: 1000 !default;\n$zindex-dropdown: 1000 !default;\n$zindex-popover: 1010 !default;\n$zindex-tooltip: 1030 !default;\n$zindex-navbar-fixed: 1030 !default;\n$zindex-modal-background: 1040 !default;\n$zindex-modal: 1050 !default;\n\n// Media queries breakpoints\n// ------------------------------------------------------------------------------------------------------\n\n// Extra small screen / phone\n// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1\n$screen-xs: 480px !default;\n$screen-xs-min: $screen-xs !default;\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n// Grid system\n// ------------------------------------------------------------------------------------------------------\n\n// Number of columns in the grid system\n$grid-columns: 12 !default;\n// Padding, to be divided by two and applied to the left and right of all columns\n$grid-gutter-width: 30px !default;\n\n// Navbar collapse\n\n// Point at which the navbar becomes uncollapsed\n$grid-float-breakpoint: $screen-sm-min !default;\n// Point at which the navbar begins collapsing\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n// Navbar\n// -----------------------------------------------------------------------------\n\n// Basics of a navbar\n$navbar-height: 50px !default;\n$navbar-margin-bottom: $line-height-computed !default;\n$navbar-border-radius: $border-radius-base !default;\n$navbar-padding-horizontal: floor($grid-gutter-width / 2) !default;\n$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;\n\n$navbar-default-color: #777 !default;\n$navbar-default-bg: #f8f8f8 !default;\n$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color: #777 !default;\n$navbar-default-link-hover-color: #333 !default;\n$navbar-default-link-hover-bg: transparent !default;\n$navbar-default-link-active-color: #555 !default;\n$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color: #ccc !default;\n$navbar-default-link-disabled-bg: transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color: $navbar-default-link-color !default;\n$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg: transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg: #ddd !default;\n$navbar-default-toggle-icon-bar-bg: #ccc !default;\n$navbar-default-toggle-border-color: #ddd !default;\n\n\n// Inverted navbar\n//\n// Reset inverted navbar basics\n$navbar-inverse-color: $gray-light !default;\n$navbar-inverse-bg: #222 !default;\n$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color: $gray-light !default;\n$navbar-inverse-link-hover-color: #fff !default;\n$navbar-inverse-link-hover-bg: transparent !default;\n$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color: #444 !default;\n$navbar-inverse-link-disabled-bg: transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color: $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color: #fff !default;\n$navbar-inverse-brand-hover-bg: transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg: #333 !default;\n$navbar-inverse-toggle-icon-bar-bg: #fff !default;\n$navbar-inverse-toggle-border-color: #333 !default;\n\n\n// Navs\n// -----------------------------------------------------------------------------\n\n$nav-link-padding: 10px 15px !default;\n$nav-link-hover-bg: $gray-lighter !default;\n\n$nav-disabled-link-color: $gray-light !default;\n$nav-disabled-link-hover-color: $gray-light !default;\n\n$nav-open-link-hover-color: #fff !default;\n\n// Tabs\n$nav-tabs-border-color: #ddd !default;\n\n$nav-tabs-link-hover-border-color: $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg: $body-bg !default;\n$nav-tabs-active-link-hover-color: $gray !default;\n$nav-tabs-active-link-hover-border-color: #ddd !default;\n\n$nav-tabs-justified-link-border-color: #ddd !default;\n$nav-tabs-justified-active-link-border-color: $body-bg !default;\n\n// Pills\n$nav-pills-border-radius: $border-radius-base !default;\n$nav-pills-active-link-hover-bg: $component-active-bg !default;\n$nav-pills-active-link-hover-color: $component-active-color !default;\n\n\n// Pagination\n// -----------------------------------------------------------------------------\n\n$pagination-bg: #fff !default;\n$pagination-border: #ddd !default;\n\n$pagination-hover-bg: $gray-lighter !default;\n\n$pagination-active-bg: $brand-primary !default;\n$pagination-active-color: #fff !default;\n\n$pagination-disabled-color: $gray-light !default;\n\n\n// Pager\n// -----------------------------------------------------------------------------\n\n$pager-border-radius: 15px !default;\n$pager-disabled-color: $gray-light !default;\n\n\n// Jumbotron\n// -----------------------------------------------------------------------------\n\n$jumbotron-padding: 30px !default;\n$jumbotron-color: inherit !default;\n$jumbotron-bg: $gray-lighter !default;\n$jumbotron-heading-color: inherit !default;\n$jumbotron-font-size: ceil($font-size-base * 1.5) !default;\n\n\n// Form states and alerts\n// -----------------------------------------------------------------------------\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n// Tooltips\n// -----------------------------------------------------------------------------\n$tooltip-max-width: 200px !default;\n$tooltip-color: #fff !default;\n$tooltip-bg: #000 !default;\n\n$tooltip-arrow-width: 5px !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n// -----------------------------------------------------------------------------\n$popover-bg: #fff !default;\n$popover-max-width: 276px !default;\n$popover-border-color: rgba(0,0,0,.2) !default;\n$popover-fallback-border-color: #ccc !default;\n\n$popover-title-bg: darken($popover-bg, 3%) !default;\n\n$popover-arrow-width: 10px !default;\n$popover-arrow-color: #fff !default;\n\n$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;\n$popover-arrow-outer-color: rgba(0,0,0,.25) !default;\n$popover-arrow-outer-fallback-color: #999 !default;\n\n\n// Labels\n// -----------------------------------------------------------------------------\n\n$label-default-bg: $gray-light !default;\n$label-primary-bg: $brand-primary !default;\n$label-success-bg: $brand-success !default;\n$label-info-bg: $brand-info !default;\n$label-warning-bg: $brand-warning !default;\n$label-danger-bg: $brand-danger !default;\n\n$label-color: #fff !default;\n$label-link-hover-color: #fff !default;\n\n\n// Modals\n// -----------------------------------------------------------------------------\n$modal-inner-padding: 20px !default;\n\n$modal-title-padding: 15px !default;\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: #fff !default;\n$modal-content-border-color: rgba(0,0,0,.2) !default;\n$modal-content-fallback-border-color: #999 !default;\n\n$modal-backdrop-bg: #000 !default;\n$modal-header-border-color: #e5e5e5 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n\n\n// Alerts\n// -----------------------------------------------------------------------------\n$alert-padding: 15px !default;\n$alert-border-radius: $border-radius-base !default;\n$alert-link-font-weight: bold !default;\n\n$alert-success-bg: $state-success-bg !default;\n$alert-success-text: $state-success-text !default;\n$alert-success-border: $state-success-border !default;\n\n$alert-info-bg: $state-info-bg !default;\n$alert-info-text: $state-info-text !default;\n$alert-info-border: $state-info-border !default;\n\n$alert-warning-bg: $state-warning-bg !default;\n$alert-warning-text: $state-warning-text !default;\n$alert-warning-border: $state-warning-border !default;\n\n$alert-danger-bg: $state-danger-bg !default;\n$alert-danger-text: $state-danger-text !default;\n$alert-danger-border: $state-danger-border !default;\n\n\n// Progress bars\n// -----------------------------------------------------------------------------\n$progress-bg: #f5f5f5 !default;\n$progress-bar-color: #fff !default;\n\n$progress-bar-bg: $brand-primary !default;\n$progress-bar-success-bg: $brand-success !default;\n$progress-bar-warning-bg: $brand-warning !default;\n$progress-bar-danger-bg: $brand-danger !default;\n$progress-bar-info-bg: $brand-info !default;\n\n\n// List group\n// -----------------------------------------------------------------------------\n$list-group-bg: #fff !default;\n$list-group-border: #ddd !default;\n$list-group-border-radius: $border-radius-base !default;\n\n$list-group-hover-bg: #f5f5f5 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border: $list-group-active-bg !default;\n\n$list-group-link-color: #555 !default;\n$list-group-link-heading-color: #333 !default;\n\n\n// Panels\n// -----------------------------------------------------------------------------\n$panel-bg: #fff !default;\n$panel-inner-border: #ddd !default;\n$panel-border-radius: $border-radius-base !default;\n$panel-footer-bg: #f5f5f5 !default;\n\n$panel-default-text: $gray-dark !default;\n$panel-default-border: #ddd !default;\n$panel-default-heading-bg: #f5f5f5 !default;\n\n$panel-primary-text: #fff !default;\n$panel-primary-border: $brand-primary !default;\n$panel-primary-heading-bg: $brand-primary !default;\n\n$panel-success-text: $state-success-text !default;\n$panel-success-border: $state-success-border !default;\n$panel-success-heading-bg: $state-success-bg !default;\n\n$panel-warning-text: $state-warning-text !default;\n$panel-warning-border: $state-warning-border !default;\n$panel-warning-heading-bg: $state-warning-bg !default;\n\n$panel-danger-text: $state-danger-text !default;\n$panel-danger-border: $state-danger-border !default;\n$panel-danger-heading-bg: $state-danger-bg !default;\n\n$panel-info-text: $state-info-text !default;\n$panel-info-border: $state-info-border !default;\n$panel-info-heading-bg: $state-info-bg !default;\n\n\n// Thumbnails\n// -----------------------------------------------------------------------------\n$thumbnail-padding: 4px !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border: #ddd !default;\n$thumbnail-border-radius: $border-radius-base !default;\n\n$thumbnail-caption-color: $text-color !default;\n$thumbnail-caption-padding: 9px !default;\n\n\n// Wells\n// -----------------------------------------------------------------------------\n$well-bg: #f5f5f5 !default;\n\n\n// Badges\n// -----------------------------------------------------------------------------\n$badge-color: #fff !default;\n$badge-link-hover-color: #fff !default;\n$badge-bg: $gray-light !default;\n\n$badge-active-color: $link-color !default;\n$badge-active-bg: #fff !default;\n\n$badge-font-weight: bold !default;\n$badge-line-height: 1 !default;\n$badge-border-radius: 10px !default;\n\n\n// Breadcrumbs\n// -----------------------------------------------------------------------------\n$breadcrumb-bg: #f5f5f5 !default;\n$breadcrumb-color: #ccc !default;\n$breadcrumb-active-color: $gray-light !default;\n$breadcrumb-separator: \"/\" !default;\n\n\n// Carousel\n// ------------------------\n\n$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color: #fff !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-font-size: 20px !default;\n\n$carousel-indicator-active-bg: #fff !default;\n$carousel-indicator-border-color: #fff !default;\n\n$carousel-caption-color: #fff !default;\n\n\n// Close\n// ------------------------\n$close-font-weight: bold !default;\n$close-color: #000 !default;\n$close-text-shadow: 0 1px 0 #fff !default;\n\n\n// Code\n// ------------------------\n$code-color: #c7254e !default;\n$code-bg: #f9f2f4 !default;\n\n$pre-bg: #f5f5f5 !default;\n$pre-color: $gray-dark !default;\n$pre-border-color: #ccc !default;\n$pre-scrollable-max-height: 340px !default;\n\n// Type\n// ------------------------\n$text-muted: $gray-light !default;\n$abbr-border-color: $gray-light !default;\n$headings-small-color: $gray-light !default;\n$blockquote-small-color: $gray-light !default;\n$blockquote-border-color: $gray-lighter !default;\n$page-header-border-color: $gray-lighter !default;\n\n// Miscellaneous\n// -----------------------------------------------------------------------------\n\n// Hr border color\n$hr-border: $gray-lighter !default;\n\n// Horizontal forms & lists\n$component-offset-horizontal: 180px !default;\n\n\n// Container sizes\n// ------------------------------------------------------------------------------------------------------\n\n// Small screen / tablet\n$container-tablet: ((720px + $grid-gutter-width)) !default;\n$container-sm: $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop: ((940px + $grid-gutter-width)) !default;\n$container-md: $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop: ((1140px + $grid-gutter-width)) !default;\n$container-lg: $container-large-desktop !default;\n"]} \ No newline at end of file diff --git a/dkan/themes/contrib/nuboot_radix/assets/css/ie9.css.map b/dkan/themes/contrib/nuboot_radix/assets/css/ie9.css.map index e4652f58a..096837567 100644 --- a/dkan/themes/contrib/nuboot_radix/assets/css/ie9.css.map +++ b/dkan/themes/contrib/nuboot_radix/assets/css/ie9.css.map @@ -1 +1 @@ -{"version":3,"sources":["../stdin"],"names":[],"mappings":"AAGA;EACE,gBAAgB,EACjB","file":"ie9.css","sourcesContent":[null],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["../stdin"],"names":[],"mappings":"AAGA;EACE,gBAAgB,EACjB","file":"ie9.css","sourcesContent":[null]} \ No newline at end of file diff --git a/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css b/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css index d82c43513..b824d0577 100644 --- a/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css +++ b/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css @@ -44,7 +44,6 @@ a { color: #23527c; text-decoration: underline; } a:focus { - outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } @@ -1257,7 +1256,6 @@ select[size] { input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { - outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } @@ -1765,7 +1763,6 @@ select[multiple].input-lg, -ms-user-select: none; user-select: none; } .btn:focus, .media-widget > a:focus, .btn.focus, .media-widget > a.focus, .btn:active:focus, .media-widget > a:active:focus, .btn:active.focus, .media-widget > a:active.focus, .btn.active:focus, .media-widget > a.active:focus, .btn.active.focus, .media-widget > a.active.focus { - outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .media-widget > a:hover, .btn:focus, .media-widget > a:focus, .btn.focus, .media-widget > a.focus { @@ -5431,6 +5428,7 @@ button.close { @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; backface-visibility: hidden; -ms-perspective: 1000px; -o-perspective: 1000px; @@ -8504,7 +8502,13 @@ body.maintenance-page .form-actions .media-widget > a:active:first-child { padding-right: 10px; } #dkan-sitewide-dataset-search-form label, -#dkan-sitewide-dataset-search-form--2 label, #region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label { +#dkan-sitewide-dataset-search-form--2 label, #region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label, .screenreader { + position: absolute; + top: 0; + left: -9999px; } + +#dkan-sitewide-dataset-search-form label, +#dkan-sitewide-dataset-search-form--2 label, #region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label, .screenreader { position: absolute; top: 0; left: -9999px; } @@ -9736,7 +9740,7 @@ ul.action-links { line-height: 2em; } .main .panel-pane { - margin-bottom: 3em; } + margin-bottom: 0em; } h2.pane-title { border-bottom: 1px solid #ddd; @@ -9778,7 +9782,7 @@ h2.pane-title { .radix-layouts-content .pane-content { padding: 20px 0; - margin-bottom: 1em; } + margin-bottom: 0em; } .radix-layouts-content .pane-node-field-topic .pane-content { padding: 0; } @@ -10446,6 +10450,8 @@ img { margin: .75em 0; } .view-dkan-groups .node-teaser .btn-primary, .view-dkan-groups .node-teaser body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .view-dkan-groups .node-teaser .btn:first-child, .view-dkan-groups .node-teaser body.maintenance-page .form-actions .media-widget > a:first-child, body.maintenance-page .form-actions .view-dkan-groups .node-teaser .media-widget > a:first-child { margin: 0 auto 1.5em; } + .view-dkan-groups .node-teaser .field-name-field-image { + text-align: center; } .view-groups-page .views-column { float: left; @@ -10455,6 +10461,9 @@ img { .view-group-block .views-field-title { font-size: 1.2em; } +.view-group-block .views-field-field-image { + text-align: center; } + .view-group-block .views-field-nid a { background: #0A77BD; color: #fff; diff --git a/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css.map b/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css.map index 3a7332368..5f8abb3b8 100644 --- a/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css.map +++ b/dkan/themes/contrib/nuboot_radix/assets/css/nuboot_radix.style.css.map @@ -1 +1 @@ -{"version":3,"sources":["nuboot_radix.style.css","../bower_components/compass-mixins/lib/compass/functions/_lists.scss","../bower_components/compass-mixins/lib/compass/functions/_constants.scss","../bower_components/compass-mixins/lib/compass/functions/_display.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss","../bower_components/compass-mixins/lib/compass/css3/_shared.scss","../bower_components/compass-mixins/lib/compass/css3/_box-sizing.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_tab-focus.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_image.scss","../bower_components/compass-mixins/lib/compass/css3/_transition.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_type.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_background-variant.scss","../bower_components/compass-mixins/lib/compass/utilities/general/_clearfix.scss","../bower_components/compass-mixins/lib/compass/utilities/general/_hacks.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-overflow.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_grid.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid-framework.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_tables.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_table-row.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss","../bower_components/compass-mixins/lib/compass/css3/_box-shadow.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_forms.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss","../bower_components/compass-mixins/lib/compass/css3/_opacity.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_normalize.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_print.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_glyphicons.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-divider.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-filter.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_input-groups.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_navs.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_navbar.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_pagination.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_pagination.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_pager.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_labels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_labels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_jumbotron.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_thumbnails.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_alerts.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_progress-bars.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_gradients.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_progress-bar.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_media.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_list-group.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_list-group.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_panels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_panels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-embed.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_wells.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_modals.scss","../bower_components/compass-mixins/lib/compass/css3/_transform.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_tooltip.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-text.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_utilities.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_center-block.scss","../bower_components/compass-mixins/lib/compass/typography/text/_replacement.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-utilities.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss","../bower_components/font-awesome/scss/font-awesome.scss","../bower_components/font-awesome/scss/_path.scss","../bower_components/font-awesome/scss/_core.scss","../bower_components/font-awesome/scss/_larger.scss","../bower_components/font-awesome/scss/_fixed-width.scss","../bower_components/font-awesome/scss/_list.scss","../bower_components/font-awesome/scss/_variables.scss","../bower_components/font-awesome/scss/_bordered-pulled.scss","../bower_components/font-awesome/scss/_animated.scss","../bower_components/font-awesome/scss/_rotated-flipped.scss","../bower_components/font-awesome/scss/_mixins.scss","../bower_components/font-awesome/scss/_stacked.scss","../bower_components/font-awesome/scss/_icons.scss","radix/_admin.scss","radix/_comment.scss","radix/_form.scss","radix/_mixins.scss","radix/_layout.scss","radix/_maintenance.scss","radix/_modal.scss","radix/_nav.scss","radix/_node.scss","radix/_panel.scss","radix/_structure.scss","radix/_view.scss","base/_mixins.scss","components/_admin.scss","components/_block.scss","base/_variables.scss","components/_dkan.scss","components/_form.scss","components/_layout.scss","components/_menu.scss","components/_node.scss","components/_page.scss","components/_panel.scss","components/_recline.scss","components/_responsive.scss","components/_search.scss","components/_structure.scss","components/_term.scss","components/_view.scss","../bower_components/compass-mixins/lib/compass/css3/_text-shadow.scss"],"names":[],"mappings":"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;EkBjJnC,kBlB6B4B;EkB5B5B,gBlBpB0B;EkBqB1B,iBlBiC2B;EkBhC3B,mBlBoC2B,EkBnC5B;;AAED;;;EACE,alB0ImC;EkBzInC,kBlByImC,EkBxIpC;;AAED;;;;;;;EACE,aAAa,EACd;;AFsPH;EAEI,ahBpHmC;EgBqHnC,kBhBzO4B;EgB0O5B,gBhB1R0B;EgB2R1B,iBhBrO2B;EgBsO3B,mBhBlO2B,EgBmO5B;;AAPH;EASI,ahB3HmC;EgB4HnC,kBhB5HmC,EgB6HpC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ahBnImC;EgBoInC,iBAAkC;EAClC,kBhBzP4B;EgB0P5B,gBhB1S0B;EgB2S1B,iBhBrP2B,EgBsP5B;;AE3RD;;;;EACE,alBgJkC;EkB/IlC,mBlB0B4B;EkBzB5B,gBlBrB0B;EkBsB1B,qBlBgCiC;EkB/BjC,mBlBmC2B,EkBlC5B;;AAED;;;EACE,alBwIkC;EkBvIlC,kBlBuIkC,EkBtInC;;AAED;;;;;;;EACE,aAAa,EACd;;AFgRH;EAEI,ahBhJkC;EgBiJlC,mBhBtQ4B;EgBuQ5B,gBhBrT0B;EgBsT1B,qBhBhQiC;EgBiQjC,mBhB7P2B,EgB8P5B;;AAPH;EASI,ahBvJkC;EgBwJlC,kBhBxJkC,EgByJnC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ahB/JkC;EgBgKlC,iBAAkC;EAClC,mBhBtR4B;EgBuR5B,gBhBrU0B;EgBsU1B,qBhBhRiC,EgBiRlC;;AAQH;EAEE,mBAAmB,EAMpB;EARD;IAMI,sBAAkC,EACnC;;AAGH;EACE,mBAAmB;EACnB,OAAO;EACP,SAAS;EACT,WAAW;EACX,eAAe;EACf,YhB9LqD;EgB+LrD,ahB/LqD;EgBgMrD,kBhBhMqD;EgBiMrD,mBAAmB;EACnB,qBAAqB,EACtB;;AACD;;;;;;EAGE,YhBrMoC;EgBsMpC,ahBtMoC;EgBuMpC,kBhBvMoC,EgBwMrC;;AACD;;;;;;EAGE,YhB1MqC;EgB2MrC,ahB3MqC;EgB4MrC,kBhB5MqC,EgB6MtC;;AAGD;;;;;;;;;;EExZI,elBseoC,EkBrerC;;AFuZH;EEpZI,sBlB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rFtC;EAFD;IC1DI,YrB+IiC;IqB9IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuDH;ICrDI,YrB0IiC;IqBzIjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkDH;;;;IC9CI,YrBmIiC;IqBlIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmCH;;;;;;;;;;MCvCM,YrB4H+B;MqB3H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoCL;;;;IC/BI,uBAAuB,EACxB;ED8BH;;;;;;;;;;;;;;;;ICvBM,0BrB9BwB;IqB+BpB,sBrB6G6B,EqB5GlC;EDqBL;ICjBI,erBpC0B;IqBqC1B,uBrBqGiC,EqBpGlC;;ADmBH;ECpEE,YrByJmC;EqBxJnC,0BrBW6B;EqBV7B,sBrByJqC,EoBrFtC;EAFD;IC9DI,YrBmJiC;IqBlJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED2DH;ICzDI,YrB8IiC;IqB7IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDsDH;;IClDI,YrBuIiC;IqBtIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDuCH;;;;MC3CM,YrBgI+B;MqB/H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDwCL;;ICnCI,uBAAuB,EACxB;EDkCH;;;;IC3BM,0BrB7ByB;IqB8BrB,sBrBiH6B,EqBhHlC;EDyBL;ICrBI,erBnC2B;IqBoC3B,uBrByGiC,EqBxGlC;;ADuBH;ECxEE,YrB6JmC;EqB5JnC,0BrBY6B;EqBX7B,sBrB6JqC,EoBrFtC;EAFD;IClEI,YrBuJiC;IqBtJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+DH;IC7DI,YrBkJiC;IqBjJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED0DH;;ICtDI,YrB2IiC;IqB1IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID2CH;;;;MC/CM,YrBoI+B;MqBnI/B,0BAAwB;MACpB,sBAAoB,EACzB;ED4CL;;ICvCI,uBAAuB,EACxB;EDsCH;;;;IC/BM,0BrB5ByB;IqB6BrB,sBrBqH6B,EqBpHlC;ED6BL;ICzBI,erBlC2B;IqBmC3B,uBrB6GiC,EqB5GlC;;AD2BH;EC5EE,YrBiKmC;EqBhKnC,0BrBa6B;EqBZ7B,sBrBiKqC,EoBrFtC;EAFD;ICtEI,YrB2JiC;IqB1JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDmEH;ICjEI,YrBsJiC;IqBrJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED8DH;;IC1DI,YrB+IiC;IqB9IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID+CH;;;;MCnDM,YrBwI+B;MqBvI/B,0BAAwB;MACpB,sBAAoB,EACzB;EDgDL;;IC3CI,uBAAuB,EACxB;ED0CH;;;;ICnCM,0BrB3ByB;IqB4BrB,sBrByH6B,EqBxHlC;EDiCL;IC7BI,erBjC2B;IqBkC3B,uBrBiHiC,EqBhHlC;;AD+BH;EChFE,YrBqKmC;EqBpKnC,0BrBc6B;EqBb7B,sBrBqKqC,EoBrFtC;EAFD;IC1EI,YrB+JiC;IqB9JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuEH;ICrEI,YrB0JiC;IqBzJjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkEH;;IC9DI,YrBmJiC;IqBlJjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmDH;;;;MCvDM,YrB4I+B;MqB3I/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoDL;;IC/CI,uBAAuB,EACxB;ED8CH;;;;ICvCM,0BrB1ByB;IqB2BrB,sBrB6H6B,EqB5HlC;EDqCL;ICjCI,erBhC2B;IqBiC3B,uBrBqHiC,EqBpHlC;;ADwCH;EACE,epB/E4B;EoBgF5B,oBAAoB;EACpB,iBAAiB,EA8BlB;EAjCD;;IAUI,8BAA8B;ItBtF+B,yFmB0B9C,EG8DhB;EAZH;IAiBI,0BAA0B,EAC3B;EAlBH;IAqBI,epBhF0B;IoBiF1B,2BpB/E6B;IoBgF7B,8BAA8B,EAC/B;EAxBH;;;IA6BM,epB9G0B;IoB+G1B,sBAAsB,EACvB;;AAQL;EC1EE,mBrBsC8B;EqBrC9B,gBrBT4B;EqBU5B,qBrB4CmC;EqB3CnC,mBrB+C6B,EoB2B9B;;AACD;EC9EE,kBrByC8B;EqBxC9B,gBrBR4B;EqBS5B,iBrB6C6B;EqB5C7B,mBrBgD6B,EoB8B9B;;AACD;EClFE,iBrB4C6B;EqB3C7B,gBrBR4B;EqBS5B,iBrB6C6B;Eq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A+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AASpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EA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C,EiC8C1C;IA1BL;MAuBQ,YjC1CuC;MiC2CvC,8BjC1C8C,EiC2C/C;EAzBP;IA+BQ,YjChDuC;IiCiDvC,0BjChDyC,EiCiD1C;EAjCP;IAuCQ,YjCtDuC;IiCuDvC,8BjCtD8C,EiCuD/C;EAzCP;IA8CI,mBjClD2C,EiC0D5C;IAtDH;MAiDM,uBjCvDyC,EiCwD1C;IAlDL;MAoDM,uBjCzDyC,EiC0D1C;EArDL;;IA0DI,sBjCjFqC,EiCkFtC;EA3DH;IAoEQ,0BjCpFyC;IiCqFzC,YjCtFuC,EiCuFxC;EAGH;IAzEJ;MA6EU,YjCjGqC,EiCuGtC;MAnFT;QAgFY,YjCnGmC;QiCoGnC,8BjCnG0C,EiCoG3C;IAlFX;MAwFY,YjCzGmC;MiC0GnC,0BjCzGqC,EiC0GtC;IA1FX;MAgGY,YjC/GmC;MiCgHnC,8BjC/G0C,EiCgH3C,EAAA;EAlGX;IA8GI,YjClI2C,EiCsI5C;IAlHH;MAgHM,YjCnIyC,EiCoI1C;EAjHL;IAqHI,YjCzI2C,EiCqJ5C;IAjIH;MAwHM,YjC3IyC,EiC4I1C;IAzHL;;;MA8HQ,YjC7IuC,EiC8IxC;;AAOP;EACE,uBjCrI8C;EiCsI9C,sBjCrIgD,EiCsQjD;EAnID;IAKI,ejCrI+C,EiC2IhD;IAXH;MAQM,YjC9H0C;MiC+H1C,8BjC9HiD,EiC+HlD;EAVL;IAcI,ejCnJ+C,EiCoJhD;EAfH;IAmBM,ejCnJ6C,EiC0J9C;IA1BL;MAuBQ,YjCtJwC;MiCuJxC,8BjCtJ+C,EiCuJhD;EAzBP;IA+BQ,YjC9JwC;IiC+JxC,0BjC5J0C,EiC6J3C;EAjCP;IAuCQ,YjClKwC;IiCmKxC,8BjClK+C,EiCmKhD;EAzCP;IA+CI,mBjC/J4C,EiCuK7C;IAvDH;MAkDM,uBjCpK0C,EiCqK3C;IAnDL;MAqDM,uBjCtK0C,EiCuK3C;EAtDL;;IA2DI,sBAAoB,EACrB;EA5DH;IAoEQ,0BjChM0C;IiCiM1C,YjCpMwC,EiCqMzC;EAGH;IAzEJ;MA6EU,sBjChNwC,EiCiNzC;IA9ET;MAgFU,0BjCnNwC,EiCoNzC;IAjFT;MAmFU,ejCnNyC,EiCyN1C;MAzFT;QAsFY,YjCrNoC;QiCsNpC,8BjCrN2C,EiCsN5C;IAxFX;MA8FY,YjC7NoC;MiC8NpC,0BjC3NsC,EiC4NvC;IAhGX;MAsGY,YjCjOoC;MiCkOpC,8BjCjO2C,EiCkO5C,EAAA;EAxGX;IA+GI,ejC/O+C,EiCmPhD;IAnHH;MAiHM,YjChP0C,EiCiP3C;EAlHL;IAsHI,ejCtP+C,EiCkQhD;IAlIH;MAyHM,YjCxP0C,EiCyP3C;IA1HL;;;MA+HQ,YjC1PwC,EiC2PzC;;AE7oBP;EACE,kBnCqxBkC;EmCpxBlC,oBnC0D6B;EmCzD7B,iBAAiB;EACjB,0BnCoxBqC;EmCnxBrC,mBnCmG6B,EmClF9B;EAtBD;IAQI,sBAAsB,EASvB;IAjBH;MAaM,cAA2C;MAC3C,eAAe;MACf,YnC2wB8B,EmC1wB/B;EAhBL;IAoBI,enCX4B,EmCY7B;;ACvBH;EACE,sBAAsB;EACtB,gBAAgB;EAChB,eAA+B;EAC/B,mBpCsG6B,EoClC9B;EAxED;IAOI,gBAAgB,EA0BjB;IAjCH;;MAUM,mBAAmB;MACnB,YAAY;MACZ,kBpCgF0B;MoC/E1B,qBpC+C+B;MoC9C/B,sBAAsB;MACtB,epCDwB;MoCExB,uBpCobqC;MoCnbrC,uBpCobqC;MoCnbrC,kBAAkB,EACnB;IAnBL;;MAuBQ,eAAe;MtCP0C,4BE0FlC;MF1FkC,+BE0FlC,EoCjFxB;IAzBP;;MtCgBiE,6BE0FlC;MF1FkC,gCE0FlC,EoC3ExB;EA/BP;;;IAuCM,WAAW;IACX,epCPwB;IoCQxB,0BpC7B0B;IoC8B1B,mBpC+ZqC,EoC9ZtC;EA3CL;;;;IAmDM,WAAW;IACX,YpCuZqC;IoCtZrC,0BpCvCwB;IoCwCxB,sBpCxCwB;IoCyCxB,gBAAgB,EACjB;EAxDL;;;;;;IAkEM,epCvD0B;IoCwD1B,uBpC6YqC;IoC5YrC,mBpC6YqC;IoC5YrC,oBpC+JsC,EoC9JvC;;AAQL;;EC3EM,mBrC4F0B;EqC3F1B,gBrC6CwB;EqC5CxB,qBrCkG+B,EqCjGhC;;ADwEL;;EtC9DiE,4BE2FlC;EF3FkC,+BE2FlC,EqChGxB;;ADmEP;;EtC9DiE,6BE2FlC;EF3FkC,gCE2FlC,EqC1FxB;;ADkEP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H;IAyBI,gBAAgB,EACjB;;AAOH;;EAEE,oBAA8B,EAS/B;EAXD;;IAMI,mBAAmB;IACnB,UAAU;IACV,aAAa;IACb,eAAe,EAChB;;AAOH;ECvDE,0B7CqfsC;E6CpftC,sB7CqfqC;E6CpfrC,e7CkfsC,E4C3bvC;EAFD;IClDI,0BAAwB,EACzB;EDiDH;IC/CI,eAAa,EACd;;ADkDH;EC3DE,0B7CyfsC;E6CxftC,sB7CyfqC;E6CxfrC,e7CsfsC,E4C3bvC;EAFD;ICtDI,0BAAwB,EACzB;EDqDH;ICnDI,eAAa,EACd;;ADsDH;EC/DE,0B7C6fsC;E6C5ftC,sB7C6fqC;E6C5frC,e7C0fsC,E4C3bvC;EAFD;IC1DI,0BAAwB,EACzB;EDyDH;ICvDI,eAAa,EACd;;AD0DH;ECnEE,0B7CigBsC;E6ChgBtC,sB7CigBqC;E6ChgBrC,e7C8fsC,E4C3bvC;EAFD;IC9DI,0BAAwB,EACzB;ED6DH;IC3DI,eAAa,EACd;;ACGH;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAQnC;EACE,iBAAiB;EACjB,a9CsC6B;E8CrC7B,oB9CqC6B;E8CpC7B,0B9CgnBmC;E8C/mBnC,mB9C+E6B;EF1FkC,uHmB0B9C,E6BblB;;AAGD;EACE,YAAY;EACZ,UAAU;EACV,aAAa;EACb,gB9Cc4B;E8Cb5B,kB9CyB6B;E8CxB7B,Y9CsmBgC;E8CrmBhC,mBAAmB;EACnB,0B9C1B4B;EFEmC,uHmB0B9C;Ed+IuC,oGArChC,E2CzGzB;;AAOD;;ECGE,sMAAiC;EDAjC,2BAA2B,EAC5B;;AAMD;;E3B1CU,mD2B4CkD,EAC3D;;AAMD;EErEE,0BhDe6B,E8CwD9B;EAFD;IChBE,sMAAiC,EChDhC;;AFoEH;EEzEE,0BhDgB6B,E8C2D9B;EAFD;ICpBE,sMAAiC,EChDhC;;AFwEH;EE7EE,0BhDiB6B,E8C8D9B;EAFD;ICxBE,sMAAiC,EChDhC;;AF4EH;EEjFE,0BhDkB6B,E8CiE9B;EAFD;IC5BE,sMAAiC,EChDhC;;ACRH;EAEE,iBAAiB,EAKlB;EAPD;IAKI,cAAc,EACf;;AAGH;;EAEE,QAA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A3B;ID+OH;MCrPM,0BrDMwB,EqDLzB;IDoPL;MClPM,erDGwB;MqDFxB,uBrDosB4B,EqDnsB7B;EDgPL;IC5OM,6BrDHwB,EqDIzB;;AD8OL;EChQE,sBrDsfqC,EoDpPtC;EAFD;IC7PI,erDifoC;IqDhfpC,0BrDifoC;IqDhfpC,sBrDifmC,EqDxepC;IDkPH;MCxPM,0BrD8eiC,EqD7elC;IDuPL;MCrPM,erD0ekC;MqDzelC,0BrDwekC,EqDvenC;EDmPL;IC/OM,6BrDqeiC,EqDpelC;;ADiPL;ECnQE,sBrD0fqC,EoDrPtC;EAFD;IChQI,erDqfoC;IqDpfpC,0BrDqfoC;IqDpfpC,sBrDqfmC,EqD5epC;IDqPH;MC3PM,0BrDkfiC,EqDjflC;ID0PL;MCxPM,erD8ekC;MqD7elC,0BrD4ekC,EqD3enC;EDsPL;IClPM,6BrDyeiC,EqDxelC;;ADoPL;ECtQE,sBrD8fqC,EoDtPtC;EAFD;ICnQI,erDyfoC;IqDxfpC,0BrDyfoC;IqDxfpC,sBrDyfmC,EqDhfpC;IDwPH;MC9PM,0BrDsfiC,EqDrflC;ID6PL;MC3PM,erDkfkC;MqDjflC,0BrDgfkC,EqD/enC;EDyPL;ICrPM,6BrD6eiC,EqD5elC;;ADuPL;ECzQE,sBrDkgBqC,EoDvPtC;EAFD;ICtQI,erD6foC;IqD5fpC,0BrD6foC;IqD5fpC,sBrD6fmC,EqDpfpC;ID2PH;MCjQM,0BrD0fiC,EqDzflC;IDgQL;MC9PM,erDsfkC;MqDrflC,0BrDofkC,EqDnfnC;ED4PL;ICxPM,6BrDifiC,EqDhflC;;ACjBL;EACE,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,WAAW;EACX,iBAAiB,EAelB;EApBD;;;;;IAYI,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,UAAU,EACX;;AAIH;EACE,uBAAuB,EACxB;;AAGD;EACE,oBAAoB,EACrB;;AC5BD;EACE,iBAAiB;EACjB,cAAc;EACd,oBAAoB;EACpB,0BvDqvBmC;EuDpvBnC,0BvDqvBkC;EuDpvBlC,mBvDiG6B;EF1FkC,wHmB0B9C,EsC3B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B;EAAE,aN4iBc,EAAO;;AM3iBvB;EAAE,aN2nBY,EAAO;;AM1nBrB;EAAE,aNsPY,EAAO;;AMrPrB;EAAE,aNykBgB,EAAO;;AMxkBzB;EAAE,aNukBU,EAAO;;AMtkBnB;EAAE,aNwkBe,EAAO;;AMvkBxB;EAAE,aNyHa,EAAO;;AMxHtB;;;EAAE,aN6kBa,EAAO;;AM5kBtB;EAAE,aN+emB,EAAO;;AM9e5B;EAAE,aN6eoB,EAAO;;AM5e7B;EAAE,aNqciB,EAAO;;AMpc1B;EAAE,aN8fc,EAAO;;AM7fvB;;EAAE,aNkJW,EAAO;;AMjJpB;EAAE,aNslBe,EAAO;;AMrlBxB;EAAE,aNiTY,EAAO;;AMhTrB;EAAE,aN6Nc,EAAO;;AM5NvB;EAAE,aNmIe,EAAO;;AMlIxB;EAAE,aNudY,EAAO;;AMtdrB;EAAE,aN+KgB,EAAO;;AM9KzB;EAAE,aNU2B,EAAO;;AMTpC;EAAE,aNYyB,EAAO;;AMXlC;EAAE,aN0Ta,EAAO;;AMzTtB;EAAE,aNmbqB,EAAO;;AMlb9B;;EAAE,aN4cc,EAAO;;AM3cvB;EAAE,aNsce,EAAO;;AMrcxB;EAAE,aN6VgB,EAAO;;AM5VzB;EAAE,aNgWY,EAAO;;AM/VrB;EAAE,aNkOY,EAAO;;AMjOrB;EAAE,aN8RkB,EAAO;;AM7R3B;EAAE,aN+mBkB,EAAO;;AM9mB3B;EAAE,aN6mBmB,EAAO;;AM5mB5B;EAAE,aN8mBiB,EAAO;;AM7mB1B;EAAE,aNmbc,EAAO;;AMlbvB;EAAE,aNmBe,EAAO;;AMlBxB;EAAE,aNgiBW,EAAO;;AM/hBpB;EAAE,aNgiBY,EAAO;;AM/hBrB;EAAE,aN8CY,EAAO;;AM7CrB;EAAE,aN8CgB,EAAO;;AM7CzB;EAAE,aN0aa,EAAO;;AMzatB;EAAE,aN+Dc,EAAO;;AM9DvB;EAAE,aNgOY,EAAO;;AM/NrB;EAAE,aNsCY,EAAO;;AMrCrB;EAAE,aNgTc,EAAO;;AM/SvB;EAAE,aN8hBmB,EAAO;;AM7hB5B;EAAE,aN8hBkB,EAAO;;AM7hB3B;EAAE,aNpCkB,EAAO;;AMqC3B;EAAE,aNvCoB,EAAO;;AMwC7B;EAAE,aNrCmB,EAAO;;AMsC5B;EAAE,aNxCqB,EAAO;;AMyC9B;EAAE,aNoUY,EAAO;;AMnUrB;;EAAE,aN4Xe,EAAO;;AM3XxB;EAAE,aN6Rc,EAAO;;AM5RvB;EAAE,aNklBoB,EAAO;;AMjlB7B;;;EAAE,aN0YiB,EAAO;;AMzY1B;EAAE,aNmYc,EAAO;;AMlYvB;EAAE,aN+UkB,EAAO;;AM9U3B;EAAE,aNnDc,EAAO;;AMoDvB;EAAE,aN8hBY,EAAO;;AM7hBrB;;EAAE,aNiYuB,EAAO;;AMhYhC;EAAE,aNqcsB,EAAO;;AMpc/B;EAAE,aNuEsB,EAAO;;AMtE/B;EAAE,aNtBc,EAAO;;AMuBvB;EAAE,aNifqB,EAAO;;AMhf9B;EAAE,aNgKqB,EAAO;;AM/J9B;EAAE,aNlBgB,EAAO;;AMmBzB;EAAE,aNsYY,EAAO;;AMrYrB;EAAE,aNoXa,EAAO;;AMnXtB;EAAE,aNifY,EAAO;;AMhfrB;EAAE,aNuMe,EAAO;;AMtMxB;EAAE,aN2JoB,EAAO;;AM1J7B;EAAE,aN0eoB,EAAO;;AMze7B;EAAE,aN+Ha,EAAO;;AM9HtB;EAAE,aNiEoB,EAAO;;AMhE7B;EAAE,aNiEqB,EAAO;;AMhE9B;EAAE,aNkYmB,EAAO;;AMjY5B;EAAE,aN6UoB,EAAO;;AM5U7B;EAAE,aNygBoB,EAAO;;AMxgB7B;EAAE,aNmDoB,EAAO;;AMlD7B;EAAE,aNuYuB,EAAO;;AMtYhC;EAAE,aNoQmB,EAAO;;AMnQ5B;EAAE,aNgGkB,EAAO;;AM/F3B;EAAE,aNqgBsB,EAAO;;AMpgB/B;EAAE,aN+CsB,EAAO;;AM9C/B;EAAE,aNnCW,EAAO;;AMoCpB;EAAE,aNhDkB,EAAO;;AMiD3B;EAAE,aNhDmB,EAAO;;AMiD5B;EAAE,aNhDgB,EAAO;;AMiDzB;EAAE,aNpDkB,EAAO;;AMqD3B;;EAAE,aNoaa,EAAO;;AMnatB;EAAE,aN2Hc,EAAO;;AM1HvB;EAAE,aN8EgB,EAAO;;AM7EzB;EAAE,aNgXY,EAAO;;AM/WrB;EAAE,aN2Ta,EAAO;;AM1TtB;EAAE,aNlDgB,EAAO;;AMmDzB;EAAE,aNoH0B,EAAO;;AMnHnC;EAAE,aN0LY,EAAO;;AMzLrB;EAAE,aNqQY,EAAO;;AMpQrB;EAAE,aNyJY,EAAO;;AMxJrB;EAAE,aNsHW,EAAO;;AMrHpB;EAAE,aNsHiB,EAAO;;AMrH1B;;EAAE,aN+G4B,EAAO;;AM9GrC;EAAE,aNiWa,EAAO;;AMhWtB;EAAE,aNNgB,EAAO;;AMOzB;EAAE,aNkXc,EAAO;;AMjXvB;EAAE,aNyDe,EAAO;;AMxDxB;EAAE,aNuRc,EAAO;;AMtRvB;EAAE,aNiCkB,EAAO;;AMhC3B;EAAE,aN6BoB,EAAO;;AM5B7B;EAAE,aN0Xe,EAAO;;AMzXxB;EAAE,aNyZqB,EAAO;;AMxZ9B;EAAE,aNsJc,EAAO;;AMrJvB;EAAE,aNuJmB,EAAO;;AMtJ5B;EAAE,aNtEgB,EAAO;;AMuEzB;EAAE,aNxEgB,EAAO;;AMyEzB;;EAAE,aNhEiB,EAAO;;AMiE1B;EAAE,aN8fsB,EAAO;;AM7f/B;EAAE,aN0GuB,EAAO;;AMzGhC;EAAE,aNdoB,EAAO;;AMe7B;EAAE,aNwOW,EAAO;;AMvOpB;;EAAE,aNwCY,EAAO;;AMvCrB;EAAE,aN6CgB,EAAO;;AM5CzB;EAAE,aNwdmB,EAAO;;AMvd5B;EAAE,aNsdqB,EAAO;;AMrd9B;EAAE,aN6aiB,EAAO;;AM5a1B;EAAE,aNgMe,EAAO;;AM/LxB;EAAE,aN2YgB,EAAO;;AM1YzB;EAAE,aNqPuB,EAAO;;AMpPhC;EAAE,aN+ckB,EAAO;;AM9c3B;EAAE,aNsFqB,EAAO;;AMrF9B;EAAE,aNsYe,EAAO;;AMrYxB;EAAE,aNqec,EAAO;;AMpevB;EAAE,aN2JqB,EAAO;;AM1J9B;EAAE,aNsfc,EAAO;;AMrfvB;EAAE,aNmOe,EAAO;;AMlOxB;EAAE,aNsTa,EAAO;;AMrTtB;EAAE,aN6ZgB,EAAO;;AM5ZzB;EAAE,aNpDkB,EAAO;;AMqD3B;EAAE,aNoToB,EAAO;;AMnT7B;EAAE,aNsee,EAAO;;AMrexB;;EAAE,aNgFgB,EAAO;;AM/EzB;EAAE,aNgJc,EAAO;;AM/IvB;EAAE,aN0ec,EAAO;;AMzevB;EAAE,aNgCmB,EAAO;;AM/B5B;;EAAE,aN8VW,EAAO;;AM7VpB;EAAE,aNwKa,EAAO;;AMvKtB;EAAE,aNvDgB,EAAO;;AMwDzB;EAAE,aN9EY,EAAO;;AM+ErB;EAAE,aNvBmB,EAAO;;AMwB5B;EAAE,aN2JoB,EAAO;;AM1J7B;EAAE,aNyJmB,EAAO;;AMxJ5B;EAAE,aN0JiB,EAAO;;AMzJ1B;EAAE,aNsJmB,EAAO;;AMrJ5B;EAAE,aN5HyB,EAAO;;AM6HlC;EAAE,aNxH0B,EAAO;;AMyHnC;EAAE,aNxHuB,EAAO;;AMyHhC;EAAE,aNhIyB,EAAO;;AMiIlC;EAAE,aNqIa,EAAO;;AMpItB;EAAE,aN4fc,EAAO;;AM3fvB;EAAE,aNsaa,EAAO;;AMratB;EAAE,aN0Fc,EAAO;;AMzFvB;EAAE,aN3EiB,EAAO;;AM4E1B;EAAE,aNzHkB,EAAO;;AM0H3B;;EAAE,aN+da,EAAO;;AM9dtB;;EAAE,aN8MY,EAAO;;AM7MrB;EAAE,aNda,EAAO;;AMetB;EAAE,aN4Fa,EAAO;;AM3FtB;;EAAE,aN8UgB,EAAO;;AM7UzB;;EAAE,aNgFe,EAAO;;AM/ExB;EAAE,aN2QiB,EAAO;;AM1Q1B;;EAAE,aN0FgB,EAAO;;AMzFzB;EAAE,aNyXc,EAAO;;AMxXvB;;;EAAE,aNtHY,EAAO;;AMuHrB;EAAE,aN4Me,EAAO;;AM3MxB;EAAE,aN0Me,EAAO;;AMzMxB;EAAE,aNwYqB,EAAO;;AMvY9B;EAAE,aNociB,EAAO;;AMnc1B;EAAE,aN+Ya,EAAO;;AM9YtB;EAAE,aN8Ma,EAAO;;AM7MtB;EAAE,aNsba,EAAO;;AMrbtB;EAAE,aNgRiB,EAAO;;AM/Q1B;EAAE,aNiRwB,EAAO;;AMhRjC;EAAE,aN+G0B,EAAO;;AM9GnC;EAAE,aN6GmB,EAAO;;AM5G5B;EAAE,aNsOa,EAAO;;AMrOtB;EAAE,aN/EkB,EAAO;;AMgF3B;EAAE,aNzEgB,EAAO;;AM0EzB;EAAE,aNhFkB,EAAO;;AMiF3B;EAAE,aNhFmB,EAAO;;AMiF5B;EAAE,aN5Be,EAAO;;AM6BxB;;EAAE,aNsVY,EAAO;;AMrVrB;;EAAE,aN2ViB,EAAO;;AM1V1B;;EAAE,aNyVgB,EAAO;;AMxVzB;EAAE,aNUgB,EAAO;;AMTzB;EAAE,aNiLgB,EAAO;;AMhLzB;;EAAE,aNkbY,EAAO;;AMjbrB;;EAAE,aN6Ea,EAAO;;AM5EtB;;EAAE,aN6XkB,EAAO;;AM5X3B;EAAE,aNnCiB,EAAO;;AMoC1B;EAAE,aNhCkB,EAAO;;AMiC3B;;EAAE,aNvHY,EAAO;;AMwHrB;EAAE,aNmUe,EAAO;;AMlUxB;EAAE,aNyagB,EAAO;;AMxazB;;EAAE,aNxDiB,EAAO;;AMyD1B;EAAE,aNoKmB,EAAO;;AMnK5B;EAAE,aNIgB,EAAO;;AMHzB;EAAE,aNtDsB,EAAO;;AMuD/B;EAAE,aNtDoB,EAAO;;AMuD7B;EAAE,aN8ae,EAAO;;AM7axB;EAAE,aNiWmB,EAAO;;AMhW5B;EAAE,aN0WgB,EAAO;;AMzWzB;EAAE,aN7Ic,EAAO;;AM8IvB;EAAE,aNtDc,EAAO;;AMuDvB;EAAE,aN/Be,EAAO;;AMgCxB;EAAE,aN8BmB,EAAO;;AM7B5B;EAAE,aN7HkB,EAAO;;AM8H3B;EAAE,aNyGkB,EAAO;;AMxG3B;EAAE,aN5MiB,EAAO;;AM6M1B;EAAE,aNyLc,EAAO;;AMxLvB;EAAE,aNUmB,EAAO;;AMT5B;EAAE,aN1JY,EAAO;;AM2JrB;EAAE,aN6EgB,EAAO;;AM5EzB;EAAE,aNgPmB,EAAO;;AM/O5B;EAAE,aN7MyB,EAAO;;AM8MlC;EAAE,aN7M0B,EAAO;;AM8MnC;EAAE,aN7MuB,EAAO;;AM8MhC;EAAE,aNjNyB,EAAO;;AMkNlC;EAAE,aN7MkB,EAAO;;AM8M3B;EAAE,aN7MmB,EAAO;;AM8M5B;EAAE,aN7MgB,EAAO;;AM8MzB;EAAE,aNjNkB,EAAO;;AMkN3B;EAAE,aN3Ce,EAAO;;AM4CxB;EAAE,aN2Hc,EAAO;;AM1HvB;EAAE,aNwVc,EAAO;;AMvVvB;;EAAE,aNkLc,EAAO;;AMjLvB;EAAE,aN3FgB,EAAO;;AM4FzB;EAAE,aN2OkB,EAAO;;AM1O3B;EAAE,aN2OmB,EAAO;;AM1O5B;EAAE,aNmTe,EAAO;;AMlTxB;EAAE,aNhGc,EAAO;;AMiGvB;;EAAE,aNqPa,EAAO;;AMpPtB;EAAE,aN6CkB,EAAO;;AM5C3B;EAAE,aNoBgB,EAAO;;AMnBzB;EAAE,aNqBqB,EAAO;;AMpB9B;EAAE,aN8Re,EAAO;;AM7RxB;EAAE,aNyBe,EAAO;;AMxBxB;EAAE,aN8Ja,EAAO;;AM7JtB;EAAE,aNyBe,EAAO;;AMxBxB;EAAE,aNwGkB,EAAO;;AMvG3B;EAAE,aNOc,EAAO;;AMNvB;EAAE,aNKsB,EAAO;;AMJ/B;EAAE,aN8UgB,EAAO;;AM7UzB;EAAE,aNjGY,EAAO;;AMkGrB;;EAAE,aNyOiB,EAAO;;AMxO1B;;;EAAE,aN8SmB,EAAO;;AM7S5B;EAAE,aN2HsB,EAAO;;AM1H/B;EAAE,aNhFY,EAAO;;AMiFrB;EAAE,aNrGiB,EAAO;;AMsG1B;;EAAE,aNnIoB,EAAO;;AMoI7B;EAAE,aNkNgB,EAAO;;AMjNzB;EAAE,aN+EY,EAAO;;AM9ErB;EAAE,aNnDmB,EAAO;;AMoD5B;EAAE,aNwTmB,EAAO;;AMvT5B;EAAE,aNmTiB,EAAO;;AMlT1B;EAAE,aN1Dc,EAAO;;AM2DvB;EAAE,aNyMoB,EAAO;;AMxM7B;EAAE,aN4IkB,EAAO;;AM3I3B;EAAE,aN4IwB,EAAO;;AM3IjC;EAAE,aNwPc,EAAO;;AMvPvB;EAAE,aNzKkB,EAAO;;AM0K3B;EAAE,aNlByB,EAAO;;AMmBlC;EAAE,aN2Nc,EAAO;;AM1NvB;EAAE,aNgIc,EAAO;;AM/HvB;EAAE,aN3I2B,EAAO;;AM4IpC;EAAE,aN3I4B,EAAO;;AM4IrC;EAAE,aN3IyB,EAAO;;AM4IlC;EAAE,aN/I2B,EAAO;;AMgJpC;EAAE,aNuDa,EAAO;;AMtDtB;EAAE,aNpGY,EAAO;;AMqGrB;EAAE,aNzQc,EAAO;;AM0QvB;EAAE,aNiWkB,EAAO;;AMhW3B;EAAE,aN7LgB,EAAO;;AM8LzB;EAAE,aNlFkB,EAAO;;AMmF3B;EAAE,aNlFkB,EAAO;;AMmF3B;EAAE,aNmNkB,EAAO;;AMlN3B;EAAE,aN4KmB,EAAO;;AM3K5B;EAAE,aNsTc,EAAO;;AMrTvB;EAAE,aN2HoB,EAAO;;AM1H7B;EAAE,aN2HsB,EAAO;;AM1H/B;EAAE,aN0EgB,EAAO;;AMzEzB;EAAE,aNwEkB,EAAO;;AMvE3B;EAAE,aNhKoB,EAAO;;AMiK7B;EAAE,aNuJqB,EAAO;;AMtJ9B;EAAE,aN7E4B,EAAO;;AM8ErC;EAAE,aN0NoB,EAAO;;AMzN7B;EAAE,aN/He,EAAO;;AMgIxB;;EAAE,aN3L2B,EAAO;;AM4LpC;;EAAE,aNzLyB,EAAO;;AM0LlC;;EAAE,aN3L4B,EAAO;;AM4LrC;;EAAE,aN5FW,EAAO;;AM6FpB;EAAE,aN1BW,EAAO;;AM2BpB;;EAAE,aN+UW,EAAO;;AM9UpB;;EAAE,aNuCW,EAAO;;AMtCpB;;;;EAAE,aN8CW,EAAO;;AM7CpB;;;EAAE,aNgMW,EAAO;;AM/LpB;;EAAE,aNgDW,EAAO;;AM/CpB;;EAAE,aN3NW,EAAO;;AM4NpB;EAAE,aN7EY,EAAO;;AM8ErB;EAAE,aNjEiB,EAAO;;AMkE1B;EAAE,aNgOsB,EAAO;;AM/N/B;EAAE,aNgOuB,EAAO;;AM/NhC;EAAE,aNgOuB,EAAO;;AM/NhC;EAAE,aNgOwB,EAAO;;AM/NjC;EAAE,aNmOwB,EAAO;;AMlOjC;EAAE,aNmOyB,EAAO;;AMlOlC;EAAE,aNwRiB,EAAO;;AMvR1B;EAAE,aNoRmB,EAAO;;AMnR5B;EAAE,aNyWsB,EAAO;;AMxW/B;EAAE,aNsWe,EAAO;;AMrWxB;EAAE,aN4VY,EAAO;;AM3VrB;EAAE,aN4VmB,EAAO;;AM3V5B;EAAE,aNoWoB,EAAO;;AMnW7B;EAAE,aN9He,EAAO;;AM+HxB;EAAE,aNoOsB,EAAO;;AMnO/B;EAAE,aNkBiB,EAAO;;AMjB1B;EAAE,aNlEc,EAAO;;AMmEvB;EAAE,aN/TW,EAAO;;AMgUpB;EAAE,aN3PiB,EAAO;;AM4P1B;EAAE,aN3PwB,EAAO;;AM4PjC;EAAE,aNmSc,EAAO;;AMlSvB;EAAE,aNmSqB,EAAO;;AMlS9B;EAAE,aNiDuB,EAAO;;AMhDhC;EAAE,aNmDqB,EAAO;;AMlD9B;EAAE,aNgDuB,EAAO;;AM/ChC;EAAE,aNgDwB,EAAO;;AM/CjC;EAAE,aNtTa,EAAO;;AMuTtB;EAAE,aNuUe,EAAO;;AMtUxB;EAAE,aNlUe,EAAO;;AMmUxB;EAAE,aNmCa,EAAO;;AMlCtB;EAAE,aNhJgB,EAAO;;AMiJzB;EAAE,aN0La,EAAO;;AMzLtB;EAAE,aNxEkB,EAAO;;AMyE3B;EAAE,aNgRc,EAAO;;AM/QvB;EAAE,aNnHc,EAAO;;AMoHvB;EAAE,aN6CY,EAAO;;AM5CrB;;EAAE,aNjDgB,EAAO;;AMkDzB;EAAE,aNmOa,EAAO;;AMlOtB;EAAE,aNoEc,EAAO;;AMnEvB;EAAE,aNlUe,EAAO;;AMmUxB;EAAE,aNrQW,EAAO;;AMsQpB;EAAE,aN6SU,EAAO;;AM5SnB;EAAE,aNkTa,EAAO;;AMjTtB;EAAE,aNkIc,EAAO;;AMjIvB;EAAE,aN+EiB,EAAO;;AM9E1B;EAAE,aNoMsB,EAAO;;AMnM/B;EAAE,aNnU4B,EAAO;;AMoUrC;EAAE,aNrU2B,EAAO;;AMsUpC;;EAAE,aNvP2B,EAAO;;AMwPpC;EAAE,aNrKoB,EAAO;;AMsK7B;EAAE,aN6SkB,EAAO;;AM5S3B;EAAE,aNiSoB,EAAO;;AMhS7B;;EAAE,aNiQW,EAAO;;AMhQpB;EAAE,aNqGqB,EAAO;;AMpG9B;EAAE,aNqLqB,EAAO;;AMpL9B;EAAE,aNmKa,EAAO;;AMlKtB;EAAE,aNhKuB,EAAO;;AMiKhC;EAAE,aN2SiB,EAAO;;AM1S1B;EAAE,aN6Dc,EAAO;;AM5DvB;;;EAAE,aNsQkB,EAAO;;AMrQ3B;;EAAE,aN1EsB,EAAO;;AM2E/B;EAAE,aN6Sa,EAAO;;AM5StB;EAAE,aNhFc,EAAO;;AMiFvB;EAAE,aNyGc,EAAO;;AMxGvB;EAAE,aNyGqB,EAAO;;AMxG9B;EAAE,aNmM0B,EAAO;;AMlMnC;EAAE,aNiMmB,EAAO;;AMhM5B;EAAE,aN7LiB,EAAO;;AM8L1B;EAAE,aN1LY,EAAO;;AM2LrB;EAAE,aNwEkB,EAAO;;AMvE3B;EAAE,aNwEsB,EAAO;;AMvE/B;EAAE,aNvLc,EAAO;;AMwLvB;EAAE,aNjCc,EAAO;;AMkCvB;EAAE,aN5BgB,EAAO;;AM6BzB;EAAE,aN7JW,EAAO;;AM8JpB;EAAE,aNvSgB,EAAO;;AMwSzB;EAAE,aNpPa,EAAO;;AMqPtB;EAAE,aNsDW,EAAO;;AMrDpB;EAAE,aN+Ja,EAAO;;AM9JtB;EAAE,aNjNY,EAAO;;AMkNrB;EAAE,aNjNa,EAAO;;AMkNtB;EAAE,aNnUe,EAAO;;AMoUxB;EAAE,aNnUsB,EAAO;;AMoU/B;EAAE,aNsKa,EAAO;;AMrKtB;EAAE,aNsKoB,EAAO;;AMrK7B;EAAE,aNkFe,EAAO;;AMjFxB;;EAAE,aNlSW,EAAO;;AMmSpB;;EAAE,aN0LY,EAAO;;AMzLrB;EAAE,aNwNY,EAAO;;AMvNrB;EAAE,aNqJe,EAAO;;AMpJxB;EAAE,aNlNkB,EAAO;;AMmN3B;EAAE,aN+IkB,EAAO;;AM9I3B;EAAE,aNxNgB,EAAO;;AMyNzB;EAAE,aNpKkB,EAAO;;AMqK3B;EAAE,aN7JmB,EAAO;;AM8J5B;EAAE,aN1KoB,EAAO;;AM2K7B;EAAE,aNpKyB,EAAO;;AMqKlC;;;EAAE,aN3KoB,EAAO;;AM4K7B;;EAAE,aNhLsB,EAAO;;AMiL/B;;EAAE,aNhLoB,EAAO;;AMiL7B;;EAAE,aNpKoB,EAAO;;AMqK7B;EAAE,aNjLmB,EAAO;;AMkL5B;EAAE,aN+OY,EAAO;;AM9OrB;EAAE,aN/Pe,EAAO;;AMgQxB;EAAE,aN/DgB,EAAO;;AMgEzB;;;;;EAAE,aNhDiB,EAAO;;AMiD1B;EAAE,aN9QsB,EAAO;;AM+Q/B;;EAAE,aN2Da,EAAO;;AM1DtB;;EAAE,aNvNc,EAAO;;AMwNvB;EAAE,aNtIkB,EAAO;;AMuI3B;EAAE,aNxIW,EAAO;;AMyIpB;;;EAAE,aNzHmB,EAAO;;AM0H5B;EAAE,aNmKqB,EAAO;;AMlK9B;EAAE,aN6CU,EAAO;;AM5CnB;;EAAE,aN2Oc,EAAO;;AM1OvB;;EAAE,aNUmB,EAAO;;AMT5B;;EAAE,aNUqB,EAAO;;AMT9B;EAAE,aN3Ge,EAAO;;AM4GxB;EAAE,aNzRmB,EAAO;;AM0R5B;EAAE,aNlHc,EAAO;;AMmHvB;EAAE,aNQiB,EAAO;;AMP1B;EAAE,aNkGe,EAAO;;AMjGxB;EAAE,aN+EiB,EAAO;;AM9E1B;EAAE,aN+EwB,EAAO;;AM9EjC;EAAE,aN/VY,EAAO;;AMgWrB;;EAAE,aNnKgB,EAAO;;AMoKzB;EAAE,aNwLW,EAAO;;AMvLpB;EAAE,aN1WkB,EAAO;;AM2W3B;EAAE,aNsBY,EAAO;;AMrBrB;EAAE,aN2FkB,EAAO;;AM1F3B;EAAE,aNyLc,EAAO;;AMxLvB;EAAE,aN0OY,EAAO;;AMzOrB;EAAE,aNnBmB,EAAO;;AMoB5B;EAAE,aN2NY,EAAO;;AM1NrB;EAAE,aN3VkB,EAAO;;AM4V3B;EAAE,aNHc,EAAO;;AMIvB;EAAE,aNvJqB,EAAO;;AMwJ9B;EAAE,aNlUe,EAAO;;AMmUxB;EAAE,aNtUqB,EAAO;;AMuU9B;EAAE,aNzUmB,EAAO;;AM0U5B;EAAE,aN5Ue,EAAO;;AM6UxB;EAAE,aNxUiB,EAAO;;AMyU1B;EAAE,aNxUiB,EAAO;;AMyU1B;EAAE,aN7XkB,EAAO;;AM8X3B;EAAE,aN7XoB,EAAO;;AM8X7B;EAAE,aN6Ja,EAAO;;AM5JtB;EAAE,aN1RiB,EAAO;;AM2R1B;EAAE,aN3ZU,EAAO;;AM4ZnB;EAAE,aN9OkB,EAAO;;AM+O3B;EAAE,aNzBmB,EAAO;;AM0B5B;EAAE,aNhYqB,EAAO;;AMiY9B;EAAE,aNjbkB,EAAO;;AMkb3B;EAAE,aNZiB,EAAO;;AMa1B;EAAE,aN7FkB,EAAO;;AM8F3B;EAAE,aN3Gc,EAAO;;AM4GvB;EAAE,aN3GqB,EAAO;;AM4G9B;EAAE,aN0IkB,EAAO;;AMzI3B;EAAE,aN0IiB,EAAO;;AMzI1B;EAAE,aN1Ye,EAAO;;AM2YxB;EAAE,aNvXW,EAAO;;AMwXpB;EAAE,aN3He,EAAO;;AM4HxB;EAAE,aNtciB,EAAO;;AMuc1B;EAAE,aNnWU,EAAO;;AMoWnB;;;EAAE,aN1IW,EAAO;;AM2IpB;EAAE,aNxEgB,EAAO;;AMyEzB;EAAE,aN5XkB,EAAO;;AM6X3B;EAAE,aNjTsB,EAAO;;AMkT/B;EAAE,aNpSgB,EAAO;;AMqSzB;EAAE,aNlNgB,EAAO;;AMmNzB;EAAE,aNvHe,EAAO;;AMwHxB;EAAE,aN0Bc,EAAO;;AMzBvB;EAAE,aNsCoB,EAAO;;AMrC7B;EAAE,aN0CmB,EAAO;;AMzC5B;EAAE,aN2CgB,EAAO;;AM1CzB;EAAE,aNhXiB,EAAO;;AMiX1B;EAAE,aNlXuB,EAAO;;AMmXhC;EAAE,aNvSe,EAAO;;AMwSxB;EAAE,aN+BY,EAAO;;AM9BrB;EAAE,aNyJmB,EAAO;;AMxJ5B;EAAE,aNvEkB,EAAO;;AMwE3B;EAAE,aN6EmB,EAAO;;AM5E5B;EAAE,aN5KiB,EAAO;;AM6K1B;EAAE,aNwJa,EAAO;;AMvJtB;EAAE,aNjGY,EAAO;;AMkGrB;EAAE,aNxFe,EAAO;;AMyFxB;;EAAE,aNmHmB,EAAO;;AMlH5B;EAAE,aNmHuB,EAAO;;AMlHhC;EAAE,aNoJoB,EAAO;;AMnJ7B;EAAE,aNrGmB,EAAO;;AMsG5B;EAAE,aNmJkB,EAAO;;AMlJ3B;EAAE,aNtGmB,EAAO;;AMuG5B;EAAE,aNrGqB,EAAO;;AMsG9B;EAAE,aNvGqB,EAAO;;AMwG9B;EAAE,aNjFc,EAAO;;AMkFvB;EAAE,aNjOkB,EAAO;;AMkO3B;EAAE,aN1RyB,EAAO;;AM2RlC;EAAE,aNpDmB,EAAO;;AMqD5B;EAAE,aNyJgB,EAAO;;AMxJzB;EAAE,aNCc,EAAO;;AMAvB;EAAE,aNmIiB,EAAO;;AMlI1B;EAAE,aNoIkB,EAAO;;AMnI3B;;EAAE,aN7bW,EAAO;;AM8bpB;EAAE,aNuIe,EAAO;;AMtIxB;EAAE,aNgGa,EAAO;;AM/FtB;EAAE,aN0Dc,EAAO;;AMzDvB;EAAE,aNhHc,EAAO;;AMiHvB;;EAAE,aN0JoB,EAAO;;AMzJ7B;EAAE,aNtFqB,EAAO;;AMuF9B;EAAE,aN1FgB,EAAO;;AM2FzB;EAAE,aNhToB,EAAO;;AMiT7B;;EAAE,aN1coB,EAAO;;AM2c7B;;EAAE,aNxc8B,EAAO;;AMycvC;;EAAE,aN3coB,EAAO;;AM4c7B;;EAAE,aN3cuB,EAAO;;AM4chC;;EAAE,aN/cqB,EAAO;;AMgd9B;EAAE,aN1GqB,EAAO;;AM2G9B;EAAE,aNhMgB,EAAO;;AMiMzB;EAAE,aNvGoB,EAAO;;AMwG7B;EAAE,aNvGsB,EAAO;;AMwG/B;EAAE,aNmCmB,EAAO;;AMlC5B;EAAE,aNmCqB,EAAO;;AMlC9B;EAAE,aN1Zc,EAAO;;AM2ZvB;EAAE,aN7ZsB,EAAO;;AM8Z/B;EAAE,aN/Xa,EAAO;;AMgYtB;EAAE,aNreqB,EAAO;;AMse9B;EAAE,aN7MmB,EAAO;;AM8M5B;;EAAE,aN7MuB,EAAO;;AM8MhC;;EAAE,aNhNsB,EAAO;;AMiN/B;;EAAE,aNlNqB,EAAO;;AMmN9B;EAAE,aNvNiB,EAAO;;AMwN1B;;EAAE,aNtOmB,EAAO;;AMuO5B;;EAAE,aN1OoB,EAAO;;AM2O7B;EAAE,aNvOuB,EAAO;;AMwOhC;EAAE,aNjPqB,EAAO;;AMkP9B;EAAE,aNxOoB,EAAO;;AMyO7B;EAAE,aN5OsB,EAAO;;AM6O/B;EAAE,aN9OoB,EAAO;;AM+O7B;EAAE,aN6DiB,EAAO;;AM5D1B;EAAE,aNnEkB,EAAO;;AMoE3B;EAAE,aNtXwB,EAAO;;AMuXjC;EAAE,aN7QU,EAAO;;AM8QnB;EAAE,aN7QiB,EAAO;;AM8Q1B;EAAE,aNgEmB,EAAO;;AM/D5B;EAAE,aN/HqB,EAAO;;AMgI9B;EAAE,aN/H4B,EAAO;;AMgIrC;EAAE,aNnRkB,EAAO;;AMoR3B;EAAE,aN2GmB,EAAO;;AM1G5B;EAAE,aNzDc,EAAO;;AM0DvB;EAAE,aN/Zc,EAAO;;AMgavB;EAAE,aNjTe,EAAO;;AMkTxB;EAAE,aNlIa,EAAO;;AMmItB;EAAE,aNxNyB,EAAO;;AMyNlC;;EAAE,aNsBkB,EAAO;;AMrB3B;EAAE,aNvYc,EAAO;;AMwYvB;EAAE,aN9iBa,EAAO;;AM+iBtB;EAAE,aNxiBc,EAAO;;AMyiBvB;EAAE,aNhduB,EAAO;;AMidhC;EAAE,aNndwB,EAAO;;AModjC;EAAE,aNjdwB,EAAO;;AMkdjC;EAAE,aNtdwB,EAAO;;AMudjC;EAAE,aNvOgB,EAAO;;AMwOzB;EAAE,aNjLe,EAAO;;AMkLxB;EAAE,aNjLiB,EAAO;;AMkL1B;EAAE,aNpLa,EAAO;;AMqLtB;EAAE,aNvLW,EAAO;;AMwLpB;EAAE,aN1ZkB,EAAO;;AM2Z3B;EAAE,aN1ZoB,EAAO;;AM2Z7B;EAAE,aNrPa,EAAO;;AMsPtB;EAAE,aNuEa,EAAO;;AMtEtB;EAAE,aNnfiB,EAAO;;AMof1B;EAAE,aNzTiB,EAAO;;AOhR1B;EAEE,sBAAsB;EACtB,YAAY;EAAE,SAAS;EAEvB,kBAAkB;EAAE,SAAS,E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","file":"nuboot_radix.style.css","sourcesContent":["@charset \"UTF-8\";\n/*\n * A partial implementation of the Ruby list functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/lists.rb\n */\n/*\n * A partial implementation of the Ruby constants functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/constants.rb\n */\n/*\n * A partial implementation of the Ruby display functions from Compass:\n * https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/display.rb\n */\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: transparent; }\n\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857;\n color: #333333;\n background-color: #fff; }\n\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit; }\n\na {\n color: #337ab7;\n text-decoration: none; }\n a:hover, a:focus {\n color: #23527c;\n text-decoration: underline; }\n a:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\nfigure {\n margin: 0; }\n\nimg {\n vertical-align: middle; }\n\n.img-responsive {\n display: block;\n max-width: 100%;\n height: auto; }\n\n.img-rounded {\n border-radius: 6px; }\n\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: compact(compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false);\n display: inline-block;\n max-width: 100%;\n height: auto; }\n\n.img-circle {\n border-radius: 50%; }\n\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee; }\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto; }\n\n[role=\"button\"] {\n cursor: pointer; }\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit; }\n h1 small,\n h1 .small, h2 small,\n h2 .small, h3 small,\n h3 .small, h4 small,\n h4 .small, h5 small,\n h5 .small, h6 small,\n h6 .small,\n .h1 small,\n .h1 .small, .h2 small,\n .h2 .small, .h3 small,\n .h3 .small, .h4 small,\n .h4 .small, .h5 small,\n .h5 .small, .h6 small,\n .h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777; }\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: 20px;\n margin-bottom: 10px; }\n h1 small,\n h1 .small, .h1 small,\n .h1 .small,\n h2 small,\n h2 .small, .h2 small,\n .h2 .small,\n h3 small,\n h3 .small, .h3 small,\n .h3 .small {\n font-size: 65%; }\n\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: 10px;\n margin-bottom: 10px; }\n h4 small,\n h4 .small, .h4 small,\n .h4 .small,\n h5 small,\n h5 .small, .h5 small,\n .h5 .small,\n h6 small,\n h6 .small, .h6 small,\n .h6 .small {\n font-size: 75%; }\n\nh1, .h1 {\n font-size: 36px; }\n\nh2, .h2 {\n font-size: 30px; }\n\nh3, .h3 {\n font-size: 24px; }\n\nh4, .h4 {\n font-size: 18px; }\n\nh5, .h5 {\n font-size: 14px; }\n\nh6, .h6 {\n font-size: 12px; }\n\np {\n margin: 0 0 10px; }\n\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4; }\n @media (min-width: 768px) {\n .lead {\n font-size: 21px; } }\n\nsmall,\n.small {\n font-size: 85%; }\n\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em; }\n\n.text-left {\n text-align: left; }\n\n.text-right {\n text-align: right; }\n\n.text-center {\n text-align: center; }\n\n.text-justify {\n text-align: justify; }\n\n.text-nowrap {\n white-space: nowrap; }\n\n.text-lowercase {\n text-transform: lowercase; }\n\n.text-uppercase, .initialism {\n text-transform: uppercase; }\n\n.text-capitalize {\n text-transform: capitalize; }\n\n.text-muted, body.maintenance-page .tasks-list > div {\n color: #777777; }\n\n.text-primary {\n color: #337ab7; }\n\na.text-primary:hover,\na.text-primary:focus {\n color: #286090; }\n\n.text-success {\n color: #3c763d; }\n\na.text-success:hover,\na.text-success:focus {\n color: #2b542c; }\n\n.text-info {\n color: #31708f; }\n\na.text-info:hover,\na.text-info:focus {\n color: #245269; }\n\n.text-warning {\n color: #8a6d3b; }\n\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c; }\n\n.text-danger {\n color: #a94442; }\n\na.text-danger:hover,\na.text-danger:focus {\n color: #843534; }\n\n.bg-primary {\n color: #fff; }\n\n.bg-primary {\n background-color: #337ab7; }\n\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090; }\n\n.bg-success {\n background-color: #dff0d8; }\n\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3; }\n\n.bg-info {\n background-color: #d9edf7; }\n\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee; }\n\n.bg-warning {\n background-color: #fcf8e3; }\n\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5; }\n\n.bg-danger {\n background-color: #f2dede; }\n\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9; }\n\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee; }\n\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px; }\n ul ul,\n ul ol,\n ol ul,\n ol ol {\n margin-bottom: 0; }\n\n.list-unstyled {\n padding-left: 0;\n list-style: none; }\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px; }\n .list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px; }\n\ndl {\n margin-top: 0;\n margin-bottom: 20px; }\n\ndt,\ndd {\n line-height: 1.42857; }\n\ndt {\n font-weight: bold; }\n\ndd {\n margin-left: 0; }\n\n.dl-horizontal dd {\n overflow: hidden;\n *zoom: 1; }\n\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .dl-horizontal dd {\n margin-left: 180px; } }\n\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777; }\n\n.initialism {\n font-size: 90%; }\n\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee; }\n blockquote p:last-child,\n blockquote ul:last-child,\n blockquote ol:last-child {\n margin-bottom: 0; }\n blockquote footer,\n blockquote small,\n blockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857;\n color: #777777; }\n blockquote footer:before,\n blockquote small:before,\n blockquote .small:before {\n content: '\\2014 \\00A0'; }\n\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right; }\n .blockquote-reverse footer:before,\n .blockquote-reverse small:before,\n .blockquote-reverse .small:before,\n blockquote.pull-right footer:before,\n blockquote.pull-right small:before,\n blockquote.pull-right .small:before {\n content: ''; }\n .blockquote-reverse footer:after,\n .blockquote-reverse small:after,\n .blockquote-reverse .small:after,\n blockquote.pull-right footer:after,\n blockquote.pull-right small:after,\n blockquote.pull-right .small:after {\n content: '\\00A0 \\2014'; }\n\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }\n\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px; }\n\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }\n kbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none; }\n\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px; }\n pre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0; }\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll; }\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n overflow: hidden;\n *zoom: 1; }\n @media (min-width: 768px) {\n .container {\n width: 750px; } }\n @media (min-width: 992px) {\n .container {\n width: 970px; } }\n @media (min-width: 1200px) {\n .container {\n width: 1170px; } }\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n overflow: hidden;\n *zoom: 1; }\n\n.row {\n margin-left: -15px;\n margin-right: -15px;\n overflow: hidden;\n *zoom: 1; }\n\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .calendar-calendar, .view .row > .list-group, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px; }\n\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left; }\n\n.col-xs-1 {\n width: 8.33333%; }\n\n.col-xs-2 {\n width: 16.66667%; }\n\n.col-xs-3 {\n width: 25%; }\n\n.col-xs-4 {\n width: 33.33333%; }\n\n.col-xs-5 {\n width: 41.66667%; }\n\n.col-xs-6 {\n width: 50%; }\n\n.col-xs-7 {\n width: 58.33333%; }\n\n.col-xs-8 {\n width: 66.66667%; }\n\n.col-xs-9 {\n width: 75%; }\n\n.col-xs-10 {\n width: 83.33333%; }\n\n.col-xs-11 {\n width: 91.66667%; }\n\n.col-xs-12 {\n width: 100%; }\n\n.col-xs-pull-0 {\n right: auto; }\n\n.col-xs-pull-1 {\n right: 8.33333%; }\n\n.col-xs-pull-2 {\n right: 16.66667%; }\n\n.col-xs-pull-3 {\n right: 25%; }\n\n.col-xs-pull-4 {\n right: 33.33333%; }\n\n.col-xs-pull-5 {\n right: 41.66667%; }\n\n.col-xs-pull-6 {\n right: 50%; }\n\n.col-xs-pull-7 {\n right: 58.33333%; }\n\n.col-xs-pull-8 {\n right: 66.66667%; }\n\n.col-xs-pull-9 {\n right: 75%; }\n\n.col-xs-pull-10 {\n right: 83.33333%; }\n\n.col-xs-pull-11 {\n right: 91.66667%; }\n\n.col-xs-pull-12 {\n right: 100%; }\n\n.col-xs-push-0 {\n left: auto; }\n\n.col-xs-push-1 {\n left: 8.33333%; }\n\n.col-xs-push-2 {\n left: 16.66667%; }\n\n.col-xs-push-3 {\n left: 25%; }\n\n.col-xs-push-4 {\n left: 33.33333%; }\n\n.col-xs-push-5 {\n left: 41.66667%; }\n\n.col-xs-push-6 {\n left: 50%; }\n\n.col-xs-push-7 {\n left: 58.33333%; }\n\n.col-xs-push-8 {\n left: 66.66667%; }\n\n.col-xs-push-9 {\n left: 75%; }\n\n.col-xs-push-10 {\n left: 83.33333%; }\n\n.col-xs-push-11 {\n left: 91.66667%; }\n\n.col-xs-push-12 {\n left: 100%; }\n\n.col-xs-offset-0 {\n margin-left: 0%; }\n\n.col-xs-offset-1 {\n margin-left: 8.33333%; }\n\n.col-xs-offset-2 {\n margin-left: 16.66667%; }\n\n.col-xs-offset-3 {\n margin-left: 25%; }\n\n.col-xs-offset-4 {\n margin-left: 33.33333%; }\n\n.col-xs-offset-5 {\n margin-left: 41.66667%; }\n\n.col-xs-offset-6 {\n margin-left: 50%; }\n\n.col-xs-offset-7 {\n margin-left: 58.33333%; }\n\n.col-xs-offset-8 {\n margin-left: 66.66667%; }\n\n.col-xs-offset-9 {\n margin-left: 75%; }\n\n.col-xs-offset-10 {\n margin-left: 83.33333%; }\n\n.col-xs-offset-11 {\n margin-left: 91.66667%; }\n\n.col-xs-offset-12 {\n margin-left: 100%; }\n\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left; }\n .col-sm-1 {\n width: 8.33333%; }\n .col-sm-2 {\n width: 16.66667%; }\n .col-sm-3 {\n width: 25%; }\n .col-sm-4 {\n width: 33.33333%; }\n .col-sm-5 {\n width: 41.66667%; }\n .col-sm-6 {\n width: 50%; }\n .col-sm-7 {\n width: 58.33333%; }\n .col-sm-8 {\n width: 66.66667%; }\n .col-sm-9 {\n width: 75%; }\n .col-sm-10 {\n width: 83.33333%; }\n .col-sm-11 {\n width: 91.66667%; }\n .col-sm-12 {\n width: 100%; }\n .col-sm-pull-0 {\n right: auto; }\n .col-sm-pull-1 {\n right: 8.33333%; }\n .col-sm-pull-2 {\n right: 16.66667%; }\n .col-sm-pull-3 {\n right: 25%; }\n .col-sm-pull-4 {\n right: 33.33333%; }\n .col-sm-pull-5 {\n right: 41.66667%; }\n .col-sm-pull-6 {\n right: 50%; }\n .col-sm-pull-7 {\n right: 58.33333%; }\n .col-sm-pull-8 {\n right: 66.66667%; }\n .col-sm-pull-9 {\n right: 75%; }\n .col-sm-pull-10 {\n right: 83.33333%; }\n .col-sm-pull-11 {\n right: 91.66667%; }\n .col-sm-pull-12 {\n right: 100%; }\n .col-sm-push-0 {\n left: auto; }\n .col-sm-push-1 {\n left: 8.33333%; }\n .col-sm-push-2 {\n left: 16.66667%; }\n .col-sm-push-3 {\n left: 25%; }\n .col-sm-push-4 {\n left: 33.33333%; }\n .col-sm-push-5 {\n left: 41.66667%; }\n .col-sm-push-6 {\n left: 50%; }\n .col-sm-push-7 {\n left: 58.33333%; }\n .col-sm-push-8 {\n left: 66.66667%; }\n .col-sm-push-9 {\n left: 75%; }\n .col-sm-push-10 {\n left: 83.33333%; }\n .col-sm-push-11 {\n left: 91.66667%; }\n .col-sm-push-12 {\n left: 100%; }\n .col-sm-offset-0 {\n margin-left: 0%; }\n .col-sm-offset-1 {\n margin-left: 8.33333%; }\n .col-sm-offset-2 {\n margin-left: 16.66667%; }\n .col-sm-offset-3 {\n margin-left: 25%; }\n .col-sm-offset-4 {\n margin-left: 33.33333%; }\n .col-sm-offset-5 {\n margin-left: 41.66667%; }\n .col-sm-offset-6 {\n margin-left: 50%; }\n .col-sm-offset-7 {\n margin-left: 58.33333%; }\n .col-sm-offset-8 {\n margin-left: 66.66667%; }\n .col-sm-offset-9 {\n margin-left: 75%; }\n .col-sm-offset-10 {\n margin-left: 83.33333%; }\n .col-sm-offset-11 {\n margin-left: 91.66667%; }\n .col-sm-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .calendar-calendar, .view .row > .list-group {\n float: left; }\n .col-md-1 {\n width: 8.33333%; }\n .col-md-2 {\n width: 16.66667%; }\n .col-md-3 {\n width: 25%; }\n .col-md-4 {\n width: 33.33333%; }\n .col-md-5 {\n width: 41.66667%; }\n .col-md-6 {\n width: 50%; }\n .col-md-7 {\n width: 58.33333%; }\n .col-md-8 {\n width: 66.66667%; }\n .col-md-9 {\n width: 75%; }\n .col-md-10 {\n width: 83.33333%; }\n .col-md-11 {\n width: 91.66667%; }\n .col-md-12, .calendar-calendar, .view .row > .list-group {\n width: 100%; }\n .col-md-pull-0 {\n right: auto; }\n .col-md-pull-1 {\n right: 8.33333%; }\n .col-md-pull-2 {\n right: 16.66667%; }\n .col-md-pull-3 {\n right: 25%; }\n .col-md-pull-4 {\n right: 33.33333%; }\n .col-md-pull-5 {\n right: 41.66667%; }\n .col-md-pull-6 {\n right: 50%; }\n .col-md-pull-7 {\n right: 58.33333%; }\n .col-md-pull-8 {\n right: 66.66667%; }\n .col-md-pull-9 {\n right: 75%; }\n .col-md-pull-10 {\n right: 83.33333%; }\n .col-md-pull-11 {\n right: 91.66667%; }\n .col-md-pull-12 {\n right: 100%; }\n .col-md-push-0 {\n left: auto; }\n .col-md-push-1 {\n left: 8.33333%; }\n .col-md-push-2 {\n left: 16.66667%; }\n .col-md-push-3 {\n left: 25%; }\n .col-md-push-4 {\n left: 33.33333%; }\n .col-md-push-5 {\n left: 41.66667%; }\n .col-md-push-6 {\n left: 50%; }\n .col-md-push-7 {\n left: 58.33333%; }\n .col-md-push-8 {\n left: 66.66667%; }\n .col-md-push-9 {\n left: 75%; }\n .col-md-push-10 {\n left: 83.33333%; }\n .col-md-push-11 {\n left: 91.66667%; }\n .col-md-push-12 {\n left: 100%; }\n .col-md-offset-0 {\n margin-left: 0%; }\n .col-md-offset-1 {\n margin-left: 8.33333%; }\n .col-md-offset-2 {\n margin-left: 16.66667%; }\n .col-md-offset-3 {\n margin-left: 25%; }\n .col-md-offset-4 {\n margin-left: 33.33333%; }\n .col-md-offset-5 {\n margin-left: 41.66667%; }\n .col-md-offset-6 {\n margin-left: 50%; }\n .col-md-offset-7 {\n margin-left: 58.33333%; }\n .col-md-offset-8 {\n margin-left: 66.66667%; }\n .col-md-offset-9 {\n margin-left: 75%; }\n .col-md-offset-10 {\n margin-left: 83.33333%; }\n .col-md-offset-11 {\n margin-left: 91.66667%; }\n .col-md-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left; }\n .col-lg-1 {\n width: 8.33333%; }\n .col-lg-2 {\n width: 16.66667%; }\n .col-lg-3 {\n width: 25%; }\n .col-lg-4 {\n width: 33.33333%; }\n .col-lg-5 {\n width: 41.66667%; }\n .col-lg-6 {\n width: 50%; }\n .col-lg-7 {\n width: 58.33333%; }\n .col-lg-8 {\n width: 66.66667%; }\n .col-lg-9 {\n width: 75%; }\n .col-lg-10 {\n width: 83.33333%; }\n .col-lg-11 {\n width: 91.66667%; }\n .col-lg-12 {\n width: 100%; }\n .col-lg-pull-0 {\n right: auto; }\n .col-lg-pull-1 {\n right: 8.33333%; }\n .col-lg-pull-2 {\n right: 16.66667%; }\n .col-lg-pull-3 {\n right: 25%; }\n .col-lg-pull-4 {\n right: 33.33333%; }\n .col-lg-pull-5 {\n right: 41.66667%; }\n .col-lg-pull-6 {\n right: 50%; }\n .col-lg-pull-7 {\n right: 58.33333%; }\n .col-lg-pull-8 {\n right: 66.66667%; }\n .col-lg-pull-9 {\n right: 75%; }\n .col-lg-pull-10 {\n right: 83.33333%; }\n .col-lg-pull-11 {\n right: 91.66667%; }\n .col-lg-pull-12 {\n right: 100%; }\n .col-lg-push-0 {\n left: auto; }\n .col-lg-push-1 {\n left: 8.33333%; }\n .col-lg-push-2 {\n left: 16.66667%; }\n .col-lg-push-3 {\n left: 25%; }\n .col-lg-push-4 {\n left: 33.33333%; }\n .col-lg-push-5 {\n left: 41.66667%; }\n .col-lg-push-6 {\n left: 50%; }\n .col-lg-push-7 {\n left: 58.33333%; }\n .col-lg-push-8 {\n left: 66.66667%; }\n .col-lg-push-9 {\n left: 75%; }\n .col-lg-push-10 {\n left: 83.33333%; }\n .col-lg-push-11 {\n left: 91.66667%; }\n .col-lg-push-12 {\n left: 100%; }\n .col-lg-offset-0 {\n margin-left: 0%; }\n .col-lg-offset-1 {\n margin-left: 8.33333%; }\n .col-lg-offset-2 {\n margin-left: 16.66667%; }\n .col-lg-offset-3 {\n margin-left: 25%; }\n .col-lg-offset-4 {\n margin-left: 33.33333%; }\n .col-lg-offset-5 {\n margin-left: 41.66667%; }\n .col-lg-offset-6 {\n margin-left: 50%; }\n .col-lg-offset-7 {\n margin-left: 58.33333%; }\n .col-lg-offset-8 {\n margin-left: 66.66667%; }\n .col-lg-offset-9 {\n margin-left: 75%; }\n .col-lg-offset-10 {\n margin-left: 83.33333%; }\n .col-lg-offset-11 {\n margin-left: 91.66667%; }\n .col-lg-offset-12 {\n margin-left: 100%; } }\n\ntable {\n background-color: transparent; }\n\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left; }\n\nth {\n text-align: left; }\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px; }\n .table > thead > tr > th,\n .table > thead > tr > td,\n .table > tbody > tr > th,\n .table > tbody > tr > td,\n .table > tfoot > tr > th,\n .table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857;\n vertical-align: top;\n border-top: 1px solid #ddd; }\n .table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd; }\n .table > caption + thead > tr:first-child > th,\n .table > caption + thead > tr:first-child > td,\n .table > colgroup + thead > tr:first-child > th,\n .table > colgroup + thead > tr:first-child > td,\n .table > thead:first-child > tr:first-child > th,\n .table > thead:first-child > tr:first-child > td {\n border-top: 0; }\n .table > tbody + tbody {\n border-top: 2px solid #ddd; }\n .table .table {\n background-color: #fff; }\n\n.table-condensed > thead > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > tfoot > tr > td {\n padding: 5px; }\n\n.table-bordered, .calendar-calendar table.mini {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th, .calendar-calendar table.mini > thead > tr > th,\n .table-bordered > thead > tr > td, .calendar-calendar table.mini > thead > tr > td,\n .table-bordered > tbody > tr > th, .calendar-calendar table.mini > tbody > tr > th,\n .table-bordered > tbody > tr > td, .calendar-calendar table.mini > tbody > tr > td,\n .table-bordered > tfoot > tr > th, .calendar-calendar table.mini > tfoot > tr > th,\n .table-bordered > tfoot > tr > td, .calendar-calendar table.mini > tfoot > tr > td {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th, .calendar-calendar table.mini > thead > tr > th,\n .table-bordered > thead > tr > td, .calendar-calendar table.mini > thead > tr > td {\n border-bottom-width: 2px; }\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell; }\n\n.table > thead > tr > td.active,\n.table > thead > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8; }\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8; }\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6; }\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7; }\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3; }\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc; }\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede; }\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc; }\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; }\n @media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd; }\n .table-responsive > .table {\n margin-bottom: 0; }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap; }\n .table-responsive > .table-bordered, .calendar-calendar .table-responsive > table.mini {\n border: 0; }\n .table-responsive > .table-bordered > thead > tr > th:first-child, .calendar-calendar .table-responsive > table.mini > thead > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child, .calendar-calendar\n .table-responsive > table.mini > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > td:first-child {\n border-left: 0; }\n .table-responsive > .table-bordered > thead > tr > th:last-child, .calendar-calendar .table-responsive > table.mini > thead > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child, .calendar-calendar\n .table-responsive > table.mini > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > td:last-child {\n border-right: 0; }\n .table-responsive > .table-bordered > tbody > tr:last-child > th, .calendar-calendar .table-responsive > table.mini > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td, .calendar-calendar\n .table-responsive > table.mini > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr:last-child > td {\n border-bottom: 0; } }\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0; }\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5; }\n\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold; }\n\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal; }\n\ninput[type=\"file\"] {\n display: block; }\n\ninput[type=\"range\"] {\n display: block;\n width: 100%; }\n\nselect[multiple],\nselect[size] {\n height: auto; }\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857;\n color: #555555; }\n\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -webkit-transition: compact(compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false) false false false);\n transition: compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false); }\n .form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6), false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6), false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6), false, false, false, false, false, false, false, false); }\n .form-control::-moz-placeholder {\n color: #999;\n opacity: 1; }\n .form-control:-ms-input-placeholder {\n color: #999; }\n .form-control::-webkit-input-placeholder {\n color: #999; }\n .form-control::-ms-expand {\n border: 0;\n background-color: transparent; }\n .form-control[disabled], .form-control[readonly],\n fieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1; }\n .form-control[disabled],\n fieldset[disabled] .form-control {\n cursor: not-allowed; }\n\ntextarea.form-control {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: none; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px; }\n input[type=\"date\"].input-sm, .input-group-sm > input[type=\"date\"].form-control,\n .input-group-sm > input[type=\"date\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"date\"].btn,\n .input-group-sm input[type=\"date\"],\n input[type=\"time\"].input-sm,\n .input-group-sm > input[type=\"time\"].form-control,\n .input-group-sm > input[type=\"time\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"time\"].btn,\n .input-group-sm\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-sm,\n .input-group-sm > input[type=\"datetime-local\"].form-control,\n .input-group-sm > input[type=\"datetime-local\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-sm\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-sm,\n .input-group-sm > input[type=\"month\"].form-control,\n .input-group-sm > input[type=\"month\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"month\"].btn,\n .input-group-sm\n input[type=\"month\"] {\n line-height: 30px; }\n input[type=\"date\"].input-lg, .input-group-lg > input[type=\"date\"].form-control,\n .input-group-lg > input[type=\"date\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"date\"].btn,\n .input-group-lg input[type=\"date\"],\n input[type=\"time\"].input-lg,\n .input-group-lg > input[type=\"time\"].form-control,\n .input-group-lg > input[type=\"time\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"time\"].btn,\n .input-group-lg\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-lg,\n .input-group-lg > input[type=\"datetime-local\"].form-control,\n .input-group-lg > input[type=\"datetime-local\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-lg\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-lg,\n .input-group-lg > input[type=\"month\"].form-control,\n .input-group-lg > input[type=\"month\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"month\"].btn,\n .input-group-lg\n input[type=\"month\"] {\n line-height: 46px; } }\n\n.form-group {\n margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px; }\n .radio label,\n .checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer; }\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9; }\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; }\n\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer; }\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; }\n\ninput[type=\"radio\"][disabled], input[type=\"radio\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled]\ninput[type=\"checkbox\"] {\n cursor: not-allowed; }\n\n.radio-inline.disabled,\nfieldset[disabled] .radio-inline,\n.checkbox-inline.disabled,\nfieldset[disabled]\n.checkbox-inline {\n cursor: not-allowed; }\n\n.radio.disabled label,\nfieldset[disabled] .radio label,\n.checkbox.disabled label,\nfieldset[disabled]\n.checkbox label {\n cursor: not-allowed; }\n\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px; }\n .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,\n .input-group-lg > .form-control-static.input-group-addon,\n .input-group-lg > .input-group-btn > .form-control-static.btn,\n .input-group-lg > .media-widget.input-group-btn > a.form-control-static, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,\n .input-group-sm > .form-control-static.input-group-addon,\n .input-group-sm > .input-group-btn > .form-control-static.btn,\n .input-group-sm > .media-widget.input-group-btn > a.form-control-static {\n padding-left: 0;\n padding-right: 0; }\n\n.input-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn,\n.input-group-sm > .media-widget.input-group-btn > a {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\nselect.input-sm, .input-group-sm > select.form-control,\n.input-group-sm > select.input-group-addon,\n.input-group-sm > .input-group-btn > select.btn {\n height: 30px;\n line-height: 30px; }\n\ntextarea.input-sm, .input-group-sm > textarea.form-control,\n.input-group-sm > textarea.input-group-addon,\n.input-group-sm > .input-group-btn > textarea.btn,\nselect[multiple].input-sm,\n.input-group-sm > select[multiple].form-control,\n.input-group-sm > select[multiple].input-group-addon,\n.input-group-sm > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px; }\n\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto; }\n\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.input-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn,\n.input-group-lg > .media-widget.input-group-btn > a {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\nselect.input-lg, .input-group-lg > select.form-control,\n.input-group-lg > select.input-group-addon,\n.input-group-lg > .input-group-btn > select.btn {\n height: 46px;\n line-height: 46px; }\n\ntextarea.input-lg, .input-group-lg > textarea.form-control,\n.input-group-lg > textarea.input-group-addon,\n.input-group-lg > .input-group-btn > textarea.btn,\nselect[multiple].input-lg,\n.input-group-lg > select[multiple].form-control,\n.input-group-lg > select[multiple].input-group-addon,\n.input-group-lg > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px; }\n\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto; }\n\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.33333; }\n\n.has-feedback {\n position: relative; }\n .has-feedback .form-control {\n padding-right: 42.5px; }\n\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none; }\n\n.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,\n.input-group-lg > .input-group-addon + .form-control-feedback,\n.input-group-lg > .input-group-btn > .btn + .form-control-feedback,\n.input-group-lg > .media-widget.input-group-btn > a + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px; }\n\n.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,\n.input-group-sm > .input-group-addon + .form-control-feedback,\n.input-group-sm > .input-group-btn > .btn + .form-control-feedback,\n.input-group-sm > .media-widget.input-group-btn > a + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px; }\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d; }\n\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false); }\n .has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168, false, false, false, false, false, false, false, false, false); }\n\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8; }\n\n.has-success .form-control-feedback {\n color: #3c763d; }\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b; }\n\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false); }\n .has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b, false, false, false, false, false, false, false, false, false); }\n\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3; }\n\n.has-warning .form-control-feedback {\n color: #8a6d3b; }\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442; }\n\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false); }\n .has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483, false, false, false, false, false, false, false, false, false); }\n\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede; }\n\n.has-error .form-control-feedback {\n color: #a94442; }\n\n.has-feedback label ~ .form-control-feedback {\n top: 25px; }\n\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0; }\n\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373; }\n\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .form-inline .form-control-static {\n display: inline-block; }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle; }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto; }\n .form-inline .input-group > .form-control {\n width: 100%; }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0; }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .form-inline .has-feedback .form-control-feedback {\n top: 0; } }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px; }\n\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n overflow: hidden;\n *zoom: 1; }\n\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px; } }\n\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px; }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px; } }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px; } }\n\n.btn, .media-widget > a {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none; }\n .btn:focus, .media-widget > a:focus, .btn.focus, .media-widget > a.focus, .btn:active:focus, .media-widget > a:active:focus, .btn:active.focus, .media-widget > a:active.focus, .btn.active:focus, .media-widget > a.active:focus, .btn.active.focus, .media-widget > a.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n .btn:hover, .media-widget > a:hover, .btn:focus, .media-widget > a:focus, .btn.focus, .media-widget > a.focus {\n color: #333;\n text-decoration: none; }\n .btn:active, .media-widget > a:active, .btn.active, .media-widget > a.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false); }\n .btn.disabled, .media-widget > a.disabled, .btn[disabled], .media-widget > a[disabled],\n fieldset[disabled] .btn,\n fieldset[disabled] .media-widget > a {\n cursor: not-allowed;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n\na.btn.disabled, .media-widget > a.disabled,\nfieldset[disabled] a.btn,\nfieldset[disabled] .media-widget > a {\n pointer-events: none; }\n\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc; }\n .btn-default:focus, .btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c; }\n .btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,\n .open > .btn-default.dropdown-toggle:hover,\n .open > .btn-default.dropdown-toggle:focus,\n .open > .btn-default.dropdown-toggle.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n background-image: none; }\n .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,\n fieldset[disabled] .btn-default:hover,\n fieldset[disabled] .btn-default:focus,\n fieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc; }\n .btn-default .badge {\n color: #fff;\n background-color: #333; }\n\n.btn-primary, body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary:focus, body.maintenance-page .form-actions .btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a:focus:first-child, .btn-primary.focus, body.maintenance-page .form-actions .focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a.focus:first-child {\n color: #fff;\n background-color: #286090;\n border-color: #122b40; }\n .btn-primary:hover, body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a:hover:first-child {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active, body.maintenance-page .form-actions .btn:active:first-child, body.maintenance-page .form-actions .media-widget > a:active:first-child, .btn-primary.active, body.maintenance-page .form-actions .active.btn:first-child, body.maintenance-page .form-actions .media-widget > a.active:first-child,\n .open > .btn-primary.dropdown-toggle, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:first-child {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active:hover, body.maintenance-page .form-actions .btn:active:hover:first-child, body.maintenance-page .form-actions .media-widget > a:active:hover:first-child, .btn-primary:active:focus, body.maintenance-page .form-actions .btn:active:focus:first-child, body.maintenance-page .form-actions .media-widget > a:active:focus:first-child, .btn-primary:active.focus, body.maintenance-page .form-actions .btn:active.focus:first-child, body.maintenance-page .form-actions .media-widget > a:active.focus:first-child, .btn-primary.active:hover, body.maintenance-page .form-actions .active.btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a.active:hover:first-child, .btn-primary.active:focus, body.maintenance-page .form-actions .active.btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a.active:focus:first-child, .btn-primary.active.focus, body.maintenance-page .form-actions .active.focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a.active.focus:first-child,\n .open > .btn-primary.dropdown-toggle:hover, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:hover:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:hover:first-child,\n .open > .btn-primary.dropdown-toggle:focus, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:focus:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:focus:first-child,\n .open > .btn-primary.dropdown-toggle.focus, body.maintenance-page .form-actions\n .open > .dropdown-toggle.focus.btn:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle.focus:first-child {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40; }\n .btn-primary:active, body.maintenance-page .form-actions .btn:active:first-child, body.maintenance-page .form-actions .media-widget > a:active:first-child, .btn-primary.active, body.maintenance-page .form-actions .active.btn:first-child, body.maintenance-page .form-actions .media-widget > a.active:first-child,\n .open > .btn-primary.dropdown-toggle, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:first-child {\n background-image: none; }\n .btn-primary.disabled:hover, body.maintenance-page .form-actions .disabled.btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a.disabled:hover:first-child, .btn-primary.disabled:focus, body.maintenance-page .form-actions .disabled.btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a.disabled:focus:first-child, .btn-primary.disabled.focus, body.maintenance-page .form-actions .disabled.focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a.disabled.focus:first-child, .btn-primary[disabled]:hover, body.maintenance-page .form-actions [disabled].btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a[disabled]:hover:first-child, .btn-primary[disabled]:focus, body.maintenance-page .form-actions [disabled].btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a[disabled]:focus:first-child, .btn-primary[disabled].focus, body.maintenance-page .form-actions [disabled].focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a[disabled].focus:first-child,\n fieldset[disabled] .btn-primary:hover,\n fieldset[disabled] body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .btn:hover:first-child,\n fieldset[disabled] body.maintenance-page .form-actions .media-widget > a:hover:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .media-widget > a:hover:first-child,\n fieldset[disabled] .btn-primary:focus,\n fieldset[disabled] body.maintenance-page .form-actions .btn:focus:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .btn:focus:first-child,\n fieldset[disabled] body.maintenance-page .form-actions .media-widget > a:focus:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .media-widget > a:focus:first-child,\n fieldset[disabled] .btn-primary.focus,\n fieldset[disabled] body.maintenance-page .form-actions .focus.btn:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .focus.btn:first-child,\n fieldset[disabled] body.maintenance-page .form-actions .media-widget > a.focus:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .media-widget > a.focus:first-child {\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary .badge, body.maintenance-page .form-actions .btn:first-child .badge, body.maintenance-page .form-actions .media-widget > a:first-child .badge {\n color: #337ab7;\n background-color: #fff; }\n\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success:focus, .btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625; }\n .btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,\n .open > .btn-success.dropdown-toggle:hover,\n .open > .btn-success.dropdown-toggle:focus,\n .open > .btn-success.dropdown-toggle.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n background-image: none; }\n .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,\n fieldset[disabled] .btn-success:hover,\n fieldset[disabled] .btn-success:focus,\n fieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success .badge {\n color: #5cb85c;\n background-color: #fff; }\n\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info:focus, .btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85; }\n .btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,\n .open > .btn-info.dropdown-toggle:hover,\n .open > .btn-info.dropdown-toggle:focus,\n .open > .btn-info.dropdown-toggle.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n background-image: none; }\n .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,\n fieldset[disabled] .btn-info:hover,\n fieldset[disabled] .btn-info:focus,\n fieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info .badge {\n color: #5bc0de;\n background-color: #fff; }\n\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning:focus, .btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d; }\n .btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,\n .open > .btn-warning.dropdown-toggle:hover,\n .open > .btn-warning.dropdown-toggle:focus,\n .open > .btn-warning.dropdown-toggle.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n background-image: none; }\n .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,\n fieldset[disabled] .btn-warning:hover,\n fieldset[disabled] .btn-warning:focus,\n fieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff; }\n\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger:focus, .btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19; }\n .btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,\n .open > .btn-danger.dropdown-toggle:hover,\n .open > .btn-danger.dropdown-toggle:focus,\n .open > .btn-danger.dropdown-toggle.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n background-image: none; }\n .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,\n fieldset[disabled] .btn-danger:hover,\n fieldset[disabled] .btn-danger:focus,\n fieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger .badge {\n color: #d9534f;\n background-color: #fff; }\n\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0; }\n .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],\n fieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {\n border-color: transparent; }\n .btn-link:hover, .btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent; }\n .btn-link[disabled]:hover, .btn-link[disabled]:focus,\n fieldset[disabled] .btn-link:hover,\n fieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none; }\n\n.btn-lg, .btn-group-lg > .btn, .media-widget.btn-group-lg > a {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\n.btn-sm, .btn-group-sm > .btn, .media-widget.btn-group-sm > a {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-xs, .btn-group-xs > .btn, .media-widget.btn-group-xs > a {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-block {\n display: block;\n width: 100%; }\n\n.btn-block + .btn-block {\n margin-top: 5px; }\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%; }\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%; }\n\nbody {\n margin: 0; }\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline; }\n\naudio:not([controls]) {\n display: none;\n height: 0; }\n\n[hidden],\ntemplate {\n display: none; }\n\na {\n background-color: transparent; }\n\na:active,\na:hover {\n outline: 0; }\n\nabbr[title] {\n border-bottom: 1px dotted; }\n\nb,\nstrong {\n font-weight: bold; }\n\ndfn {\n font-style: italic; }\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0; }\n\nmark {\n background: #ff0;\n color: #000; }\n\nsmall {\n font-size: 80%; }\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline; }\n\nsup {\n top: -0.5em; }\n\nsub {\n bottom: -0.25em; }\n\nimg {\n border: 0; }\n\nsvg:not(:root) {\n overflow: hidden; }\n\nfigure {\n margin: 1em 40px; }\n\nhr {\n box-sizing: content-box;\n height: 0; }\n\npre {\n overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em; }\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0; }\n\nbutton {\n overflow: visible; }\n\nbutton,\nselect {\n text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer; }\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0; }\n\ninput {\n line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0; }\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none; }\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em; }\n\nlegend {\n border: 0;\n padding: 0; }\n\ntextarea {\n overflow: auto; }\n\noptgroup {\n font-weight: bold; }\n\ntable {\n border-collapse: collapse;\n border-spacing: 0; }\n\ntd,\nth {\n padding: 0; }\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important; }\n a,\n a:visited {\n text-decoration: underline; }\n a[href]:after {\n content: \" (\" attr(href) \")\"; }\n abbr[title]:after {\n content: \" (\" attr(title) \")\"; }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\"; }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid; }\n thead {\n display: table-header-group; }\n tr,\n img {\n page-break-inside: avoid; }\n img {\n max-width: 100% !important; }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3; }\n h2,\n h3 {\n page-break-after: avoid; }\n .navbar {\n display: none; }\n .btn > .caret, .media-widget > a > .caret,\n .dropup > .btn > .caret,\n .media-widget.dropup > a > .caret {\n border-top-color: #000 !important; }\n .label {\n border: 1px solid #000; }\n .table {\n border-collapse: collapse !important; }\n .table td,\n .table th {\n background-color: #fff !important; }\n .table-bordered th, .calendar-calendar table.mini th,\n .table-bordered td, .calendar-calendar table.mini td {\n border: 1px solid #ddd !important; } }\n\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\"); }\n\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon-asterisk:before {\n content: \"\\002a\"; }\n\n.glyphicon-plus:before {\n content: \"\\002b\"; }\n\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\"; }\n\n.glyphicon-minus:before {\n content: \"\\2212\"; }\n\n.glyphicon-cloud:before {\n content: \"\\2601\"; }\n\n.glyphicon-envelope:before {\n content: \"\\2709\"; }\n\n.glyphicon-pencil:before {\n content: \"\\270f\"; }\n\n.glyphicon-glass:before {\n content: \"\\e001\"; }\n\n.glyphicon-music:before {\n content: \"\\e002\"; }\n\n.glyphicon-search:before {\n content: \"\\e003\"; }\n\n.glyphicon-heart:before {\n content: \"\\e005\"; }\n\n.glyphicon-star:before {\n content: \"\\e006\"; }\n\n.glyphicon-star-empty:before {\n content: \"\\e007\"; }\n\n.glyphicon-user:before {\n content: \"\\e008\"; }\n\n.glyphicon-film:before {\n content: \"\\e009\"; }\n\n.glyphicon-th-large:before {\n content: \"\\e010\"; }\n\n.glyphicon-th:before {\n content: \"\\e011\"; }\n\n.glyphicon-th-list:before {\n content: \"\\e012\"; }\n\n.glyphicon-ok:before {\n content: \"\\e013\"; }\n\n.glyphicon-remove:before {\n content: \"\\e014\"; }\n\n.glyphicon-zoom-in:before {\n content: \"\\e015\"; }\n\n.glyphicon-zoom-out:before {\n content: \"\\e016\"; }\n\n.glyphicon-off:before {\n content: \"\\e017\"; }\n\n.glyphicon-signal:before {\n content: \"\\e018\"; }\n\n.glyphicon-cog:before {\n content: \"\\e019\"; }\n\n.glyphicon-trash:before {\n content: \"\\e020\"; }\n\n.glyphicon-home:before {\n content: \"\\e021\"; }\n\n.glyphicon-file:before {\n content: \"\\e022\"; }\n\n.glyphicon-time:before {\n content: \"\\e023\"; }\n\n.glyphicon-road:before {\n content: \"\\e024\"; }\n\n.glyphicon-download-alt:before {\n content: \"\\e025\"; }\n\n.glyphicon-download:before {\n content: \"\\e026\"; }\n\n.glyphicon-upload:before {\n content: \"\\e027\"; }\n\n.glyphicon-inbox:before {\n content: \"\\e028\"; }\n\n.glyphicon-play-circle:before {\n content: \"\\e029\"; }\n\n.glyphicon-repeat:before {\n content: \"\\e030\"; }\n\n.glyphicon-refresh:before {\n content: \"\\e031\"; }\n\n.glyphicon-list-alt:before {\n content: \"\\e032\"; }\n\n.glyphicon-lock:before {\n content: \"\\e033\"; }\n\n.glyphicon-flag:before {\n content: \"\\e034\"; }\n\n.glyphicon-headphones:before {\n content: \"\\e035\"; }\n\n.glyphicon-volume-off:before {\n content: \"\\e036\"; }\n\n.glyphicon-volume-down:before {\n content: \"\\e037\"; }\n\n.glyphicon-volume-up:before {\n content: \"\\e038\"; }\n\n.glyphicon-qrcode:before {\n content: \"\\e039\"; }\n\n.glyphicon-barcode:before {\n content: \"\\e040\"; }\n\n.glyphicon-tag:before {\n content: \"\\e041\"; }\n\n.glyphicon-tags:before {\n content: \"\\e042\"; }\n\n.glyphicon-book:before {\n content: \"\\e043\"; }\n\n.glyphicon-bookmark:before {\n content: \"\\e044\"; }\n\n.glyphicon-print:before {\n content: \"\\e045\"; }\n\n.glyphicon-camera:before {\n content: \"\\e046\"; }\n\n.glyphicon-font:before {\n content: \"\\e047\"; }\n\n.glyphicon-bold:before {\n content: \"\\e048\"; }\n\n.glyphicon-italic:before {\n content: \"\\e049\"; }\n\n.glyphicon-text-height:before {\n content: \"\\e050\"; }\n\n.glyphicon-text-width:before {\n content: \"\\e051\"; }\n\n.glyphicon-align-left:before {\n content: \"\\e052\"; }\n\n.glyphicon-align-center:before {\n content: \"\\e053\"; }\n\n.glyphicon-align-right:before {\n content: \"\\e054\"; }\n\n.glyphicon-align-justify:before {\n content: \"\\e055\"; }\n\n.glyphicon-list:before {\n content: \"\\e056\"; }\n\n.glyphicon-indent-left:before {\n content: \"\\e057\"; }\n\n.glyphicon-indent-right:before {\n content: \"\\e058\"; }\n\n.glyphicon-facetime-video:before {\n content: \"\\e059\"; }\n\n.glyphicon-picture:before {\n content: \"\\e060\"; }\n\n.glyphicon-map-marker:before {\n content: \"\\e062\"; }\n\n.glyphicon-adjust:before {\n content: \"\\e063\"; }\n\n.glyphicon-tint:before {\n content: \"\\e064\"; }\n\n.glyphicon-edit:before {\n content: \"\\e065\"; }\n\n.glyphicon-share:before {\n content: \"\\e066\"; }\n\n.glyphicon-check:before {\n content: \"\\e067\"; }\n\n.glyphicon-move:before {\n content: \"\\e068\"; }\n\n.glyphicon-step-backward:before {\n content: \"\\e069\"; }\n\n.glyphicon-fast-backward:before {\n content: \"\\e070\"; }\n\n.glyphicon-backward:before {\n content: \"\\e071\"; }\n\n.glyphicon-play:before {\n content: \"\\e072\"; }\n\n.glyphicon-pause:before {\n content: \"\\e073\"; }\n\n.glyphicon-stop:before {\n content: \"\\e074\"; }\n\n.glyphicon-forward:before {\n content: \"\\e075\"; }\n\n.glyphicon-fast-forward:before {\n content: \"\\e076\"; }\n\n.glyphicon-step-forward:before {\n content: \"\\e077\"; }\n\n.glyphicon-eject:before {\n content: \"\\e078\"; }\n\n.glyphicon-chevron-left:before {\n content: \"\\e079\"; }\n\n.glyphicon-chevron-right:before {\n content: \"\\e080\"; }\n\n.glyphicon-plus-sign:before {\n content: \"\\e081\"; }\n\n.glyphicon-minus-sign:before {\n content: \"\\e082\"; }\n\n.glyphicon-remove-sign:before {\n content: \"\\e083\"; }\n\n.glyphicon-ok-sign:before {\n content: \"\\e084\"; }\n\n.glyphicon-question-sign:before {\n content: \"\\e085\"; }\n\n.glyphicon-info-sign:before {\n content: \"\\e086\"; }\n\n.glyphicon-screenshot:before {\n content: \"\\e087\"; }\n\n.glyphicon-remove-circle:before {\n content: \"\\e088\"; }\n\n.glyphicon-ok-circle:before {\n content: \"\\e089\"; }\n\n.glyphicon-ban-circle:before {\n content: \"\\e090\"; }\n\n.glyphicon-arrow-left:before {\n content: \"\\e091\"; }\n\n.glyphicon-arrow-right:before {\n content: \"\\e092\"; }\n\n.glyphicon-arrow-up:before {\n content: \"\\e093\"; }\n\n.glyphicon-arrow-down:before {\n content: \"\\e094\"; }\n\n.glyphicon-share-alt:before {\n content: \"\\e095\"; }\n\n.glyphicon-resize-full:before {\n content: \"\\e096\"; }\n\n.glyphicon-resize-small:before {\n content: \"\\e097\"; }\n\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\"; }\n\n.glyphicon-gift:before {\n content: \"\\e102\"; }\n\n.glyphicon-leaf:before {\n content: \"\\e103\"; }\n\n.glyphicon-fire:before {\n content: \"\\e104\"; }\n\n.glyphicon-eye-open:before {\n content: \"\\e105\"; }\n\n.glyphicon-eye-close:before {\n content: \"\\e106\"; }\n\n.glyphicon-warning-sign:before {\n content: \"\\e107\"; }\n\n.glyphicon-plane:before {\n content: \"\\e108\"; }\n\n.glyphicon-calendar:before {\n content: \"\\e109\"; }\n\n.glyphicon-random:before {\n content: \"\\e110\"; }\n\n.glyphicon-comment:before {\n content: \"\\e111\"; }\n\n.glyphicon-magnet:before {\n content: \"\\e112\"; }\n\n.glyphicon-chevron-up:before {\n content: \"\\e113\"; }\n\n.glyphicon-chevron-down:before {\n content: \"\\e114\"; }\n\n.glyphicon-retweet:before {\n content: \"\\e115\"; }\n\n.glyphicon-shopping-cart:before {\n content: \"\\e116\"; }\n\n.glyphicon-folder-close:before {\n content: \"\\e117\"; }\n\n.glyphicon-folder-open:before {\n content: \"\\e118\"; }\n\n.glyphicon-resize-vertical:before {\n content: \"\\e119\"; }\n\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\"; }\n\n.glyphicon-hdd:before {\n content: \"\\e121\"; }\n\n.glyphicon-bullhorn:before {\n content: \"\\e122\"; }\n\n.glyphicon-bell:before {\n content: \"\\e123\"; }\n\n.glyphicon-certificate:before {\n content: \"\\e124\"; }\n\n.glyphicon-thumbs-up:before {\n content: \"\\e125\"; }\n\n.glyphicon-thumbs-down:before {\n content: \"\\e126\"; }\n\n.glyphicon-hand-right:before {\n content: \"\\e127\"; }\n\n.glyphicon-hand-left:before {\n content: \"\\e128\"; }\n\n.glyphicon-hand-up:before {\n content: \"\\e129\"; }\n\n.glyphicon-hand-down:before {\n content: \"\\e130\"; }\n\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\"; }\n\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\"; }\n\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\"; }\n\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\"; }\n\n.glyphicon-globe:before {\n content: \"\\e135\"; }\n\n.glyphicon-wrench:before {\n content: \"\\e136\"; }\n\n.glyphicon-tasks:before {\n content: \"\\e137\"; }\n\n.glyphicon-filter:before {\n content: \"\\e138\"; }\n\n.glyphicon-briefcase:before {\n content: \"\\e139\"; }\n\n.glyphicon-fullscreen:before {\n content: \"\\e140\"; }\n\n.glyphicon-dashboard:before {\n content: \"\\e141\"; }\n\n.glyphicon-paperclip:before {\n content: \"\\e142\"; }\n\n.glyphicon-heart-empty:before {\n content: \"\\e143\"; }\n\n.glyphicon-link:before {\n content: \"\\e144\"; }\n\n.glyphicon-phone:before {\n content: \"\\e145\"; }\n\n.glyphicon-pushpin:before {\n content: \"\\e146\"; }\n\n.glyphicon-usd:before {\n content: \"\\e148\"; }\n\n.glyphicon-gbp:before {\n content: \"\\e149\"; }\n\n.glyphicon-sort:before {\n content: \"\\e150\"; }\n\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\"; }\n\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\"; }\n\n.glyphicon-sort-by-order:before {\n content: \"\\e153\"; }\n\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\"; }\n\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\"; }\n\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\"; }\n\n.glyphicon-unchecked:before {\n content: \"\\e157\"; }\n\n.glyphicon-expand:before {\n content: \"\\e158\"; }\n\n.glyphicon-collapse-down:before {\n content: \"\\e159\"; }\n\n.glyphicon-collapse-up:before {\n content: \"\\e160\"; }\n\n.glyphicon-log-in:before {\n content: \"\\e161\"; }\n\n.glyphicon-flash:before {\n content: \"\\e162\"; }\n\n.glyphicon-log-out:before {\n content: \"\\e163\"; }\n\n.glyphicon-new-window:before {\n content: \"\\e164\"; }\n\n.glyphicon-record:before {\n content: \"\\e165\"; }\n\n.glyphicon-save:before {\n content: \"\\e166\"; }\n\n.glyphicon-open:before {\n content: \"\\e167\"; }\n\n.glyphicon-saved:before {\n content: \"\\e168\"; }\n\n.glyphicon-import:before {\n content: \"\\e169\"; }\n\n.glyphicon-export:before {\n content: \"\\e170\"; }\n\n.glyphicon-send:before {\n content: \"\\e171\"; }\n\n.glyphicon-floppy-disk:before {\n content: \"\\e172\"; }\n\n.glyphicon-floppy-saved:before {\n content: \"\\e173\"; }\n\n.glyphicon-floppy-remove:before {\n content: \"\\e174\"; }\n\n.glyphicon-floppy-save:before {\n content: \"\\e175\"; }\n\n.glyphicon-floppy-open:before {\n content: \"\\e176\"; }\n\n.glyphicon-credit-card:before {\n content: \"\\e177\"; }\n\n.glyphicon-transfer:before {\n content: \"\\e178\"; }\n\n.glyphicon-cutlery:before {\n content: \"\\e179\"; }\n\n.glyphicon-header:before {\n content: \"\\e180\"; }\n\n.glyphicon-compressed:before {\n content: \"\\e181\"; }\n\n.glyphicon-earphone:before {\n content: \"\\e182\"; }\n\n.glyphicon-phone-alt:before {\n content: \"\\e183\"; }\n\n.glyphicon-tower:before {\n content: \"\\e184\"; }\n\n.glyphicon-stats:before {\n content: \"\\e185\"; }\n\n.glyphicon-sd-video:before {\n content: \"\\e186\"; }\n\n.glyphicon-hd-video:before {\n content: \"\\e187\"; }\n\n.glyphicon-subtitles:before {\n content: \"\\e188\"; }\n\n.glyphicon-sound-stereo:before {\n content: \"\\e189\"; }\n\n.glyphicon-sound-dolby:before {\n content: \"\\e190\"; }\n\n.glyphicon-sound-5-1:before {\n content: \"\\e191\"; }\n\n.glyphicon-sound-6-1:before {\n content: \"\\e192\"; }\n\n.glyphicon-sound-7-1:before {\n content: \"\\e193\"; }\n\n.glyphicon-copyright-mark:before {\n content: \"\\e194\"; }\n\n.glyphicon-registration-mark:before {\n content: \"\\e195\"; }\n\n.glyphicon-cloud-download:before {\n content: \"\\e197\"; }\n\n.glyphicon-cloud-upload:before {\n content: \"\\e198\"; }\n\n.glyphicon-tree-conifer:before {\n content: \"\\e199\"; }\n\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\"; }\n\n.glyphicon-cd:before {\n content: \"\\e201\"; }\n\n.glyphicon-save-file:before {\n content: \"\\e202\"; }\n\n.glyphicon-open-file:before {\n content: \"\\e203\"; }\n\n.glyphicon-level-up:before {\n content: \"\\e204\"; }\n\n.glyphicon-copy:before {\n content: \"\\e205\"; }\n\n.glyphicon-paste:before {\n content: \"\\e206\"; }\n\n.glyphicon-alert:before {\n content: \"\\e209\"; }\n\n.glyphicon-equalizer:before {\n content: \"\\e210\"; }\n\n.glyphicon-king:before {\n content: \"\\e211\"; }\n\n.glyphicon-queen:before {\n content: \"\\e212\"; }\n\n.glyphicon-pawn:before {\n content: \"\\e213\"; }\n\n.glyphicon-bishop:before {\n content: \"\\e214\"; }\n\n.glyphicon-knight:before {\n content: \"\\e215\"; }\n\n.glyphicon-baby-formula:before {\n content: \"\\e216\"; }\n\n.glyphicon-tent:before {\n content: \"\\26fa\"; }\n\n.glyphicon-blackboard:before {\n content: \"\\e218\"; }\n\n.glyphicon-bed:before {\n content: \"\\e219\"; }\n\n.glyphicon-apple:before {\n content: \"\\f8ff\"; }\n\n.glyphicon-erase:before {\n content: \"\\e221\"; }\n\n.glyphicon-hourglass:before {\n content: \"\\231b\"; }\n\n.glyphicon-lamp:before {\n content: \"\\e223\"; }\n\n.glyphicon-duplicate:before {\n content: \"\\e224\"; }\n\n.glyphicon-piggy-bank:before {\n content: \"\\e225\"; }\n\n.glyphicon-scissors:before {\n content: \"\\e226\"; }\n\n.glyphicon-bitcoin:before {\n content: \"\\e227\"; }\n\n.glyphicon-btc:before {\n content: \"\\e227\"; }\n\n.glyphicon-xbt:before {\n content: \"\\e227\"; }\n\n.glyphicon-yen:before {\n content: \"\\00a5\"; }\n\n.glyphicon-jpy:before {\n content: \"\\00a5\"; }\n\n.glyphicon-ruble:before {\n content: \"\\20bd\"; }\n\n.glyphicon-rub:before {\n content: \"\\20bd\"; }\n\n.glyphicon-scale:before {\n content: \"\\e230\"; }\n\n.glyphicon-ice-lolly:before {\n content: \"\\e231\"; }\n\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\"; }\n\n.glyphicon-education:before {\n content: \"\\e233\"; }\n\n.glyphicon-option-horizontal:before {\n content: \"\\e234\"; }\n\n.glyphicon-option-vertical:before {\n content: \"\\e235\"; }\n\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\"; }\n\n.glyphicon-modal-window:before {\n content: \"\\e237\"; }\n\n.glyphicon-oil:before {\n content: \"\\e238\"; }\n\n.glyphicon-grain:before {\n content: \"\\e239\"; }\n\n.glyphicon-sunglasses:before {\n content: \"\\e240\"; }\n\n.glyphicon-text-size:before {\n content: \"\\e241\"; }\n\n.glyphicon-text-color:before {\n content: \"\\e242\"; }\n\n.glyphicon-text-background:before {\n content: \"\\e243\"; }\n\n.glyphicon-object-align-top:before {\n content: \"\\e244\"; }\n\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\"; }\n\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\"; }\n\n.glyphicon-object-align-left:before {\n content: \"\\e247\"; }\n\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\"; }\n\n.glyphicon-object-align-right:before {\n content: \"\\e249\"; }\n\n.glyphicon-triangle-right:before {\n content: \"\\e250\"; }\n\n.glyphicon-triangle-left:before {\n content: \"\\e251\"; }\n\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\"; }\n\n.glyphicon-triangle-top:before {\n content: \"\\e253\"; }\n\n.glyphicon-console:before {\n content: \"\\e254\"; }\n\n.glyphicon-superscript:before {\n content: \"\\e255\"; }\n\n.glyphicon-subscript:before {\n content: \"\\e256\"; }\n\n.glyphicon-menu-left:before {\n content: \"\\e257\"; }\n\n.glyphicon-menu-right:before {\n content: \"\\e258\"; }\n\n.glyphicon-menu-down:before {\n content: \"\\e259\"; }\n\n.glyphicon-menu-up:before {\n content: \"\\e260\"; }\n\n.fade {\n opacity: 0;\n -webkit-transition: compact(compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false); }\n .fade.in {\n opacity: 1; }\n\n.collapse {\n display: none; }\n .collapse.in {\n display: block; }\n\ntr.collapse.in {\n display: table-row; }\n\ntbody.collapse.in {\n display: table-row-group; }\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n -moz-transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n -o-transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n -webkit-transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n -moz-transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n -o-transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n -webkit-transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false);\n -moz-transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false);\n -o-transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false);\n transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false); }\n\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent; }\n\n.dropup,\n.dropdown {\n position: relative; }\n\n.dropdown-toggle:focus {\n outline: 0; }\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: compact(0 6px 12px rgba(0, 0, 0, 0.175), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 6px 12px rgba(0, 0, 0, 0.175), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 6px 12px rgba(0, 0, 0, 0.175), false, false, false, false, false, false, false, false, false);\n background-clip: padding-box; }\n .dropdown-menu.pull-right {\n right: 0;\n left: auto; }\n .dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857;\n color: #333333;\n white-space: nowrap; }\n\n.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5; }\n\n.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7; }\n\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n color: #777777; }\n\n.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed; }\n\n.open > .dropdown-menu {\n display: block; }\n\n.open > a {\n outline: 0; }\n\n.dropdown-menu-right {\n left: auto;\n right: 0; }\n\n.dropdown-menu-left {\n left: 0;\n right: auto; }\n\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857;\n color: #777777;\n white-space: nowrap; }\n\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990; }\n\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto; }\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\"; }\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px; }\n\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto; }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto; } }\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; }\n .btn-group > .btn, .media-widget.btn-group > a,\n .btn-group-vertical > .btn,\n .media-widget.btn-group-vertical > a {\n position: relative;\n float: left; }\n .btn-group > .btn:hover, .media-widget.btn-group > a:hover, .btn-group > .btn:focus, .media-widget.btn-group > a:focus, .btn-group > .btn:active, .media-widget.btn-group > a:active, .btn-group > .btn.active, .media-widget.btn-group > a.active,\n .btn-group-vertical > .btn:hover,\n .media-widget.btn-group-vertical > a:hover,\n .btn-group-vertical > .btn:focus,\n .media-widget.btn-group-vertical > a:focus,\n .btn-group-vertical > .btn:active,\n .media-widget.btn-group-vertical > a:active,\n .btn-group-vertical > .btn.active,\n .media-widget.btn-group-vertical > a.active {\n z-index: 2; }\n\n.btn-group .btn + .btn, .btn-group .media-widget > a + .btn, .btn-group .media-widget > .btn + a, .btn-group .media-widget > a + a,\n.btn-group .btn + .btn-group,\n.btn-group .media-widget > a + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .media-widget > .btn-group + a,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px; }\n\n.btn-toolbar {\n margin-left: -5px;\n overflow: hidden;\n *zoom: 1; }\n .btn-toolbar .btn, .btn-toolbar .media-widget > a,\n .btn-toolbar .btn-group,\n .btn-toolbar .input-group {\n float: left; }\n .btn-toolbar > .btn, .media-widget.btn-toolbar > a,\n .btn-toolbar > .btn-group,\n .btn-toolbar > .input-group {\n margin-left: 5px; }\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle), .media-widget.btn-group > a:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0; }\n\n.btn-group > .btn:first-child, .media-widget.btn-group > a:first-child {\n margin-left: 0; }\n .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle), .media-widget.btn-group > a:first-child:not(:last-child):not(.dropdown-toggle) {\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group > .btn:last-child:not(:first-child), .media-widget.btn-group > a:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group > .btn-group {\n float: left; }\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn, .btn-group > .media-widget.btn-group:not(:first-child):not(:last-child) > a {\n border-radius: 0; }\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .media-widget.btn-group:first-child:not(:last-child) > a:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child, .btn-group > .media-widget.btn-group:last-child:not(:first-child) > a:first-child {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0; }\n\n.btn-group > .btn + .dropdown-toggle, .media-widget.btn-group > a + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle, .media-widget.btn-group-lg.btn-group > a + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px; }\n\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false); }\n .btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n\n.btn .caret, .media-widget > a .caret {\n margin-left: 0; }\n\n.btn-lg .caret, .btn-group-lg > .btn .caret, .media-widget.btn-group-lg > a .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0; }\n\n.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret, .dropup .media-widget.btn-group-lg > a .caret {\n border-width: 0 5px 5px; }\n\n.btn-group-vertical > .btn, .media-widget.btn-group-vertical > a,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn,\n.btn-group-vertical > .media-widget.btn-group > a {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%; }\n\n.btn-group-vertical > .btn-group {\n overflow: hidden;\n *zoom: 1; }\n .btn-group-vertical > .btn-group > .btn, .btn-group-vertical > .media-widget.btn-group > a {\n float: none; }\n\n.btn-group-vertical > .btn + .btn, .media-widget.btn-group-vertical > a + .btn, .media-widget.btn-group-vertical > .btn + a, .media-widget.btn-group-vertical > a + a,\n.btn-group-vertical > .btn + .btn-group,\n.media-widget.btn-group-vertical > a + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.media-widget.btn-group-vertical > .btn-group + a,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0; }\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child), .media-widget.btn-group-vertical > a:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.btn-group-vertical > .btn:first-child:not(:last-child), .media-widget.btn-group-vertical > a:first-child:not(:last-child) {\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group-vertical > .btn:last-child:not(:first-child), .media-widget.btn-group-vertical > a:last-child:not(:first-child) {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px; }\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn, .btn-group-vertical > .media-widget.btn-group:not(:first-child):not(:last-child) > a {\n border-radius: 0; }\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .media-widget.btn-group:first-child:not(:last-child) > a:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child, .btn-group-vertical > .media-widget.btn-group:last-child:not(:first-child) > a:first-child {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate; }\n .btn-group-justified > .btn, .media-widget.btn-group-justified > a,\n .btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%; }\n .btn-group-justified > .btn-group .btn, .btn-group-justified > .btn-group .media-widget > a {\n width: 100%; }\n .btn-group-justified > .btn-group .dropdown-menu {\n left: auto; }\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"], .media-widget[data-toggle=\"buttons\"] > a input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n.media-widget[data-toggle=\"buttons\"] > a input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .media-widget.btn-group > a input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .media-widget.btn-group > a input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none; }\n\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate; }\n .input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0; }\n .input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0; }\n .input-group .form-control:focus {\n z-index: 3; }\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell; }\n .input-group-addon:not(:first-child):not(:last-child),\n .input-group-btn:not(:first-child):not(:last-child),\n .input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; }\n\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px; }\n .input-group-addon.input-sm,\n .input-group-sm > .input-group-addon,\n .input-group-sm > .input-group-btn > .input-group-addon.btn,\n .input-group-sm > .media-widget.input-group-btn > a.input-group-addon {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px; }\n .input-group-addon.input-lg,\n .input-group-lg > .input-group-addon,\n .input-group-lg > .input-group-btn > .input-group-addon.btn,\n .input-group-lg > .media-widget.input-group-btn > a.input-group-addon {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px; }\n .input-group-addon input[type=\"radio\"],\n .input-group-addon input[type=\"checkbox\"] {\n margin-top: 0; }\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.media-widget.input-group-btn:first-child > a,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .media-widget.btn-group > a,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.media-widget.input-group-btn:last-child > a:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn,\n.input-group-btn:last-child > .media-widget.btn-group:not(:last-child) > a {\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.input-group-addon:first-child {\n border-right: 0; }\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.media-widget.input-group-btn:last-child > a,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .media-widget.btn-group > a,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.media-widget.input-group-btn:first-child > a:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn,\n.input-group-btn:first-child > .media-widget.btn-group:not(:first-child) > a {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.input-group-addon:last-child {\n border-left: 0; }\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap; }\n .input-group-btn > .btn, .media-widget.input-group-btn > a {\n position: relative; }\n .input-group-btn > .btn + .btn, .media-widget.input-group-btn > a + .btn, .media-widget.input-group-btn > .btn + a, .media-widget.input-group-btn > a + a {\n margin-left: -1px; }\n .input-group-btn > .btn:hover, .media-widget.input-group-btn > a:hover, .input-group-btn > .btn:focus, .media-widget.input-group-btn > a:focus, .input-group-btn > .btn:active, .media-widget.input-group-btn > a:active {\n z-index: 2; }\n .input-group-btn:first-child > .btn, .media-widget.input-group-btn:first-child > a,\n .input-group-btn:first-child > .btn-group {\n margin-right: -1px; }\n .input-group-btn:last-child > .btn, .media-widget.input-group-btn:last-child > a,\n .input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px; }\n\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n overflow: hidden;\n *zoom: 1; }\n .nav > li {\n position: relative;\n display: block; }\n .nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px; }\n .nav > li > a:hover, .nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .nav > li.disabled > a {\n color: #777777; }\n .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed; }\n .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7; }\n .nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .nav > li > a > img {\n max-width: none; }\n\n.nav-tabs {\n border-bottom: 1px solid #ddd; }\n .nav-tabs > li {\n float: left;\n margin-bottom: -1px; }\n .nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0; }\n .nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd; }\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default; }\n\n.nav-pills > li {\n float: left; }\n .nav-pills > li > a {\n border-radius: 4px; }\n .nav-pills > li + li {\n margin-left: 2px; }\n .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7; }\n\n.nav-stacked > li {\n float: none; }\n .nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0; }\n\n.nav-justified, .nav-tabs.nav-justified {\n width: 100%; }\n .nav-justified > li, .nav-tabs.nav-justified > li {\n float: none; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px; }\n .nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto; }\n @media (min-width: 768px) {\n .nav-justified > li, .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-bottom: 0; } }\n\n.nav-tabs-justified, .nav-tabs.nav-justified {\n border-bottom: 0; }\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd; }\n @media (min-width: 768px) {\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff; } }\n\n.tab-content > .tab-pane {\n display: none; }\n\n.tab-content > .active {\n display: block; }\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n overflow: hidden;\n *zoom: 1; }\n @media (min-width: 768px) {\n .navbar {\n border-radius: 4px; } }\n\n.navbar-header {\n overflow: hidden;\n *zoom: 1; }\n @media (min-width: 768px) {\n .navbar-header {\n float: left; } }\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n overflow: hidden;\n *zoom: 1;\n -webkit-overflow-scrolling: touch; }\n .navbar-collapse.in {\n overflow-y: auto; }\n @media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none; }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important; }\n .navbar-collapse.in {\n overflow-y: visible; }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0; } }\n\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px; }\n @media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px; } }\n\n.container > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px; }\n @media (min-width: 768px) {\n .container > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-header,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0; } }\n\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px; }\n @media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0; } }\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030; }\n @media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0; } }\n\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px; }\n\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0; }\n\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px; }\n .navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none; }\n .navbar-brand > img {\n display: block; }\n @media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px; } }\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px; }\n .navbar-toggle:focus {\n outline: 0; }\n .navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px; }\n .navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px; }\n @media (min-width: 768px) {\n .navbar-toggle {\n display: none; } }\n\n.navbar-nav {\n margin: 7.5px -15px; }\n .navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px; }\n @media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none; }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px; }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px; }\n .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none; } }\n @media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0; }\n .navbar-nav > li {\n float: left; }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px; } }\n\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: compact(inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1), false, false, false, false, false, false, false, false, false);\n margin-top: 8px;\n margin-bottom: 8px; }\n @media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .navbar-form .form-control-static {\n display: inline-block; }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle; }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto; }\n .navbar-form .input-group > .form-control {\n width: 100%; }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0; }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0; } }\n @media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px; }\n .navbar-form .form-group:last-child {\n margin-bottom: 0; } }\n @media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); } }\n\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px; }\n .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn, .media-widget.btn-group-sm > a.navbar-btn {\n margin-top: 10px;\n margin-bottom: 10px; }\n .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn, .media-widget.btn-group-xs > a.navbar-btn {\n margin-top: 14px;\n margin-bottom: 14px; }\n\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px; }\n @media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px; } }\n\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important; }\n .navbar-right {\n float: right !important;\n margin-right: -15px; }\n .navbar-right ~ .navbar-right {\n margin-right: 0; } }\n\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7; }\n .navbar-default .navbar-brand {\n color: #777; }\n .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent; }\n .navbar-default .navbar-text {\n color: #777; }\n .navbar-default .navbar-nav > li > a {\n color: #777; }\n .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent; }\n .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7; }\n .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent; }\n .navbar-default .navbar-toggle {\n border-color: #ddd; }\n .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n background-color: #ddd; }\n .navbar-default .navbar-toggle .icon-bar {\n background-color: #888; }\n .navbar-default .navbar-collapse,\n .navbar-default .navbar-form {\n border-color: #e7e7e7; }\n .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555; }\n @media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777; }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent; }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7; }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent; } }\n .navbar-default .navbar-link {\n color: #777; }\n .navbar-default .navbar-link:hover {\n color: #333; }\n .navbar-default .btn-link {\n color: #777; }\n .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {\n color: #333; }\n .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-default .btn-link:hover,\n fieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc; }\n\n.navbar-inverse {\n background-color: #222;\n border-color: #090909; }\n .navbar-inverse .navbar-brand {\n color: #9d9d9d; }\n .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-text {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #090909; }\n .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent; }\n .navbar-inverse .navbar-toggle {\n border-color: #333; }\n .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {\n background-color: #333; }\n .navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff; }\n .navbar-inverse .navbar-collapse,\n .navbar-inverse .navbar-form {\n border-color: #101010; }\n .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #090909;\n color: #fff; }\n @media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent; } }\n .navbar-inverse .navbar-link {\n color: #9d9d9d; }\n .navbar-inverse .navbar-link:hover {\n color: #fff; }\n .navbar-inverse .btn-link {\n color: #9d9d9d; }\n .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {\n color: #fff; }\n .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-inverse .btn-link:hover,\n fieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444; }\n\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px; }\n .breadcrumb > li {\n display: inline-block; }\n .breadcrumb > li + li:before {\n content: \"/ \";\n padding: 0 5px;\n color: #ccc; }\n .breadcrumb > .active {\n color: #777777; }\n\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px; }\n .pagination > li {\n display: inline; }\n .pagination > li > a,\n .pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px; }\n .pagination > li:first-child > a,\n .pagination > li:first-child > span {\n margin-left: 0;\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px; }\n .pagination > li:last-child > a,\n .pagination > li:last-child > span {\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px; }\n .pagination > li > a:hover, .pagination > li > a:focus,\n .pagination > li > span:hover,\n .pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd; }\n .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,\n .pagination > .active > span,\n .pagination > .active > span:hover,\n .pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default; }\n .pagination > .disabled > span,\n .pagination > .disabled > span:hover,\n .pagination > .disabled > span:focus,\n .pagination > .disabled > a,\n .pagination > .disabled > a:hover,\n .pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed; }\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333; }\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n -moz-border-radius-topleft: 6px;\n -webkit-border-top-left-radius: 6px;\n border-top-left-radius: 6px;\n -moz-border-radius-bottomleft: 6px;\n -webkit-border-bottom-left-radius: 6px;\n border-bottom-left-radius: 6px; }\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n -moz-border-radius-topright: 6px;\n -webkit-border-top-right-radius: 6px;\n border-top-right-radius: 6px;\n -moz-border-radius-bottomright: 6px;\n -webkit-border-bottom-right-radius: 6px;\n border-bottom-right-radius: 6px; }\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px; }\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n overflow: hidden;\n *zoom: 1; }\n .pager li {\n display: inline; }\n .pager li > a,\n .pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px; }\n .pager li > a:hover,\n .pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .pager .next > a,\n .pager .next > span {\n float: right; }\n .pager .previous > a,\n .pager .previous > span {\n float: left; }\n .pager .disabled > a,\n .pager .disabled > a:hover,\n .pager .disabled > a:focus,\n .pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed; }\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em; }\n .label:empty {\n display: none; }\n .btn .label, .media-widget > a .label {\n position: relative;\n top: -1px; }\n\na.label:hover, a.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.label-default {\n background-color: #777777; }\n .label-default[href]:hover, .label-default[href]:focus {\n background-color: #5e5e5e; }\n\n.label-primary {\n background-color: #337ab7; }\n .label-primary[href]:hover, .label-primary[href]:focus {\n background-color: #286090; }\n\n.label-success {\n background-color: #5cb85c; }\n .label-success[href]:hover, .label-success[href]:focus {\n background-color: #449d44; }\n\n.label-info {\n background-color: #5bc0de; }\n .label-info[href]:hover, .label-info[href]:focus {\n background-color: #31b0d5; }\n\n.label-warning {\n background-color: #f0ad4e; }\n .label-warning[href]:hover, .label-warning[href]:focus {\n background-color: #ec971f; }\n\n.label-danger {\n background-color: #d9534f; }\n .label-danger[href]:hover, .label-danger[href]:focus {\n background-color: #c9302c; }\n\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px; }\n .badge:empty {\n display: none; }\n .btn .badge, .media-widget > a .badge {\n position: relative;\n top: -1px; }\n .btn-xs .badge, .btn-group-xs > .btn .badge, .media-widget.btn-group-xs > a .badge,\n .btn-group-xs > .btn .badge,\n .media-widget.btn-group-xs > a .badge {\n top: 0;\n padding: 1px 5px; }\n .list-group-item.active > .badge,\n .nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff; }\n .list-group-item > .badge {\n float: right; }\n .list-group-item > .badge + .badge {\n margin-right: 5px; }\n .nav-pills > li > a > .badge {\n margin-left: 3px; }\n\na.badge:hover, a.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee; }\n .jumbotron h1,\n .jumbotron .h1 {\n color: inherit; }\n .jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200; }\n .jumbotron > hr {\n border-top-color: #d5d5d5; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px; }\n .jumbotron .container {\n max-width: 100%; }\n @media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px; }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px; } }\n\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: compact(compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false); }\n .thumbnail > img,\n .thumbnail a > img {\n display: block;\n max-width: 100%;\n height: auto;\n margin-left: auto;\n margin-right: auto; }\n .thumbnail .caption {\n padding: 9px;\n color: #333333; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7; }\n\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px; }\n .alert h4 {\n margin-top: 0;\n color: inherit; }\n .alert .alert-link {\n font-weight: bold; }\n .alert > p,\n .alert > ul {\n margin-bottom: 0; }\n .alert > p + p {\n margin-top: 5px; }\n\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px; }\n .alert-dismissable .close,\n .alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit; }\n\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d; }\n .alert-success hr {\n border-top-color: #c9e2b3; }\n .alert-success .alert-link {\n color: #2b542c; }\n\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f; }\n .alert-info hr {\n border-top-color: #a6e1ec; }\n .alert-info .alert-link {\n color: #245269; }\n\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b; }\n .alert-warning hr {\n border-top-color: #f7e1b5; }\n .alert-warning .alert-link {\n color: #66512c; }\n\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442; }\n .alert-danger hr {\n border-top-color: #e4b9c0; }\n .alert-danger .alert-link {\n color: #843534; }\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 2px rgba(0, 0, 0, 0.1), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 2px rgba(0, 0, 0, 0.1), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 2px rgba(0, 0, 0, 0.1), false, false, false, false, false, false, false, false, false); }\n\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: compact(inset 0 -1px 0 rgba(0, 0, 0, 0.15), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 -1px 0 rgba(0, 0, 0, 0.15), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 -1px 0 rgba(0, 0, 0, 0.15), false, false, false, false, false, false, false, false, false);\n -webkit-transition: compact(compact(width 0.6s ease, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(width 0.6s ease, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(width 0.6s ease, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(width 0.6s ease, false, false, false, false, false, false, false, false, false); }\n\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n background-size: 40px 40px; }\n\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite; }\n\n.progress-bar-success {\n background-color: #5cb85c; }\n .progress-striped .progress-bar-success {\n 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);\n 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);\n 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); }\n\n.progress-bar-info {\n background-color: #5bc0de; }\n .progress-striped .progress-bar-info {\n 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);\n 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);\n 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); }\n\n.progress-bar-warning {\n background-color: #f0ad4e; }\n .progress-striped .progress-bar-warning {\n 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);\n 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);\n 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); }\n\n.progress-bar-danger {\n background-color: #d9534f; }\n .progress-striped .progress-bar-danger {\n 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);\n 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);\n 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); }\n\n.media {\n margin-top: 15px; }\n .media:first-child {\n margin-top: 0; }\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden; }\n\n.media-body {\n width: 10000px; }\n\n.media-object {\n display: block; }\n .media-object.img-thumbnail {\n max-width: none; }\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px; }\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px; }\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top; }\n\n.media-middle {\n vertical-align: middle; }\n\n.media-bottom {\n vertical-align: bottom; }\n\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.media-list {\n padding-left: 0;\n list-style: none; }\n\n.list-group {\n margin-bottom: 20px;\n padding-left: 0; }\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd; }\n .list-group-item:first-child {\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px; }\n .list-group-item:last-child {\n margin-bottom: 0;\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px; }\n\na.list-group-item,\nbutton.list-group-item {\n color: #555; }\n a.list-group-item .list-group-item-heading,\n button.list-group-item .list-group-item-heading {\n color: #333; }\n a.list-group-item:hover, a.list-group-item:focus,\n button.list-group-item:hover,\n button.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5; }\n\nbutton.list-group-item {\n width: 100%;\n text-align: left; }\n\n.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed; }\n .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {\n color: inherit; }\n .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {\n color: #777777; }\n\n.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .list-group-item.active .list-group-item-heading,\n .list-group-item.active .list-group-item-heading > small,\n .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,\n .list-group-item.active:hover .list-group-item-heading > small,\n .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,\n .list-group-item.active:focus .list-group-item-heading > small,\n .list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit; }\n .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {\n color: #c7ddef; }\n\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8; }\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d; }\n a.list-group-item-success .list-group-item-heading,\n button.list-group-item-success .list-group-item-heading {\n color: inherit; }\n a.list-group-item-success:hover, a.list-group-item-success:focus,\n button.list-group-item-success:hover,\n button.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6; }\n a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,\n button.list-group-item-success.active,\n button.list-group-item-success.active:hover,\n button.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d; }\n\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7; }\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f; }\n a.list-group-item-info .list-group-item-heading,\n button.list-group-item-info .list-group-item-heading {\n color: inherit; }\n a.list-group-item-info:hover, a.list-group-item-info:focus,\n button.list-group-item-info:hover,\n button.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3; }\n a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,\n button.list-group-item-info.active,\n button.list-group-item-info.active:hover,\n button.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f; }\n\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3; }\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b; }\n a.list-group-item-warning .list-group-item-heading,\n button.list-group-item-warning .list-group-item-heading {\n color: inherit; }\n a.list-group-item-warning:hover, a.list-group-item-warning:focus,\n button.list-group-item-warning:hover,\n button.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc; }\n a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,\n button.list-group-item-warning.active,\n button.list-group-item-warning.active:hover,\n button.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b; }\n\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede; }\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442; }\n a.list-group-item-danger .list-group-item-heading,\n button.list-group-item-danger .list-group-item-heading {\n color: inherit; }\n a.list-group-item-danger:hover, a.list-group-item-danger:focus,\n button.list-group-item-danger:hover,\n button.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc; }\n a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,\n button.list-group-item-danger.active,\n button.list-group-item-danger.active:hover,\n button.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442; }\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3; }\n\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: compact(0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false); }\n\n.panel-body {\n padding: 15px;\n overflow: hidden;\n *zoom: 1; }\n\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px; }\n .panel-heading > .dropdown .dropdown-toggle {\n color: inherit; }\n\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit; }\n .panel-title > a,\n .panel-title > small,\n .panel-title > .small,\n .panel-title > small > a,\n .panel-title > .small > a {\n color: inherit; }\n\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0; }\n .panel > .list-group .list-group-item,\n .panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0; }\n .panel > .list-group:first-child .list-group-item:first-child,\n .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .list-group:last-child .list-group-item:last-child,\n .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0; }\n\n.list-group + .panel-footer {\n border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0; }\n .panel > .table caption,\n .panel > .table-responsive > .table caption,\n .panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px; }\n\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px; }\n\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd; }\n\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0; }\n\n.panel > .table-bordered, .calendar-calendar .panel > table.mini,\n.panel > .table-responsive > .table-bordered, .calendar-calendar\n.panel > .table-responsive > table.mini {\n border: 0; }\n .panel > .table-bordered > thead > tr > th:first-child, .calendar-calendar .panel > table.mini > thead > tr > th:first-child,\n .panel > .table-bordered > thead > tr > td:first-child, .calendar-calendar\n .panel > table.mini > thead > tr > td:first-child,\n .panel > .table-bordered > tbody > tr > th:first-child, .calendar-calendar\n .panel > table.mini > tbody > tr > th:first-child,\n .panel > .table-bordered > tbody > tr > td:first-child, .calendar-calendar\n .panel > table.mini > tbody > tr > td:first-child,\n .panel > .table-bordered > tfoot > tr > th:first-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > th:first-child,\n .panel > .table-bordered > tfoot > tr > td:first-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > td:first-child {\n border-left: 0; }\n .panel > .table-bordered > thead > tr > th:last-child, .calendar-calendar .panel > table.mini > thead > tr > th:last-child,\n .panel > .table-bordered > thead > tr > td:last-child, .calendar-calendar\n .panel > table.mini > thead > tr > td:last-child,\n .panel > .table-bordered > tbody > tr > th:last-child, .calendar-calendar\n .panel > table.mini > tbody > tr > th:last-child,\n .panel > .table-bordered > tbody > tr > td:last-child, .calendar-calendar\n .panel > table.mini > tbody > tr > td:last-child,\n .panel > .table-bordered > tfoot > tr > th:last-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > th:last-child,\n .panel > .table-bordered > tfoot > tr > td:last-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > td:last-child {\n border-right: 0; }\n .panel > .table-bordered > thead > tr:first-child > td, .calendar-calendar .panel > table.mini > thead > tr:first-child > td,\n .panel > .table-bordered > thead > tr:first-child > th, .calendar-calendar\n .panel > table.mini > thead > tr:first-child > th,\n .panel > .table-bordered > tbody > tr:first-child > td, .calendar-calendar\n .panel > table.mini > tbody > tr:first-child > td,\n .panel > .table-bordered > tbody > tr:first-child > th, .calendar-calendar\n .panel > table.mini > tbody > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:first-child > th {\n border-bottom: 0; }\n .panel > .table-bordered > tbody > tr:last-child > td, .calendar-calendar .panel > table.mini > tbody > tr:last-child > td,\n .panel > .table-bordered > tbody > tr:last-child > th, .calendar-calendar\n .panel > table.mini > tbody > tr:last-child > th,\n .panel > .table-bordered > tfoot > tr:last-child > td, .calendar-calendar\n .panel > table.mini > tfoot > tr:last-child > td,\n .panel > .table-bordered > tfoot > tr:last-child > th, .calendar-calendar\n .panel > table.mini > tfoot > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr:last-child > th {\n border-bottom: 0; }\n\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0; }\n\n.panel-group {\n margin-bottom: 20px; }\n .panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px; }\n .panel-group .panel + .panel {\n margin-top: 5px; }\n .panel-group .panel-heading {\n border-bottom: 0; }\n .panel-group .panel-heading + .panel-collapse > .panel-body,\n .panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd; }\n .panel-group .panel-footer {\n border-top: 0; }\n .panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd; }\n\n.panel-default {\n border-color: #ddd; }\n .panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd; }\n .panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd; }\n .panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333; }\n .panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd; }\n\n.panel-primary {\n border-color: #337ab7; }\n .panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7; }\n .panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff; }\n .panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7; }\n\n.panel-success {\n border-color: #d6e9c6; }\n .panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6; }\n .panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6; }\n .panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d; }\n .panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6; }\n\n.panel-info {\n border-color: #bce8f1; }\n .panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1; }\n .panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1; }\n .panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f; }\n .panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1; }\n\n.panel-warning {\n border-color: #faebcc; }\n .panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc; }\n .panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc; }\n .panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b; }\n .panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc; }\n\n.panel-danger {\n border-color: #ebccd1; }\n .panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1; }\n .panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1; }\n .panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442; }\n .panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1; }\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden; }\n .embed-responsive .embed-responsive-item,\n .embed-responsive iframe,\n .embed-responsive embed,\n .embed-responsive object,\n .embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0; }\n\n.embed-responsive-16by9 {\n padding-bottom: 56.25%; }\n\n.embed-responsive-4by3 {\n padding-bottom: 75%; }\n\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false); }\n .well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n\n.well-lg {\n padding: 24px;\n border-radius: 6px; }\n\n.well-sm {\n padding: 9px;\n border-radius: 3px; }\n\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);\n opacity: 0.2; }\n .close:hover, .close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n opacity: 0.5; }\n\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none; }\n\n.modal-open {\n overflow: hidden; }\n\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0; }\n .modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -moz-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out; }\n .modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -moz-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0); }\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto; }\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px; }\n\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: compact(0 3px 9px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 3px 9px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 3px 9px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n background-clip: padding-box;\n outline: 0; }\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000; }\n .modal-backdrop.fade {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n .modal-backdrop.in {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n opacity: 0.5; }\n\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n overflow: hidden;\n *zoom: 1; }\n\n.modal-header .close {\n margin-top: -2px; }\n\n.modal-title {\n margin: 0;\n line-height: 1.42857; }\n\n.modal-body {\n position: relative;\n padding: 15px; }\n\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n overflow: hidden;\n *zoom: 1; }\n .modal-footer .btn + .btn, .modal-footer .media-widget > a + .btn, .modal-footer .media-widget > .btn + a, .modal-footer .media-widget > a + a {\n margin-left: 5px;\n margin-bottom: 0; }\n .modal-footer .btn-group .btn + .btn, .modal-footer .btn-group .media-widget > a + .btn, .modal-footer .btn-group .media-widget > .btn + a, .modal-footer .btn-group .media-widget > a + a {\n margin-left: -1px; }\n .modal-footer .btn-block + .btn-block {\n margin-left: 0; }\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll; }\n\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto; }\n .modal-content {\n -webkit-box-shadow: compact(0 5px 15px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 5px 15px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 5px 15px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false); }\n .modal-sm {\n width: 300px; } }\n\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px; } }\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n .tooltip.in {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n opacity: 0.9; }\n .tooltip.top {\n margin-top: -3px;\n padding: 5px 0; }\n .tooltip.right {\n margin-left: 3px;\n padding: 0 5px; }\n .tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0; }\n .tooltip.left {\n margin-left: -3px;\n padding: 0 5px; }\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px; }\n\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000; }\n\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000; }\n\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: compact(0 5px 10px rgba(0, 0, 0, 0.2), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 5px 10px rgba(0, 0, 0, 0.2), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 5px 10px rgba(0, 0, 0, 0.2), false, false, false, false, false, false, false, false, false); }\n .popover.top {\n margin-top: -10px; }\n .popover.right {\n margin-left: 10px; }\n .popover.bottom {\n margin-top: 10px; }\n .popover.left {\n margin-left: -10px; }\n\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0; }\n\n.popover-content {\n padding: 9px 14px; }\n\n.popover > .arrow, .popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.popover > .arrow {\n border-width: 11px; }\n\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\"; }\n\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px; }\n .popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff; }\n\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25); }\n .popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff; }\n\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px; }\n .popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff; }\n\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25); }\n .popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px; }\n\n.carousel {\n position: relative; }\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%; }\n .carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: compact(compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false); }\n .carousel-inner > .item > img,\n .carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n line-height: 1; }\n @media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n -ms-backface-visibility: hidden;\n -o-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n -ms-perspective: 1000px;\n -o-perspective: 1000px;\n perspective: 1000px; }\n .carousel-inner > .item.next, .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n -moz-transform: translate3d(100%, 0, 0);\n -ms-transform: translate3d(100%, 0, 0);\n -o-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.prev, .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n -moz-transform: translate3d(-100%, 0, 0);\n -ms-transform: translate3d(-100%, 0, 0);\n -o-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n -moz-transform: translate3d(0, 0, 0);\n -ms-transform: translate3d(0, 0, 0);\n -o-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0; } }\n .carousel-inner > .active,\n .carousel-inner > .next,\n .carousel-inner > .prev {\n display: block; }\n .carousel-inner > .active {\n left: 0; }\n .carousel-inner > .next,\n .carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%; }\n .carousel-inner > .next {\n left: 100%; }\n .carousel-inner > .prev {\n left: -100%; }\n .carousel-inner > .next.left,\n .carousel-inner > .prev.right {\n left: 0; }\n .carousel-inner > .active.left {\n left: -100%; }\n .carousel-inner > .active.right {\n left: 100%; }\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n opacity: 0.5;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: transparent; }\n .carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }\n .carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }\n .carousel-control:hover, .carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n opacity: 0.9; }\n .carousel-control .icon-prev,\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block; }\n .carousel-control .icon-prev,\n .carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px; }\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px; }\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif; }\n .carousel-control .icon-prev:before {\n content: '\\2039'; }\n .carousel-control .icon-next:before {\n content: '\\203a'; }\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center; }\n .carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: transparent; }\n .carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff; }\n\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }\n .carousel-caption .btn, .carousel-caption .media-widget > a {\n text-shadow: none; }\n\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px; }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px; }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px; }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px; }\n .carousel-indicators {\n bottom: 20px; } }\n\n.clearfix {\n overflow: hidden;\n *zoom: 1; }\n\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto; }\n\n.pull-right {\n float: right !important; }\n\n.pull-left {\n float: left !important; }\n\n.hide {\n display: none !important; }\n\n.show {\n display: block !important; }\n\n.invisible {\n visibility: hidden; }\n\n.text-hide {\n text-indent: -119988px;\n overflow: hidden;\n text-align: left; }\n\n.hidden {\n display: none !important; }\n\n.affix {\n position: fixed; }\n\n@-ms-viewport {\n width: device-width; }\n\n.visible-xs {\n display: none !important; }\n\n.visible-sm {\n display: none !important; }\n\n.visible-md {\n display: none !important; }\n\n.visible-lg {\n display: none !important; }\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important; }\n\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important; }\n table.visible-xs {\n display: table !important; }\n tr.visible-xs {\n display: table-row !important; }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important; }\n table.visible-sm {\n display: table !important; }\n tr.visible-sm {\n display: table-row !important; }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important; }\n table.visible-md {\n display: table !important; }\n tr.visible-md {\n display: table-row !important; }\n th.visible-md,\n td.visible-md {\n display: table-cell !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important; }\n table.visible-lg {\n display: table !important; }\n tr.visible-lg {\n display: table-row !important; }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important; } }\n\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important; } }\n\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important; } }\n\n.visible-print {\n display: none !important; }\n\n@media print {\n .visible-print {\n display: block !important; }\n table.visible-print {\n display: table !important; }\n tr.visible-print {\n display: table-row !important; }\n th.visible-print,\n td.visible-print {\n display: table-cell !important; } }\n\n.visible-print-block {\n display: none !important; }\n @media print {\n .visible-print-block {\n display: block !important; } }\n\n.visible-print-inline {\n display: none !important; }\n @media print {\n .visible-print-inline {\n display: inline !important; } }\n\n.visible-print-inline-block {\n display: none !important; }\n @media print {\n .visible-print-inline-block {\n display: inline-block !important; } }\n\n@media print {\n .hidden-print {\n display: none !important; } }\n\n/*!\n * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n font-family: 'FontAwesome';\n src: url(\"../fonts/fontawesome-webfont.eot?v=4.4.0\");\n src: url(\"../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0\") format(\"embedded-opentype\"), url(\"../fonts/fontawesome-webfont.woff2?v=4.4.0\") format(\"woff2\"), url(\"../fonts/fontawesome-webfont.woff?v=4.4.0\") format(\"woff\"), url(\"../fonts/fontawesome-webfont.ttf?v=4.4.0\") format(\"truetype\"), url(\"../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular\") format(\"svg\");\n font-weight: normal;\n font-style: normal; }\n\n.fa {\n display: inline-block;\n font: normal normal normal 14px/1 FontAwesome;\n font-size: inherit;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n font-size: 1.33333em;\n line-height: 0.75em;\n vertical-align: -15%; }\n\n.fa-2x {\n font-size: 2em; }\n\n.fa-3x {\n font-size: 3em; }\n\n.fa-4x {\n font-size: 4em; }\n\n.fa-5x {\n font-size: 5em; }\n\n.fa-fw {\n width: 1.28571em;\n text-align: center; }\n\n.fa-ul {\n padding-left: 0;\n margin-left: 2.14286em;\n list-style-type: none; }\n .fa-ul > li {\n position: relative; }\n\n.fa-li {\n position: absolute;\n left: -2.14286em;\n width: 2.14286em;\n top: 0.14286em;\n text-align: center; }\n .fa-li.fa-lg {\n left: -1.85714em; }\n\n.fa-border {\n padding: .2em .25em .15em;\n border: solid 0.08em #eee;\n border-radius: .1em; }\n\n.fa-pull-left {\n float: left; }\n\n.fa-pull-right {\n float: right; }\n\n.fa.fa-pull-left {\n margin-right: .3em; }\n\n.fa.fa-pull-right {\n margin-left: .3em; }\n\n/* Deprecated as of 4.4.0 */\n.pull-right {\n float: right; }\n\n.pull-left {\n float: left; }\n\n.fa.pull-left {\n margin-right: .3em; }\n\n.fa.pull-right {\n margin-left: .3em; }\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg); } }\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg); } }\n\n.fa-rotate-90 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n -webkit-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n transform: rotate(90deg); }\n\n.fa-rotate-180 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg); }\n\n.fa-rotate-270 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n -webkit-transform: rotate(270deg);\n -ms-transform: rotate(270deg);\n transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0);\n -webkit-transform: scale(-1, 1);\n -ms-transform: scale(-1, 1);\n transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n -webkit-transform: scale(1, -1);\n -ms-transform: scale(1, -1);\n transform: scale(1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n filter: none; }\n\n.fa-stack {\n position: relative;\n display: inline-block;\n width: 2em;\n height: 2em;\n line-height: 2em;\n vertical-align: middle; }\n\n.fa-stack-1x, .fa-stack-2x {\n position: absolute;\n left: 0;\n width: 100%;\n text-align: center; }\n\n.fa-stack-1x {\n line-height: inherit; }\n\n.fa-stack-2x {\n font-size: 2em; }\n\n.fa-inverse {\n color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n.fa-glass:before {\n content: \"\"; }\n\n.fa-music:before {\n content: \"\"; }\n\n.fa-search:before {\n content: \"\"; }\n\n.fa-envelope-o:before {\n content: \"\"; }\n\n.fa-heart:before {\n content: \"\"; }\n\n.fa-star:before {\n content: \"\"; }\n\n.fa-star-o:before {\n content: \"\"; }\n\n.fa-user:before {\n content: \"\"; }\n\n.fa-film:before {\n content: \"\"; }\n\n.fa-th-large:before {\n content: \"\"; }\n\n.fa-th:before {\n content: \"\"; }\n\n.fa-th-list:before {\n content: \"\"; }\n\n.fa-check:before {\n content: \"\"; }\n\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n content: \"\"; }\n\n.fa-search-plus:before {\n content: \"\"; }\n\n.fa-search-minus:before {\n content: \"\"; }\n\n.fa-power-off:before {\n content: \"\"; }\n\n.fa-signal:before {\n content: \"\"; }\n\n.fa-gear:before,\n.fa-cog:before {\n content: \"\"; }\n\n.fa-trash-o:before {\n content: \"\"; }\n\n.fa-home:before {\n content: \"\"; }\n\n.fa-file-o:before {\n content: \"\"; }\n\n.fa-clock-o:before {\n content: \"\"; }\n\n.fa-road:before {\n content: \"\"; }\n\n.fa-download:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-down:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-up:before {\n content: \"\"; }\n\n.fa-inbox:before {\n content: \"\"; }\n\n.fa-play-circle-o:before {\n content: \"\"; }\n\n.fa-rotate-right:before,\n.fa-repeat:before {\n content: \"\"; }\n\n.fa-refresh:before {\n content: \"\"; }\n\n.fa-list-alt:before {\n content: \"\"; }\n\n.fa-lock:before {\n content: \"\"; }\n\n.fa-flag:before {\n content: \"\"; }\n\n.fa-headphones:before {\n content: \"\"; }\n\n.fa-volume-off:before {\n content: \"\"; }\n\n.fa-volume-down:before {\n content: \"\"; }\n\n.fa-volume-up:before {\n content: \"\"; }\n\n.fa-qrcode:before {\n content: \"\"; }\n\n.fa-barcode:before {\n content: \"\"; }\n\n.fa-tag:before {\n content: \"\"; }\n\n.fa-tags:before {\n content: \"\"; }\n\n.fa-book:before {\n content: \"\"; }\n\n.fa-bookmark:before {\n content: \"\"; }\n\n.fa-print:before {\n content: \"\"; }\n\n.fa-camera:before {\n content: \"\"; }\n\n.fa-font:before {\n content: \"\"; }\n\n.fa-bold:before {\n content: \"\"; }\n\n.fa-italic:before {\n content: \"\"; }\n\n.fa-text-height:before {\n content: \"\"; }\n\n.fa-text-width:before {\n content: \"\"; }\n\n.fa-align-left:before {\n content: \"\"; }\n\n.fa-align-center:before {\n content: \"\"; }\n\n.fa-align-right:before {\n content: \"\"; }\n\n.fa-align-justify:before {\n content: \"\"; }\n\n.fa-list:before {\n content: \"\"; }\n\n.fa-dedent:before,\n.fa-outdent:before {\n content: \"\"; }\n\n.fa-indent:before {\n content: \"\"; }\n\n.fa-video-camera:before {\n content: \"\"; }\n\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n content: \"\"; }\n\n.fa-pencil:before {\n content: \"\"; }\n\n.fa-map-marker:before {\n content: \"\"; }\n\n.fa-adjust:before {\n content: \"\"; }\n\n.fa-tint:before {\n content: \"\"; }\n\n.fa-edit:before,\n.fa-pencil-square-o:before {\n content: \"\"; }\n\n.fa-share-square-o:before {\n content: \"\"; }\n\n.fa-check-square-o:before {\n content: \"\"; }\n\n.fa-arrows:before {\n content: \"\"; }\n\n.fa-step-backward:before {\n content: \"\"; }\n\n.fa-fast-backward:before {\n content: \"\"; }\n\n.fa-backward:before {\n content: \"\"; }\n\n.fa-play:before {\n content: \"\"; }\n\n.fa-pause:before {\n content: \"\"; }\n\n.fa-stop:before {\n content: \"\"; }\n\n.fa-forward:before {\n content: \"\"; }\n\n.fa-fast-forward:before {\n content: \"\"; }\n\n.fa-step-forward:before {\n content: \"\"; }\n\n.fa-eject:before {\n content: \"\"; }\n\n.fa-chevron-left:before {\n content: \"\"; }\n\n.fa-chevron-right:before {\n content: \"\"; }\n\n.fa-plus-circle:before {\n content: \"\"; }\n\n.fa-minus-circle:before {\n content: \"\"; }\n\n.fa-times-circle:before {\n content: \"\"; }\n\n.fa-check-circle:before {\n content: \"\"; }\n\n.fa-question-circle:before {\n content: \"\"; }\n\n.fa-info-circle:before {\n content: \"\"; }\n\n.fa-crosshairs:before {\n content: \"\"; }\n\n.fa-times-circle-o:before {\n content: \"\"; }\n\n.fa-check-circle-o:before {\n content: \"\"; }\n\n.fa-ban:before {\n content: \"\"; }\n\n.fa-arrow-left:before {\n content: \"\"; }\n\n.fa-arrow-right:before {\n content: \"\"; }\n\n.fa-arrow-up:before {\n content: \"\"; }\n\n.fa-arrow-down:before {\n content: \"\"; }\n\n.fa-mail-forward:before,\n.fa-share:before {\n content: \"\"; }\n\n.fa-expand:before {\n content: \"\"; }\n\n.fa-compress:before {\n content: \"\"; }\n\n.fa-plus:before {\n content: \"\"; }\n\n.fa-minus:before {\n content: \"\"; }\n\n.fa-asterisk:before {\n content: \"\"; }\n\n.fa-exclamation-circle:before {\n content: \"\"; }\n\n.fa-gift:before {\n content: \"\"; }\n\n.fa-leaf:before {\n content: \"\"; }\n\n.fa-fire:before {\n content: \"\"; }\n\n.fa-eye:before {\n content: \"\"; }\n\n.fa-eye-slash:before {\n content: \"\"; }\n\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n content: \"\"; }\n\n.fa-plane:before {\n content: \"\"; }\n\n.fa-calendar:before {\n content: \"\"; }\n\n.fa-random:before {\n content: \"\"; }\n\n.fa-comment:before {\n content: \"\"; }\n\n.fa-magnet:before {\n content: \"\"; }\n\n.fa-chevron-up:before {\n content: \"\"; }\n\n.fa-chevron-down:before {\n content: \"\"; }\n\n.fa-retweet:before {\n content: \"\"; }\n\n.fa-shopping-cart:before {\n content: \"\"; }\n\n.fa-folder:before {\n content: \"\"; }\n\n.fa-folder-open:before {\n content: \"\"; }\n\n.fa-arrows-v:before {\n content: \"\"; }\n\n.fa-arrows-h:before {\n content: \"\"; }\n\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n content: \"\"; }\n\n.fa-twitter-square:before {\n content: \"\"; }\n\n.fa-facebook-square:before {\n content: \"\"; }\n\n.fa-camera-retro:before {\n content: \"\"; }\n\n.fa-key:before {\n content: \"\"; }\n\n.fa-gears:before,\n.fa-cogs:before {\n content: \"\"; }\n\n.fa-comments:before {\n content: \"\"; }\n\n.fa-thumbs-o-up:before {\n content: \"\"; }\n\n.fa-thumbs-o-down:before {\n content: \"\"; }\n\n.fa-star-half:before {\n content: \"\"; }\n\n.fa-heart-o:before {\n content: \"\"; }\n\n.fa-sign-out:before {\n content: \"\"; }\n\n.fa-linkedin-square:before {\n content: \"\"; }\n\n.fa-thumb-tack:before {\n content: \"\"; }\n\n.fa-external-link:before {\n content: \"\"; }\n\n.fa-sign-in:before {\n content: \"\"; }\n\n.fa-trophy:before {\n content: \"\"; }\n\n.fa-github-square:before {\n content: \"\"; }\n\n.fa-upload:before {\n content: \"\"; }\n\n.fa-lemon-o:before {\n content: \"\"; }\n\n.fa-phone:before {\n content: \"\"; }\n\n.fa-square-o:before {\n content: \"\"; }\n\n.fa-bookmark-o:before {\n content: \"\"; }\n\n.fa-phone-square:before {\n content: \"\"; }\n\n.fa-twitter:before {\n content: \"\"; }\n\n.fa-facebook-f:before,\n.fa-facebook:before {\n content: \"\"; }\n\n.fa-github:before {\n content: \"\"; }\n\n.fa-unlock:before {\n content: \"\"; }\n\n.fa-credit-card:before {\n content: \"\"; }\n\n.fa-feed:before,\n.fa-rss:before {\n content: \"\"; }\n\n.fa-hdd-o:before {\n content: \"\"; }\n\n.fa-bullhorn:before {\n content: \"\"; }\n\n.fa-bell:before {\n content: \"\"; }\n\n.fa-certificate:before {\n content: \"\"; }\n\n.fa-hand-o-right:before {\n content: \"\"; }\n\n.fa-hand-o-left:before {\n content: \"\"; }\n\n.fa-hand-o-up:before {\n content: \"\"; }\n\n.fa-hand-o-down:before {\n content: \"\"; }\n\n.fa-arrow-circle-left:before {\n content: \"\"; }\n\n.fa-arrow-circle-right:before {\n content: \"\"; }\n\n.fa-arrow-circle-up:before {\n content: \"\"; }\n\n.fa-arrow-circle-down:before {\n content: \"\"; }\n\n.fa-globe:before {\n content: \"\"; }\n\n.fa-wrench:before {\n content: \"\"; }\n\n.fa-tasks:before {\n content: \"\"; }\n\n.fa-filter:before {\n content: \"\"; }\n\n.fa-briefcase:before {\n content: \"\"; }\n\n.fa-arrows-alt:before {\n content: \"\"; }\n\n.fa-group:before,\n.fa-users:before {\n content: \"\"; }\n\n.fa-chain:before,\n.fa-link:before {\n content: \"\"; }\n\n.fa-cloud:before {\n content: \"\"; }\n\n.fa-flask:before {\n content: \"\"; }\n\n.fa-cut:before,\n.fa-scissors:before {\n content: \"\"; }\n\n.fa-copy:before,\n.fa-files-o:before {\n content: \"\"; }\n\n.fa-paperclip:before {\n content: \"\"; }\n\n.fa-save:before,\n.fa-floppy-o:before {\n content: \"\"; }\n\n.fa-square:before {\n content: \"\"; }\n\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n content: \"\"; }\n\n.fa-list-ul:before {\n content: \"\"; }\n\n.fa-list-ol:before {\n content: \"\"; }\n\n.fa-strikethrough:before {\n content: \"\"; }\n\n.fa-underline:before {\n content: \"\"; }\n\n.fa-table:before {\n content: \"\"; }\n\n.fa-magic:before {\n content: \"\"; }\n\n.fa-truck:before {\n content: \"\"; }\n\n.fa-pinterest:before {\n content: \"\"; }\n\n.fa-pinterest-square:before {\n content: \"\"; }\n\n.fa-google-plus-square:before {\n content: \"\"; }\n\n.fa-google-plus:before {\n content: \"\"; }\n\n.fa-money:before {\n content: \"\"; }\n\n.fa-caret-down:before {\n content: \"\"; }\n\n.fa-caret-up:before {\n content: \"\"; }\n\n.fa-caret-left:before {\n content: \"\"; }\n\n.fa-caret-right:before {\n content: \"\"; }\n\n.fa-columns:before {\n content: \"\"; }\n\n.fa-unsorted:before,\n.fa-sort:before {\n content: \"\"; }\n\n.fa-sort-down:before,\n.fa-sort-desc:before {\n content: \"\"; }\n\n.fa-sort-up:before,\n.fa-sort-asc:before {\n content: \"\"; }\n\n.fa-envelope:before {\n content: \"\"; }\n\n.fa-linkedin:before {\n content: \"\"; }\n\n.fa-rotate-left:before,\n.fa-undo:before {\n content: \"\"; }\n\n.fa-legal:before,\n.fa-gavel:before {\n content: \"\"; }\n\n.fa-dashboard:before,\n.fa-tachometer:before {\n content: \"\"; }\n\n.fa-comment-o:before {\n content: \"\"; }\n\n.fa-comments-o:before {\n content: \"\"; }\n\n.fa-flash:before,\n.fa-bolt:before {\n content: \"\"; }\n\n.fa-sitemap:before {\n content: \"\"; }\n\n.fa-umbrella:before {\n content: \"\"; }\n\n.fa-paste:before,\n.fa-clipboard:before {\n content: \"\"; }\n\n.fa-lightbulb-o:before {\n content: \"\"; }\n\n.fa-exchange:before {\n content: \"\"; }\n\n.fa-cloud-download:before {\n content: \"\"; }\n\n.fa-cloud-upload:before {\n content: \"\"; }\n\n.fa-user-md:before {\n content: \"\"; }\n\n.fa-stethoscope:before {\n content: \"\"; }\n\n.fa-suitcase:before {\n content: \"\"; }\n\n.fa-bell-o:before {\n content: \"\"; }\n\n.fa-coffee:before {\n content: \"\"; }\n\n.fa-cutlery:before {\n content: \"\"; }\n\n.fa-file-text-o:before {\n content: \"\"; }\n\n.fa-building-o:before {\n content: \"\"; }\n\n.fa-hospital-o:before {\n content: \"\"; }\n\n.fa-ambulance:before {\n content: \"\"; }\n\n.fa-medkit:before {\n content: \"\"; }\n\n.fa-fighter-jet:before {\n content: \"\"; }\n\n.fa-beer:before {\n content: \"\"; }\n\n.fa-h-square:before {\n content: \"\"; }\n\n.fa-plus-square:before {\n content: \"\"; }\n\n.fa-angle-double-left:before {\n content: \"\"; }\n\n.fa-angle-double-right:before {\n content: \"\"; }\n\n.fa-angle-double-up:before {\n content: \"\"; }\n\n.fa-angle-double-down:before {\n content: \"\"; }\n\n.fa-angle-left:before {\n content: \"\"; }\n\n.fa-angle-right:before {\n content: \"\"; }\n\n.fa-angle-up:before {\n content: \"\"; }\n\n.fa-angle-down:before {\n content: \"\"; }\n\n.fa-desktop:before {\n content: \"\"; }\n\n.fa-laptop:before {\n content: \"\"; }\n\n.fa-tablet:before {\n content: \"\"; }\n\n.fa-mobile-phone:before,\n.fa-mobile:before {\n content: \"\"; }\n\n.fa-circle-o:before {\n content: \"\"; }\n\n.fa-quote-left:before {\n content: \"\"; }\n\n.fa-quote-right:before {\n content: \"\"; }\n\n.fa-spinner:before {\n content: \"\"; }\n\n.fa-circle:before {\n content: \"\"; }\n\n.fa-mail-reply:before,\n.fa-reply:before {\n content: \"\"; }\n\n.fa-github-alt:before {\n content: \"\"; }\n\n.fa-folder-o:before {\n content: \"\"; }\n\n.fa-folder-open-o:before {\n content: \"\"; }\n\n.fa-smile-o:before {\n content: \"\"; }\n\n.fa-frown-o:before {\n content: \"\"; }\n\n.fa-meh-o:before {\n content: \"\"; }\n\n.fa-gamepad:before {\n content: \"\"; }\n\n.fa-keyboard-o:before {\n content: \"\"; }\n\n.fa-flag-o:before {\n content: \"\"; }\n\n.fa-flag-checkered:before {\n content: \"\"; }\n\n.fa-terminal:before {\n content: \"\"; }\n\n.fa-code:before {\n content: \"\"; }\n\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n content: \"\"; }\n\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n content: \"\"; }\n\n.fa-location-arrow:before {\n content: \"\"; }\n\n.fa-crop:before {\n content: \"\"; }\n\n.fa-code-fork:before {\n content: \"\"; }\n\n.fa-unlink:before,\n.fa-chain-broken:before {\n content: \"\"; }\n\n.fa-question:before {\n content: \"\"; }\n\n.fa-info:before {\n content: \"\"; }\n\n.fa-exclamation:before {\n content: \"\"; }\n\n.fa-superscript:before {\n content: \"\"; }\n\n.fa-subscript:before {\n content: \"\"; }\n\n.fa-eraser:before {\n content: \"\"; }\n\n.fa-puzzle-piece:before {\n content: \"\"; }\n\n.fa-microphone:before {\n content: \"\"; }\n\n.fa-microphone-slash:before {\n content: \"\"; }\n\n.fa-shield:before {\n content: \"\"; }\n\n.fa-calendar-o:before {\n content: \"\"; }\n\n.fa-fire-extinguisher:before {\n content: \"\"; }\n\n.fa-rocket:before {\n content: \"\"; }\n\n.fa-maxcdn:before {\n content: \"\"; }\n\n.fa-chevron-circle-left:before {\n content: \"\"; }\n\n.fa-chevron-circle-right:before {\n content: \"\"; }\n\n.fa-chevron-circle-up:before {\n content: \"\"; }\n\n.fa-chevron-circle-down:before {\n content: \"\"; }\n\n.fa-html5:before {\n content: \"\"; }\n\n.fa-css3:before {\n content: \"\"; }\n\n.fa-anchor:before {\n content: \"\"; }\n\n.fa-unlock-alt:before {\n content: \"\"; }\n\n.fa-bullseye:before {\n content: \"\"; }\n\n.fa-ellipsis-h:before {\n content: \"\"; }\n\n.fa-ellipsis-v:before {\n content: \"\"; }\n\n.fa-rss-square:before {\n content: \"\"; }\n\n.fa-play-circle:before {\n content: \"\"; }\n\n.fa-ticket:before {\n content: \"\"; }\n\n.fa-minus-square:before {\n content: \"\"; }\n\n.fa-minus-square-o:before {\n content: \"\"; }\n\n.fa-level-up:before {\n content: \"\"; }\n\n.fa-level-down:before {\n content: \"\"; }\n\n.fa-check-square:before {\n content: \"\"; }\n\n.fa-pencil-square:before {\n content: \"\"; }\n\n.fa-external-link-square:before {\n content: \"\"; }\n\n.fa-share-square:before {\n content: \"\"; }\n\n.fa-compass:before {\n content: \"\"; }\n\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n content: \"\"; }\n\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n content: \"\"; }\n\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n content: \"\"; }\n\n.fa-euro:before,\n.fa-eur:before {\n content: \"\"; }\n\n.fa-gbp:before {\n content: \"\"; }\n\n.fa-dollar:before,\n.fa-usd:before {\n content: \"\"; }\n\n.fa-rupee:before,\n.fa-inr:before {\n content: \"\"; }\n\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n content: \"\"; }\n\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n content: \"\"; }\n\n.fa-won:before,\n.fa-krw:before {\n content: \"\"; }\n\n.fa-bitcoin:before,\n.fa-btc:before {\n content: \"\"; }\n\n.fa-file:before {\n content: \"\"; }\n\n.fa-file-text:before {\n content: \"\"; }\n\n.fa-sort-alpha-asc:before {\n content: \"\"; }\n\n.fa-sort-alpha-desc:before {\n content: \"\"; }\n\n.fa-sort-amount-asc:before {\n content: \"\"; }\n\n.fa-sort-amount-desc:before {\n content: \"\"; }\n\n.fa-sort-numeric-asc:before {\n content: \"\"; }\n\n.fa-sort-numeric-desc:before {\n content: \"\"; }\n\n.fa-thumbs-up:before {\n content: \"\"; }\n\n.fa-thumbs-down:before {\n content: \"\"; }\n\n.fa-youtube-square:before {\n content: \"\"; }\n\n.fa-youtube:before {\n content: \"\"; }\n\n.fa-xing:before {\n content: \"\"; }\n\n.fa-xing-square:before {\n content: \"\"; }\n\n.fa-youtube-play:before {\n content: \"\"; }\n\n.fa-dropbox:before {\n content: \"\"; }\n\n.fa-stack-overflow:before {\n content: \"\"; }\n\n.fa-instagram:before {\n content: \"\"; }\n\n.fa-flickr:before {\n content: \"\"; }\n\n.fa-adn:before {\n content: \"\"; }\n\n.fa-bitbucket:before {\n content: \"\"; }\n\n.fa-bitbucket-square:before {\n content: \"\"; }\n\n.fa-tumblr:before {\n content: \"\"; }\n\n.fa-tumblr-square:before {\n content: \"\"; }\n\n.fa-long-arrow-down:before {\n content: \"\"; }\n\n.fa-long-arrow-up:before {\n content: \"\"; }\n\n.fa-long-arrow-left:before {\n content: \"\"; }\n\n.fa-long-arrow-right:before {\n content: \"\"; }\n\n.fa-apple:before {\n content: \"\"; }\n\n.fa-windows:before {\n content: \"\"; }\n\n.fa-android:before {\n content: \"\"; }\n\n.fa-linux:before {\n content: \"\"; }\n\n.fa-dribbble:before {\n content: \"\"; }\n\n.fa-skype:before {\n content: \"\"; }\n\n.fa-foursquare:before {\n content: \"\"; }\n\n.fa-trello:before {\n content: \"\"; }\n\n.fa-female:before {\n content: \"\"; }\n\n.fa-male:before {\n content: \"\"; }\n\n.fa-gittip:before,\n.fa-gratipay:before {\n content: \"\"; }\n\n.fa-sun-o:before {\n content: \"\"; }\n\n.fa-moon-o:before {\n content: \"\"; }\n\n.fa-archive:before {\n content: \"\"; }\n\n.fa-bug:before {\n content: \"\"; }\n\n.fa-vk:before {\n content: \"\"; }\n\n.fa-weibo:before {\n content: \"\"; }\n\n.fa-renren:before {\n content: \"\"; }\n\n.fa-pagelines:before {\n content: \"\"; }\n\n.fa-stack-exchange:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-right:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-left:before {\n content: \"\"; }\n\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n content: \"\"; }\n\n.fa-dot-circle-o:before {\n content: \"\"; }\n\n.fa-wheelchair:before {\n content: \"\"; }\n\n.fa-vimeo-square:before {\n content: \"\"; }\n\n.fa-turkish-lira:before,\n.fa-try:before {\n content: \"\"; }\n\n.fa-plus-square-o:before {\n content: \"\"; }\n\n.fa-space-shuttle:before {\n content: \"\"; }\n\n.fa-slack:before {\n content: \"\"; }\n\n.fa-envelope-square:before {\n content: \"\"; }\n\n.fa-wordpress:before {\n content: \"\"; }\n\n.fa-openid:before {\n content: \"\"; }\n\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n content: \"\"; }\n\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n content: \"\"; }\n\n.fa-yahoo:before {\n content: \"\"; }\n\n.fa-google:before {\n content: \"\"; }\n\n.fa-reddit:before {\n content: \"\"; }\n\n.fa-reddit-square:before {\n content: \"\"; }\n\n.fa-stumbleupon-circle:before {\n content: \"\"; }\n\n.fa-stumbleupon:before {\n content: \"\"; }\n\n.fa-delicious:before {\n content: \"\"; }\n\n.fa-digg:before {\n content: \"\"; }\n\n.fa-pied-piper:before {\n content: \"\"; }\n\n.fa-pied-piper-alt:before {\n content: \"\"; }\n\n.fa-drupal:before {\n content: \"\"; }\n\n.fa-joomla:before {\n content: \"\"; }\n\n.fa-language:before {\n content: \"\"; }\n\n.fa-fax:before {\n content: \"\"; }\n\n.fa-building:before {\n content: \"\"; }\n\n.fa-child:before {\n content: \"\"; }\n\n.fa-paw:before {\n content: \"\"; }\n\n.fa-spoon:before {\n content: \"\"; }\n\n.fa-cube:before {\n content: \"\"; }\n\n.fa-cubes:before {\n content: \"\"; }\n\n.fa-behance:before {\n content: \"\"; }\n\n.fa-behance-square:before {\n content: \"\"; }\n\n.fa-steam:before {\n content: \"\"; }\n\n.fa-steam-square:before {\n content: \"\"; }\n\n.fa-recycle:before {\n content: \"\"; }\n\n.fa-automobile:before,\n.fa-car:before {\n content: \"\"; }\n\n.fa-cab:before,\n.fa-taxi:before {\n content: \"\"; }\n\n.fa-tree:before {\n content: \"\"; }\n\n.fa-spotify:before {\n content: \"\"; }\n\n.fa-deviantart:before {\n content: \"\"; }\n\n.fa-soundcloud:before {\n content: \"\"; }\n\n.fa-database:before {\n content: \"\"; }\n\n.fa-file-pdf-o:before {\n content: \"\"; }\n\n.fa-file-word-o:before {\n content: \"\"; }\n\n.fa-file-excel-o:before {\n content: \"\"; }\n\n.fa-file-powerpoint-o:before {\n content: \"\"; }\n\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n content: \"\"; }\n\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n content: \"\"; }\n\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n content: \"\"; }\n\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n content: \"\"; }\n\n.fa-file-code-o:before {\n content: \"\"; }\n\n.fa-vine:before {\n content: \"\"; }\n\n.fa-codepen:before {\n content: \"\"; }\n\n.fa-jsfiddle:before {\n content: \"\"; }\n\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n content: \"\"; }\n\n.fa-circle-o-notch:before {\n content: \"\"; }\n\n.fa-ra:before,\n.fa-rebel:before {\n content: \"\"; }\n\n.fa-ge:before,\n.fa-empire:before {\n content: \"\"; }\n\n.fa-git-square:before {\n content: \"\"; }\n\n.fa-git:before {\n content: \"\"; }\n\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n content: \"\"; }\n\n.fa-tencent-weibo:before {\n content: \"\"; }\n\n.fa-qq:before {\n content: \"\"; }\n\n.fa-wechat:before,\n.fa-weixin:before {\n content: \"\"; }\n\n.fa-send:before,\n.fa-paper-plane:before {\n content: \"\"; }\n\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n content: \"\"; }\n\n.fa-history:before {\n content: \"\"; }\n\n.fa-circle-thin:before {\n content: \"\"; }\n\n.fa-header:before {\n content: \"\"; }\n\n.fa-paragraph:before {\n content: \"\"; }\n\n.fa-sliders:before {\n content: \"\"; }\n\n.fa-share-alt:before {\n content: \"\"; }\n\n.fa-share-alt-square:before {\n content: \"\"; }\n\n.fa-bomb:before {\n content: \"\"; }\n\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n content: \"\"; }\n\n.fa-tty:before {\n content: \"\"; }\n\n.fa-binoculars:before {\n content: \"\"; }\n\n.fa-plug:before {\n content: \"\"; }\n\n.fa-slideshare:before {\n content: \"\"; }\n\n.fa-twitch:before {\n content: \"\"; }\n\n.fa-yelp:before {\n content: \"\"; }\n\n.fa-newspaper-o:before {\n content: \"\"; }\n\n.fa-wifi:before {\n content: \"\"; }\n\n.fa-calculator:before {\n content: \"\"; }\n\n.fa-paypal:before {\n content: \"\"; }\n\n.fa-google-wallet:before {\n content: \"\"; }\n\n.fa-cc-visa:before {\n content: \"\"; }\n\n.fa-cc-mastercard:before {\n content: \"\"; }\n\n.fa-cc-discover:before {\n content: \"\"; }\n\n.fa-cc-amex:before {\n content: \"\"; }\n\n.fa-cc-paypal:before {\n content: \"\"; }\n\n.fa-cc-stripe:before {\n content: \"\"; }\n\n.fa-bell-slash:before {\n content: \"\"; }\n\n.fa-bell-slash-o:before {\n content: \"\"; }\n\n.fa-trash:before {\n content: \"\"; }\n\n.fa-copyright:before {\n content: \"\"; }\n\n.fa-at:before {\n content: \"\"; }\n\n.fa-eyedropper:before {\n content: \"\"; }\n\n.fa-paint-brush:before {\n content: \"\"; }\n\n.fa-birthday-cake:before {\n content: \"\"; }\n\n.fa-area-chart:before {\n content: \"\"; }\n\n.fa-pie-chart:before {\n content: \"\"; }\n\n.fa-line-chart:before {\n content: \"\"; }\n\n.fa-lastfm:before {\n content: \"\"; }\n\n.fa-lastfm-square:before {\n content: \"\"; }\n\n.fa-toggle-off:before {\n content: \"\"; }\n\n.fa-toggle-on:before {\n content: \"\"; }\n\n.fa-bicycle:before {\n content: \"\"; }\n\n.fa-bus:before {\n content: \"\"; }\n\n.fa-ioxhost:before {\n content: \"\"; }\n\n.fa-angellist:before {\n content: \"\"; }\n\n.fa-cc:before {\n content: \"\"; }\n\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n content: \"\"; }\n\n.fa-meanpath:before {\n content: \"\"; }\n\n.fa-buysellads:before {\n content: \"\"; }\n\n.fa-connectdevelop:before {\n content: \"\"; }\n\n.fa-dashcube:before {\n content: \"\"; }\n\n.fa-forumbee:before {\n content: \"\"; }\n\n.fa-leanpub:before {\n content: \"\"; }\n\n.fa-sellsy:before {\n content: \"\"; }\n\n.fa-shirtsinbulk:before {\n content: \"\"; }\n\n.fa-simplybuilt:before {\n content: \"\"; }\n\n.fa-skyatlas:before {\n content: \"\"; }\n\n.fa-cart-plus:before {\n content: \"\"; }\n\n.fa-cart-arrow-down:before {\n content: \"\"; }\n\n.fa-diamond:before {\n content: \"\"; }\n\n.fa-ship:before {\n content: \"\"; }\n\n.fa-user-secret:before {\n content: \"\"; }\n\n.fa-motorcycle:before {\n content: \"\"; }\n\n.fa-street-view:before {\n content: \"\"; }\n\n.fa-heartbeat:before {\n content: \"\"; }\n\n.fa-venus:before {\n content: \"\"; }\n\n.fa-mars:before {\n content: \"\"; }\n\n.fa-mercury:before {\n content: \"\"; }\n\n.fa-intersex:before,\n.fa-transgender:before {\n content: \"\"; }\n\n.fa-transgender-alt:before {\n content: \"\"; }\n\n.fa-venus-double:before {\n content: \"\"; }\n\n.fa-mars-double:before {\n content: \"\"; }\n\n.fa-venus-mars:before {\n content: \"\"; }\n\n.fa-mars-stroke:before {\n content: \"\"; }\n\n.fa-mars-stroke-v:before {\n content: \"\"; }\n\n.fa-mars-stroke-h:before {\n content: \"\"; }\n\n.fa-neuter:before {\n content: \"\"; }\n\n.fa-genderless:before {\n content: \"\"; }\n\n.fa-facebook-official:before {\n content: \"\"; }\n\n.fa-pinterest-p:before {\n content: \"\"; }\n\n.fa-whatsapp:before {\n content: \"\"; }\n\n.fa-server:before {\n content: \"\"; }\n\n.fa-user-plus:before {\n content: \"\"; }\n\n.fa-user-times:before {\n content: \"\"; }\n\n.fa-hotel:before,\n.fa-bed:before {\n content: \"\"; }\n\n.fa-viacoin:before {\n content: \"\"; }\n\n.fa-train:before {\n content: \"\"; }\n\n.fa-subway:before {\n content: \"\"; }\n\n.fa-medium:before {\n content: \"\"; }\n\n.fa-yc:before,\n.fa-y-combinator:before {\n content: \"\"; }\n\n.fa-optin-monster:before {\n content: \"\"; }\n\n.fa-opencart:before {\n content: \"\"; }\n\n.fa-expeditedssl:before {\n content: \"\"; }\n\n.fa-battery-4:before,\n.fa-battery-full:before {\n content: \"\"; }\n\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n content: \"\"; }\n\n.fa-battery-2:before,\n.fa-battery-half:before {\n content: \"\"; }\n\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n content: \"\"; }\n\n.fa-battery-0:before,\n.fa-battery-empty:before {\n content: \"\"; }\n\n.fa-mouse-pointer:before {\n content: \"\"; }\n\n.fa-i-cursor:before {\n content: \"\"; }\n\n.fa-object-group:before {\n content: \"\"; }\n\n.fa-object-ungroup:before {\n content: \"\"; }\n\n.fa-sticky-note:before {\n content: \"\"; }\n\n.fa-sticky-note-o:before {\n content: \"\"; }\n\n.fa-cc-jcb:before {\n content: \"\"; }\n\n.fa-cc-diners-club:before {\n content: \"\"; }\n\n.fa-clone:before {\n content: \"\"; }\n\n.fa-balance-scale:before {\n content: \"\"; }\n\n.fa-hourglass-o:before {\n content: \"\"; }\n\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n content: \"\"; }\n\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n content: \"\"; }\n\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n content: \"\"; }\n\n.fa-hourglass:before {\n content: \"\"; }\n\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n content: \"\"; }\n\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n content: \"\"; }\n\n.fa-hand-scissors-o:before {\n content: \"\"; }\n\n.fa-hand-lizard-o:before {\n content: \"\"; }\n\n.fa-hand-spock-o:before {\n content: \"\"; }\n\n.fa-hand-pointer-o:before {\n content: \"\"; }\n\n.fa-hand-peace-o:before {\n content: \"\"; }\n\n.fa-trademark:before {\n content: \"\"; }\n\n.fa-registered:before {\n content: \"\"; }\n\n.fa-creative-commons:before {\n content: \"\"; }\n\n.fa-gg:before {\n content: \"\"; }\n\n.fa-gg-circle:before {\n content: \"\"; }\n\n.fa-tripadvisor:before {\n content: \"\"; }\n\n.fa-odnoklassniki:before {\n content: \"\"; }\n\n.fa-odnoklassniki-square:before {\n content: \"\"; }\n\n.fa-get-pocket:before {\n content: \"\"; }\n\n.fa-wikipedia-w:before {\n content: \"\"; }\n\n.fa-safari:before {\n content: \"\"; }\n\n.fa-chrome:before {\n content: \"\"; }\n\n.fa-firefox:before {\n content: \"\"; }\n\n.fa-opera:before {\n content: \"\"; }\n\n.fa-internet-explorer:before {\n content: \"\"; }\n\n.fa-tv:before,\n.fa-television:before {\n content: \"\"; }\n\n.fa-contao:before {\n content: \"\"; }\n\n.fa-500px:before {\n content: \"\"; }\n\n.fa-amazon:before {\n content: \"\"; }\n\n.fa-calendar-plus-o:before {\n content: \"\"; }\n\n.fa-calendar-minus-o:before {\n content: \"\"; }\n\n.fa-calendar-times-o:before {\n content: \"\"; }\n\n.fa-calendar-check-o:before {\n content: \"\"; }\n\n.fa-industry:before {\n content: \"\"; }\n\n.fa-map-pin:before {\n content: \"\"; }\n\n.fa-map-signs:before {\n content: \"\"; }\n\n.fa-map-o:before {\n content: \"\"; }\n\n.fa-map:before {\n content: \"\"; }\n\n.fa-commenting:before {\n content: \"\"; }\n\n.fa-commenting-o:before {\n content: \"\"; }\n\n.fa-houzz:before {\n content: \"\"; }\n\n.fa-vimeo:before {\n content: \"\"; }\n\n.fa-black-tie:before {\n content: \"\"; }\n\n.fa-fonticons:before {\n content: \"\"; }\n\n.views-display-setting .views-admin-label {\n display: inline-block;\n float: left;\n /* LTR */\n margin-right: 3pt;\n /* LTR */ }\n\n.comment {\n margin-top: 15px; }\n .comment .user-picture {\n float: left;\n margin-right: 10px; }\n .comment .user-picture a {\n display: block; }\n .comment .submitted {\n font-size: 0.90em; }\n .comment .submitted .permalink {\n margin-left: 5px; }\n .comment .submitted .new {\n color: #d9534f; }\n .comment .content {\n margin: 10px 0; }\n .comment .links {\n font-size: 0.80em; }\n\n.form-item {\n margin-top: 0; }\n\nform .form-managed-file input {\n display: inline-block;\n margin: 0 10px 0 0; }\n\nform .container-inline-date .date-padding {\n padding: 0;\n float: none; }\n\nform .form-actions .btn, form .form-actions .media-widget > a {\n margin-right: 10px; }\n\nform .field-type-datetime select {\n min-width: 80px; }\n\nform .format-toggle {\n float: none; }\n\nform .field-multiple-table thead th {\n padding: 10px !important; }\n form .field-multiple-table thead th label {\n margin: 0;\n font-weight: bold; }\n\nform .description {\n margin: 2px 0;\n color: #555555; }\n\n.media-widget > a {\n margin: 0 10px 0 0; }\n\nfieldset {\n padding: 0; }\n fieldset legend {\n float: left;\n line-height: 1em;\n margin: 0; }\n fieldset .panel-body {\n clear: both; }\n\nhtml.js input.form-autocomplete {\n background: image-url(\"throbber.gif\") no-repeat right 8px #fff !important; }\n\nhtml.js input.throbbing {\n background-position: right -122px !important; }\n\nhtml.js fieldset.collapsed {\n height: auto;\n border-left-width: 1px;\n border-right-width: 1px; }\n\n.views-exposed-form .views-exposed-widget .form-submit {\n margin-top: 1.8em; }\n\n@media (max-width: 767px) {\n form .btn, form .media-widget > a {\n width: 100%;\n display: block;\n clear: both;\n margin: 0 0 5px; }\n form input.form-text,\n form textarea,\n form select {\n width: 100%; }\n form .confirm-parent,\n form .password-parent,\n form .password-suggestions {\n width: auto !important; }\n form .password-parent div.password-strength {\n width: 150px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px; }\n form .confirm-parent div.password-confirm {\n width: 110px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px; } }\n\n#node-edit #edit-title {\n font-size: 1.6em;\n line-height: 1.6em;\n height: 45px;\n width: 90%; }\n\n#node-edit .form-item-path-alias {\n overflow: hidden;\n *zoom: 1; }\n #node-edit .form-item-path-alias label, #node-edit .form-item-path-alias input {\n display: inline; }\n\n#node-edit .burr-flipped-sidebar .panel-pane {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n padding: 10px; }\n #node-edit .burr-flipped-sidebar .panel-pane blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n #node-edit .burr-flipped-sidebar .panel-pane .pane-title {\n margin-top: 0; }\n\n#node-edit .burr-flipped-sidebar .pane-node-form-buttons {\n background: none;\n padding: inherit; }\n #node-edit .burr-flipped-sidebar .pane-node-form-buttons .form-actions {\n margin: 0;\n border-top: 0; }\n\n#node-edit .pane-node-form-buttons {\n clear: both; }\n\n.filter-wrapper {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n margin-top: 10px; }\n .filter-wrapper blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n .filter-wrapper .form-item {\n margin: 0 0 10px;\n padding: 0; }\n .filter-wrapper .filter-guidelines {\n padding: 0; }\n .filter-wrapper .filter-guidelines .tips {\n margin-left: 0; }\n\n.page-admin form table select,\n.page-admin form table input.form-text {\n width: 150px; }\n\n#features-export-form .features-export-parent {\n margin: 0 0 20px; }\n #features-export-form .features-export-parent fieldset.collapsed {\n min-height: 43px !important;\n background: none; }\n #features-export-form .features-export-parent .features-export-list {\n padding: 10px; }\n #features-export-form .features-export-parent .features-export-list .form-item {\n float: none !important; }\n\n#panels-panel-context-edit-move .container,\n#panels-panel-context-edit-content .container {\n width: auto;\n padding: 0; }\n #panels-panel-context-edit-move .container .row,\n #panels-panel-context-edit-content .container .row {\n margin-bottom: 20px; }\n\n.navbar-form .form-wrapper {\n padding: 0; }\n\n.navbar-form .form-item-keys,\n.navbar-form .form-item {\n margin-top: 0 !important; }\n\n.navbar-form .form-submit {\n display: none; }\n\n.pane-search-box form .form-wrapper .form-group {\n display: block;\n margin-bottom: 10px; }\n\n.tabledrag-handle .handle {\n box-sizing: content-box; }\n\n.container .container,\n.container .container-fluid {\n width: auto;\n margin-left: -15px;\n margin-right: -15px; }\n\n#footer {\n margin: 36px 0; }\n\nbody.maintenance-page .container {\n max-width: 970px !important; }\n\nbody.maintenance-page .jumbotron {\n background-color: #000000;\n color: white;\n padding: 20px 0; }\n body.maintenance-page .jumbotron h1 {\n font-size: 3.0em;\n margin-top: 0; }\n @media (min-width: 992px) {\n body.maintenance-page .jumbotron {\n padding-top: 30px;\n padding-bottom: 30px; } }\n\nbody.maintenance-page .main {\n padding-top: 20px;\n padding-bottom: 50px; }\n\nbody.maintenance-page .page-header h1 {\n font-size: 24px; }\n @media (min-width: 992px) {\n body.maintenance-page .page-header h1 {\n font-size: 36px; } }\n\nbody.maintenance-page .tasks-list > div {\n margin-bottom: 25px; }\n body.maintenance-page .tasks-list > div h6 {\n margin-bottom: 2px;\n font-size: 14px;\n font-weight: normal; }\n body.maintenance-page .tasks-list > div h4 {\n margin-top: 0;\n font-size: 14px; }\n body.maintenance-page .tasks-list > div.active, body.maintenance-page .tasks-list > div.done {\n color: black; }\n\nbody.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child {\n background-color: white;\n border-color: black;\n color: black; }\n body.maintenance-page .form-actions .btn:first-child:hover, body.maintenance-page .form-actions .media-widget > a:first-child:hover, body.maintenance-page .form-actions .btn:first-child:focus, body.maintenance-page .form-actions .media-widget > a:first-child:focus {\n background-color: black;\n border-color: white; }\n\nbody.maintenance-page .progress .progress-bar {\n background-color: black; }\n\nbody.maintenance-page #panopoly-theme-selection-form .form-type-radio {\n margin: 0 0 2em; }\n body.maintenance-page #panopoly-theme-selection-form .form-type-radio label {\n display: block; }\n body.maintenance-page #panopoly-theme-selection-form .form-type-radio .form-radio {\n margin: 0;\n left: 0;\n top: 40%; }\n\nbody.ctools-modal-open {\n overflow: hidden; }\n\n#modalContent .modal-content {\n width: 100%;\n overflow: hidden;\n box-shadow: none !important; }\n\n#modalContent #modal-content {\n overflow: auto;\n width: 100% !important;\n background: white; }\n\n#modalContent .panels-add-content-modal {\n background: none;\n padding: 0;\n height: 100%;\n margin: -20px -20px 0;\n width: 100%;\n position: absolute; }\n\n#modalContent .panels-section-columns,\n#modalContent .panels-categories-description {\n border: none; }\n\n#modalContent .panels-section-column-categories {\n margin-left: 0;\n border-right: 1px solid #ccc;\n height: 100%;\n background: white;\n overflow: auto;\n padding-bottom: 20px; }\n #modalContent .panels-section-column-categories .btn, #modalContent .panels-section-column-categories .media-widget > a {\n border: 1px solid #777777 !important;\n line-height: inherit;\n margin: 0;\n text-align: left; }\n\n#modalContent .panels-categories-box {\n border: 0; }\n #modalContent .panels-categories-box a.btn, #modalContent .panels-categories-box .media-widget > a {\n padding: 5px 10px; }\n #modalContent .panels-categories-box a.active {\n background: #eeeeee;\n box-shadow: none; }\n\n#modalContent .panels-root-content-box a.btn, #modalContent .panels-root-content-box .media-widget > a {\n padding: 5px 10px; }\n\n#modalContent .panels-categories-description {\n padding: 20px; }\n\n#modalContent .panels-section-columns {\n padding-bottom: 20px; }\n\n#modalContent fieldset.widget-preview {\n margin-top: 18px;\n margin-bottom: 0;\n position: static;\n border: 1px solid #ddd; }\n #modalContent fieldset.widget-preview .panel-heading {\n position: relative; }\n #modalContent fieldset.widget-preview .panel-heading .btn, #modalContent fieldset.widget-preview .panel-heading .media-widget > a {\n position: absolute;\n right: 10px;\n top: 5px; }\n\n#modalContent .ctools-auto-submit-full-form fieldset {\n width: 48%;\n display: block; }\n #modalContent .ctools-auto-submit-full-form fieldset fieldset {\n width: 100%; }\n #modalContent .ctools-auto-submit-full-form fieldset.widget-preview-single {\n float: right;\n margin-left: 1em;\n margin-top: 0;\n width: 48%;\n max-width: 48% !important; }\n\n#modalContent .ctools-auto-submit-full-form .form-actions {\n float: right;\n clear: right;\n width: 48%;\n max-width: 48%;\n text-align: right; }\n\n#modalContent .form-item-view-settings {\n display: block; }\n\n#modalContent .form-item-exposed-use-pager {\n display: block; }\n\n#modalContent #panopoly-form-widget-preview {\n width: 50%;\n float: right; }\n #modalContent #panopoly-form-widget-preview .container {\n width: auto; }\n\nul.menu > li > ul.menu {\n margin-left: 1em;\n /* LTR */ }\n\nul.nav > li.dropdown:after {\n width: 100%;\n height: 2px;\n background: none;\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n content: ''; }\n\n.nav-expanded .caret {\n display: none; }\n\n.nav-expanded > li > a {\n font-size: 1.2em;\n text-align: left;\n font-weight: 700;\n color: #333333; }\n .nav-expanded > li > a:hover, .nav-expanded > li > a:focus, .nav-expanded > li > a.active, .nav-expanded > li > a.active-trail {\n color: #23527c;\n background: none; }\n\n.nav-expanded > li ul.dropdown-menu {\n background: none;\n display: block;\n border: 0;\n padding: 0;\n position: static;\n float: none;\n border-radius: 0;\n box-shadow: none; }\n .nav-expanded > li ul.dropdown-menu li a {\n padding: 3px 15px;\n color: #333333; }\n .nav-expanded > li ul.dropdown-menu li a:hover, .nav-expanded > li ul.dropdown-menu li a:focus, .nav-expanded > li ul.dropdown-menu li a.active, .nav-expanded > li ul.dropdown-menu li a.active-trail {\n color: #23527c;\n background: none; }\n .nav-expanded > li ul.dropdown-menu ul {\n display: none !important; }\n\n@media (min-width: 992px) {\n .nav-expanded > li {\n float: none;\n margin-bottom: 18px; } }\n\n.nav-expanded > li.open > a {\n color: #333333;\n background: none; }\n .nav-expanded > li.open > a:hover, .nav-expanded > li.open > a:focus, .nav-expanded > li.open > a.active, .nav-expanded > li.open > a.active-trail {\n color: #23527c;\n background: none; }\n\n.field-collection-container {\n border: 0; }\n .field-collection-container .field-collection-view {\n margin: 0;\n padding: 0;\n border: none; }\n\n.node-panopoly-page.node-teaser .panel-pane {\n margin: 0 0 10px 260px; }\n\n.node-panopoly-page.node-teaser .pane-node-field-featured-image {\n float: left;\n margin-left: 0; }\n\n@media (max-width: 767px) {\n .node-panopoly-page .panel-pane {\n float: none !important;\n margin: 0 0 10px !important; } }\n\n.node-panopoly-news-article.node-teaser .panel-pane {\n margin: 0 0 10px 260px; }\n\n.node-panopoly-news-article.node-teaser .pane-node-field-featured-image {\n float: left;\n margin-left: 0; }\n\n@media (max-width: 767px) {\n .node-panopoly-news-article .panel-pane {\n float: none !important;\n margin: 0 0 10px !important; } }\n\n.panel-display > .row {\n margin-bottom: 20px; }\n\n.panel-flexible .panel-separator {\n display: none; }\n\n.panels-layouts-checkboxes input[type=\"radio\"] {\n position: static;\n margin-left: 0px;\n margin-bottom: 20px; }\n\n.panels-layouts-checkboxes label {\n margin-left: 0px; }\n\n.panels-layouts-checkboxes .form-type-radio {\n margin: 0 !important; }\n\nbody.panels-ipe {\n margin-bottom: 55px !important; }\n\ndiv#panels-ipe-control-container {\n width: auto;\n left: 0;\n right: 0;\n box-shadow: none; }\n div#panels-ipe-control-container .panels-ipe-button-container {\n text-align: center; }\n div#panels-ipe-control-container .panels-ipe-button-container .panels-ipe-pseudobutton-container {\n margin: 0 5px; }\n div#panels-ipe-control-container .panels-ipe-button-container .panels-ipe-pseudobutton-container a {\n padding: 0px 10px 0px 34px; }\n div#panels-ipe-control-container .panels-ipe-button-container .panels-ipe-pseudobutton-container a:hover {\n text-decoration: none; }\n div#panels-ipe-control-container .panels-ipe-form-container form > div {\n text-align: center; }\n div#panels-ipe-control-container .panels-ipe-form-container form .form-submit {\n margin: 0 5px;\n padding: 0px 10px 0px 34px; }\n div#panels-ipe-control-container .panels-ipe-form-container form .form-submit:hover {\n box-shadow: none; }\n\nul.panels-ipe-linkbar {\n list-style: none outside none; }\n ul.panels-ipe-linkbar > li {\n display: inline-block;\n margin: 0 0 0 5px; }\n ul.panels-ipe-linkbar > li a {\n margin: 0 !important; }\n\n#logo {\n display: block;\n float: left;\n margin-right: 15px;\n height: 100%;\n width: auto; }\n\n#site-name {\n float: left; }\n\n.page-header {\n margin: 0 0 18px; }\n .page-header h1 {\n margin: 0; }\n\n.page-title-hidden .page-header {\n display: none; }\n\n.breadcrumb a i {\n display: none; }\n\n.tabs,\n.nav-tabs {\n margin: 0 0 18px; }\n\n.action-links {\n list-style: none outside none;\n margin: 0 0 18px;\n padding: 0;\n overflow: hidden;\n *zoom: 1; }\n .action-links > li {\n float: left;\n margin: 0 10px 0 0; }\n\ndiv.vertical-tabs {\n border: none;\n border: 1px solid #DDD;\n outline: none;\n border-radius: 4px; }\n div.vertical-tabs ul.vertical-tabs-list {\n border: none;\n margin-top: 20px;\n margin-bottom: 20px;\n outline: none; }\n div.vertical-tabs ul.vertical-tabs-list li {\n border: none;\n background: none;\n outline: none !important;\n border-radius: 4px 0 0 4px;\n border: 1px solid;\n border-color: #fff #ddd #fff #fff; }\n div.vertical-tabs ul.vertical-tabs-list li.selected {\n border-color: #ddd #fff #ddd #ddd; }\n div.vertical-tabs ul.vertical-tabs-list li a {\n outline: none !important;\n border-radius: 4px 0 0 4px; }\n div.vertical-tabs ul.vertical-tabs-list li a:hover {\n color: #fff;\n background: #337ab7;\n text-decoration: none; }\n div.vertical-tabs ul.vertical-tabs-list li a:hover strong {\n text-decoration: none;\n color: #fff; }\n div.vertical-tabs .vertical-tabs-panes {\n padding: 20px 10px; }\n div.vertical-tabs .form-type-textfield input {\n width: 90%;\n box-sizing: content-box; }\n\ntable {\n width: 100%;\n margin-bottom: 1.42857; }\n table th,\n table td {\n padding: 8px;\n line-height: 1.42857;\n text-align: left;\n vertical-align: top;\n border-top: 1px solid #ddd; }\n table th.checkbox,\n table td.checkbox {\n text-align: center;\n display: table-cell;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0; }\n table th.checkbox input,\n table td.checkbox input {\n float: none !important;\n margin-left: 0 !important; }\n table th.checkbox div.checkbox,\n table td.checkbox div.checkbox {\n text-align: center;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0; }\n table th {\n font-weight: bold; }\n table thead th {\n vertical-align: bottom; }\n table caption + thead tr:first-child th,\n table caption + thead tr:first-child td,\n table colgroup + thead tr:first-child th,\n table colgroup + thead tr:first-child td,\n table thead:first-child tr:first-child th,\n table thead:first-child tr:first-child td {\n border-top: 0; }\n table tbody + tbody {\n border-top: 2px solid #ddd; }\n\nul.links {\n padding: 0;\n list-style: none outside none; }\n ul.links.inline {\n margin: 0; }\n ul.links.inline li {\n margin: 0 10px 0 0;\n padding: 0; }\n\n.carousel .carousel-control {\n z-index: 100; }\n\n.carousel .carousel-indicators li {\n float: none;\n margin-left: 3px;\n margin-right: 3px; }\n .carousel .carousel-indicators li a {\n display: none; }\n\n.carousel .carousel-caption h1, .carousel .carousel-caption h2, .carousel .carousel-caption h3, .carousel .carousel-caption h4, .carousel .carousel-caption h5, .carousel .carousel-caption h6 {\n color: white; }\n\n.item-list ul.pagination {\n margin: 20px 0; }\n .item-list ul.pagination > li {\n margin: 0;\n display: inline-block;\n padding: 0;\n position: relative; }\n .item-list ul.pagination > li > a, .item-list ul.pagination > li > span {\n padding: 6px 12px;\n border-radius: inherit; }\n .item-list ul.pagination > li > a.progress-disabled, .item-list ul.pagination > li > span.progress-disabled {\n float: left; }\n .item-list ul.pagination > li .ajax-progress {\n float: left;\n padding: 6px 5px 6px 10px; }\n\n.ctools-dropdown-container hr {\n margin: 0; }\n\nul.nav,\nul.navl li,\nul.dropdown-menu,\nul.dropdown-menu li {\n list-style: none outside none !important; }\n\n.calendar-calendar table.mini td {\n border: 1px solid #eeeeee !important;\n padding: 5px; }\n\n.view-header .date-nav-wrapper h3 {\n margin-top: 5px !important;\n margin-bottom: 0; }\n\n.ui-tabs .ui-tabs-nav {\n padding: 0 5px 5px 5px; }\n\n.views-exposed-form .views-submit-button,\n.views-exposed-form .views-reset-button {\n margin-top: 3px; }\n\ninput[type=\"submit\"],\n.btn-primary, body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child,\n.btn.btn-primary, .media-widget > a.btn-primary {\n color: white;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n white-space: nowrap;\n padding: 5px 12px;\n line-height: 1.4em;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px; }\n\ninput[type=\"submit\"]:hover,\n.btn-primary:hover, body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a:hover:first-child,\ninput[type=\"submit\"]:focus,\n.btn-primary:focus,\nbody.maintenance-page .form-actions .btn:focus:first-child,\nbody.maintenance-page .form-actions .media-widget > a:focus:first-child,\ninput[type=\"submit\"]:active,\n.btn-primary:active,\nbody.maintenance-page .form-actions .btn:active:first-child,\nbody.maintenance-page .form-actions .media-widget > a:active:first-child {\n color: white;\n text-decoration: none; }\n\n.form-managed-file input.form-submit {\n -webkit-border-radius: 0 4px 4px 0;\n -moz-border-radius: 0 4px 4px 0;\n -ms-border-radius: 0 4px 4px 0;\n -o-border-radius: 0 4px 4px 0;\n border-radius: 0 4px 4px 0;\n padding-left: 10px;\n padding-right: 10px; }\n\n#dkan-sitewide-dataset-search-form label,\n#dkan-sitewide-dataset-search-form--2 label, #region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label {\n position: absolute;\n top: 0;\n left: -9999px; }\n\n.clearfix {\n overflow: visible; }\n\n.admin-list dt, .admin-list dd {\n display: inline-block;\n float: none;\n vertical-align: top; }\n\n.views-edit-view .action-list input.btn,\n.views-edit-view .action-list input.btn:active,\n.views-edit-view .action-list input.btn:focus,\n.views-edit-view .action-list input.btn:hover,\n.views-edit-view .action-list input[type=\"submit\"]:hover {\n background: inherit;\n border: none;\n color: inherit; }\n\n.views-edit-view .footer {\n background: inherit; }\n\n.modal-content .panels-root-content-box a.btn, .modal-content .panels-root-content-box .media-widget > a {\n white-space: normal; }\n\n.modal-content .panel-title {\n padding-right: 55px; }\n\n.views-displays .secondary .open > a:hover {\n color: #666; }\n\n.media-thumbnails-select {\n padding: 0 0 40px; }\n\n.page-admin .alert {\n margin: 10px 0; }\n\n.page-admin .container.main {\n width: 100%; }\n\n.page-admin .table-bordered > thead > tr > th, .page-admin .calendar-calendar table.mini > thead > tr > th, .calendar-calendar .page-admin table.mini > thead > tr > th,\n.page-admin .table-bordered > tbody > tr > th,\n.page-admin .calendar-calendar table.mini > tbody > tr > th, .calendar-calendar\n.page-admin table.mini > tbody > tr > th,\n.page-admin .table-bordered > tbody > tr > td,\n.page-admin .calendar-calendar table.mini > tbody > tr > td, .calendar-calendar\n.page-admin table.mini > tbody > tr > td {\n border: none; }\n\n.page-admin table thead > tr > th.checkbox,\n.page-admin table.table thead > tr > th.checkbox,\n.page-admin .table-bordered > tbody > tr > th.checkbox,\n.page-admin .calendar-calendar table.mini > tbody > tr > th.checkbox, .calendar-calendar\n.page-admin table.mini > tbody > tr > th.checkbox,\n.page-admin .table-bordered > tbody > tr > td.checkbox,\n.page-admin .calendar-calendar table.mini > tbody > tr > td.checkbox, .calendar-calendar\n.page-admin table.mini > tbody > tr > td.checkbox,\n.page-admin .table-striped > tbody > tr:nth-child(odd) > td.checkbox,\n.page-admin .table-striped > tbody > tr:nth-child(odd) > th.checkbox {\n background-color: transparent;\n border: none;\n margin: 0;\n display: table-cell;\n position: relative; }\n\n.page-admin .table tbody tr:hover td.checkbox,\n.page-admin .table tbody tr:hover th.checkbox {\n background-color: #FFFEEE; }\n\n.page-admin table th.checkbox label,\n.page-admin table td.checkbox label {\n line-height: 0;\n padding: 4px;\n vertical-align: top; }\n\n.page-admin table th.checkbox input[type=\"checkbox\"],\n.page-admin table th.checkbox input,\n.page-admin table td.checkbox input[type=\"checkbox\"],\n.page-admin table td.checkbox input {\n float: none !important;\n margin: 0 !important;\n position: relative; }\n\n.pane-dkan-sitewide-dkan-sitewide-other-access a.btn, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a,\n#block-dkan-sitewide-dkan-sitewide-other-access a.btn,\n#block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a {\n background-image: auto;\n border: 1px solid #ccc;\n padding: 6px 10px 6px 36px;\n position: relative; }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn i, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn i,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i {\n background-position: 0 0;\n position: absolute;\n top: 8px;\n left: 5px;\n visibility: visible; }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-rdfxml, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-rdfxml,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-rdfxml,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-rdfxml {\n background-image: url(../images/rdf.png); }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-json, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-json,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-json,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-json {\n background-image: url(../images/json.png); }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn:hover, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a:hover,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn:hover,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a:hover {\n background-color: #eeeeee; }\n\n.pane-dkan-sitewide-dkan-sitewide-other-access .btn-group,\n#block-dkan-sitewide-dkan-sitewide-other-access .btn-group {\n margin: .6em 0; }\n .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:first-child, .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:first-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:first-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:first-child {\n background-image: url(../images/json.png);\n background-repeat: no-repeat;\n background-position: 10px 10px; }\n .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:last-child, .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:last-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:last-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:last-child {\n background-image: url(../images/rdf.png);\n background-repeat: no-repeat;\n background-position: 10px 10px; }\n\n#block-dkan-forms-dkan-forms-dataset-help h2.block-title::before {\n content: \"\\f05a\";\n font-family: \"FontAwesome\";\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em; }\n\n.radix-layouts-sidebar .ctools-collapsible-container.pane-block,\n.radix-layouts-sidebar .ctools-collapsible-container .pane-content,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"].pane-block,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] .pane-content,\n.radix-layouts-sidebar .block-facetapi.pane-block,\n.radix-layouts-sidebar .block-facetapi .pane-content {\n border: none;\n margin: 0;\n padding: 0;\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n\n.radix-layouts-sidebar .ctools-collapsible-container .item-list,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] .item-list,\n.radix-layouts-sidebar .block-facetapi .item-list {\n border: 1px solid #ddd; }\n .radix-layouts-sidebar .ctools-collapsible-container .item-list .facetapi-limit-link,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] .item-list .facetapi-limit-link,\n .radix-layouts-sidebar .block-facetapi .item-list .facetapi-limit-link {\n padding: 10px 22px; }\n .radix-layouts-sidebar .ctools-collapsible-container .item-list .facetapi-limit-link:before,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] .item-list .facetapi-limit-link:before,\n .radix-layouts-sidebar .block-facetapi .item-list .facetapi-limit-link:before {\n top: 10px;\n right: 22px; }\n\n.radix-layouts-sidebar .ctools-collapsible-container h2.pane-title,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] h2.pane-title,\n.radix-layouts-sidebar .block-facetapi h2.pane-title {\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0;\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: normal;\n position: relative;\n padding: 9px 21px 9px 12px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1); }\n .radix-layouts-sidebar .ctools-collapsible-container h2.pane-title:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] h2.pane-title:after,\n .radix-layouts-sidebar .block-facetapi h2.pane-title:after {\n font-family: \"fontawesome\";\n content: \"\\f077\";\n color: rgba(255, 255, 255, 0.7);\n font-size: 12px;\n font-weight: bold;\n position: absolute;\n right: 14px;\n top: 10px; }\n\n.radix-layouts-sidebar .ctools-collapsible-container.ctools-collapsed h2.pane-title:after,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"].ctools-collapsed h2.pane-title:after,\n.radix-layouts-sidebar .block-facetapi.ctools-collapsed h2.pane-title:after {\n content: \"\\f078\"; }\n\n.radix-layouts-sidebar .ctools-collapsible-container .ctools-toggle,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] .ctools-toggle,\n.radix-layouts-sidebar .block-facetapi .ctools-toggle {\n background: none; }\n\n.radix-layouts-sidebar .ctools-collapsible-container ul,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul,\n.radix-layouts-sidebar .block-facetapi ul {\n margin: 0;\n padding: 0; }\n\n.radix-layouts-sidebar .ctools-collapsible-container ul li.leaf,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf,\n.radix-layouts-sidebar .block-facetapi ul li.leaf {\n list-style-type: none;\n list-style-image: none;\n margin: 0;\n padding: 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf li,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf li,\n .radix-layouts-sidebar .block-facetapi ul li.leaf li {\n position: relative; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf li a,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf li a,\n .radix-layouts-sidebar .block-facetapi ul li.leaf li a {\n padding-right: 48px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf.last,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf.last,\n .radix-layouts-sidebar .block-facetapi ul li.leaf.last {\n border-bottom: none; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf li:before,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf li:before,\n .radix-layouts-sidebar .block-facetapi ul li.leaf li:before {\n content: \"\\f178\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 4px;\n right: 30px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a {\n color: #333333;\n display: block;\n padding: 6px 20px 6px 10px;\n position: relative;\n line-height: 22px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a:focus, .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a:hover,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a:focus,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a:hover,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a:focus,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a:hover {\n color: #1a1a1a;\n background: rgba(0, 0, 0, 0.03);\n text-decoration: none; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a:hover:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a:hover:after,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a:hover:after {\n content: \"\\f055\";\n color: #5cb85c;\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a img,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a img,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a img {\n height: 25px;\n width: 25px;\n margin: 0 16px 0 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active {\n background: #ccc;\n color: #333;\n z-index: 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active:before,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active:before,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active:before {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 17px 0 17px 15px;\n border-color: transparent #ccc;\n display: block;\n width: 0;\n z-index: 1;\n right: -15px;\n top: 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active:after,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active:after {\n content: \"\\f00d\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active:hover:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active:hover:after,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active:hover:after {\n color: red; }\n\n.radix-layouts-sidebar .ctools-collapsible-container a.facetapi-limit-link,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] a.facetapi-limit-link,\n.radix-layouts-sidebar .block-facetapi a.facetapi-limit-link {\n display: block;\n padding: 5px 30px 5px 5px;\n position: relative; }\n\n.radix-layouts-sidebar .ctools-collapsible-container a.facetapi-limit-link:before,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] a.facetapi-limit-link:before,\n.radix-layouts-sidebar .block-facetapi a.facetapi-limit-link:before {\n content: \"\\f150\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 15px; }\n\n.radix-layouts-sidebar .ctools-collapsible-container a.facetapi-limit-link.open:before,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] a.facetapi-limit-link.open:before,\n.radix-layouts-sidebar .block-facetapi a.facetapi-limit-link.open:before {\n content: \"\\f151\"; }\n\n.radix-layouts-sidebar .ctools-collapsible-container .ctools-toggle {\n width: 12px; }\n\n.facetapi-facet-changed li.expanded a.facetapi-active {\n background: #ccc;\n border-bottom: 1px dotted #eee;\n color: #333;\n line-height: 22px;\n padding: 6px 20px 6px 10px; }\n .facetapi-facet-changed li.expanded a.facetapi-active:hover {\n background: #ccc;\n color: #333;\n text-decoration: none; }\n .facetapi-facet-changed li.expanded a.facetapi-active:hover:after {\n color: red; }\n .facetapi-facet-changed li.expanded a.facetapi-active:before {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 17px 0 17px 15px;\n border-color: transparent #ccc;\n display: block;\n width: 0;\n z-index: 1;\n right: -15px;\n top: 0; }\n .facetapi-facet-changed li.expanded a.facetapi-active:after {\n content: \"\\f00d\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px; }\n\n.facetapi-facet-changed li.expanded ul.expanded li.leaf a,\n.facetapi-facet-changed li.expanded li.expanded a {\n padding: 6px 20px 6px 20px; }\n\n.facetapi-facet-changed li.expanded .item-list {\n border: none; }\n\n.facetapi-facet-field-license a {\n white-space: pre;\n /* CSS 2.0 */\n white-space: pre-wrap;\n /* CSS 2.1 */\n white-space: pre-line;\n /* CSS 3.0 */\n white-space: -pre-wrap;\n /* Opera 4-6 */\n white-space: -o-pre-wrap;\n /* Opera 7 */\n white-space: -moz-pre-wrap;\n /* Mozilla */\n white-space: -hp-pre-wrap;\n /* HP Printers */\n word-wrap: break-word;\n /* IE 5+ */\n word-break: break-word; }\n\n.pane-views-group-block-block,\n#block-views-group-block-block {\n overflow: hidden; }\n .pane-views-group-block-block .views-field-title a,\n #block-views-group-block-block .views-field-title a {\n display: block;\n padding: .5em 0; }\n .pane-views-group-block-block .views-field-body p,\n #block-views-group-block-block .views-field-body p {\n margin: .5em 0 1em; }\n .pane-views-group-block-block .group-subscribe-message,\n #block-views-group-block-block .group-subscribe-message {\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px;\n background: #0A77BD;\n color: #fff;\n padding: 5px;\n text-align: center;\n margin-left: -15px;\n margin-right: -15px; }\n .pane-views-group-block-block .group-subscribe-message a,\n #block-views-group-block-block .group-subscribe-message a {\n color: #fff;\n display: block; }\n\n.radix-layouts-sidebar .pane-block.pane-views-group-block-block .pane-content {\n padding: 0 15px; }\n\n#block-dkan-dataset-dkan-dataset-dataset-help .content {\n padding: 10px; }\n\n#block-dkan-forms-dkan-forms-dataset-help h2:before {\n content: \"\\f05a\";\n font-family: \"FontAwesome\";\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em; }\n\n.pane-dkan-sitewide-demo-front-dkan-demo-front,\n#block-dkan-sitewide-demo-front-dkan-demo-front {\n -webkit-box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.5);\n -moz-box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.5);\n box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.5); }\n .pane-dkan-sitewide-demo-front-dkan-demo-front p,\n #block-dkan-sitewide-demo-front-dkan-demo-front p {\n color: #fff;\n padding: 15px; }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .media-overlay,\n #block-dkan-sitewide-demo-front-dkan-demo-front .media-overlay {\n position: relative;\n padding: 0; }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .media-overlay img,\n #block-dkan-sitewide-demo-front-dkan-demo-front .media-overlay img {\n width: 100%;\n height: auto; }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .media-overlay .media-heading,\n #block-dkan-sitewide-demo-front-dkan-demo-front .media-overlay .media-heading {\n background-color: rgba(0, 0, 0, 0.8);\n bottom: 0;\n color: #FFFFFF;\n font-size: 13px;\n left: 0;\n line-height: 18px;\n margin: 0;\n padding: 12px 10px;\n position: absolute;\n right: 0;\n z-index: 1; }\n\n.radix-layouts-sidebar .pane-dkan-sitewide-dkan-sitewide-social.pane-block .pane-content {\n padding: 0; }\n .radix-layouts-sidebar .pane-dkan-sitewide-dkan-sitewide-social.pane-block .pane-content li.last a:hover {\n -webkit-border-radius: 0 0 3px 3px;\n -moz-border-radius: 0 0 3px 3px;\n -ms-border-radius: 0 0 3px 3px;\n -o-border-radius: 0 0 3px 3px;\n border-radius: 0 0 3px 3px; }\n\n.pane-dkan-sitewide-dkan-sitewide-resource-add table {\n margin-top: 0; }\n\n.radix-layouts-sidebar .panel-panel-inner .panels-ipe-portlet-wrapper:first-child h2.pane-title,\n.radix-layouts-sidebar .panel-panel-inner > div[class*=\"pane-facetapi\"]:first-child h2.pane-title {\n -webkit-border-radius: 5px 5px 0 0;\n -moz-border-radius: 5px 5px 0 0;\n -ms-border-radius: 5px 5px 0 0;\n -o-border-radius: 5px 5px 0 0;\n border-radius: 5px 5px 0 0; }\n\n.radix-layouts-sidebar .panel-panel-inner .panels-ipe-portlet-wrapper:last-child .ctools-collapsed h2.pane-title, .radix-layouts-sidebar .panel-panel-inner .panels-ipe-portlet-wrapper:last-child.ctools-collapsed h2.pane-title,\n.radix-layouts-sidebar .panel-panel-inner > div[class*=\"pane-facetapi\"]:last-child .ctools-collapsed h2.pane-title,\n.radix-layouts-sidebar .panel-panel-inner > div[class*=\"pane-facetapi\"]:last-child.ctools-collapsed h2.pane-title {\n -webkit-border-radius: 0 0 5px 5px;\n -moz-border-radius: 0 0 5px 5px;\n -ms-border-radius: 0 0 5px 5px;\n -o-border-radius: 0 0 5px 5px;\n border-radius: 0 0 5px 5px; }\n\n@media all and (max-width: 768px) {\n .node-dataset .resource-list li {\n padding-right: 0; }\n .node-dataset .resource-list li span.links {\n position: relative;\n top: auto;\n right: auto;\n margin: 10px 0;\n display: block;\n padding: 0; }\n .node-dataset .resource-list li a.btn, .node-dataset .resource-list li .media-widget > a {\n margin: 0 5px 10px 0; } }\n\n.resource-list a.label {\n display: inline-block;\n overflow-wrap: break-word; }\n\n.stages {\n margin: 0 0 20px; }\n .stages li {\n font-size: 14px; }\n .stages li.first,\n .stages li.first .highlight {\n -webkit-border-radius: 5px 0 0 5px;\n -moz-border-radius: 5px 0 0 5px;\n -ms-border-radius: 5px 0 0 5px;\n -o-border-radius: 5px 0 0 5px;\n border-radius: 5px 0 0 5px; }\n .stages li.last,\n .stages li.last .highlight {\n -webkit-border-radius: 0 5px 5px 0;\n -moz-border-radius: 0 5px 5px 0;\n -ms-border-radius: 0 5px 5px 0;\n -o-border-radius: 0 5px 5px 0;\n border-radius: 0 5px 5px 0; }\n\n.node-type-resource .item-list .list-group li {\n margin: 0; }\n\n.node-type-dataset .field-name-field-tags .field-label,\n.node-type-dataset .field-name-field-topic .field-label,\n.node-type-dataset .field-name-field-preview-thumbail .field-label {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em; }\n\n.field-name-field-topic .field-item {\n display: inline-block; }\n\n#edit-path-alias {\n height: 34px; }\n\n.node-dataset .resource-list li {\n padding: 0 260px 0 45px; }\n\np.dkan-profile-page-user-name {\n display: inline-block; }\n\ninput.use-ajax-submit {\n margin-right: 10px; }\n\nbutton.btn,\n.btn.btn-default,\n.media-widget > a.btn-default,\n.btn.btn-primary,\n.media-widget > a.btn-primary,\nbody.maintenance-page .form-actions .btn:first-child,\nbody.maintenance-page .form-actions .media-widget > a:first-child,\n.tabs--primary.nav-pills li a,\n.form-control {\n line-height: 1.5em; }\n\n.btn, .media-widget > a, .btn-sm, .btn-group-sm > .btn, .media-widget.btn-group-sm > a {\n font-size: 14px; }\n\nselect.form-control {\n min-height: 36px; }\n select.form-control[multiple=\"multiple\"] {\n height: auto; }\n\n.form-control,\ndiv.autocomplete-deluxe-multiple {\n padding: 0 12px; }\n\n.ctools-dropbutton .ctools-content a,\n.ctools-dropbutton input.btn,\n.ctools-dropbutton input[type=\"submit\"] {\n color: #666; }\n .ctools-dropbutton .ctools-content a:hover, .ctools-dropbutton .ctools-content a:focus, .ctools-dropbutton .ctools-content a:active,\n .ctools-dropbutton input.btn:hover,\n .ctools-dropbutton input.btn:focus,\n .ctools-dropbutton input.btn:active,\n .ctools-dropbutton input[type=\"submit\"]:hover,\n .ctools-dropbutton input[type=\"submit\"]:focus,\n .ctools-dropbutton input[type=\"submit\"]:active {\n border: none;\n color: #0A77BD; }\n\n.field-type-file input[type=\"submit\"],\n.input-group-addon,\n.input-group-btn {\n width: auto; }\n\n.colorizer-form .form-control {\n width: 50%; }\n\n.colorizer-form label {\n float: none;\n display: block; }\n\n.colorizer-form #palette {\n clear: both; }\n .colorizer-form #palette .item-selected {\n background-color: transparent; }\n\n.bue-popup {\n z-index: 999; }\n\n.bue-ui.editor-container {\n background-color: #ffffff;\n padding: 0 4px;\n border: 1px solid #ddd;\n -webkit-border-radius: 4px 4px 0 0;\n -moz-border-radius: 4px 4px 0 0;\n -ms-border-radius: 4px 4px 0 0;\n -o-border-radius: 4px 4px 0 0;\n border-radius: 4px 4px 0 0; }\n\n.form-control.form-textarea {\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n\n.form-control.chosen-processed {\n line-height: 34px;\n height: auto;\n padding: 0;\n border: none;\n max-width: 100% !important; }\n .form-control.chosen-processed .chosen-choices {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n border-color: #ccc; }\n\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n background-position: -42px 2px; }\n\n.chzn-container-single {\n max-width: 100%; }\n\ndiv.autocomplete-deluxe-multiple,\n.chzn-container-multi {\n width: 100% !important; }\n\n.chzn-container-multi .chzn-choices .search-field input {\n height: auto; }\n\n#context-blockform td.blocks .label {\n background-color: #555555; }\n\n.tabledrag-hide .chzn-container-single {\n width: 20px !important; }\n\ndiv.autocomplete-deluxe-container input.autocomplete-deluxe-form-single {\n float: left; }\n\nfieldset fieldset {\n position: relative; }\n\nfieldset.collapsible {\n padding-top: 0; }\n\n#og-group-ref-add-more-wrapper fieldset,\nfieldset.group-primary {\n padding-top: 0; }\n #og-group-ref-add-more-wrapper fieldset legend,\n fieldset.group-primary legend {\n display: none; }\n\n.horizontal-tabs fieldset.horizontal-tabs-pane {\n padding: 0; }\n\ndiv.horizontal-tabs {\n border: none; }\n\n.form-managed-file span.file {\n border: 1px solid #ddd;\n padding: 0 15px;\n line-height: 34px;\n display: inline-block;\n vertical-align: top;\n border-radius: 5px 0 0 5px;\n margin-right: 0; }\n\n.form-managed-file input {\n -webkit-border-radius: 4px 0 0 4px;\n -moz-border-radius: 4px 0 0 4px;\n -ms-border-radius: 4px 0 0 4px;\n -o-border-radius: 4px 0 0 4px;\n border-radius: 4px 0 0 4px;\n border: 1px solid #ddd;\n padding: 5px;\n margin: 0 0 10px 0;\n height: 36px;\n vertical-align: top; }\n\n.form-managed-file input.form-submit {\n margin: 0 0 10px 0; }\n\n.form-managed-file .input-group-btn {\n display: inline-block;\n vertical-align: top; }\n\n.path-form.panel-default {\n border-color: transparent; }\n .path-form.panel-default .panel-body {\n padding: 0; }\n\n.list-group-item {\n background-color: transparent;\n border: none;\n color: #333333;\n padding: 0; }\n\n.filter-wrapper {\n padding: 10px; }\n\n#body-add-more-wrapper .panel-body {\n padding: 0; }\n\n.node-resource-form .field-name-field-upload .form-type-managed-file {\n display: table; }\n .node-resource-form .field-name-field-upload .form-type-managed-file .file-widget {\n display: table-footer-group; }\n .node-resource-form .field-name-field-upload .form-type-managed-file .file-resup-wrapper {\n display: table-header-group; }\n\n#search-api-admin-index-status-form input {\n margin-bottom: 1em; }\n\n.page-admin form input[type=submit] {\n margin-right: 1em; }\n\n.container,\n.container-fluid,\n.row {\n overflow: visible; }\n\naside.col-sm-3 {\n padding-left: 0; }\n\nsection.col-sm-9 {\n padding-right: 0; }\n\n#featured,\n.panel-top {\n background-position: 50% 50%;\n background-size: cover !important;\n overflow: hidden;\n position: relative;\n z-index: 0; }\n #featured .tint,\n .panel-top .tint {\n position: absolute;\n height: 900px;\n width: 100%;\n z-index: -1; }\n #featured .pane-dkan-sitewide-demo-front-dkan-demo-front .pane-title,\n #featured .pane-views-popular-tags-block .pane-title,\n #featured .pane-dkan-sitewide-demo-front-dkan-add-front .pane-title,\n .panel-top .pane-dkan-sitewide-demo-front-dkan-demo-front .pane-title,\n .panel-top .pane-views-popular-tags-block .pane-title,\n .panel-top .pane-dkan-sitewide-demo-front-dkan-add-front .pane-title {\n display: none; }\n #featured .container,\n .panel-top .container {\n padding: 30px 0;\n position: relative;\n z-index: 5; }\n #featured .pane-block,\n #featured .panel-pane,\n #featured .block-content,\n .panel-top .pane-block,\n .panel-top .panel-pane,\n .panel-top .block-content {\n color: #fff;\n line-height: 1.33em;\n margin: 0 15px; }\n #featured a,\n .panel-top a {\n color: #fff; }\n\n.page-admin .panel-top {\n background-image: none !important;\n background-color: none;\n overflow: visible; }\n .page-admin .panel-top .tint {\n display: none; }\n\n#top-content {\n margin: 20px; }\n #top-content .block {\n padding: 10px;\n text-align: center; }\n #top-content .block h2.block-title {\n border: none;\n color: #333333;\n font-size: 1.6em; }\n #top-content [class*=\"col-\"] {\n background-color: #ccc;\n border-left: 4px solid #fff;\n border-right: 4px solid #fff;\n margin-bottom: -99999px;\n padding-bottom: 99999px; }\n #top-content .row {\n overflow: hidden; }\n\n@media all and (max-width: 767px) {\n .branding.container {\n padding-left: 15px;\n padding-right: 15px; } }\n\n.navigation-wrapper .container {\n overflow: visible; }\n .navigation-wrapper .container .navbar-collapse {\n overflow: visible; }\n\n.container > .navbar-header, .container > .navbar-collapse {\n margin-left: 10px;\n margin-right: 10px; }\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n padding: 0;\n vertical-align: top; }\n\n.navbar-header {\n position: relative;\n z-index: 3; }\n\n.navbar-default {\n background: transparent;\n border: none;\n margin: 0;\n overflow: visible !important;\n position: relative;\n z-index: 3; }\n .navbar-default .navbar-nav,\n .navbar-default .user-menu {\n margin: 0;\n overflow: visible;\n position: relative;\n z-index: 3; }\n .navbar-default .navbar-nav a.dropdown-toggle,\n .navbar-default .user-menu a.dropdown-toggle {\n color: #FFFFFF; }\n .navbar-default .navbar-nav .open > a,\n .navbar-default .navbar-nav li > a,\n .navbar-default .user-menu .open > a,\n .navbar-default .user-menu li > a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding: 15px; }\n .navbar-default .navbar-nav .open > a.dropdown-toggle:hover, .navbar-default .navbar-nav .open > a:active, .navbar-default .navbar-nav .open > a:hover, .navbar-default .navbar-nav .open > a:focus,\n .navbar-default .navbar-nav li > a.dropdown-toggle:hover,\n .navbar-default .navbar-nav li > a:active,\n .navbar-default .navbar-nav li > a:hover,\n .navbar-default .navbar-nav li > a:focus,\n .navbar-default .user-menu .open > a.dropdown-toggle:hover,\n .navbar-default .user-menu .open > a:active,\n .navbar-default .user-menu .open > a:hover,\n .navbar-default .user-menu .open > a:focus,\n .navbar-default .user-menu li > a.dropdown-toggle:hover,\n .navbar-default .user-menu li > a:active,\n .navbar-default .user-menu li > a:hover,\n .navbar-default .user-menu li > a:focus {\n background: #002245;\n color: #FFFFFF;\n text-decoration: none; }\n .navbar-default .navbar-nav .open > a.dropdown-toggle:focus, .navbar-default .navbar-nav .open > a.dropdown-toggle:active,\n .navbar-default .navbar-nav li > a.dropdown-toggle:focus,\n .navbar-default .navbar-nav li > a.dropdown-toggle:active,\n .navbar-default .user-menu .open > a.dropdown-toggle:focus,\n .navbar-default .user-menu .open > a.dropdown-toggle:active,\n .navbar-default .user-menu li > a.dropdown-toggle:focus,\n .navbar-default .user-menu li > a.dropdown-toggle:active {\n background-color: transparent; }\n .navbar-default .navbar-nav .open > a.dropdown-toggle:hover,\n .navbar-default .navbar-nav li > a.dropdown-toggle:hover,\n .navbar-default .user-menu .open > a.dropdown-toggle:hover,\n .navbar-default .user-menu li > a.dropdown-toggle:hover {\n background: #002245; }\n .navbar-default .navbar-nav .dropdown-menu,\n .navbar-default .user-menu .dropdown-menu {\n background: #0A77BD;\n padding: 0; }\n .navbar-default .navbar-nav .dropdown-menu li,\n .navbar-default .user-menu .dropdown-menu li {\n display: block; }\n .navbar-default .navbar-nav .dropdown-menu li a,\n .navbar-default .user-menu .dropdown-menu li a {\n display: block;\n color: #ffffff; }\n .navbar-default .navbar-toggle {\n border-color: #ffffff; }\n .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n background-color: rgba(0, 0, 0, 0.25); }\n .navbar-default .navbar-toggle .icon-bar {\n background-color: #ffffff; }\n @media all and (min-width: 768px) {\n .navbar-default .user-menu {\n float: right; }\n .navbar-default .navbar-nav li,\n .navbar-default .user-menu li {\n display: inline-block; }\n .navbar-default .navbar-nav li a,\n .navbar-default .user-menu li a {\n display: inline-block; }\n .navbar-default .navbar-nav li .dropdown-menu li,\n .navbar-default .navbar-nav li .dropdown-menu li a,\n .navbar-default .user-menu li .dropdown-menu li,\n .navbar-default .user-menu li .dropdown-menu li a {\n display: block; } }\n .navbar-default .navbar-nav.secondary li {\n float: none; }\n .navbar-default .navbar-nav.secondary li a {\n font-size: .7em;\n line-height: 1.5em;\n padding: 4px; }\n\n@media all and (max-width: 767px) {\n .nav > li {\n clear: both; }\n .navbar-default .navbar-nav .open .dropdown-menu,\n .navbar-default .navbar-nav .dropdown-menu {\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n border: none;\n display: block;\n width: 100%;\n position: relative; }\n .navbar-default .navbar-nav .open .dropdown-menu li > a,\n .navbar-default .navbar-nav .dropdown-menu li > a {\n color: #ffffff;\n display: block;\n padding: 15px 10px 15px 35px; }\n .navbar-default .navbar-nav .open .dropdown-menu li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu li > a:focus, .navbar-default .navbar-nav .open .dropdown-menu li > a:active,\n .navbar-default .navbar-nav .dropdown-menu li > a:hover,\n .navbar-default .navbar-nav .dropdown-menu li > a:focus,\n .navbar-default .navbar-nav .dropdown-menu li > a:active {\n background: #002245;\n color: #ffffff;\n clear: both; } }\n\n#block-dkan-sitewide-dkan-sitewide-user-menu .links a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding: 15px; }\n #block-dkan-sitewide-dkan-sitewide-user-menu .links a:hover, #block-dkan-sitewide-dkan-sitewide-user-menu .links a:focus {\n background: #002245;\n color: #FFFFFF;\n text-decoration: none; }\n\n#block-dkan-sitewide-dkan-sitewide-user-menu img {\n margin: 10px; }\n\n@media all and (min-width: 768px) {\n #block-dkan-sitewide-dkan-sitewide-user-menu {\n float: right; }\n #block-dkan-sitewide-dkan-sitewide-user-menu .links a {\n display: inline-block; } }\n\n.navbar .nav > li > a {\n text-shadow: none; }\n\n@media (min-width: 768px) {\n .navbar {\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n .container > .navbar-header {\n margin-left: 0; }\n #nav-wrapper .navbar-default .logo {\n padding: 10px 10px 0 0; } }\n\n.tabs--primary {\n margin: 10px 0; }\n .tabs--primary li {\n margin: 1px; }\n .tabs--primary li a {\n background: #fff;\n border: 1px solid #fff;\n padding: 6px 15px; }\n .tabs--primary li a:hover {\n border: 1px solid #002245;\n background: #002245;\n color: #fff; }\n .tabs--primary li a.active {\n border: 1px solid #0A77BD;\n background: #0A77BD;\n color: #fff; }\n\n.nav-tabs li a {\n color: #0A77BD; }\n\n.front .tabs--primary {\n display: none; }\n\n.tabs--primary .nav-pills li a.active,\n.tabs--primary .nav-pills li.active a:hover,\n.tabs--primary .nav-pills li.active a:focus {\n border: 1px solid #0A77BD;\n background: #0A77BD;\n color: #ffffff; }\n\n.btn-primary, body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child {\n background: #0A77BD;\n border-color: #0A77BD; }\n\n.btn-primary:hover, body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a:hover:first-child,\n.btn-primary:focus,\nbody.maintenance-page .form-actions .btn:focus:first-child,\nbody.maintenance-page .form-actions .media-widget > a:focus:first-child,\n.btn-primary:active,\nbody.maintenance-page .form-actions .btn:active:first-child,\nbody.maintenance-page .form-actions .media-widget > a:active:first-child,\n.btn-primary.active,\nbody.maintenance-page .form-actions .active.btn:first-child,\nbody.maintenance-page .form-actions .media-widget > a.active:first-child {\n background: #002245;\n border-color: #002245; }\n\n.form-actions #edit-submit {\n background: #5cb85c;\n border-color: #5cb85c; }\n\n.form-actions #edit-submit:hover,\n.form-actions #edit-submit:focus,\n.form-actions #edit-submit:active {\n background: #449d44;\n border-color: #449d44;\n color: #fff; }\n\na.embed-link {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n color: #fff;\n display: inline-block;\n padding: 5px 15px 5px 35px;\n position: relative;\n margin: 1em 0;\n text-decoration: none; }\n\na.embed-link:hover,\na.embed-link:focus,\na.embed-link:active {\n color: #fff;\n text-decoration: none; }\n\na.embed-link:before {\n content: '\\f121';\n color: #fff;\n font-family: \"FontAwesome\";\n font-size: 1.3em;\n position: absolute;\n top: 5px;\n left: 10px; }\n\ntextarea.embed-code {\n width: 100%;\n margin-bottom: 1em; }\n\nul.action-links {\n margin: 1em 15px; }\n ul.action-links li {\n float: none;\n display: inline-block; }\n\n.btn:active, .media-widget > a:active,\n.btn.active,\n.media-widget > a.active {\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n\n.radix-layouts-sidebar ul.menu > li > ul.menu {\n margin-left: 0; }\n .radix-layouts-sidebar ul.menu > li > ul.menu li a {\n padding: 10px 15px 10px 30px; }\n\n.node-type-dataset .field-name-field-tags {\n margin: 1em 0; }\n\n.node-type-dataset .field-name-field-topic {\n margin: -20px 0 15px 0; }\n\n.node-type-dataset h4 {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em; }\n\n.node-type-dataset .field-name-field-related-content .field-label,\n.node-type-dataset .field-name-field-topic .field-label,\n.node-type-dataset .field-name-field-tags .field-label,\n.node-type-dataset .field-name-field-topic .field-label,\n.node-type-dataset .field-name-field-preview-thumbail .field-label {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em; }\n\n/** UI Tabs **/\n.node-resource-form .horizontal-tabs {\n border: none; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list {\n background-color: transparent;\n border: 0;\n padding-top: 10px; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected {\n border: 0;\n background-color: transparent;\n min-width: 10em; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li a:hover,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected a:hover {\n background: transparent; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li #active-horizontal-tab,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected #active-horizontal-tab {\n background: url(../images/sprite-ckan-icons.png) no-repeat -193px 2px;\n display: block;\n text-indent: -9999px;\n width: 16px;\n height: 16px;\n margin: 0 0 0 28px;\n clip: auto; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.horizontal-tab-button-1 .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.horizontal-tab-button-2 .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected.horizontal-tab-button-1 .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected.horizontal-tab-button-2 .summary {\n background: url(../images/sprite-ckan-icons.png) no-repeat -160px 0; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected .summary {\n background: url(../images/sprite-ckan-icons.png) no-repeat -144px 0;\n width: 16px;\n height: 16px;\n position: absolute;\n top: 5px;\n left: 10px; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li a,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected a {\n font-size: 1.1em;\n position: relative;\n padding: 5px 15px 5px 30px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n border: 1px solid #ddd;\n padding: 8px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_upload legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_api legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_file legend.panel-heading {\n display: none; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_upload .field-widget-recline-widget legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_api .field-widget-recline-widget legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_file .field-widget-recline-widget legend.panel-heading {\n border: none;\n border-bottom: 1px solid #ddd;\n display: block;\n background: transparent;\n color: #555555;\n padding: 5px 0; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .form-type-checkbox label,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .form-type-select label {\n display: block;\n line-height: 36px;\n padding-top: 2px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .filefield-source-remotefile input {\n margin-right: 0; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .filefield-source-remotefile input.btn {\n -webkit-border-radius: 0 4px 4px 0;\n -moz-border-radius: 0 4px 4px 0;\n -ms-border-radius: 0 4px 4px 0;\n -o-border-radius: 0 4px 4px 0;\n border-radius: 0 4px 4px 0;\n margin-left: -1px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .form-item-field-upload-und-0-embed {\n clear: both; }\n\n.page-node-add-resource .field-group-htabs.group-data div.horizontal-tabs {\n border: 0; }\n\n.page-node-add-resource .form-item {\n margin: 0; }\n\n#action-info {\n color: #d9534f;\n margin: 1em 0; }\n #action-info:before {\n color: #d9534f;\n content: \"\\f071\";\n font-family: \"FontAwesome\";\n font-size: 1.5em;\n font-style: normal;\n margin-right: 5px;\n vertical-align: middle; }\n\n.field-name-body a {\n overflow-wrap: break-word; }\n\n.field-name-body ul {\n list-style-type: disc;\n margin: 10px 20px; }\n .field-name-body ul li {\n margin: 6px 10px; }\n\n.field-group-table-description {\n color: #555555;\n display: block;\n padding: 8px 10px 8px 40px;\n position: relative; }\n .field-group-table-description .icon-info-sign:before {\n color: #777777;\n content: \"\\f05a\";\n font-family: \"FontAwesome\";\n font-size: 2.5em;\n font-style: normal;\n height: 30px;\n left: 0;\n margin: 10px 15px 0 0;\n padding: 6px 0;\n position: absolute;\n top: -6px;\n width: 30px; }\n\n.node-type-group .horizontal-tabs {\n margin: 0; }\n .node-type-group .horizontal-tabs #edit-field-image-und-0-remove-button {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n margin-left: 5px; }\n\n.group-owner-message {\n margin-bottom: 20px; }\n\n.field-type-text-with-summary {\n padding: 0; }\n\n.field-name-field-additional-info {\n margin-top: 2em; }\n\n.field-name-field-related-content .field-item a {\n border: 1px solid #ddd;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px; }\n .field-name-field-related-content .field-item a:hover {\n color: #ffffff;\n text-decoration: none;\n background: #0A77BD; }\n\n.field-name-field-related-content .field-item:first-of-type a {\n -webkit-border-radius: 4px 4px 0px 0px;\n -moz-border-radius: 4px 4px 0px 0px;\n -ms-border-radius: 4px 4px 0px 0px;\n -o-border-radius: 4px 4px 0px 0px;\n border-radius: 4px 4px 0px 0px; }\n\n.field-name-field-related-content .field-item:last-of-type a {\n -webkit-border-radius: 0px 0px 4px 4px;\n -moz-border-radius: 0px 0px 4px 4px;\n -ms-border-radius: 0px 0px 4px 4px;\n -o-border-radius: 0px 0px 4px 4px;\n border-radius: 0px 0px 4px 4px; }\n\n.main {\n padding-top: 20px;\n padding-bottom: 20px; }\n\n.front .main {\n padding: 0; }\n\n.page-admin .main {\n padding: 20px 15px; }\n\n.page-admin .region-content {\n margin: 0; }\n\n.page-admin .breadcrumb,\n.page-admin .alert,\n.page-admin .tabs--primary,\n.page-admin .page-header {\n margin: 0 0 15px; }\n\n.panel-body {\n overflow: visible; }\n\n.pane-content .field-name-body {\n line-height: 2em; }\n\n.main .panel-pane {\n margin-bottom: 3em; }\n\nh2.pane-title {\n border-bottom: 1px solid #ddd;\n padding-bottom: 10px; }\n\n#panels-choose-layout .form-type-radio input,\n.panels-choose-layout .form-type-radio input {\n width: 15px; }\n\n.radix-layouts-sidebar .pane-title {\n -webkit-border-radius: 3px 3px 0 0;\n -moz-border-radius: 3px 3px 0 0;\n -ms-border-radius: 3px 3px 0 0;\n -o-border-radius: 3px 3px 0 0;\n border-radius: 3px 3px 0 0;\n border: 1px solid;\n border-bottom: none;\n font-size: 16px;\n line-height: 1.3;\n margin: 0;\n padding: 7px 10px;\n font-weight: normal; }\n\n.radix-layouts-sidebar .pane-block {\n -webkit-border-radius: 5px;\n -moz-border-radius: 5px;\n -ms-border-radius: 5px;\n -o-border-radius: 5px;\n border-radius: 5px;\n border: 1px solid #ddd;\n margin-bottom: 20px;\n padding: 0px; }\n .radix-layouts-sidebar .pane-block .pane-content {\n background-color: transparent;\n margin: 0;\n padding: 15px; }\n\n.page-user .radix-layouts-content .pane-content {\n padding: 0; }\n .page-user .radix-layouts-content .pane-content .profile {\n margin-top: 0; }\n\n.radix-layouts-content .pane-title {\n font-size: 36px;\n line-height: 42px;\n margin: 0 0 15px 0; }\n\n.radix-layouts-content .pane-content {\n padding: 20px 0;\n margin-bottom: 1em; }\n\n.radix-layouts-content .pane-node-field-topic .pane-content {\n padding: 0; }\n\n.radix-layouts-content .pane-page-breadcrumb .breadcrumb {\n display: block;\n margin: 0 0 15px 0; }\n\n@media (max-width: 991px) {\n .node-type-group .radix-layouts-content .pane-title {\n margin-top: 2em; } }\n\n.node-type-group .radix-layouts-content .pane-content {\n padding: 20px 0 0;\n margin-bottom: 0; }\n\n.page-manager-wrapper .panel-region .pane-title {\n background-image: none;\n border: none;\n font-size: 1em;\n line-height: normal; }\n\n.page-manager-wrapper .panel-region .panel-pane-collapsible .pane-content {\n padding: 10px 15px; }\n\n#panelizer-edit-content-form input {\n margin-right: 1em; }\n\n.panel-full-width .panel-top {\n margin-bottom: 15px; }\n\n@media (max-width: 768px) {\n .panel-full-width .panel-bottom .panel-col-first,\n .panel-full-width .panel-bottom .panel-col-second,\n .panel-full-width .panel-bottom .panel-col-third {\n float: none;\n width: 100%; } }\n\n.recline-pager .pagination li {\n vertical-align: middle; }\n .recline-pager .pagination li a {\n line-height: 1em;\n padding: 0 10px; }\n .recline-pager .pagination li a.btn, .recline-pager .pagination li .media-widget > a {\n line-height: 32px; }\n\n.recline-pager .pagination input {\n height: 20px;\n font-size: .8em; }\n\n.recline-data-explorer .form-control {\n border-color: #ccc; }\n\n.recline-data-explorer .btn, .recline-data-explorer .media-widget > a {\n border: 1px solid #ccc;\n font-size: 14px;\n padding: 0px 12px;\n line-height: 32px; }\n\n.dropdown-menu.slick-contextmenu {\n background: #fff; }\n .dropdown-menu.slick-contextmenu li {\n padding-left: 5px;\n padding-right: 5px; }\n\n@media all and (max-width: 767px) {\n aside[class|='col'],\n section[class|='col'] {\n padding: 0; }\n .container {\n width: 100%; }\n .panel-full-width .panel-top .panel-col-first,\n .panel-full-width .panel-top .panel-col-second,\n .panel-full-width .panel-bottom .panel-col-first,\n .panel-full-width .panel-bottom .panel-col-second,\n .panel-full-width .panel-bottom .panel-col-third {\n width: 100%;\n float: none; }\n .panel-full-width .panel-top .panel-col-first .inside,\n .panel-full-width .panel-top .panel-col-second .inside,\n .panel-full-width .panel-bottom .panel-col-first .inside,\n .panel-full-width .panel-bottom .panel-col-second .inside,\n .panel-full-width .panel-bottom .panel-col-third .inside {\n margin: 20px 15px; } }\n\n#views-exposed-form-dkan-datasets-panel-pane-1 .views-exposed-form .views-widget-filter-search_api_views_fulltext {\n max-width: 320px; }\n\n#dkan-sitewide-dataset-search-form,\n#dkan-sitewide-dataset-search-form--2 {\n position: relative; }\n #dkan-sitewide-dataset-search-form form,\n #dkan-sitewide-dataset-search-form--2 form {\n display: block;\n margin: 8px 0;\n position: relative;\n width: 100%; }\n #dkan-sitewide-dataset-search-form input.form-text,\n #dkan-sitewide-dataset-search-form--2 input.form-text {\n padding-right: 30px; }\n #dkan-sitewide-dataset-search-form button[type=\"submit\"],\n #dkan-sitewide-dataset-search-form input[type=\"submit\"],\n #dkan-sitewide-dataset-search-form--2 button[type=\"submit\"],\n #dkan-sitewide-dataset-search-form--2 input[type=\"submit\"] {\n background: none !important;\n border: none;\n content: \"\\f002\";\n color: #555555;\n display: inline-block;\n font-size: 1.3em;\n font-family: \"FontAwesome\";\n margin: 0;\n padding: 0;\n position: absolute;\n right: 10px;\n width: 25px;\n top: 2px; }\n\n#block-dkan-sitewide-dkan-sitewide-search-bar {\n clear: both; }\n @media all and (min-width: 768px) {\n #block-dkan-sitewide-dkan-sitewide-search-bar {\n position: absolute;\n top: 10px;\n right: 15px;\n width: 172px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar form {\n width: 172px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar input.form-control {\n width: 170px;\n height: 36px;\n margin: 0; } }\n #block-dkan-sitewide-dkan-sitewide-search-bar form {\n display: block;\n margin: 8px 0;\n position: relative;\n width: 100%; }\n #block-dkan-sitewide-dkan-sitewide-search-bar input.form-text {\n padding-right: 30px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar button[type=\"submit\"],\n #block-dkan-sitewide-dkan-sitewide-search-bar input[type=\"submit\"] {\n background: none !important;\n border: none;\n content: \"\\f002\";\n color: #555555;\n display: inline-block;\n font-size: 1.3em;\n font-family: \"FontAwesome\";\n margin: 0;\n padding: 0;\n position: absolute;\n right: 10px;\n width: 25px;\n top: 2px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar .views-exposed-form .form-submit {\n margin: 22px 0 0;\n text-shadow: none; }\n\n.facetapi-terms span[class*=font-icon-select]:before,\n.icon-dkan.facet-icon:before {\n font-family: 'DKAN-Topics';\n font-size: 24px;\n padding-right: .3em;\n vertical-align: middle; }\n\n.node-search-result .icon-dkan.facet-icon:before {\n font-size: 42px;\n margin-top: 0.7em;\n display: block; }\n\n.node-search-result .resource-list li {\n display: inline-block; }\n\n.node-search-result .icon-container {\n text-align: center; }\n\n.search-result ul.resource-list {\n margin-top: 0.9em; }\n .search-result ul.resource-list li {\n display: inline-block; }\n .search-result ul.resource-list li a, .search-result ul.resource-list li:first-child {\n margin-left: 0px; }\n\n.search-result .dataset-list {\n list-style: none;\n margin: 0;\n padding: 0; }\n .search-result .dataset-list li {\n list-style: none;\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em; }\n .search-result .dataset-list li:before {\n content: \"\\e97e\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em; }\n\n.search-result .group-membership {\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em; }\n .search-result .group-membership:before {\n content: \"\\e981\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em; }\n\n.search-result.search-result-group .group-membership {\n display: none; }\n\n.search-result p {\n margin-bottom: 0px; }\n\n.node-search-result h2.node-title {\n margin: 1.5em 0 .5em 0; }\n\nbody {\n font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 16px;\n line-height: 1.35em;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\nbody.modal-open {\n overflow: visible !important; }\n\n.branding {\n position: relative; }\n .branding .logo {\n margin: 20px 20px 15px 0; }\n\n@media (max-width: 768px) {\n .logo img {\n max-width: 100%; } }\n\n.site-name {\n display: block;\n font-size: 2em;\n line-height: 1.15em;\n margin: 50px 20px 0; }\n @media (max-width: 460px) {\n .site-name {\n clear: left;\n float: none;\n margin: 10px 20px 5px 0; } }\n .site-name:hover {\n text-decoration: none; }\n\n.site-slogan {\n margin-bottom: 20px; }\n\nh1 {\n font-size: 30px;\n line-height: 36px;\n margin-bottom: 15px; }\n\nh1, h2, h3, h4 {\n color: #333333;\n font-weight: 300; }\n\nh3.media-heading {\n margin: .5em 0; }\n\nh4 {\n margin-top: 2em;\n margin-bottom: .5em; }\n\na {\n color: #0A77BD; }\n a:hover {\n color: #002245; }\n\np,\np:last-child {\n margin: 0 0 1.25em 0; }\n\n.breadcrumb {\n background: none;\n border: none;\n font-size: 1em;\n list-style: none;\n padding: 0;\n position: relative; }\n .breadcrumb li {\n float: none; }\n .breadcrumb li a span {\n display: none; }\n .breadcrumb li.home-link a {\n font-size: 1.3em; }\n .breadcrumb li.home-link a i {\n display: block; }\n\n.alert {\n border: none;\n padding: 15px 35px;\n position: relative; }\n .alert .close {\n line-height: 18px;\n position: absolute;\n right: 10px;\n top: 5px; }\n .alert.alert-warning {\n background: #FFE285; }\n .alert:before {\n font-family: \"FontAwesome\";\n font-size: 1.5em;\n position: absolute;\n top: 15px;\n left: 10px; }\n .alert.alert-danger:before {\n content: '\\f06a';\n color: #d9534f; }\n .alert.alert-warning:before {\n content: '\\f05a';\n color: #8a6d3b; }\n .alert.alert-success:before {\n content: '\\f058';\n color: #5cb85c; }\n\n.page-admin .alert {\n margin: 10px 0; }\n\ntable,\ntable.group_additional {\n border-collapse: collapse;\n margin: 1em 0;\n width: 100%; }\n table thead > tr > th,\n table.group_additional thead > tr > th {\n background-color: #e7e7e7;\n border: 1px solid #ddd !important;\n padding: 4px 8px;\n font-weight: bold; }\n table tbody th,\n table td,\n table.group_additional tbody th,\n table.group_additional td {\n border: 1px solid #ddd;\n padding: 4px 8px;\n vertical-align: top; }\n table tr:hover,\n table.group_additional tr:hover {\n background: #FFFEEE; }\n\n@media screen and (max-width: 1024px) {\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: normal; } }\n\n.field-name-field-additional-info .field-label {\n margin-bottom: 1em; }\n\n.group_additional,\n.field-name-field-additional-info table,\n.field-name-field-additional-info .table-responsive {\n margin: 0; }\n .group_additional td,\n .group_additional th,\n .field-name-field-additional-info table td,\n .field-name-field-additional-info table th,\n .field-name-field-additional-info .table-responsive td,\n .field-name-field-additional-info .table-responsive th {\n white-space: normal;\n width: auto; }\n .group_additional td:nth-of-type(2n),\n .field-name-field-additional-info table td:nth-of-type(2n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(2n) {\n white-space: pre;\n /* CSS 2.0 */\n white-space: pre-wrap;\n /* CSS 2.1 */\n white-space: pre-line;\n /* CSS 3.0 */\n white-space: -pre-wrap;\n /* Opera 4-6 */\n white-space: -o-pre-wrap;\n /* Opera 7 */\n white-space: -moz-pre-wrap;\n /* Mozilla */\n white-space: -hp-pre-wrap;\n /* HP Printers */\n word-wrap: break-word;\n /* IE 5+ */\n word-break: break-word; }\n @media all and (min-width: 768px) {\n .group_additional th:nth-of-type(1n),\n .group_additional td:nth-of-type(1n),\n .group_additional th:nth-of-type(4n),\n .group_additional td:nth-of-type(4n),\n .field-name-field-additional-info table th:nth-of-type(1n),\n .field-name-field-additional-info table td:nth-of-type(1n),\n .field-name-field-additional-info table th:nth-of-type(4n),\n .field-name-field-additional-info table td:nth-of-type(4n),\n .field-name-field-additional-info .table-responsive th:nth-of-type(1n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(1n),\n .field-name-field-additional-info .table-responsive th:nth-of-type(4n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(4n) {\n width: 5%;\n border-right: 1px solid #ddd; }\n .group_additional th:nth-of-type(2n),\n .group_additional td:nth-of-type(2n),\n .field-name-field-additional-info table th:nth-of-type(2n),\n .field-name-field-additional-info table td:nth-of-type(2n),\n .field-name-field-additional-info .table-responsive th:nth-of-type(2n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(2n) {\n width: 90%; }\n .group_additional th:nth-of-type(2n) .form-control,\n .group_additional td:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table th:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table td:nth-of-type(2n) .form-control,\n .field-name-field-additional-info .table-responsive th:nth-of-type(2n) .form-control,\n .field-name-field-additional-info .table-responsive td:nth-of-type(2n) .form-control {\n min-width: 40%; } }\n\ntable.group_additional,\n.field-name-field-additional-info table {\n margin-top: 0; }\n table.group_additional th,\n table.group_additional td,\n table.group_additional th:nth-of-type(1n),\n table.group_additional td:nth-of-type(1n),\n table.group_additional th:nth-of-type(2n),\n table.group_additional td:nth-of-type(2n),\n .field-name-field-additional-info table th,\n .field-name-field-additional-info table td,\n .field-name-field-additional-info table th:nth-of-type(1n),\n .field-name-field-additional-info table td:nth-of-type(1n),\n .field-name-field-additional-info table th:nth-of-type(2n),\n .field-name-field-additional-info table td:nth-of-type(2n) {\n width: auto; }\n table.group_additional th .form-control,\n table.group_additional td .form-control,\n table.group_additional th:nth-of-type(1n) .form-control,\n table.group_additional td:nth-of-type(1n) .form-control,\n table.group_additional th:nth-of-type(2n) .form-control,\n table.group_additional td:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table th .form-control,\n .field-name-field-additional-info table td .form-control,\n .field-name-field-additional-info table th:nth-of-type(1n) .form-control,\n .field-name-field-additional-info table td:nth-of-type(1n) .form-control,\n .field-name-field-additional-info table th:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table td:nth-of-type(2n) .form-control {\n display: inline-block;\n width: auto;\n vertical-align: top; }\n\n.table > thead:first-child > tr:first-child > th,\ntable thead:first-child tr:first-child th {\n border: 1px solid #ddd; }\n\n.table-bordered > thead > tr > th, .calendar-calendar table.mini > thead > tr > th,\ntable thead > tr > th {\n background-color: #e7e7e7;\n border: 1px solid #ddd;\n padding: 4px 8px; }\n\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9; }\n\n.table tbody tr:hover td,\n.table tbody tr:hover th,\n.table-striped > tbody > tr:nth-child(odd):hover {\n background-color: #FFFEEE; }\n\ndl {\n margin: 0;\n padding: 0;\n clear: both;\n overflow: hidden; }\n\ndt {\n clear: both;\n margin: 0;\n padding: 8px 5px;\n float: left;\n width: 28%; }\n\ndd {\n margin: 0;\n padding: 8px 5px;\n float: right;\n width: 72%; }\n\ndt,\ndd {\n border-top: 1px solid #ddd; }\n\n.item-list .pagination li:first-child > span,\n.item-list .pagination li:first-child > a {\n -webkit-border-radius: 4px 0 0 4px;\n -moz-border-radius: 4px 0 0 4px;\n -ms-border-radius: 4px 0 0 4px;\n -o-border-radius: 4px 0 0 4px;\n border-radius: 4px 0 0 4px; }\n\n.item-list .pagination li:last-child > span,\n.item-list .pagination li:last-child > a {\n -webkit-border-radius: 0 4px 4px 0;\n -moz-border-radius: 0 4px 4px 0;\n -ms-border-radius: 0 4px 4px 0;\n -o-border-radius: 0 4px 4px 0;\n border-radius: 0 4px 4px 0; }\n\n.radix-layouts-sidebar .item-list ul,\n.nav-simple {\n margin: 0;\n list-style: none;\n padding: 0; }\n .radix-layouts-sidebar .item-list ul li,\n .nav-simple li {\n margin: 0;\n line-height: 1.1666666666666667em;\n padding: 0;\n border-bottom: 1px dotted #CCC;\n position: relative; }\n .radix-layouts-sidebar .item-list ul li a,\n .nav-simple li a {\n display: block;\n margin: 0; }\n .radix-layouts-sidebar .item-list ul li a:hover,\n .nav-simple li a:hover {\n background: #FFFEEE; }\n .radix-layouts-sidebar .item-list ul li.last,\n .nav-simple li.last {\n border-bottom: none; }\n\nimg {\n max-width: 100%;\n height: auto; }\n\n.thumbnail {\n padding: 0;\n margin: 0;\n background-color: transparent;\n border: none;\n border-radius: 0; }\n\n.field-name-field-tags .field-item {\n display: inline-block; }\n\n.field-name-field-tags label {\n display: block; }\n\n.field-name-field-tags input.form-control {\n height: auto; }\n\n.field-name-field-tags .field-item a {\n display: inline-block;\n padding: 2px 10px 2px;\n font-size: 12px;\n line-height: 20px;\n -webkit-border-radius: 0 5px 5px 0;\n -moz-border-radius: 0 5px 5px 0;\n -ms-border-radius: 0 5px 5px 0;\n -o-border-radius: 0 5px 5px 0;\n border-radius: 0 5px 5px 0;\n background-color: #F3F3F3;\n margin: 3px 5px 3px 20px;\n position: relative;\n color: #333333;\n border: 1px solid #ddd;\n border-left: 0;\n z-index: 2; }\n .field-name-field-tags .field-item a:after {\n content: \"\";\n width: 20px;\n height: 20px;\n background-color: #F3F3F3;\n -webkit-transform: rotate(45deg);\n -moz-transform: rotate(45deg);\n -ms-transform: rotate(45deg);\n -o-transform: rotate(45deg);\n transform: rotate(45deg);\n -webkit-border-radius: 2px;\n -moz-border-radius: 2px;\n -ms-border-radius: 2px;\n -o-border-radius: 2px;\n border-radius: 2px;\n position: absolute;\n top: 2px;\n left: -9px;\n z-index: -1;\n border: 1px solid #ddd;\n border-top: none;\n border-right: none; }\n .field-name-field-tags .field-item a:before {\n content: \"\";\n width: 2px;\n height: 2px;\n background: #777777;\n position: absolute;\n top: 11px;\n left: -5px;\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n\n.field-name-field-tags .field-item a:hover,\n.field-name-field-tags .field-item a:hover:after {\n background: #fff;\n color: #000;\n text-decoration: none; }\n\n.field-name-field-topic .field-item {\n margin: 0 1.5em .5em 0; }\n .field-name-field-topic .field-item .field-item {\n margin: 0; }\n\n.field-name-field-topic-icon span::before,\n.view-dkan-datasets .field-name-field-topic-icon span::before {\n font-size: 18px; }\n\n.font_icon_select_options .label {\n color: #333; }\n\n.front .view-popular-tags {\n margin-top: 20px; }\n\n.view-popular-tags {\n margin: 15px 0; }\n .view-popular-tags ul.tag-list {\n margin: 0;\n padding: 0; }\n .view-popular-tags ul.tag-list li {\n display: inline-block;\n margin-right: 2em; }\n .view-popular-tags ul.tag-list li a {\n color: #fff; }\n\n.view-content h2 {\n font-size: 1.5em;\n margin: 1em 0 .5em; }\n\n.view-groups-search .views-row {\n border-bottom: 1px dotted #ccc;\n padding: 1em 0; }\n\n.view-front-page-group-list .views-row {\n position: relative;\n padding-left: 120px;\n min-height: 110px; }\n .view-front-page-group-list .views-row img {\n position: absolute;\n top: 0;\n left: 0; }\n\n.view-user-profile-fields img {\n height: auto;\n margin: 0 auto;\n max-width: 190px;\n width: 100%; }\n\n.view-front-page-group-grid .row span {\n display: block;\n margin: 15px 0; }\n .view-front-page-group-grid .row span .media-content {\n padding: 0 10px 10px 120px; }\n .view-front-page-group-grid .row span .media-image {\n float: left;\n margin: 0;\n padding: 0; }\n .view-front-page-group-grid .row span .media-image img {\n margin: 5px 10px 5px 0; }\n .view-front-page-group-grid .row span h3.media-heading {\n font-size: 1.3em;\n margin: .5em 0;\n padding: 0; }\n\n@media (min-width: 768px) {\n .view-front-page-group-grid .span6,\n .view-front-page-group-grid .col-lg-6 {\n float: left;\n margin: 0;\n width: 50%; } }\n\n.view-dkan-groups .node-teaser {\n min-height: 365px;\n margin-bottom: 20px; }\n .view-dkan-groups .node-teaser h2.node-title {\n margin: .75em 0; }\n .view-dkan-groups .node-teaser .btn-primary, .view-dkan-groups .node-teaser body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .view-dkan-groups .node-teaser .btn:first-child, .view-dkan-groups .node-teaser body.maintenance-page .form-actions .media-widget > a:first-child, body.maintenance-page .form-actions .view-dkan-groups .node-teaser .media-widget > a:first-child {\n margin: 0 auto 1.5em; }\n\n.view-groups-page .views-column {\n float: left;\n margin: 0;\n width: 50%; }\n\n.view-group-block .views-field-title {\n font-size: 1.2em; }\n\n.view-group-block .views-field-nid a {\n background: #0A77BD;\n color: #fff;\n display: block;\n margin: 1em 0 0 0;\n padding: 5px 8px;\n text-align: center; }\n\n.view-dataset form {\n margin: 0;\n position: relative; }\n\n.view-dataset .views-row {\n margin: 1.5em 0; }\n\n.views-exposed-form {\n position: relative; }\n .views-exposed-form .views-exposed-widget {\n display: inline;\n padding: .5em .5em 0 0; }\n .views-exposed-form .views-exposed-widget .views-widget-filter-search_api_views_fulltext,\n .views-exposed-form .views-exposed-widget .views-widget-sort-by,\n .views-exposed-form .views-exposed-widget .views-widget-sort-order,\n .views-exposed-form .views-exposed-widget .views-submit-button,\n .views-exposed-form .views-exposed-widget .form-submit {\n display: inline;\n float: none;\n margin: 0;\n position: relative; }\n .views-exposed-form .views-exposed-widget.views-reset-button, .views-exposed-form .views-exposed-widget.views-submit-button {\n margin: 0;\n padding: 2.1em .5em 0 0; }\n .views-exposed-form .description {\n text-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n position: absolute;\n color: #999999;\n font-size: 12px;\n left: 7px;\n top: 10px; }\n\n#views-exposed-form-dkan-datasets-panel-pane-1 .views-exposed-form .description {\n display: none; }\n\n.view-dkan-groups-featured .row,\n.pane-dkan-groups-featured .row {\n text-align: center; }\n .view-dkan-groups-featured .row div[class*='views-column'],\n .pane-dkan-groups-featured .row div[class*='views-column'] {\n margin-bottom: 1.25em; }\n\n.view-admin-content table {\n margin-top: 0; }\n","/*\n * A partial implementation of the Ruby list functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/lists.rb\n */\n\n\n// compact is part of libsass\n\n@function -compass-nth($list, $place) {\n // Yep, Sass-lists are 1-indexed.\n @if $place == \"first\" {\n $place: 1;\n }\n @if $place == \"last\" {\n $place: length($list);\n }\n @return nth($list, $place);\n}\n\n// compass_list and compass_space_list can't be implemented in sass script\n\n@function -compass-list-size($list) {\n @return length($list);\n}\n\n@function -compass-slice($list, $start, $end: false) {\n @if $end == false {\n $end: length($list);\n }\n $full: nth($list, $start);\n @for $i from $start + 1 through $end {\n $full: $full, nth($list, $i);\n }\n @return $full;\n}\n\n@function reject($list, $reject1, $reject2:null, $reject3:null, $reject4:null, $reject5:null, $reject6:null, $reject7:null, $reject8:null, $reject9:null) {\n $rejects: $reject1, $reject2, $reject3, $reject4, $reject5, $reject6, $reject7, $reject8, $reject9;\n\n $full: false;\n @each $item in $list {\n @if index($rejects, $item) {}\n @else {\n @if $full {\n $full: $full, $item;\n }\n @else {\n $full: $item;\n }\n }\n }\n @return $full;\n}\n","/*\n * A partial implementation of the Ruby constants functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/constants.rb\n */\n\n@function opposite-position($from) {\n @if ($from == top) {\n @return bottom;\n } @else if ($from == bottom) {\n @return top;\n } @else if ($from == left) {\n @return right;\n } @else if ($from == right) {\n @return left;\n } @else if ($from == center) {\n @return center;\n }\n}\n","/*\n * A partial implementation of the Ruby display functions from Compass:\n * https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/display.rb\n */\n\n@function elements-of-type($type){\n @if ($type == block){\n @return address, article, aside, blockquote, center, dir, div, dd, details, dl, dt, fieldset, figcaption, figure, form, footer, frameset, h1, h2, h3, h4, h5, h6, hr, header, hgroup, isindex, main, menu, nav, noframes, noscript, ol, p, pre, section, summary, ul;\n } @else if ($type == inline){\n @return a, abbr, acronym, audio, b, basefont, bdo, big, br, canvas, cite, code, command, datalist, dfn, em, embed, font, i, img, input, keygen, kbd, label, mark, meter, output, progress, q, rp, rt, ruby, s, samp, select, small, span, strike, strong, sub, sup, textarea, time, tt, u, var, video, wbr;\n } @else if ($type == inline-block){\n @return img;\n } @else if ($type == table){\n @return table;\n } @else if ($type == list-item){\n @return li;\n } @else if ($type == table-row-group){\n @return tbody;\n } @else if ($type == table-header-group){\n @return thead;\n } @else if ($type == table-footer-group){\n @return tfoot;\n } @else if ($type == table-row){\n @return tr;\n } @else if ($type == table-cell){\n @return th, td;\n } @else if ($type == html5-block){\n @return article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary;\n } @else if ($type == html5-inline){\n @return audio, canvas, command, datalist, embed, keygen, mark, meter, output, progress, rp, rt, ruby, time, video, wbr;\n } @else if ($type == html5){\n @return article, aside, audio, canvas, command, datalist, details, embed, figcaption, figure, footer, header, hgroup, keygen, main, mark, menu, meter, nav, output, progress, rp, rt, ruby, section, summary, time, video, wbr;\n } @else if ($type == text-input){\n @return input, textarea;\n }\n}\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n @include box-sizing(border-box);\n}\n*:before,\n*:after {\n @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: $font-family-base;\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $text-color;\n background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n @include tab-focus;\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: $thumbnail-padding;\n line-height: $line-height-base;\n background-color: $thumbnail-bg;\n border: 1px solid $thumbnail-border;\n border-radius: $thumbnail-border-radius;\n @include transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: $line-height-computed;\n margin-bottom: $line-height-computed;\n border: 0;\n border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","@import \"../support\";\n\n// This mixin provides basic support for CSS3 properties and\n// their corresponding experimental CSS2 properties when\n// the implementations are identical except for the property\n// prefix.\n@mixin experimental($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { -webkit-#{$property} : $value; }\n @if $khtml and $experimental-support-for-khtml { -khtml-#{$property} : $value; }\n @if $moz and $experimental-support-for-mozilla { -moz-#{$property} : $value; }\n @if $ms and $experimental-support-for-microsoft { -ms-#{$property} : $value; }\n @if $o and $experimental-support-for-opera { -o-#{$property} : $value; }\n @if $official { #{$property} : $value; }\n}\n\n// Same as experimental(), but for cases when the property is the same and the value is vendorized\n@mixin experimental-value($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { #{$property} : -webkit-#{$value}; }\n @if $khtml and $experimental-support-for-khtml { #{$property} : -khtml-#{$value}; }\n @if $moz and $experimental-support-for-mozilla { #{$property} : -moz-#{$value}; }\n @if $ms and $experimental-support-for-microsoft { #{$property} : -ms-#{$value}; }\n @if $o and $experimental-support-for-opera { #{$property} : -o-#{$value}; }\n @if $official { #{$property} : #{$value}; }\n}\n","@import \"shared\";\n\n// Change the box model for Mozilla, Webkit, IE8 and the future\n//\n// @param $bs\n// [ content-box | border-box ]\n\n@mixin box-sizing($bs) {\n $bs: unquote($bs);\n @include experimental(box-sizing, $bs,\n -moz, -webkit, not(-o), not(-ms), not(-khtml), official\n );\n}\n","$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n$gray-base: #000 !default;\n$gray-darker: lighten($gray-base, 13.5%) !default; // #222\n$gray-dark: lighten($gray-base, 20%) !default; // #333\n$gray: lighten($gray-base, 33.5%) !default; // #555\n$gray-light: lighten($gray-base, 46.7%) !default; // #777\n$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee\n\n$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7\n$brand-success: #5cb85c !default;\n$brand-info: #5bc0de !default;\n$brand-warning: #f0ad4e !default;\n$brand-danger: #d9534f !default;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for ``.\n$body-bg: #fff !default;\n//** Global text color on ``.\n$text-color: $gray-dark !default;\n\n//** Global textual link color.\n$link-color: $brand-primary !default;\n//** Link hover color set via `darken()` function.\n$link-hover-color: darken($link-color, 15%) !default;\n//** Link hover decoration.\n$link-hover-decoration: underline !default;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n//** Default monospace fonts for ``, ``, and `
    `.\n$font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base:        $font-family-sans-serif !default;\n\n$font-size-base:          14px !default;\n$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5:            $font-size-base !default;\n$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base:        1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the ``.\n$headings-font-family:    inherit !default;\n$headings-font-weight:    500 !default;\n$headings-line-height:    1.1 !default;\n$headings-color:          inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name:          \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id:        \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical:     6px !default;\n$padding-base-horizontal:   12px !default;\n\n$padding-large-vertical:    10px !default;\n$padding-large-horizontal:  16px !default;\n\n$padding-small-vertical:    5px !default;\n$padding-small-horizontal:  10px !default;\n\n$padding-xs-vertical:       1px !default;\n$padding-xs-horizontal:     5px !default;\n\n$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small:         1.5 !default;\n\n$border-radius-base:        4px !default;\n$border-radius-large:       6px !default;\n$border-radius-small:       3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color:    #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg:       $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n$caret-width-base:          4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large:         5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n$table-cell-padding:            8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding:  5px !default;\n\n//** Default background color used for all tables.\n$table-bg:                      transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent:               #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover:                #f5f5f5 !default;\n$table-bg-active:               $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color:            #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight:                normal !default;\n\n$btn-default-color:              #333 !default;\n$btn-default-bg:                 #fff !default;\n$btn-default-border:             #ccc !default;\n\n$btn-primary-color:              #fff !default;\n$btn-primary-bg:                 $brand-primary !default;\n$btn-primary-border:             darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color:              #fff !default;\n$btn-success-bg:                 $brand-success !default;\n$btn-success-border:             darken($btn-success-bg, 5%) !default;\n\n$btn-info-color:                 #fff !default;\n$btn-info-bg:                    $brand-info !default;\n$btn-info-border:                darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color:              #fff !default;\n$btn-warning-bg:                 $brand-warning !default;\n$btn-warning-border:             darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color:               #fff !default;\n$btn-danger-bg:                  $brand-danger !default;\n$btn-danger-border:              darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color:        $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base:         $border-radius-base !default;\n$btn-border-radius-large:        $border-radius-large !default;\n$btn-border-radius-small:        $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n$input-bg:                       #fff !default;\n//** `` background color\n$input-bg-disabled:              $gray-lighter !default;\n\n//** Text color for ``s\n$input-color:                    $gray !default;\n//** `` border color\n$input-border:                   #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on ``s in CSS.\n$input-border-radius:            $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large:      $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small:      $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus:             #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder:        #999 !default;\n\n//** Default `.form-control` height\n$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom:       15px !default;\n\n$legend-color:                   $gray-dark !default;\n$legend-border-color:            #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg:           $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled:                not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg:                    #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border:                rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border:       #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg:            #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color:            $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg:         #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color:     $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg:        $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color:   $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color:          $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color:           #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar:            1000 !default;\n$zindex-dropdown:          1000 !default;\n$zindex-popover:           1060 !default;\n$zindex-tooltip:           1070 !default;\n$zindex-navbar-fixed:      1030 !default;\n$zindex-modal-background:  1040 !default;\n$zindex-modal:             1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs:                  480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min:              $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone:               $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm:                  768px !default;\n$screen-sm-min:              $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet:              $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md:                  992px !default;\n$screen-md-min:              $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop:             $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg:                  1200px !default;\n$screen-lg-min:              $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop:          $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max:              ($screen-sm-min - 1) !default;\n$screen-sm-max:              ($screen-md-min - 1) !default;\n$screen-md-max:              ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns:              12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width:         30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint:     $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet:             (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm:                 $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop:            (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md:                 $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop:      (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg:                 $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height:                    50px !default;\n$navbar-margin-bottom:             $line-height-computed !default;\n$navbar-border-radius:             $border-radius-base !default;\n$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height:       340px !default;\n\n$navbar-default-color:             #777 !default;\n$navbar-default-bg:                #f8f8f8 !default;\n$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color:                #777 !default;\n$navbar-default-link-hover-color:          #333 !default;\n$navbar-default-link-hover-bg:             transparent !default;\n$navbar-default-link-active-color:         #555 !default;\n$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color:       #ccc !default;\n$navbar-default-link-disabled-bg:          transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color:               $navbar-default-link-color !default;\n$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg:            transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg:           #ddd !default;\n$navbar-default-toggle-icon-bar-bg:        #888 !default;\n$navbar-default-toggle-border-color:       #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color:                      lighten($gray-light, 15%) !default;\n$navbar-inverse-bg:                         #222 !default;\n$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color:           #fff !default;\n$navbar-inverse-link-hover-bg:              transparent !default;\n$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color:        #444 !default;\n$navbar-inverse-link-disabled-bg:           transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color:          #fff !default;\n$navbar-inverse-brand-hover-bg:             transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg:            #333 !default;\n$navbar-inverse-toggle-icon-bar-bg:         #fff !default;\n$navbar-inverse-toggle-border-color:        #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding:                          10px 15px !default;\n$nav-link-hover-bg:                         $gray-lighter !default;\n\n$nav-disabled-link-color:                   $gray-light !default;\n$nav-disabled-link-hover-color:             $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color:                     #ddd !default;\n\n$nav-tabs-link-hover-border-color:          $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg:             $body-bg !default;\n$nav-tabs-active-link-hover-color:          $gray !default;\n$nav-tabs-active-link-hover-border-color:   #ddd !default;\n\n$nav-tabs-justified-link-border-color:            #ddd !default;\n$nav-tabs-justified-active-link-border-color:     $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius:                   $border-radius-base !default;\n$nav-pills-active-link-hover-bg:            $component-active-bg !default;\n$nav-pills-active-link-hover-color:         $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color:                     $link-color !default;\n$pagination-bg:                        #fff !default;\n$pagination-border:                    #ddd !default;\n\n$pagination-hover-color:               $link-hover-color !default;\n$pagination-hover-bg:                  $gray-lighter !default;\n$pagination-hover-border:              #ddd !default;\n\n$pagination-active-color:              #fff !default;\n$pagination-active-bg:                 $brand-primary !default;\n$pagination-active-border:             $brand-primary !default;\n\n$pagination-disabled-color:            $gray-light !default;\n$pagination-disabled-bg:               #fff !default;\n$pagination-disabled-border:           #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg:                             $pagination-bg !default;\n$pager-border:                         $pagination-border !default;\n$pager-border-radius:                  15px !default;\n\n$pager-hover-bg:                       $pagination-hover-bg !default;\n\n$pager-active-bg:                      $pagination-active-bg !default;\n$pager-active-color:                   $pagination-active-color !default;\n\n$pager-disabled-color:                 $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding:              30px !default;\n$jumbotron-color:                inherit !default;\n$jumbotron-bg:                   $gray-lighter !default;\n$jumbotron-heading-color:        inherit !default;\n$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text:             #3c763d !default;\n$state-success-bg:               #dff0d8 !default;\n$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text:                #31708f !default;\n$state-info-bg:                  #d9edf7 !default;\n$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text:             #8a6d3b !default;\n$state-warning-bg:               #fcf8e3 !default;\n$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text:              #a94442 !default;\n$state-danger-bg:                #f2dede !default;\n$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width:           200px !default;\n//** Tooltip text color\n$tooltip-color:               #fff !default;\n//** Tooltip background color\n$tooltip-bg:                  #000 !default;\n$tooltip-opacity:             .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width:         5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color:         $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg:                          #fff !default;\n//** Popover maximum width\n$popover-max-width:                   276px !default;\n//** Popover border color\n$popover-border-color:                rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color:       #ccc !default;\n\n//** Popover title background color\n$popover-title-bg:                    darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width:                 10px !default;\n//** Popover arrow color\n$popover-arrow-color:                 $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg:            $gray-light !default;\n//** Primary label background color\n$label-primary-bg:            $brand-primary !default;\n//** Success label background color\n$label-success-bg:            $brand-success !default;\n//** Info label background color\n$label-info-bg:               $brand-info !default;\n//** Warning label background color\n$label-warning-bg:            $brand-warning !default;\n//** Danger label background color\n$label-danger-bg:             $brand-danger !default;\n\n//** Default label text color\n$label-color:                 #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color:      #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding:         15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding:         15px !default;\n//** Modal title line-height\n$modal-title-line-height:     $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg:                             #fff !default;\n//** Modal content border color\n$modal-content-border-color:                   rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color:          #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg:           #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity:      .5 !default;\n//** Modal header border color\n$modal-header-border-color:   #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color:   $modal-header-border-color !default;\n\n$modal-lg:                    900px !default;\n$modal-md:                    600px !default;\n$modal-sm:                    300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding:               15px !default;\n$alert-border-radius:         $border-radius-base !default;\n$alert-link-font-weight:      bold !default;\n\n$alert-success-bg:            $state-success-bg !default;\n$alert-success-text:          $state-success-text !default;\n$alert-success-border:        $state-success-border !default;\n\n$alert-info-bg:               $state-info-bg !default;\n$alert-info-text:             $state-info-text !default;\n$alert-info-border:           $state-info-border !default;\n\n$alert-warning-bg:            $state-warning-bg !default;\n$alert-warning-text:          $state-warning-text !default;\n$alert-warning-border:        $state-warning-border !default;\n\n$alert-danger-bg:             $state-danger-bg !default;\n$alert-danger-text:           $state-danger-text !default;\n$alert-danger-border:         $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg:                 #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color:          #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius:      $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg:             $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg:     $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg:     $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg:      $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg:        $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg:                 #fff !default;\n//** `.list-group-item` border color\n$list-group-border:             #ddd !default;\n//** List group border radius\n$list-group-border-radius:      $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg:           #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color:       $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg:          $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border:      $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color:      $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg:         $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color:         #555 !default;\n$list-group-link-hover-color:   $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg:                    #fff !default;\n$panel-body-padding:          15px !default;\n$panel-heading-padding:       10px 15px !default;\n$panel-footer-padding:        $panel-heading-padding !default;\n$panel-border-radius:         $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border:          #ddd !default;\n$panel-footer-bg:             #f5f5f5 !default;\n\n$panel-default-text:          $gray-dark !default;\n$panel-default-border:        #ddd !default;\n$panel-default-heading-bg:    #f5f5f5 !default;\n\n$panel-primary-text:          #fff !default;\n$panel-primary-border:        $brand-primary !default;\n$panel-primary-heading-bg:    $brand-primary !default;\n\n$panel-success-text:          $state-success-text !default;\n$panel-success-border:        $state-success-border !default;\n$panel-success-heading-bg:    $state-success-bg !default;\n\n$panel-info-text:             $state-info-text !default;\n$panel-info-border:           $state-info-border !default;\n$panel-info-heading-bg:       $state-info-bg !default;\n\n$panel-warning-text:          $state-warning-text !default;\n$panel-warning-border:        $state-warning-border !default;\n$panel-warning-heading-bg:    $state-warning-bg !default;\n\n$panel-danger-text:           $state-danger-text !default;\n$panel-danger-border:         $state-danger-border !default;\n$panel-danger-heading-bg:     $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding:           4px !default;\n//** Thumbnail background color\n$thumbnail-bg:                $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border:            #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius:     $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color:     $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding:   9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg:                     #f5f5f5 !default;\n$well-border:                 darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color:                 #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color:      #fff !default;\n$badge-bg:                    $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color:          $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg:             #fff !default;\n\n$badge-font-weight:           bold !default;\n$badge-line-height:           1 !default;\n$badge-border-radius:         10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical:   8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg:                 #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color:              #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color:       $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator:          \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color:                      #fff !default;\n$carousel-control-width:                      15% !default;\n$carousel-control-opacity:                    .5 !default;\n$carousel-control-font-size:                  20px !default;\n\n$carousel-indicator-active-bg:                #fff !default;\n$carousel-indicator-border-color:             #fff !default;\n\n$carousel-caption-color:                      #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight:           bold !default;\n$close-color:                 #000 !default;\n$close-text-shadow:           0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color:                  #c7254e !default;\n$code-bg:                     #f9f2f4 !default;\n\n$kbd-color:                   #fff !default;\n$kbd-bg:                      #333 !default;\n\n$pre-bg:                      #f5f5f5 !default;\n$pre-color:                   $gray-dark !default;\n$pre-border-color:            #ccc !default;\n$pre-scrollable-max-height:   340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted:                  $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color:           $gray-light !default;\n//** Headings small color\n$headings-small-color:        $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color:      $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size:        ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color:     $gray-lighter !default;\n//** Page header border color\n$page-header-border-color:    $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset:        $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border:                   $gray-lighter !default;\n","// WebKit-style focus\n\n@mixin tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n  display: $display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n    background-size: $width-1x $height-1x;\n  }\n}\n","@import \"shared\";\n\n// CSS Transitions\n// Currently only works in Webkit.\n//\n// * expected in CSS3, FireFox 3.6/7 and Opera Presto 2.3\n// * We'll be prepared.\n//\n// Including this submodule sets following defaults for the mixins:\n//\n//     $default-transition-property : all\n//     $default-transition-duration : 1s\n//     $default-transition-function : false\n//     $default-transition-delay    : false\n//\n// Override them if you like. Timing-function and delay are set to false for browser defaults (ease, 0s).\n\n$default-transition-property: all !default;\n\n$default-transition-duration: 1s !default;\n\n$default-transition-function: false !default;\n\n$default-transition-delay: false !default;\n\n$transitionable-prefixed-values: transform, transform-origin !default;\n\n// One or more properties to transition\n//\n// * for multiple, use a comma-delimited list\n// * also accepts \"all\" or \"none\"\n\n@mixin transition-property($property-1: $default-transition-property,\n  $property-2 : false,\n  $property-3 : false,\n  $property-4 : false,\n  $property-5 : false,\n  $property-6 : false,\n  $property-7 : false,\n  $property-8 : false,\n  $property-9 : false,\n  $property-10: false\n) {\n  @if type-of($property-1) == string { $property-1: unquote($property-1); }\n  $properties: compact($property-1, $property-2, $property-3, $property-4, $property-5, $property-6, $property-7, $property-8, $property-9, $property-10);\n  @if $experimental-support-for-webkit    {       -webkit-transition-property : prefixed-for-transition(-webkit, $properties); }\n  @if $experimental-support-for-mozilla   {          -moz-transition-property : prefixed-for-transition(-moz,    $properties); }\n  @if $experimental-support-for-opera     {            -o-transition-property : prefixed-for-transition(-o,      $properties); }\n                                                          transition-property : $properties;\n}\n\n// One or more durations in seconds\n//\n// * for multiple, use a comma-delimited list\n// * these durations will affect the properties in the same list position\n\n@mixin transition-duration($duration-1: $default-transition-duration,\n  $duration-2 : false,\n  $duration-3 : false,\n  $duration-4 : false,\n  $duration-5 : false,\n  $duration-6 : false,\n  $duration-7 : false,\n  $duration-8 : false,\n  $duration-9 : false,\n  $duration-10: false\n) {\n  @if type-of($duration-1) == string { $duration-1: unquote($duration-1); }\n  $durations: compact($duration-1, $duration-2, $duration-3, $duration-4, $duration-5, $duration-6, $duration-7, $duration-8, $duration-9, $duration-10);\n  @include experimental(transition-duration, $durations,\n    -moz, -webkit, -o, not(-ms), not(-khtml), official\n  );\n}\n\n// One or more timing functions\n//\n// * [ ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(x1, y1, x2, y2)]\n// * For multiple, use a comma-delimited list\n// * These functions will effect the properties in the same list position\n\n@mixin transition-timing-function($function-1: $default-transition-function,\n  $function-2 : false,\n  $function-3 : false,\n  $function-4 : false,\n  $function-5 : false,\n  $function-6 : false,\n  $function-7 : false,\n  $function-8 : false,\n  $function-9 : false,\n  $function-10: false\n) {\n  $function-1: unquote($function-1);\n  $functions: compact($function-1, $function-2, $function-3, $function-4, $function-5, $function-6, $function-7, $function-8, $function-9, $function-10);\n  @include experimental(transition-timing-function, $functions,\n    -moz, -webkit, -o, not(-ms), not(-khtml), official\n  );\n}\n\n// One or more transition-delays in seconds\n//\n// * for multiple, use a comma-delimited list\n// * these delays will effect the properties in the same list position\n\n@mixin transition-delay($delay-1: $default-transition-delay,\n  $delay-2 : false,\n  $delay-3 : false,\n  $delay-4 : false,\n  $delay-5 : false,\n  $delay-6 : false,\n  $delay-7 : false,\n  $delay-8 : false,\n  $delay-9 : false,\n  $delay-10: false\n) {\n  @if type-of($delay-1) == string { $delay-1: unquote($delay-1); }\n  $delays: compact($delay-1, $delay-2, $delay-3, $delay-4, $delay-5, $delay-6, $delay-7, $delay-8, $delay-9, $delay-10);\n  @include experimental(transition-delay, $delays,\n    -moz, -webkit, -o, not(-ms), not(-khtml), official\n  );\n}\n\n// Transition all-in-one shorthand\n\n@mixin single-transition(\n  $property: $default-transition-property,\n  $duration: $default-transition-duration,\n  $function: $default-transition-function,\n  $delay: $default-transition-delay\n) {\n  @include transition(compact($property $duration $function $delay));\n}\n\n@mixin transition(\n  $transition-1 : default,\n  $transition-2 : false,\n  $transition-3 : false,\n  $transition-4 : false,\n  $transition-5 : false,\n  $transition-6 : false,\n  $transition-7 : false,\n  $transition-8 : false,\n  $transition-9 : false,\n  $transition-10: false\n) {\n  @if $transition-1 == default {\n    $transition-1 : compact($default-transition-property $default-transition-duration $default-transition-function $default-transition-delay);\n  }\n  $transitions: false;\n  @if type-of($transition-1) == list and type-of(nth($transition-1,1)) == list {\n    $transitions: join($transition-1, compact($transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10), comma);\n  } @else {\n    $transitions : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10);\n  }\n  $delays: comma-list();\n  $has-delays: false;\n  $webkit-value: comma-list();\n  $moz-value: comma-list();\n  $o-value: comma-list();\n\n  // This block can be made considerably simpler at the point in time that\n  // we no longer need to deal with the differences in how delays are treated.\n  @each $transition in $transitions {\n    // Extract the values from the list\n    // (this would be cleaner if nth took a 3rd argument to provide a default value).\n    $property: nth($transition, 1);\n    $duration: false;\n    $timing-function: false;\n    $delay: false;\n    @if length($transition) > 1 { $duration:        nth($transition, 2); }\n    @if length($transition) > 2 { $timing-function: nth($transition, 3); }\n    @if length($transition) > 3 { $delay:           nth($transition, 4); $has-delays: true; }\n\n    // If a delay is provided without a timing function\n    @if is-time($timing-function) and not $delay { $delay: $timing-function; $timing-function: false; $has-delays: true; }\n\n    // Keep a list of delays in case one is specified\n    $delays: append($delays, if($delay, $delay, 0s));\n\n    $webkit-value: append($webkit-value, compact(prefixed-for-transition(-webkit, $property) $duration $timing-function));\n       $moz-value: append(   $moz-value, compact(prefixed-for-transition(   -moz, $property) $duration $timing-function $delay));\n         $o-value: append(     $o-value, compact(prefixed-for-transition(     -o, $property) $duration $timing-function $delay));\n  }\n\n  @if $experimental-support-for-webkit    {       -webkit-transition : $webkit-value;\n    // old webkit doesn't support the delay parameter in the shorthand so we progressively enhance it.\n    @if $has-delays                       { -webkit-transition-delay : $delays;       } }\n  @if $experimental-support-for-mozilla   {          -moz-transition : $moz-value;    }\n  @if $experimental-support-for-opera     {            -o-transition : $o-value;      }\n                                                          transition : $transitions;\n}\n\n// coerce a list to be comma delimited or make a new, empty comma delimited list.\n@function comma-list($list: ()) {\n  @return join((), $list, comma);\n}\n\n// Returns `$property` with the given prefix if it is found in `$transitionable-prefixed-values`.\n@function prefixed-for-transition($prefix, $property) {\n  @if type-of($property) == list {\n    $new-list: comma-list();\n    @each $v in $property {\n      $new-list: append($new-list, prefixed-for-transition($prefix, $v));\n    }\n    @return $new-list;\n  } @else {\n    @if index($transitionable-prefixed-values, $property) {\n      @return #{$prefix}-#{$property};\n    } @else {\n      @return $property;\n    }\n  }\n}\n\n// Checks if the value given is a unit of time.\n@function is-time($value) {\n  @if type-of($value) == number {\n    @return not(not(index(s ms, unit($value))));\n  } @else {\n    @return false;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: $headings-font-family;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: $headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: $headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: $line-height-computed;\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: ($line-height-computed / 2);\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: $line-height-computed;\n  font-size: floor(($font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: $screen-sm-min) {\n    font-size: ($font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n  background-color: $state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (($line-height-computed / 2) - 1);\n  margin: ($line-height-computed * 2) 0 $line-height-computed;\n  border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: ($line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n  @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled;\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n  line-height: $line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: $dl-horizontal-breakpoint) {\n    dt {\n      float: left;\n      width: ($dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      @include text-overflow;\n    }\n    dd {\n      margin-left: $dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: ($line-height-computed / 2) $line-height-computed;\n  margin: 0 0 $line-height-computed;\n  font-size: $blockquote-font-size;\n  border-left: 5px solid $blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: $line-height-base;\n    color: $blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid $blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: $line-height-computed;\n  font-style: normal;\n  line-height: $line-height-base;\n}\n","// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n  #{$parent} {\n    color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    color: darken($color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n  #{$parent} {\n    background-color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    background-color: darken($color, 10%);\n  }\n}\n","// @doc off\n// Extends the bottom of the element to enclose any floats it contains.\n// @doc on\n\n@import \"hacks\";\n\n// This basic method is preferred for the usual case, when positioned\n// content will not show outside the bounds of the container.\n//\n// Recommendations include using this in conjunction with a width.\n// Credit: [quirksmode.org](http://www.quirksmode.org/blog/archives/2005/03/clearing_floats.html)\n@mixin clearfix {\n  overflow: hidden;\n  @include has-layout;\n}\n\n// This older method from Position Is Everything called\n// [Easy Clearing](http://www.positioniseverything.net/easyclearing.html)\n// has the advantage of allowing positioned elements to hang\n// outside the bounds of the container at the expense of more tricky CSS.\n@mixin legacy-pie-clearfix {\n  &:after {\n    content    : \"\\0020\";\n    display    : block;\n    height     : 0;\n    clear      : both;\n    overflow   : hidden;\n    visibility : hidden;\n  }\n  @include has-layout;\n}\n\n// This is an updated version of the PIE clearfix method that reduces the amount of CSS output.\n// If you need to support Firefox before 3.5 you need to use `legacy-pie-clearfix` instead.\n//\n// Adapted from: [A new micro clearfix hack](http://nicolasgallagher.com/micro-clearfix-hack/)\n@mixin pie-clearfix {\n  &:after {\n    content: \"\";\n    display: table;\n    clear: both;\n  }\n  @include has-layout;\n}\n","@import \"../../support\";\n\n// The `zoom` approach generates less CSS but does not validate.\n// Set this to `block` to use the display-property to hack the\n// element to gain layout.\n$default-has-layout-approach: zoom !default;\n\n// This mixin causes an element matching the selector\n// to gain the \"hasLayout\" property in internet explorer.\n// More information on [hasLayout](http://reference.sitepoint.com/css/haslayout).\n@mixin has-layout($approach: $default-has-layout-approach) {\n  @if $legacy-support-for-ie {\n    @if $approach == zoom {\n      @include has-layout-zoom;\n    } @else if $approach == block {\n      @include has-layout-block;\n    } @else {\n      @warn \"Unknown has-layout approach: #{$approach}\";\n      @include has-layout-zoom;\n    }\n  }\n}\n\n@mixin has-layout-zoom {\n  @if $legacy-support-for-ie6 or $legacy-support-for-ie7 {\n    *zoom: 1;\n  }\n}\n\n@mixin has-layout-block {\n  @if $legacy-support-for-ie {\n    // This makes ie6 get layout\n    display: inline-block;\n    // and this puts it back to block\n    & { display: block; }\n  }\n}\n\n// A hack to supply IE6 (and below) with a different property value.\n// [Read more](http://www.cssportal.com/css-hacks/#in_css-important).\n@mixin bang-hack($property, $value, $ie6-value) {\n  @if $legacy-support-for-ie6 {\n    #{$property}: #{$value} !important;\n    #{$property}: #{$ie6-value};\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $code-color;\n  background-color: $code-bg;\n  border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  border-radius: $border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (($line-height-computed - 1) / 2);\n  margin: 0 0 ($line-height-computed / 2);\n  font-size: ($font-size-base - 1); // 14px to 13px\n  line-height: $line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: $pre-color;\n  background-color: $pre-bg;\n  border: 1px solid $pre-border-color;\n  border-radius: $border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: $pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  @include container-fixed;\n\n  @media (min-width: $screen-sm-min) {\n    width: $container-sm;\n  }\n  @media (min-width: $screen-md-min) {\n    width: $container-md;\n  }\n  @media (min-width: $screen-lg-min) {\n    width: $container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  @include container-fixed;\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  @include make-row;\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@include make-grid-columns;\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n@include make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: $screen-sm-min) {\n  @include make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: $screen-md-min) {\n  @include make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: $screen-lg-min) {\n  @include make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  floor(($gutter / 2));\n  padding-right: ceil(($gutter / 2));\n  @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n  margin-left:  ceil(($gutter / -2));\n  margin-right: floor(($gutter / -2));\n  @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage(($columns / $grid-columns));\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n  margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n  left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n  right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-sm-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-offset($columns) {\n  @media (min-width: $screen-sm-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-push($columns) {\n  @media (min-width: $screen-sm-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-pull($columns) {\n  @media (min-width: $screen-sm-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-md-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-offset($columns) {\n  @media (min-width: $screen-md-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-push($columns) {\n  @media (min-width: $screen-md-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-pull($columns) {\n  @media (min-width: $screen-md-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-lg-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-offset($columns) {\n  @media (min-width: $screen-lg-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-push($columns) {\n  @media (min-width: $screen-lg-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-pull($columns) {\n  @media (min-width: $screen-lg-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n  }\n  #{$list} {\n    position: relative;\n    // Prevent columns from collapsing when empty\n    min-height: 1px;\n    // Inner gutter via padding\n    padding-left:  ceil(($grid-gutter-width / 2));\n    padding-right: floor(($grid-gutter-width / 2));\n  }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-#{$class}-#{$i}\";\n  }\n  #{$list} {\n    float: left;\n  }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n  @if ($type == width) and ($index > 0) {\n    .col-#{$class}-#{$index} {\n      width: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index > 0) {\n    .col-#{$class}-push-#{$index} {\n      left: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index == 0) {\n    .col-#{$class}-push-0 {\n      left: auto;\n    }\n  }\n  @if ($type == pull) and ($index > 0) {\n    .col-#{$class}-pull-#{$index} {\n      right: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == pull) and ($index == 0) {\n    .col-#{$class}-pull-0 {\n      right: auto;\n    }\n  }\n  @if ($type == offset) {\n    .col-#{$class}-offset-#{$index} {\n      margin-left: percentage(($index / $grid-columns));\n    }\n  }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n  @for $i from 0 through $columns {\n    @include calc-grid-column($i, $class, $type);\n  }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n  @include float-grid-columns($class);\n  @include loop-grid-columns($grid-columns, $class, width);\n  @include loop-grid-columns($grid-columns, $class, pull);\n  @include loop-grid-columns($grid-columns, $class, push);\n  @include loop-grid-columns($grid-columns, $class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: $table-bg;\n}\ncaption {\n  padding-top: $table-cell-padding;\n  padding-bottom: $table-cell-padding;\n  color: $text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: $line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-cell-padding;\n        line-height: $line-height-base;\n        vertical-align: top;\n        border-top: 1px solid $table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid $table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid $table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: $body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid $table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid $table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: $table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: $table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: $screen-xs-max) {\n    width: 100%;\n    margin-bottom: ($line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid $table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.#{$state},\n    > th.#{$state},\n    &.#{$state} > td,\n    &.#{$state} > th {\n      background-color: $background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.#{$state}:hover,\n    > th.#{$state}:hover,\n    &.#{$state}:hover > td,\n    &:hover > .#{$state},\n    &.#{$state}:hover > th {\n      background-color: darken($background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: $line-height-computed;\n  font-size: ($font-size-base * 1.5);\n  line-height: inherit;\n  color: $legend-color;\n  border: 0;\n  border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  @include tab-focus;\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: ($padding-base-vertical + 1);\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n  background-color: $input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid $input-border;\n  border-radius: $input-border-radius; // Note: This has no effect on s in CSS.\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  @include form-control-focus;\n\n  // Placeholder\n  @include placeholder;\n\n  // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  #{$parent} {\n    height: $input-height;\n    padding: $padding-vertical $padding-horizontal;\n    font-size: $font-size;\n    line-height: $line-height;\n    border-radius: $border-radius;\n  }\n\n  select#{$parent} {\n    height: $input-height;\n    line-height: $input-height;\n  }\n\n  textarea#{$parent},\n  select[multiple]#{$parent} {\n    height: auto;\n  }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n  -webkit-animation: $animation;\n       -o-animation: $animation;\n          animation: $animation;\n}\n@mixin animation-name($name) {\n  -webkit-animation-name: $name;\n          animation-name: $name;\n}\n@mixin animation-duration($duration) {\n  -webkit-animation-duration: $duration;\n          animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n  -webkit-animation-timing-function: $timing-function;\n          animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n  -webkit-animation-delay: $delay;\n          animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n  -webkit-animation-iteration-count: $iteration-count;\n          animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n  -webkit-animation-direction: $direction;\n          animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n  -webkit-animation-fill-mode: $fill-mode;\n          animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility) {\n  -webkit-backface-visibility: $visibility;\n     -moz-backface-visibility: $visibility;\n          backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n          box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n  -webkit-box-sizing: $boxmodel;\n     -moz-box-sizing: $boxmodel;\n          box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n  -webkit-column-count: $column-count;\n     -moz-column-count: $column-count;\n          column-count: $column-count;\n  -webkit-column-gap: $column-gap;\n     -moz-column-gap: $column-gap;\n          column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: $mode;\n     -moz-hyphens: $mode;\n      -ms-hyphens: $mode; // IE10+\n       -o-hyphens: $mode;\n          hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: $color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n  -webkit-transform: scale($ratio);\n      -ms-transform: scale($ratio); // IE9 only\n       -o-transform: scale($ratio);\n          transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n  -webkit-transform: scaleX($ratio);\n      -ms-transform: scaleX($ratio); // IE9 only\n       -o-transform: scaleX($ratio);\n          transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n  -webkit-transform: scaleY($ratio);\n      -ms-transform: scaleY($ratio); // IE9 only\n       -o-transform: scaleY($ratio);\n          transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n  -webkit-transform: skewX($x) skewY($y);\n      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX($x) skewY($y);\n          transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n  -webkit-transform: translate($x, $y);\n      -ms-transform: translate($x, $y); // IE9 only\n       -o-transform: translate($x, $y);\n          transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n  -webkit-transform: translate3d($x, $y, $z);\n          transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees); // IE9 only\n       -o-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n  -webkit-transform: rotateX($degrees);\n      -ms-transform: rotateX($degrees); // IE9 only\n       -o-transform: rotateX($degrees);\n          transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n  -webkit-transform: rotateY($degrees);\n      -ms-transform: rotateY($degrees); // IE9 only\n       -o-transform: rotateY($degrees);\n          transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n  -webkit-perspective: $perspective;\n     -moz-perspective: $perspective;\n          perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n  -webkit-perspective-origin: $perspective;\n     -moz-perspective-origin: $perspective;\n          perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n  -webkit-transform-origin: $origin;\n     -moz-transform-origin: $origin;\n      -ms-transform-origin: $origin; // IE9 only\n          transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n  -webkit-transition: $transition;\n       -o-transition: $transition;\n          transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n  -webkit-transition-property: $transition-property;\n          transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n  -webkit-transition-delay: $transition-delay;\n          transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n  -webkit-transition-duration: $transition-duration;\n          transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n  -webkit-transition-timing-function: $timing-function;\n          transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n  -webkit-transition: -webkit-transform $transition;\n     -moz-transition: -moz-transform $transition;\n       -o-transition: -o-transform $transition;\n          transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n  -webkit-user-select: $select;\n     -moz-user-select: $select;\n      -ms-user-select: $select; // IE10+\n          user-select: $select;\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: $btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n  @include user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      @include tab-focus;\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: $btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n    @include opacity(.65);\n    @include box-shadow(none);\n  }\n\n  // [converter] extracted a& to a.btn\n}\n\na.btn {\n  &.disabled,\n  fieldset[disabled] & {\n    pointer-events: none; // Future-proof disabling of clicks on `` elements\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: $link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    @include box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: $btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n\n  &:focus,\n  &.focus {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 25%);\n  }\n  &:hover {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n\n    &:hover,\n    &:focus,\n    &.focus {\n      color: $color;\n      background-color: darken($background, 17%);\n          border-color: darken($border, 25%);\n    }\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus,\n    &.focus {\n      background-color: $background;\n          border-color: $border;\n    }\n  }\n\n  .badge {\n    color: $background;\n    background-color: $color;\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  padding: $padding-vertical $padding-horizontal;\n  font-size: $font-size;\n  line-height: $line-height;\n  border-radius: $border-radius;\n}\n","@import \"shared\";\n\n// Provides cross-browser CSS opacity. Takes a number between 0 and 1 as the argument, e.g. 0.5 for 50% opacity.\n//\n//     @param $opacity\n//         A number between 0 and 1, where 0 is transparent and 1 is opaque.\n\n@mixin opacity($opacity) {\n  @if $legacy-support-for-ie6 or $legacy-support-for-ie7 or $legacy-support-for-ie8 {\n    filter: unquote(\"progid:DXImageTransform.Microsoft.Alpha(Opacity=#{round($opacity * 100)})\");\n  }\n  opacity: $opacity;\n}\n\n// Make an element completely transparent.\n@mixin transparent { @include opacity(0); }\n\n// Make an element completely opaque.\n@mixin opaque { @include opacity(1); }\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n//    without disabling user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n//  Star\n\n@at-root {\n  // Import the fonts\n  @font-face {\n    font-family: 'Glyphicons Halflings';\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');\n  }\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\002a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  @include transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  // [converter] extracted tr&.in to tr.collapse.in\n  // [converter] extracted tbody&.in to tbody.collapse.in\n}\n\ntr.collapse.in    { display: table-row; }\n\ntbody.collapse.in { display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  @include transition-property(height, visibility);\n  @include transition-duration(.35s);\n  @include transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   $caret-width-base dashed;\n  border-top:   $caret-width-base solid \\9; // IE8\n  border-right: $caret-width-base solid transparent;\n  border-left:  $caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: $zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: $font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: $dropdown-bg;\n  border: 1px solid $dropdown-fallback-border; // IE8 fallback\n  border: 1px solid $dropdown-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    @include nav-divider($dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: $line-height-base;\n    color: $dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $dropdown-link-hover-color;\n    background-color: $dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: $dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    @include reset-filter;\n    cursor: $cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: $font-size-small;\n  line-height: $line-height-base;\n  color: $dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: ($zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: $caret-width-base dashed;\n    border-bottom: $caret-width-base solid \\9; // IE8\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      right: 0; left: auto;\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      left: 0; right: auto;\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n  height: 1px;\n  margin: (($line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: $color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  @include clearfix;\n\n  .btn,\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    @include border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { @extend .btn-xs; }\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: $caret-width-large $caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 $caret-width-large $caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    @include clearfix;\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    @include border-top-radius($btn-border-radius-base);\n    @include border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    @include border-top-radius(0);\n    @include border-bottom-radius($btn-border-radius-base);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n    \n    &:focus {\n      z-index: 3;\n    }\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  @extend .input-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  @extend .input-sm;\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: $input-color;\n  text-align: center;\n  background-color: $input-group-addon-bg;\n  border: 1px solid $input-group-addon-border-color;\n  border-radius: $input-border-radius;\n\n  // Sizing\n  &.input-sm {\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    border-radius: $input-border-radius-small;\n  }\n  &.input-lg {\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    border-radius: $input-border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  @include border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  @include border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      z-index: 2;\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  @include clearfix;\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: $nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: $nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: $nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: $nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: $cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: $nav-link-hover-bg;\n      border-color: $link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    @include nav-divider;\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid $nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: $line-height-base;\n      border: 1px solid transparent;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n      &:hover {\n        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-tabs-active-link-hover-color;\n        background-color: $nav-tabs-active-link-hover-bg;\n        border: 1px solid $nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    @extend .nav-justified;\n    @extend .nav-tabs-justified;\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: $nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-pills-active-link-hover-color;\n        background-color: $nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: $border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid $nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid $nav-tabs-justified-link-border-color;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: $nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  @include border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: $navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: $navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: $navbar-padding-horizontal;\n  padding-left:  $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  @include clearfix;\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: $navbar-collapse-max-height;\n\n    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -$navbar-padding-horizontal;\n    margin-left:  -$navbar-padding-horizontal;\n\n    @media (min-width: $grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: $zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: $zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: $navbar-padding-vertical $navbar-padding-horizontal;\n  font-size: $font-size-large;\n  line-height: $line-height-computed;\n  height: $navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -$navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: $navbar-padding-horizontal;\n  padding: 9px 10px;\n  @include navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: $border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: $line-height-computed;\n  }\n\n  @media (max-width: $grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: $line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    $navbar-padding-vertical;\n        padding-bottom: $navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -$navbar-padding-horizontal;\n  margin-right: -$navbar-padding-horizontal;\n  padding: 10px $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  @include box-shadow($shadow);\n\n  // Mixin behavior for optimum display\n  @include form-inline;\n\n  .form-group {\n    @media (max-width: $grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  @include navbar-vertical-align($input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    @include box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  @include border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  @include border-top-radius($navbar-border-radius);\n  @include border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  @include navbar-vertical-align($input-height-base);\n\n  &.btn-sm {\n    @include navbar-vertical-align($input-height-small);\n  }\n  &.btn-xs {\n    @include navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  @include navbar-vertical-align($line-height-computed);\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin-left: $navbar-padding-horizontal;\n    margin-right: $navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  margin-right: -$navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: $navbar-default-bg;\n  border-color: $navbar-default-border;\n\n  .navbar-brand {\n    color: $navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-brand-hover-color;\n      background-color: $navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-hover-color;\n        background-color: $navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-active-color;\n        background-color: $navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n        background-color: $navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: $navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: $navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-default-link-active-bg;\n        color: $navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: $navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-hover-color;\n            background-color: $navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-active-color;\n            background-color: $navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-disabled-color;\n            background-color: $navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: $navbar-default-link-color;\n    &:hover {\n      color: $navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: $navbar-inverse-bg;\n  border-color: $navbar-inverse-border;\n\n  .navbar-brand {\n    color: $navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-brand-hover-color;\n      background-color: $navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-hover-color;\n        background-color: $navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-active-color;\n        background-color: $navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n        background-color: $navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: $navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken($navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-inverse-link-active-bg;\n        color: $navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: $navbar-inverse-border;\n        }\n        .divider {\n          background-color: $navbar-inverse-border;\n        }\n        > li > a {\n          color: $navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-hover-color;\n            background-color: $navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-active-color;\n            background-color: $navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-disabled-color;\n            background-color: $navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: $navbar-inverse-link-color;\n    &:hover {\n      color: $navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n  margin-top: (($navbar-height - $element-height) / 2);\n  margin-bottom: (($navbar-height - $element-height) / 2);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n  margin-bottom: $line-height-computed;\n  list-style: none;\n  background-color: $breadcrumb-bg;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      // [converter] Workaround for https://github.com/sass/libsass/issues/1115\n      $nbsp: \"\\00a0\";\n      content: \"#{$breadcrumb-separator}#{$nbsp}\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: $breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: $breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: $padding-base-vertical $padding-base-horizontal;\n      line-height: $line-height-base;\n      text-decoration: none;\n      color: $pagination-color;\n      background-color: $pagination-bg;\n      border: 1px solid $pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        @include border-left-radius($border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: $pagination-hover-color;\n      background-color: $pagination-hover-bg;\n      border-color: $pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 3;\n      color: $pagination-active-color;\n      background-color: $pagination-active-bg;\n      border-color: $pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: $pagination-disabled-color;\n      background-color: $pagination-disabled-bg;\n      border-color: $pagination-disabled-border;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n","// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: $padding-vertical $padding-horizontal;\n      font-size: $font-size;\n      line-height: $line-height;\n    }\n    &:first-child {\n      > a,\n      > span {\n        @include border-left-radius($border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  @include clearfix;\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: $pager-bg;\n      border: 1px solid $pager-border;\n      border-radius: $pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: $pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: $pager-disabled-color;\n      background-color: $pager-bg;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: $label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // [converter] extracted a& to a.label\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Add hover effects, but only for links\na.label {\n  &:hover,\n  &:focus {\n    color: $label-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  @include label-variant($label-default-bg);\n}\n\n.label-primary {\n  @include label-variant($label-primary-bg);\n}\n\n.label-success {\n  @include label-variant($label-success-bg);\n}\n\n.label-info {\n  @include label-variant($label-info-bg);\n}\n\n.label-warning {\n  @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n  @include label-variant($label-danger-bg);\n}\n","// Labels\n\n@mixin label-variant($color) {\n  background-color: $color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken($color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: $font-size-small;\n  font-weight: $badge-font-weight;\n  color: $badge-color;\n  line-height: $badge-line-height;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: $badge-bg;\n  border-radius: $badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // [converter] extracted a& to a.badge\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: $badge-active-color;\n    background-color: $badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: $badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding-top:    $jumbotron-padding;\n  padding-bottom: $jumbotron-padding;\n  margin-bottom: $jumbotron-padding;\n  color: $jumbotron-color;\n  background-color: $jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: $jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: ($jumbotron-padding / 2);\n    font-size: $jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken($jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container\n    padding-left:  ($grid-gutter-width / 2);\n    padding-right: ($grid-gutter-width / 2);\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: $screen-sm-min) {\n    padding-top:    ($jumbotron-padding * 1.6);\n    padding-bottom: ($jumbotron-padding * 1.6);\n\n    .container &,\n    .container-fluid & {\n      padding-left:  ($jumbotron-padding * 2);\n      padding-right: ($jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: $jumbotron-heading-font-size;\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: $thumbnail-padding;\n  margin-bottom: $line-height-computed;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    @include img-responsive;\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active\n\n  // Image captions\n  .caption {\n    padding: $thumbnail-caption-padding;\n    color: $thumbnail-caption-color;\n  }\n}\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: $link-color;\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: $alert-padding;\n  margin-bottom: $line-height-computed;\n  border: 1px solid transparent;\n  border-radius: $alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing $headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: $alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: ($alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n","// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n  background-color: $background;\n  border-color: $border;\n  color: $text-color;\n\n  hr {\n    border-top-color: darken($border, 5%);\n  }\n  .alert-link {\n    color: darken($text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: $line-height-computed;\n  margin-bottom: $line-height-computed;\n  background-color: $progress-bg;\n  border-radius: $progress-border-radius;\n  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: $font-size-small;\n  line-height: $line-height-computed;\n  color: $progress-bar-color;\n  text-align: center;\n  background-color: $progress-bar-bg;\n  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  @include transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  @include gradient-striped;\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  @include animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  @include progress-bar-variant($progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  @include progress-bar-variant($progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  @include progress-bar-variant($progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  @include progress-bar-variant($progress-bar-danger-bg);\n}\n","// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n  background-repeat: repeat-x;\n  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// Progress bars\n\n@mixin progress-bar-variant($color) {\n  background-color: $color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    @include gradient-striped;\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n\n  // Fix collapse in webkit from max-width: 100% and display: table-cell.\n  &.img-thumbnail {\n    max-width: none;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on 
      ,
        , or
        .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: $list-group-bg;\n border: 1px solid $list-group-border;\n\n // Round the first and last items\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: $list-group-link-color;\n\n .list-group-item-heading {\n color: $list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: $list-group-link-hover-color;\n background-color: $list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: $list-group-disabled-bg;\n color: $list-group-disabled-color;\n cursor: $cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: $list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: $list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@include list-group-item-variant(success, $state-success-bg, $state-success-text);\n@include list-group-item-variant(info, $state-info-bg, $state-info-text);\n@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);\n@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}\n }\n\n a.list-group-item-#{$state},\n button.list-group-item-#{$state} {\n color: $color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: $color;\n border-color: $color;\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: $line-height-computed;\n background-color: $panel-bg;\n border: 1px solid transparent;\n border-radius: $panel-border-radius;\n @include box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: $panel-body-padding;\n @include clearfix;\n}\n\n// Optional heading\n.panel-heading {\n padding: $panel-heading-padding;\n border-bottom: 1px solid transparent;\n @include border-top-radius(($panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil(($font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: $panel-footer-padding;\n background-color: $panel-footer-bg;\n border-top: 1px solid $panel-inner-border;\n @include border-bottom-radius(($panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n @include border-top-radius(($panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n @include border-bottom-radius(($panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n @include border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: $panel-body-padding;\n padding-right: $panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n @include border-top-radius(($panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: ($panel-border-radius - 1);\n border-top-right-radius: ($panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: ($panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: ($panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n @include border-bottom-radius(($panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: ($panel-border-radius - 1);\n border-bottom-right-radius: ($panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: ($panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: ($panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid $table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: $line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: $panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid $panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid $panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);\n}\n.panel-primary {\n @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);\n}\n.panel-success {\n @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);\n}\n.panel-info {\n @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);\n}\n.panel-warning {\n @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);\n}\n.panel-danger {\n @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);\n}\n","// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n border-color: $border;\n\n & > .panel-heading {\n color: $heading-text-color;\n background-color: $heading-bg-color;\n border-color: $heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: $border;\n }\n .badge {\n color: $heading-bg-color;\n background-color: $heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: $border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: $well-bg;\n border: 1px solid $well-border;\n border-radius: $border-radius-base;\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: $border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: $border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: ($font-size-base * 1.5);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n @include opacity(.2);\n\n &:hover,\n &:focus {\n color: $close-color;\n text-decoration: none;\n cursor: pointer;\n @include opacity(.5);\n }\n\n // [converter] extracted button& to button.close\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n @include translate(0, -25%);\n @include transition-transform(0.3s ease-out);\n }\n &.in .modal-dialog { @include translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: $modal-content-bg;\n border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid $modal-content-border-color;\n border-radius: $border-radius-large;\n @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal-background;\n background-color: $modal-backdrop-bg;\n // Fade for backdrop\n &.fade { @include opacity(0); }\n &.in { @include opacity($modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: $modal-title-padding;\n border-bottom: 1px solid $modal-header-border-color;\n @include clearfix;\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: $modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid $modal-footer-border-color;\n @include clearfix; // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: $screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: $modal-md;\n margin: 30px auto;\n }\n .modal-content {\n @include box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: $modal-sm; }\n}\n\n@media (min-width: $screen-md-min) {\n .modal-lg { width: $modal-lg; }\n}\n","@import \"shared\";\n\n// @doc off\n// Note ----------------------------------------------------------------------\n// Safari, Chrome, and Firefox all support 3D transforms. However,\n// only in the most recent builds. You should also provide fallback 2d support for\n// Opera and IE. IE10 is slated to have 3d enabled, but is currently unreleased.\n// To make that easy, all 2D transforms include an browser-targeting toggle ($only3d)\n// to switch between the two support lists. The toggle defaults to 'false' (2D),\n// and also accepts 'true' (3D). Currently the lists are as follows:\n// 2D: Mozilla, Webkit, Opera, Official\n// 3D: Webkit, Firefox.\n\n// Available Transforms ------------------------------------------------------\n// - Scale (2d and 3d)\n// - Rotate (2d and 3d)\n// - Translate (2d and 3d)\n// - Skew (2d only)\n\n// Transform Parameters ------------------------------------------------------\n// - Transform Origin (2d and 3d)\n// - Perspective (3d)\n// - Perspective Origin (3d)\n// - Transform Style (3d)\n// - Backface Visibility (3d)\n\n// Mixins --------------------------------------------------------------------\n// transform-origin\n// - shortcuts: transform-origin2d, transform-origin3d\n// - helpers: apply-origin\n// transform\n// - shortcuts: transform2d, transform3d\n// - helpers: simple-transform, create-transform\n// perspective\n// - helpers: perspective-origin\n// transform-style\n// backface-visibility\n// scale\n// - shortcuts: scaleX, scaleY, scaleZ, scale3d\n// rotate\n// - shortcuts: rotateX, rotateY, rotate3d\n// translate\n// - shortcuts: translateX, translateY, translateZ, translate3d\n// skew\n// - shortcuts: skewX, skewY\n\n// Defaults ------------------------------------------------------------------\n// @doc on\n\n// The default x-origin for transforms\n$default-origin-x : 50% !default;\n// The default y-origin for transforms\n$default-origin-y : 50% !default;\n// The default z-origin for transforms\n$default-origin-z : 50% !default;\n\n\n// The default x-multiplier for scaling\n$default-scale-x : 1.25 !default;\n// The default y-multiplier for scaling\n$default-scale-y : $default-scale-x !default;\n// The default z-multiplier for scaling\n$default-scale-z : $default-scale-x !default;\n\n\n// The default angle for rotations\n$default-rotate : 45deg !default;\n\n\n// The default x-vector for the axis of 3d rotations\n$default-vector-x : 1 !default;\n// The default y-vector for the axis of 3d rotations\n$default-vector-y : 1 !default;\n// The default z-vector for the axis of 3d rotations\n$default-vector-z : 1 !default;\n\n\n// The default x-length for translations\n$default-translate-x : 1em !default;\n// The default y-length for translations\n$default-translate-y : $default-translate-x !default;\n// The default z-length for translations\n$default-translate-z : $default-translate-x !default;\n\n\n// The default x-angle for skewing\n$default-skew-x : 5deg !default;\n// The default y-angle for skewing\n$default-skew-y : 5deg !default;\n\n\n// **Transform-origin**\n// Transform-origin sent as a complete string\n//\n// @include apply-origin( origin [, 3D-only ] )\n//\n// where 'origin' is a space separated list containing 1-3 (x/y/z) coordinates\n// in percentages, absolute (px, cm, in, em etc..) or relative\n// (left, top, right, bottom, center) units\n//\n// @param only3d Set this to true to only apply this\n// mixin where browsers have 3D support.\n@mixin apply-origin($origin, $only3d) {\n $only3d: $only3d or -compass-list-size(-compass-list($origin)) > 2;\n @if $only3d {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Transform-origin sent as individual arguments:\n//\n// @include transform-origin( [ origin-x, origin-y, origin-z, 3D-only ] )\n//\n// where the 3 'origin-' arguments represent x/y/z coordinates.\n//\n// **NOTE:** setting z coordinates triggers 3D support list, leave false for 2D support\n@mixin transform-origin(\n $origin-x: $default-origin-x,\n $origin-y: $default-origin-y,\n $origin-z: false,\n $only3d: if($origin-z, true, false)\n) {\n $origin: unquote('');\n @if $origin-x or $origin-y or $origin-z {\n @if $origin-x { $origin: $origin-x; } @else { $origin: 50%; }\n @if $origin-y { $origin: $origin $origin-y; } @else { @if $origin-z { $origin: $origin 50%; }}\n @if $origin-z { $origin: $origin $origin-z; }\n @include apply-origin($origin, $only3d);\n }\n}\n\n\n// Transform sent as a complete string:\n//\n// @include transform( transforms [, 3D-only ] )\n//\n// where 'transforms' is a space separated list of all the transforms to be applied.\n@mixin transform(\n $transform,\n $only3d: false\n) {\n @if $only3d {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Shortcut to target all browsers with 2D transform support\n@mixin transform2d($trans) {\n @include transform($trans, false);\n}\n\n// Shortcut to target only browsers with 3D transform support\n@mixin transform3d($trans) {\n @include transform($trans, true);\n}\n\n// @doc off\n// 3D Parameters -------------------------------------------------------------\n// @doc on\n\n// Set the perspective of 3D transforms on the children of an element:\n//\n// @include perspective( perspective )\n//\n// where 'perspective' is a unitless number representing the depth of the\n// z-axis. The higher the perspective, the more exaggerated the foreshortening.\n// values from 500 to 1000 are more-or-less \"normal\" - a good starting-point.\n@mixin perspective($p) {\n @include experimental(perspective, $p,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Set the origin position for the perspective\n//\n// @include perspective-origin(origin-x [origin-y])\n//\n// where the two arguments represent x/y coordinates\n@mixin perspective-origin($origin: 50%) {\n @include experimental(perspective-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine whether a 3D objects children also live in the given 3D space\n//\n// @include transform-style( [ style ] )\n//\n// where `style` can be either `flat` or `preserve-3d`.\n// Browsers default to `flat`, mixin defaults to `preserve-3d`.\n@mixin transform-style($style: preserve-3d) {\n @include experimental(transform-style, $style,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine the visibility of an element when it's back is turned\n//\n// @include backface-visibility( [ visibility ] )\n//\n// where `visibility` can be either `visible` or `hidden`.\n// Browsers default to visible, mixin defaults to hidden\n@mixin backface-visibility($visibility: hidden) {\n @include experimental(backface-visibility, $visibility,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// @doc off\n// Transform Partials --------------------------------------------------------\n// These work well on their own, but they don't add to each other, they override.\n// Use along with transform parameter mixins to adjust origin, perspective and style\n// ---------------------------------------------------------------------------\n\n\n// Scale ---------------------------------------------------------------------\n// @doc on\n\n// Scale an object along the x and y axis:\n//\n// @include scale( [ scale-x, scale-y, perspective, 3D-only ] )\n//\n// where the 'scale-' arguments are unitless multipliers of the x and y dimensions\n// and perspective, which works the same as the stand-alone perspective property/mixin\n// but applies to the individual element (multiplied with any parent perspective)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale(\n $scale-x: $default-scale-x,\n $scale-y: $scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scale($scale-x, $scale-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the x axis\n// @include scaleX( [ scale-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleX(\n $scale: $default-scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleX($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the y axis\n// @include scaleY( [ scale-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleY(\n $scale: $default-scale-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleY($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the z axis\n// @include scaleZ( [ scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleZ(\n $scale: $default-scale-z,\n $perspective: false\n) {\n $trans: scaleZ($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Scale and object along all three axis\n// @include scale3d( [ scale-x, scale-y, scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale3d(\n $scale-x: $default-scale-x,\n $scale-y: $default-scale-y,\n $scale-z: $default-scale-z,\n $perspective: false\n) {\n $trans: scale3d($scale-x, $scale-y, $scale-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Rotate --------------------------------------------------------------------\n// @doc on\n\n// Rotate an object around the z axis (2D)\n// @include rotate( [ rotation, perspective, 3D-only ] )\n// where 'rotation' is an angle set in degrees (deg) or radian (rad) units\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n $trans: rotate($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// A longcut for 'rotate' in case you forget that 'z' is implied\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateZ(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n @include rotate($rotate, $perspective, $only3d);\n}\n\n// Rotate an object around the x axis (3D)\n// @include rotateX( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateX(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateX($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around the y axis (3D)\n// @include rotate( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateY(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateY($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around an arbitrary axis (3D)\n// @include rotate( [ vector-x, vector-y, vector-z, rotation, perspective ] )\n// where the 'vector-' arguments accept unitless numbers.\n// These numbers are not important on their own, but in relation to one another\n// creating an axis from your transform-origin, along the axis of Xx = Yy = Zz.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate3d(\n $vector-x: $default-vector-x,\n $vector-y: $default-vector-y,\n $vector-z: $default-vector-z,\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotate3d($vector-x, $vector-y, $vector-z, $rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Translate -----------------------------------------------------------------\n// @doc on\n\n// Move an object along the x or y axis (2D)\n// @include translate( [ translate-x, translate-y, perspective, 3D-only ] )\n// where the 'translate-' arguments accept any distance in percentages or absolute (px, cm, in, em etc..) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translate($translate-x, $translate-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the x axis (2D)\n// @include translate( [ translate-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateX(\n $trans-x: $default-translate-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateX($trans-x);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the y axis (2D)\n// @include translate( [ translate-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateY(\n $trans-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateY($trans-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the z axis (3D)\n// @include translate( [ translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateZ(\n $trans-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translateZ($trans-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Move an object along the x, y and z axis (3D)\n// @include translate( [ translate-x, translate-y, translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate3d(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $translate-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translate3d($translate-x, $translate-y, $translate-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Skew ----------------------------------------------------------------------\n// @doc on\n\n// Skew an element:\n//\n// @include skew( [ skew-x, skew-y, 3D-only ] )\n//\n// where the 'skew-' arguments accept css angles in degrees (deg) or radian (rad) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skew(\n $skew-x: $default-skew-x,\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skew($skew-x, $skew-y);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the x axiz\n//\n// @include skew( [ skew-x, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewX(\n $skew-x: $default-skew-x,\n $only3d: false\n) {\n $trans: skewX($skew-x);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the y axis\n//\n// @include skew( [ skew-y, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewY(\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skewY($skew-y);\n @include transform($trans, $only3d);\n}\n\n\n// Full transform mixins\n// For settings any combination of transforms as arguments\n// These are complex and not highly recommended for daily use. They are mainly\n// here for backward-compatibility purposes.\n//\n// * they include origin adjustments\n// * scale takes a multiplier (unitless), rotate and skew take degrees (deg)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin create-transform(\n $perspective: false,\n $scale-x: false,\n $scale-y: false,\n $scale-z: false,\n $rotate-x: false,\n $rotate-y: false,\n $rotate-z: false,\n $rotate3d: false,\n $trans-x: false,\n $trans-y: false,\n $trans-z: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false,\n $origin-z: false,\n $only3d: false\n) {\n $trans: unquote(\"\");\n\n // perspective\n @if $perspective { $trans: perspective($perspective) ; }\n\n // scale\n @if $scale-x and $scale-y {\n @if $scale-z { $trans: $trans scale3d($scale-x, $scale-y, $scale-z); }\n @else { $trans: $trans scale($scale-x, $scale-y); }\n } @else {\n @if $scale-x { $trans: $trans scaleX($scale-x); }\n @if $scale-y { $trans: $trans scaleY($scale-y); }\n @if $scale-z { $trans: $trans scaleZ($scale-z); }\n }\n\n // rotate\n @if $rotate-x { $trans: $trans rotateX($rotate-x); }\n @if $rotate-y { $trans: $trans rotateY($rotate-y); }\n @if $rotate-z { $trans: $trans rotateZ($rotate-z); }\n @if $rotate3d { $trans: $trans rotate3d($rotate3d); }\n\n // translate\n @if $trans-x and $trans-y {\n @if $trans-z { $trans: $trans translate3d($trans-x, $trans-y, $trans-z); }\n @else { $trans: $trans translate($trans-x, $trans-y); }\n } @else {\n @if $trans-x { $trans: $trans translateX($trans-x); }\n @if $trans-y { $trans: $trans translateY($trans-y); }\n @if $trans-z { $trans: $trans translateZ($trans-z); }\n }\n\n // skew\n @if $skew-x and $skew-y { $trans: $trans skew($skew-x, $skew-y); }\n @else {\n @if $skew-x { $trans: $trans skewX($skew-x); }\n @if $skew-y { $trans: $trans skewY($skew-y); }\n }\n\n // apply it!\n @include transform($trans, $only3d);\n @include transform-origin($origin-x, $origin-y, $origin-z, $only3d);\n}\n\n\n// A simplified set of options\n// backwards-compatible with the previous version of the 'transform' mixin\n@mixin simple-transform(\n $scale: false,\n $rotate: false,\n $trans-x: false,\n $trans-y: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false\n) {\n @include create-transform(\n false,\n $scale, $scale, false,\n false, false, $rotate, false,\n $trans-x, $trans-y, false,\n $skew-x, $skew-y,\n $origin-x, $origin-y, false,\n false\n );\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text;\n font-size: $font-size-small;\n\n @include opacity(0);\n\n &.in { @include opacity($tooltip-opacity); }\n &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: 3px 8px;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n border-radius: $border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: $tooltip-arrow-width;\n margin-bottom: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: $tooltip-arrow-width;\n margin-bottom: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n border-right-color: $tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-left-color: $tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: $tooltip-arrow-width;\n margin-top: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: $tooltip-arrow-width;\n margin-top: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n}\n","@mixin reset-text() {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: none;\n max-width: $popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text;\n font-size: $font-size-base;\n\n background-color: $popover-bg;\n background-clip: padding-box;\n border: 1px solid $popover-fallback-border-color;\n border: 1px solid $popover-border-color;\n border-radius: $border-radius-large;\n @include box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -$popover-arrow-width; }\n &.right { margin-left: $popover-arrow-width; }\n &.bottom { margin-top: $popover-arrow-width; }\n &.left { margin-left: -$popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: $font-size-base;\n background-color: $popover-title-bg;\n border-bottom: 1px solid darken($popover-title-bg, 5%);\n border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: $popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: $popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -$popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: $popover-arrow-outer-color;\n bottom: -$popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -$popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: $popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -$popover-arrow-outer-width;\n margin-top: -$popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: $popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -$popover-arrow-width;\n border-left-width: 0;\n border-right-color: $popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -$popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: $popover-arrow-outer-color;\n top: -$popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -$popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -$popover-arrow-outer-width;\n margin-top: -$popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: $popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: $popover-arrow-color;\n bottom: -$popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n @include transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n @include img-responsive;\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n @include transition-transform(0.6s ease-in-out);\n @include backface-visibility(hidden);\n @include perspective(1000px);\n\n &.next,\n &.active.right {\n @include translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n @include translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n @include translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: $carousel-control-width;\n @include opacity($carousel-control-opacity);\n font-size: $carousel-control-font-size;\n color: $carousel-control-color;\n text-align: center;\n text-shadow: $carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: $carousel-control-color;\n text-decoration: none;\n @include opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid $carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: $carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n text-shadow: $carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: $screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: ($carousel-control-font-size * 1.5);\n height: ($carousel-control-font-size * 1.5);\n margin-top: ($carousel-control-font-size / -2);\n font-size: ($carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: ($carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: ($carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n @include clearfix;\n}\n.center-block {\n @include center-block;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n @include text-hide;\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","// Center-align a block level element\n\n@mixin center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// Indicates the direction you prefer to move your text\n// when hiding it.\n//\n// `left` is more robust, especially in older browsers.\n// `right` seems have better runtime performance.\n$hide-text-direction: left !default;\n\n// Hides html text and replaces it with an image.\n// If you use this on an inline element, you will need to change the display to block or inline-block.\n// Also, if the size of the image differs significantly from the font size, you'll need to set the width and/or height.\n//\n// Parameters:\n//\n// * `img` -- the relative path from the project image directory to the image, or a url literal.\n// * `x` -- the x position of the background image.\n// * `y` -- the y position of the background image.\n@mixin replace-text($img, $x: 50%, $y: 50%) {\n @include hide-text;\n background: {\n @if is-url($img) {\n image: $img;\n } @else {\n image: image-url($img);\n }\n repeat: no-repeat;\n position: $x $y;\n };\n}\n\n// Like the `replace-text` mixin, but also sets the width\n// and height of the element according the dimensions of the image.\n//\n// If you set `$inline` to true, then an inline image (data uri) will be used.\n@mixin replace-text-with-dimensions($img, $x: 50%, $y: 50%, $inline: false) {\n @include replace-text(if($inline, inline-image($img), $img), $x, $y);\n width: image-width($img);\n height: image-height($img);\n}\n\n// Hides text in an element so you can see the background.\n//\n// The direction indicates how the text should be moved out of view.\n//\n// See `$hide-text-direction` for more information and to set this globally\n// for your application.\n@mixin hide-text($direction: $hide-text-direction) {\n @if $direction == left {\n $approximate-em-value: 12px / 1em;\n $wider-than-any-screen: -9999em;\n text-indent: $wider-than-any-screen * $approximate-em-value;\n overflow: hidden;\n text-align: left;\n } @else {\n // slightly wider than the box prevents issues with inline-block elements\n text-indent: 110%;\n white-space: nowrap;\n overflow: hidden;\n }\n}\n\n// Hides text in an element by squishing the text into oblivion.\n// Use this if you need to hide text contained in an inline element\n// but still have it read by a screen reader.\n@mixin squish-text {\n font: 0/0 serif;\n text-shadow: none;\n color: transparent;\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@at-root {\n @-ms-viewport {\n width: device-width;\n }\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n\n@include responsive-invisibility('.visible-xs');\n@include responsive-invisibility('.visible-sm');\n@include responsive-invisibility('.visible-md');\n@include responsive-invisibility('.visible-lg');\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n@media (max-width: $screen-xs-max) {\n @include responsive-visibility('.visible-xs');\n}\n.visible-xs-block {\n @media (max-width: $screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: $screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: $screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n @include responsive-visibility('.visible-sm');\n}\n.visible-sm-block {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n @include responsive-visibility('.visible-md');\n}\n.visible-md-block {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-lg-min) {\n @include responsive-visibility('.visible-lg');\n}\n.visible-lg-block {\n @media (min-width: $screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: $screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: $screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n@media (max-width: $screen-xs-max) {\n @include responsive-invisibility('.hidden-xs');\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n @include responsive-invisibility('.hidden-sm');\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n @include responsive-invisibility('.hidden-md');\n}\n\n@media (min-width: $screen-lg-min) {\n @include responsive-invisibility('.hidden-lg');\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n\n@include responsive-invisibility('.visible-print');\n\n@media print {\n @include responsive-visibility('.visible-print');\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n@media print {\n @include responsive-invisibility('.hidden-print');\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent hack\n@mixin responsive-visibility($parent) {\n #{$parent} {\n display: block !important;\n }\n table#{$parent} { display: table !important; }\n tr#{$parent} { display: table-row !important; }\n th#{$parent},\n td#{$parent} { display: table-cell !important; }\n}\n\n// [converter] $parent hack\n@mixin responsive-invisibility($parent) {\n #{$parent} {\n display: none !important;\n }\n}\n","/*!\n * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"animated\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n","/* FONT PATH\n * -------------------------- */\n\n@font-face {\n font-family: 'FontAwesome';\n src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\n url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n font-weight: normal;\n font-style: normal;\n}\n","// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n display: inline-block;\n font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n font-size: inherit; // can't have font-size inherit on line above, so need to override\n text-rendering: auto; // optimizelegibility throws things off #1094\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n}\n","// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n font-size: (4em / 3);\n line-height: (3em / 4);\n vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n","// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n width: (18em / 14);\n text-align: center;\n}\n","// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n padding-left: 0;\n margin-left: $fa-li-width;\n list-style-type: none;\n > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n position: absolute;\n left: -$fa-li-width;\n width: $fa-li-width;\n top: (2em / 14);\n text-align: center;\n &.#{$fa-css-prefix}-lg {\n left: -$fa-li-width + (4em / 14);\n }\n}\n","// Variables\n// --------------------------\n\n$fa-font-path: \"../fonts\" !default;\n$fa-font-size-base: 14px !default;\n$fa-line-height-base: 1 !default;\n//$fa-font-path: \"//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix: fa !default;\n$fa-version: \"4.4.0\" !default;\n$fa-border-color: #eee !default;\n$fa-inverse: #fff !default;\n$fa-li-width: (30em / 14) !default;\n\n$fa-var-500px: \"\\f26e\";\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-amazon: \"\\f270\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-balance-scale: \"\\f24e\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-battery-0: \"\\f244\";\n$fa-var-battery-1: \"\\f243\";\n$fa-var-battery-2: \"\\f242\";\n$fa-var-battery-3: \"\\f241\";\n$fa-var-battery-4: \"\\f240\";\n$fa-var-battery-empty: \"\\f244\";\n$fa-var-battery-full: \"\\f240\";\n$fa-var-battery-half: \"\\f242\";\n$fa-var-battery-quarter: \"\\f243\";\n$fa-var-battery-three-quarters: \"\\f241\";\n$fa-var-bed: \"\\f236\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-black-tie: \"\\f27e\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-buysellads: \"\\f20d\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-check-o: \"\\f274\";\n$fa-var-calendar-minus-o: \"\\f272\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-calendar-plus-o: \"\\f271\";\n$fa-var-calendar-times-o: \"\\f273\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cart-arrow-down: \"\\f218\";\n$fa-var-cart-plus: \"\\f217\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-diners-club: \"\\f24c\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-jcb: \"\\f24b\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-chrome: \"\\f268\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-clone: \"\\f24d\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-commenting: \"\\f27a\";\n$fa-var-commenting-o: \"\\f27b\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-connectdevelop: \"\\f20e\";\n$fa-var-contao: \"\\f26d\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-creative-commons: \"\\f25e\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-dashcube: \"\\f210\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-diamond: \"\\f219\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-expeditedssl: \"\\f23e\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-f: \"\\f09a\";\n$fa-var-facebook-official: \"\\f230\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-feed: \"\\f09e\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-firefox: \"\\f269\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-fonticons: \"\\f280\";\n$fa-var-forumbee: \"\\f211\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-genderless: \"\\f22d\";\n$fa-var-get-pocket: \"\\f265\";\n$fa-var-gg: \"\\f260\";\n$fa-var-gg-circle: \"\\f261\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-gratipay: \"\\f184\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-grab-o: \"\\f255\";\n$fa-var-hand-lizard-o: \"\\f258\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hand-paper-o: \"\\f256\";\n$fa-var-hand-peace-o: \"\\f25b\";\n$fa-var-hand-pointer-o: \"\\f25a\";\n$fa-var-hand-rock-o: \"\\f255\";\n$fa-var-hand-scissors-o: \"\\f257\";\n$fa-var-hand-spock-o: \"\\f259\";\n$fa-var-hand-stop-o: \"\\f256\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-heartbeat: \"\\f21e\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-hotel: \"\\f236\";\n$fa-var-hourglass: \"\\f254\";\n$fa-var-hourglass-1: \"\\f251\";\n$fa-var-hourglass-2: \"\\f252\";\n$fa-var-hourglass-3: \"\\f253\";\n$fa-var-hourglass-end: \"\\f253\";\n$fa-var-hourglass-half: \"\\f252\";\n$fa-var-hourglass-o: \"\\f250\";\n$fa-var-hourglass-start: \"\\f251\";\n$fa-var-houzz: \"\\f27c\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-i-cursor: \"\\f246\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-industry: \"\\f275\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-internet-explorer: \"\\f26b\";\n$fa-var-intersex: \"\\f224\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-leanpub: \"\\f212\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map: \"\\f279\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-map-o: \"\\f278\";\n$fa-var-map-pin: \"\\f276\";\n$fa-var-map-signs: \"\\f277\";\n$fa-var-mars: \"\\f222\";\n$fa-var-mars-double: \"\\f227\";\n$fa-var-mars-stroke: \"\\f229\";\n$fa-var-mars-stroke-h: \"\\f22b\";\n$fa-var-mars-stroke-v: \"\\f22a\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medium: \"\\f23a\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-mercury: \"\\f223\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-motorcycle: \"\\f21c\";\n$fa-var-mouse-pointer: \"\\f245\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-neuter: \"\\f22c\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-object-group: \"\\f247\";\n$fa-var-object-ungroup: \"\\f248\";\n$fa-var-odnoklassniki: \"\\f263\";\n$fa-var-odnoklassniki-square: \"\\f264\";\n$fa-var-opencart: \"\\f23d\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-opera: \"\\f26a\";\n$fa-var-optin-monster: \"\\f23c\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f1a7\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-p: \"\\f231\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-registered: \"\\f25d\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-safari: \"\\f267\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-sellsy: \"\\f213\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-server: \"\\f233\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-ship: \"\\f21a\";\n$fa-var-shirtsinbulk: \"\\f214\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-simplybuilt: \"\\f215\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skyatlas: \"\\f216\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-sticky-note: \"\\f249\";\n$fa-var-sticky-note-o: \"\\f24a\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-street-view: \"\\f21d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-subway: \"\\f239\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-television: \"\\f26c\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-trademark: \"\\f25c\";\n$fa-var-train: \"\\f238\";\n$fa-var-transgender: \"\\f224\";\n$fa-var-transgender-alt: \"\\f225\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-tripadvisor: \"\\f262\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-tv: \"\\f26c\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-user-plus: \"\\f234\";\n$fa-var-user-secret: \"\\f21b\";\n$fa-var-user-times: \"\\f235\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-venus: \"\\f221\";\n$fa-var-venus-double: \"\\f226\";\n$fa-var-venus-mars: \"\\f228\";\n$fa-var-viacoin: \"\\f237\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo: \"\\f27d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-whatsapp: \"\\f232\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-wikipedia-w: \"\\f266\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-y-combinator: \"\\f23b\";\n$fa-var-y-combinator-square: \"\\f1d4\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yc: \"\\f23b\";\n$fa-var-yc-square: \"\\f1d4\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n","// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n padding: .2em .25em .15em;\n border: solid .08em $fa-border-color;\n border-radius: .1em;\n}\n\n.#{$fa-css-prefix}-pull-left { float: left; }\n.#{$fa-css-prefix}-pull-right { float: right; }\n\n.#{$fa-css-prefix} {\n &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }\n &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n &.pull-left { margin-right: .3em; }\n &.pull-right { margin-left: .3em; }\n}\n","// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n\n.#{$fa-css-prefix}-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n","// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n filter: none;\n}\n","// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n display: inline-block;\n font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n font-size: inherit; // can't have font-size inherit on line above, so need to override\n text-rendering: auto; // optimizelegibility throws things off #1094\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n -webkit-transform: rotate($degrees);\n -ms-transform: rotate($degrees);\n transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n -webkit-transform: scale($horiz, $vert);\n -ms-transform: scale($horiz, $vert);\n transform: scale($horiz, $vert);\n}\n","// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n position: relative;\n display: inline-block;\n width: 2em;\n height: 2em;\n line-height: 2em;\n vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n position: absolute;\n left: 0;\n width: 100%;\n text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n","/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook-f:before,\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-feed:before,\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before,\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-y-combinator-square:before,\n.#{$fa-css-prefix}-yc-square:before,\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\n.#{$fa-css-prefix}-intersex:before,\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\n.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\n.#{$fa-css-prefix}-hotel:before,\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\n.#{$fa-css-prefix}-yc:before,\n.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }\n.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }\n.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }\n.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }\n.#{$fa-css-prefix}-battery-4:before,\n.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }\n.#{$fa-css-prefix}-battery-3:before,\n.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }\n.#{$fa-css-prefix}-battery-2:before,\n.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }\n.#{$fa-css-prefix}-battery-1:before,\n.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }\n.#{$fa-css-prefix}-battery-0:before,\n.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }\n.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }\n.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }\n.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }\n.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }\n.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }\n.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }\n.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }\n.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }\n.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }\n.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }\n.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }\n.#{$fa-css-prefix}-hourglass-1:before,\n.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }\n.#{$fa-css-prefix}-hourglass-2:before,\n.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }\n.#{$fa-css-prefix}-hourglass-3:before,\n.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }\n.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }\n.#{$fa-css-prefix}-hand-grab-o:before,\n.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }\n.#{$fa-css-prefix}-hand-stop-o:before,\n.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }\n.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }\n.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }\n.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }\n.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }\n.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }\n.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }\n.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }\n.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }\n.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }\n.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }\n.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }\n.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }\n.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }\n.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }\n.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }\n.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }\n.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }\n.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }\n.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }\n.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }\n.#{$fa-css-prefix}-tv:before,\n.#{$fa-css-prefix}-television:before { content: $fa-var-television; }\n.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }\n.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }\n.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }\n.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }\n.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }\n.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }\n.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }\n.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }\n.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }\n.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }\n.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }\n.#{$fa-css-prefix}-map:before { content: $fa-var-map; }\n.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }\n.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }\n.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }\n.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }\n.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }\n.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }\n","// Styles for admin pages.\n// --------------------------------------------------\n.views-display-setting .views-admin-label {\n // From views-admin.css\n display: inline-block;\n float: left; /* LTR */\n // From views-admin.theme.css\n margin-right: 3pt; /* LTR */\n}\n","// Comment\n// --------------------------------------------------\n.comment {\n margin-top: 15px;\n .user-picture {\n float: left;\n margin-right: 10px;\n a {\n display: block;\n }\n }\n .submitted {\n font-size: 0.90em;\n .permalink {\n margin-left: 5px;\n }\n .new {\n color: $brand-danger;\n }\n }\n .content {\n margin: 10px 0;\n }\n .links {\n font-size: 0.80em;\n }\n}\n","// General\n// -----------------------------------------------------------------------------\n.form-item {\n margin-top: 0;\n}\nform {\n .form-managed-file {\n input {\n display: inline-block;\n margin: 0 10px 0 0;\n }\n }\n .container-inline-date .date-padding {\n padding: 0;\n float: none;\n }\n .form-actions {\n .btn {\n margin-right: 10px;\n }\n }\n .field-type-datetime {\n select {\n min-width: 80px;\n }\n }\n .format-toggle {\n float: none;\n }\n .field-multiple-table {\n thead {\n th {\n padding: 10px !important;\n label {\n margin: 0;\n font-weight: bold;\n }\n }\n }\n }\n .description {\n margin: 2px 0;\n color: $gray;\n }\n}\n\n.media-widget {\n > a {\n margin: 0 10px 0 0;\n @extend .btn;\n }\n}\n\nfieldset {\n padding: 0;\n legend {\n float: left;\n line-height: 1em;\n margin: 0;\n }\n .panel-body {\n clear: both;\n }\n}\n\nhtml.js {\n input.form-autocomplete {\n background: image-url(\"throbber.gif\") no-repeat right 8px #fff !important;\n }\n input.throbbing {\n background-position: right -122px !important;\n }\n fieldset.collapsed {\n height: auto;\n border-left-width: 1px;\n border-right-width: 1px;\n }\n}\n\n.views-exposed-form .views-exposed-widget .form-submit {\n margin-top: 1.8em;\n}\n\n@media (max-width: 767px) { \n form {\n .btn {\n width: 100%;\n display: block;\n clear: both;\n margin: 0 0 5px;\n }\n input.form-text,\n textarea,\n select {\n width: 100%;\n }\n .confirm-parent, \n .password-parent, \n .password-suggestions {\n width: auto !important;\n }\n .password-parent {\n div.password-strength {\n width: 150px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px;\n }\n }\n .confirm-parent {\n div.password-confirm {\n width: 110px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px;\n }\n }\n }\n}\n\n// Node Edit Form\n// -----------------------------------------------------------------------------\n#node-edit {\n #edit-title {\n font-size: 1.6em;\n line-height: 1.6em;\n height: 45px;\n width: 90%;\n }\n .form-item-path-alias {\n @include clearfix;\n label, input {\n display: inline;\n }\n }\n .burr-flipped-sidebar {\n .panel-pane {\n @include well;\n padding: 10px;\n .pane-title {\n margin-top: 0;\n }\n }\n .pane-node-form-buttons {\n background: none;\n padding: inherit;\n .form-actions {\n margin: 0;\n border-top: 0;\n }\n }\n }\n .pane-node-form-buttons {\n clear: both;\n }\n}\n\n.filter-wrapper {\n @include well;\n margin-top: 10px;\n .form-item {\n margin: 0 0 10px;\n padding: 0;\n }\n .filter-guidelines {\n padding: 0;\n .tips {\n margin-left: 0;\n }\n }\n}\n\n// Field Overview\n// -----------------------------------------------------------------------------\n.page-admin {\n form {\n table {\n select,\n input.form-text {\n width: 150px;\n }\n }\n }\n}\n\n// Features\n// -----------------------------------------------------------------------------\n#features-export-form {\n .features-export-parent {\n margin: 0 0 20px;\n fieldset.collapsed {\n min-height: 43px !important;\n background: none;\n }\n .features-export-list {\n padding: 10px;\n .form-item {\n float: none !important;\n }\n }\n }\n}\n\n// Panels edit content form.\n// -----------------------------------------------------------------------------\n#panels-panel-context-edit-move,\n#panels-panel-context-edit-content {\n .container {\n width: auto;\n padding: 0;\n .row {\n margin-bottom: 20px;\n }\n }\n}\n\n// Navbar form\n// -----------------------------------------------------------------------------\n.navbar-form {\n .form-wrapper {\n padding: 0;\n }\n .form-item-keys,\n .form-item {\n margin-top: 0 !important;\n }\n .form-submit {\n display: none;\n }\n}\n\n// Search form block\n// -----------------------------------------------------------------------------\n.pane-search-box {\n form {\n .form-wrapper {\n .form-group {\n display: block;\n margin-bottom: 10px;\n }\n }\n }\n}\n\n// Draggable tables\n// -----------------------------------------------------------------------------\n.tabledrag-handle .handle {\n box-sizing: content-box;\n}\n","// Sass Mixins\n// --------------------------------------------------\n@mixin transparent($color, $alpha) {\n $rgba: rgba($color, $alpha);\n $ie-hex-str: ie-hex-str($rgba);\n background-color: transparent;\n background-color: $rgba;\n filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#{$ie-hex-str},endColorstr=#{$ie-hex-str});\n zoom: 1;\n}\n\n@mixin well() {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: $well-bg;\n border: 1px solid darken($well-bg, 7%);\n @include border-radius(4px);\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n@mixin btn() {\n display: inline-block;\n}\n\n// Breakpoint mixin.\n// Usage: @include breakpoint(sm) { ... }\n// -----------------------------------------------------------------------------\n@mixin breakpoint($class) {\n @if $class == xs {\n @media (max-width: $screen-xs-max) { @content; }\n }\n @else if $class == sm {\n @media (min-width: $screen-sm) { @content; }\n }\n @else if $class == md {\n @media (min-width: $screen-md) { @content; }\n }\n @else if $class == lg {\n @media (min-width: $screen-lg) { @content; }\n }\n @else {\n @warn \"Breakpoint mixin supports: xs, sm, md, lg\";\n }\n}\n\n// Font Awesome.\n// Usage: @include fa(bars) { ... }\n// -----------------------------------------------------------------------------\n@mixin fa($icon) {\n @extend .fa;\n @extend .fa-#{$icon}\n}\n","// Layout\n// --------------------------------------------------\n.container {\n .container,\n .container-fluid {\n width: auto;\n margin-left: -15px;\n margin-right: -15px;\n }\n}\n\n#footer {\n margin: 36px 0;\n}\n","// Maintenance page\n// -----------------------------------------------------------------------------\nbody.maintenance-page {\n .container {\n max-width: 970px !important;\n }\n\n .jumbotron {\n background-color: #000000;\n color: white;\n padding: 20px 0;\n h1 {\n font-size: 3.0em;\n margin-top: 0;\n }\n @include breakpoint(md) {\n padding-top: 30px;\n padding-bottom: 30px;\n }\n }\n\n .main {\n padding-top: 20px;\n padding-bottom: 50px;\n }\n\n .page-header {\n h1 {\n font-size: 24px;\n @include breakpoint(md) {\n font-size: 36px;\n }\n }\n }\n\n // Tasks.\n // --------------------------------------------------\n .tasks-list {\n > div {\n margin-bottom: 25px;\n @extend .text-muted;\n h6 {\n margin-bottom: 2px;\n font-size: 14px;\n font-weight: normal;\n }\n h4 {\n margin-top: 0;\n font-size: 14px;\n }\n &.active,\n &.done {\n color: black;\n }\n }\n }\n\n // Forms.\n // --------------------------------------------------\n .form-actions {\n .btn {\n &:first-child {\n @extend .btn-primary;\n background-color: white;\n border-color: black;\n color: black;\n &:hover, &:focus {\n background-color: black;\n border-color: white;\n }\n }\n }\n }\n\n // Progress bar\n .progress {\n .progress-bar {\n background-color: black;\n }\n }\n\n // Theme selection form.\n #panopoly-theme-selection-form {\n .form-type-radio {\n margin: 0 0 2em;\n label {\n display: block;\n }\n .form-radio {\n margin: 0;\n left: 0;\n top: 40%;\n }\n }\n }\n}","// Styles for CTools Modal\n// --------------------------------------------------\nbody.ctools-modal-open {\n overflow: hidden;\n}\n#modalContent {\n .modal-content {\n width: 100%;\n overflow: hidden;\n box-shadow: none !important;\n }\n #modal-content {\n overflow: auto;\n width: 100% !important;\n background: white;\n }\n .panels-add-content-modal {\n background: none;\n padding: 0;\n height: 100%;\n margin: -20px -20px 0;\n width: 100%;\n position: absolute;\n }\n .panels-section-columns,\n .panels-categories-description {\n border: none;\n }\n .panels-section-column-categories {\n margin-left: 0;\n border-right: 1px solid #ccc;\n height: 100%;\n background: white;\n overflow: auto;\n padding-bottom: 20px;\n .btn {\n border: 1px solid $gray-light !important;\n line-height: inherit;\n margin: 0;\n text-align: left;\n }\n }\n .panels-categories-box {\n border: 0;\n a.btn {\n padding: 5px 10px;\n }\n a.active {\n background: $gray-lighter;\n box-shadow: none;\n }\n }\n .panels-root-content-box {\n a.btn {\n padding: 5px 10px;\n }\n }\n .panels-categories-description {\n padding: 20px;\n }\n .panels-section-columns {\n padding-bottom: 20px;\n }\n fieldset.widget-preview {\n margin-top: 18px;\n margin-bottom: 0;\n position: static;\n border: 1px solid #ddd;\n .panel-heading {\n position: relative;\n .btn {\n position: absolute;\n right: 10px;\n top: 5px;\n }\n }\n }\n .ctools-auto-submit-full-form {\n fieldset {\n width: 48%;\n display: block;\n fieldset {\n width: 100%;\n }\n &.widget-preview-single {\n float: right;\n margin-left: 1em;\n margin-top: 0;\n width: 48%;\n max-width: 48% !important;\n }\n }\n .form-actions {\n float: right;\n clear: right;\n width: 48%;\n max-width: 48%;\n text-align: right;\n }\n }\n .form-item-view-settings {\n display: block;\n }\n .form-item-exposed-use-pager {\n display: block;\n }\n #panopoly-form-widget-preview {\n width: 50%;\n float: right;\n .container {\n width: auto;\n }\n }\n}\n","// Basic menu blocks\n// -----------------------------------------------------------------------------\nul.menu > li > ul.menu {\n margin-left: 1em; /* LTR */\n}\n\n// Nav\n// -----------------------------------------------------------------------------\nul.nav {\n > li {\n &.dropdown {\n &:after {\n width: 100%;\n height: 2px;\n background: none;\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n content: '';\n }\n }\n }\n}\n\n// Nav expanded\n// -----------------------------------------------------------------------------\n.nav-expanded {\n .caret {\n display: none;\n }\n > li {\n > a {\n font-size: 1.2em;\n text-align: left;\n font-weight: 700;\n color: $text-color;\n &:hover, &:focus, &.active, &.active-trail {\n color: $link-hover-color;\n background: none;\n }\n }\n ul.dropdown-menu {\n background: none;\n display: block;\n border: 0;\n padding: 0;\n position: static;\n float: none;\n border-radius: 0;\n box-shadow: none;\n li {\n a {\n padding: 3px 15px;\n color: $text-color;\n &:hover, &:focus, &.active, &.active-trail {\n color: $link-hover-color;\n background: none;\n }\n }\n }\n ul {\n display: none !important;\n }\n }\n @include breakpoint(md) {\n float: none;\n margin-bottom: 18px;\n }\n &.open {\n > a {\n color: $text-color;\n background: none;\n &:hover, &:focus, &.active, &.active-trail {\n color: $link-hover-color;\n background: none;\n }\n }\n }\n }\n}\n","// Styles for Nodes\n// --------------------------------------------------\n\n// Miscellaneous\n// --------------------------------------------------\n.field-collection-container {\n border: 0;\n .field-collection-view {\n margin: 0;\n padding: 0;\n border: none;\n }\n}\n\n// Panopoly News\n// --------------------------------------------------\n.node-panopoly-page {\n // Teaser\n &.node-teaser {\n .panel-pane {\n margin: 0 0 10px 260px;\n }\n .pane-node-field-featured-image {\n float: left;\n margin-left: 0;\n }\n }\n @media (max-width: $screen-xs-max) {\n .panel-pane {\n float: none !important;\n margin: 0 0 10px !important;\n }\n }\n}\n\n// Panopoly News\n// --------------------------------------------------\n.node-panopoly-news-article {\n // Teaser\n &.node-teaser {\n .panel-pane {\n margin: 0 0 10px 260px;\n }\n .pane-node-field-featured-image {\n float: left;\n margin-left: 0;\n }\n }\n @media (max-width: $screen-xs-max) {\n .panel-pane {\n float: none !important;\n margin: 0 0 10px !important;\n }\n }\n}\n","// General\n// -----------------------------------------------------------------------------\n.panel-display {\n > .row {\n margin-bottom: 20px;\n }\n}\n.panel-flexible .panel-separator {\n display: none;\n}\n\n// Admin\n// -----------------------------------------------------------------------------\n.panels-layouts-checkboxes {\n // Undo default Radix styling so the radio button can appear above the layout.\n input[type=\"radio\"] {\n position: static;\n margin-left: 0px;\n margin-bottom: 20px;\n }\n label {\n margin-left: 0px;\n }\n .form-type-radio {\n margin: 0 !important;\n }\n}\n\n// IPE\n// -----------------------------------------------------------------------------\nbody.panels-ipe {\n margin-bottom: 55px !important;\n}\n\ndiv#panels-ipe-control-container {\n width: auto;\n left: 0;\n right: 0;\n box-shadow: none;\n .panels-ipe-button-container {\n text-align: center;\n .panels-ipe-pseudobutton-container {\n margin: 0 5px;\n a {\n padding: 0px 10px 0px 34px;\n &:hover {\n text-decoration: none;\n }\n }\n }\n }\n .panels-ipe-form-container {\n form {\n > div {\n text-align: center;\n }\n .form-submit {\n margin: 0 5px;\n padding: 0px 10px 0px 34px;\n &:hover {\n box-shadow: none;\n }\n }\n }\n }\n}\n\nul.panels-ipe-linkbar {\n list-style: none outside none;\n > li {\n display: inline-block;\n margin: 0 0 0 5px;\n a {\n margin: 0 !important;\n }\n }\n}\n","// Site name and logo\n// -----------------------------------------------------------------------------\n#logo {\n display: block;\n float: left;\n margin-right: $navbar-padding-horizontal;\n\n // Resize the logo to fit the height of the navbar (which a child theme may\n // change on the desktop).\n height: 100%;\n width: auto;\n}\n#site-name {\n float: left;\n}\n\n// Page header\n// -----------------------------------------------------------------------------\n.page-header {\n margin: 0 0 18px;\n h1 {\n margin: 0;\n }\n}\n\n// Hide the .page-header for pages with .page-title-hidden.\n.page-title-hidden {\n .page-header {\n display: none;\n }\n}\n\n// Breadcrumb\n// -----------------------------------------------------------------------------\n.breadcrumb {\n a {\n i {\n display: none;\n }\n }\n}\n\n// Tabs\n// -----------------------------------------------------------------------------\n.tabs,\n.nav-tabs {\n margin: 0 0 18px;\n}\n\n// Action Links\n// -----------------------------------------------------------------------------\n.action-links {\n list-style: none outside none;\n margin: 0 0 18px;\n padding: 0;\n @include clearfix;\n\n > li {\n float: left;\n margin: 0 10px 0 0;\n }\n}\n\n// Vertical Tabs\n// -----------------------------------------------------------------------------\ndiv.vertical-tabs {\n border: none;\n border: 1px solid #DDD;\n outline: none;\n border-radius: 4px;\n ul.vertical-tabs-list {\n border: none;\n margin-top: 20px;\n margin-bottom: 20px;\n outline: none;\n li {\n border: none;\n background: none;\n outline: none !important;\n border-radius: 4px 0 0 4px;\n border: 1px solid;\n border-color: #fff #ddd #fff #fff;\n &.selected {\n border-color: #ddd #fff #ddd #ddd;\n }\n a {\n outline: none !important;\n border-radius: 4px 0 0 4px;\n &:hover {\n color: #fff;\n background: $link-color;\n text-decoration: none;\n strong {\n text-decoration: none;\n color: #fff;\n }\n }\n }\n }\n }\n .vertical-tabs-panes {\n padding: 20px 10px;\n }\n .form-type-textfield input {\n width: 90%;\n box-sizing: content-box;\n }\n}\n\n// Tables\n// --------------------------------------------------\ntable {\n width: 100%;\n margin-bottom: $line-height-base;\n // Cells\n th,\n td {\n padding: 8px;\n line-height: $line-height-base;\n text-align: left;\n vertical-align: top;\n border-top: 1px solid $table-border-color;\n &.checkbox {\n text-align: center;\n display: table-cell;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0;\n input {\n float: none !important;\n margin-left: 0 !important;\n }\n div.checkbox {\n text-align: center;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0;\n }\n }\n }\n th {\n font-weight: bold;\n }\n // Bottom align for column headings\n thead th {\n vertical-align: bottom;\n }\n // Remove top border from thead by default\n caption + thead tr:first-child th,\n caption + thead tr:first-child td,\n colgroup + thead tr:first-child th,\n colgroup + thead tr:first-child td,\n thead:first-child tr:first-child th,\n thead:first-child tr:first-child td {\n border-top: 0;\n }\n // Account for multiple tbody instances\n tbody + tbody {\n border-top: 2px solid $table-border-color;\n }\n}\n\n// Links\n// --------------------------------------------------\nul.links {\n padding: 0;\n list-style: none outside none;\n &.inline {\n margin: 0;\n li {\n margin: 0 10px 0 0;\n padding: 0;\n }\n }\n}\n\n// Carousel\n// --------------------------------------------------\n.carousel {\n .carousel-control {\n z-index: 100;\n }\n .carousel-indicators li {\n float: none;\n margin-left: 3px;\n margin-right: 3px;\n a {\n display: none;\n }\n }\n .carousel-caption {\n h1, h2, h3, h4, h5, h6 {\n color: white;\n }\n }\n}\n\n// Pager\n// --------------------------------------------------\n.item-list {\n ul.pagination {\n margin: 20px 0;\n > li {\n margin: 0;\n display: inline-block;\n padding: 0;\n position: relative;\n > a, > span {\n padding: 6px 12px;\n border-radius: inherit;\n &.progress-disabled {\n float: left;\n }\n }\n .ajax-progress {\n float: left;\n padding: 6px 5px 6px 10px;\n }\n }\n }\n}\n\n// Misc Fixes\n// --------------------------------------------------\n.ctools-dropdown-container {\n hr {\n margin: 0;\n }\n}\n\nul.nav,\nul.navl li,\nul.dropdown-menu,\nul.dropdown-menu li {\n list-style: none outside none !important;\n}\n\n// Calendar\n// --------------------------------------------------\n.calendar-calendar {\n @extend .col-md-12;\n table.mini {\n @extend .table-bordered;\n td {\n border: 1px solid $gray-lighter !important;\n padding: 5px;\n }\n }\n}\n.view-header {\n .date-nav-wrapper {\n h3 {\n margin-top: 5px !important;\n margin-bottom: 0;\n }\n }\n}\n\n// jQuery UI tabs\n// --------------------------------------------------\n.ui-tabs .ui-tabs-nav {\n padding: 0 5px 5px 5px;\n}\n","// Styles for Views\n// --------------------------------------------------\n\n// Fixes\n// --------------------------------------------------\n.view {\n .row {\n > .list-group {\n @extend .col-md-12;\n }\n }\n}\n.views-exposed-form {\n .views-submit-button,\n .views-reset-button {\n margin-top: 3px;\n }\n}\n","// Mixins\n// -----------------------------------------------------------------------------\n@mixin blockbox {\n @include border-radius(5px);\n border: 1px solid $border;\n margin-bottom: 20px;\n padding:0px;\n .pane-content {\n background-color: transparent;\n margin: 0;\n padding: 15px;\n }\n}\n\n@mixin block-title {\n @include border-radius(3px 3px 0 0);\n border: 1px solid;\n border-bottom: none;\n font-size: 16px;\n line-height: 1.3;\n margin: 0;\n padding: 7px 10px;\n font-weight: normal;\n}\n\n@mixin searchbox {\n form {\n display:block;\n margin:8px 0;\n position:relative;\n width: 100%;\n }\n input.form-text {\n padding-right:30px;\n }\n button[type=\"submit\"],\n input[type=\"submit\"] {\n background:none !important;\n border:none;\n content:\"\\f002\";\n color: $gray;\n display: inline-block;\n font-size: 1.3em;\n font-family: $icon-fa;\n margin: 0;\n padding:0;\n position: absolute;\n right:10px;\n width:25px;\n top: 2px;\n }\n}\n@mixin h4 {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em;\n}\n\n%button {\n // background:$brand-primary;\n // border-color:$brand-primary;\n color: white;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n white-space: nowrap;\n padding: 5px 12px;\n line-height: 1.4em;\n @include border-radius(4px);\n}\n%button:hover, \n%button:focus, \n%button:active {\n // background:$brand-secondary;\n // border-color:$brand-secondary;\n color: white;\n text-decoration: none;\n}\n%button-attached {\n @include border-radius(0 $border-radius-base $border-radius-base 0);\n padding-left: 10px;\n padding-right: 10px;\n}\n\n%screenreader {\n position: absolute;\n top:0;\n left:-9999px\n}\n\n// Force wrap content: https://perishablepress.com/wrapping-content/\n@mixin wrap {\n white-space: pre; /* CSS 2.0 */\n white-space: pre-wrap; /* CSS 2.1 */\n white-space: pre-line; /* CSS 3.0 */\n white-space: -pre-wrap; /* Opera 4-6 */\n white-space: -o-pre-wrap; /* Opera 7 */\n white-space: -moz-pre-wrap; /* Mozilla */\n white-space: -hp-pre-wrap; /* HP Printers */\n word-wrap: break-word; /* IE 5+ */ \n word-break: break-word;\n}\n\n@mixin card {\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.16), 0 0 10px 0 rgba(0, 0, 0, 0.12);\n margin-top: 10px;\n box-sizing: border-box;\n border-radius: 2px;\n background-clip: padding-box;\n text-align: center;\n\n img {\n display: block;\n margin: 0 auto;\n }\n\n h2 {\n margin:.75em 1em;\n text-align: center;\n }\n\n .content {\n margin-left: 1em;\n margin-right: 1em;\n }\n\n .btn-primary {\n margin: 0 auto 1.5em;\n }\n}\n\n@mixin item-list {\n a {\n border: 1px solid $border;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n &:hover {\n color: #ffffff;\n text-decoration: none;\n background: $brand-primary;\n }\n }\n &:first-of-type a {\n @include border-radius(4px 4px 0px 0px);\n }\n &:last-of-type a {\n @include border-radius(0px 0px 4px 4px);\n }\n}\n\n@mixin pointer {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 17px 0 17px 15px;\n border-color: transparent $smoke;\n display: block;\n width: 0;\n z-index: 1;\n right: -15px;\n top: 0;\n}",".clearfix {\n overflow: visible;\n}\n.admin-list {\n dt, dd{\n display:inline-block;\n float:none;\n vertical-align: top;\n }\n}\n.views-edit-view {\n\t.action-list {\n\t\tinput.btn,\n\t\tinput.btn:active,\n\t\tinput.btn:focus,\n\t\tinput.btn:hover, \n\t\tinput[type=\"submit\"]:hover {\n\t\t\tbackground: inherit;\n\t\t\tborder: none;\n\t\t\tcolor: inherit;\n\t\t}\n\t}\n\t.footer {\n\t\tbackground: inherit;\n\t}\n}\n\n.modal-content {\n\t.panels-root-content-box a.btn {\n\t\twhite-space: normal;\n\t}\n\t.panel-title {\n\t\tpadding-right: 55px;\n\t}\n}\n\n.views-displays .secondary .open > a:hover {\n\tcolor: #666;\n}\n\n.media-thumbnails-select {\n\tpadding: 0 0 40px;\n}\n\n.page-admin .alert {\n margin: 10px 0;\n}\n// Admin tables.\n.page-admin {\n .container.main {\n width: 100%;\n }\n .table-bordered > thead > tr > th,\n .table-bordered > tbody > tr > th,\n .table-bordered > tbody > tr > td {\n border: none;\n }\n table thead > tr > th.checkbox, \n table.table thead > tr > th.checkbox,\n .table-bordered > tbody > tr > th.checkbox,\n .table-bordered > tbody > tr > td.checkbox,\n .table-striped > tbody > tr:nth-child(odd) > td.checkbox,\n .table-striped > tbody > tr:nth-child(odd) > th.checkbox {\n background-color: transparent;\n border: none;\n margin: 0;\n display: table-cell;\n position: relative;\n }\n .table tbody tr:hover td.checkbox, \n .table tbody tr:hover th.checkbox {\n background-color: #FFFEEE;\n }\n table th.checkbox, \n table td.checkbox {\n label {\n line-height:0;\n padding: 4px;\n vertical-align: top;\n }\n input[type=\"checkbox\"],\n input {\n float: none !important;\n margin: 0 !important;\n position: relative;\n }\n }\n}\n","// OTHER ACCESS\n.pane-dkan-sitewide-dkan-sitewide-other-access,\n#block-dkan-sitewide-dkan-sitewide-other-access {\n a.btn {\n background-image: auto;\n border:1px solid $smoke;\n padding:6px 10px 6px 36px;\n position:relative;\n i {\n background-position: 0 0;\n position:absolute;\n top:8px;\n left:5px;\n visibility:visible;\n &.ckan-icon-rdfxml {\n background-image: url(../images/rdf.png);\n }\n &.ckan-icon-json {\n background-image: url(../images/json.png);\n }\n }\n &:hover {\n background-color:$gray-lighter;\n }\n }\n .btn-group {\n margin:.6em 0;\n .btn:first-child {\n background-image: url(../images/json.png);\n background-repeat:no-repeat;\n background-position: 10px 10px;\n }\n .btn:last-child {\n background-image: url(../images/rdf.png);\n background-repeat:no-repeat;\n background-position: 10px 10px;\n }\n }\n}\n\n// DKAN FORMS\n#block-dkan-forms-dkan-forms-dataset-help h2.block-title::before{\n content: \"\\f05a\";\n font-family: $icon-fa;\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em;\n}\n\n// FACET Blocks\n.radix-layouts-sidebar {\n .ctools-collapsible-container,\n div[class*=\"pane-facetapi\"],\n .block-facetapi {\n &.pane-block,\n .pane-content {\n border: none;\n margin: 0;\n padding:0;\n @include border-radius(0);\n }\n .item-list {\n border: 1px solid $border;\n .facetapi-limit-link {\n padding: 10px 22px;\n &:before {\n top: 10px;\n right: 22px;\n }\n }\n }\n h2.pane-title {\n @include border-radius(0);\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: normal;\n position: relative;\n padding: 9px 21px 9px 12px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n &:after {\n font-family: \"fontawesome\";\n content: \"\\f077\";\n color: rgba(255, 255, 255, 0.7);\n font-size: 12px;\n font-weight: bold;\n position: absolute;\n right: 14px;\n top: 10px;\n }\n }\n &.ctools-collapsed {\n h2.pane-title:after {\n content: \"\\f078\";\n }\n }\n .ctools-toggle {\n background: none;\n }\n ul {\n margin:0;\n padding:0;\n }\n ul li.leaf {\n list-style-type:none;\n list-style-image:none;\n margin:0;\n padding:0;\n li {\n position:relative;\n a {\n padding-right:48px;\n }\n }\n &.last {\n border-bottom:none;\n }\n li:before {\n content:\"\\f178\";\n font-family:$icon-fa;\n position:absolute;\n top:4px;\n right:30px;\n }\n a {\n color:$gray-dark;\n display:block;\n padding:6px 20px 6px 10px;\n position:relative;\n line-height: 22px;\n &:focus,\n &:hover {\n color:darken($gray-dark, 10%);\n background: rgba(black, 0.03);\n text-decoration:none;\n }\n &:hover:after {\n content:\"\\f055\";\n color:$brand-success;\n font-family:$icon-fa;\n position:absolute;\n top:6px;\n right:6px;\n }\n img {\n height: 25px;\n width: 25px;\n margin: 0 16px 0 0;\n }\n }\n a.facetapi-active {\n background:$smoke;\n color:#333;\n z-index:0;\n }\n a.facetapi-active:before {\n @include pointer;\n }\n a.facetapi-active:after {\n content:\"\\f00d\";\n font-family:$icon-fa;\n position:absolute;\n top:6px;\n right:6px;\n }\n a.facetapi-active:hover:after {\n color:red;\n }\n }\n a.facetapi-limit-link {\n display:block;\n padding:5px 30px 5px 5px;\n position:relative;\n }\n a.facetapi-limit-link:before {\n content:\"\\f150\";\n font-family:$icon-fa;\n position:absolute;\n top:6px;\n right:15px;\n }\n a.facetapi-limit-link.open:before {\n content:\"\\f151\";\n }\n }\n .ctools-collapsible-container .ctools-toggle {\n width: 12px;\n }\n}\n// Date facets.\n.facetapi-facet-changed {\n li.expanded {\n a.facetapi-active {\n background: #ccc;\n border-bottom: 1px dotted #eee;\n color: #333;\n line-height: 22px;\n padding: 6px 20px 6px 10px;\n &:hover {\n background: #ccc;\n color: #333;\n text-decoration: none;\n &:after {\n color: red;\n }\n }\n &:before {\n @include pointer;\n }\n &:after {\n content: \"\\f00d\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px;\n }\n }\n ul.expanded li.leaf a,\n li.expanded a {\n padding: 6px 20px 6px 20px;\n }\n .item-list {\n border: none;\n }\n }\n}\n\n// Wrap long value strings.\n.facetapi-facet-field-license a {\n @include wrap;\n}\n\n// Groups\n.pane-views-group-block-block,\n#block-views-group-block-block {\n overflow:hidden;\n .views-field-title a {\n display: block;\n padding: .5em 0;\n }\n .views-field-body p {\n margin: .5em 0 1em;\n }\n .group-subscribe-message {\n @include border-bottom-radius(4px);\n background: $brand-primary;\n color: #fff;\n padding:5px;\n text-align: center;\n margin-left: -15px;\n margin-right: -15px;\n a {\n color: #fff;\n display: block;\n }\n }\n}\n\n// Dataset page Group block.\n.radix-layouts-sidebar .pane-block.pane-views-group-block-block .pane-content {\n padding: 0 15px;\n}\n\n#block-dkan-dataset-dkan-dataset-dataset-help {\n .content {\n padding: 10px;\n }\n}\n\n#block-dkan-forms-dkan-forms-dataset-help {\n h2:before {\n content: \"\\f05a\";\n font-family: $icon-fa;\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em;\n }\n}\n\n// Front page hero blocks.\n.pane-dkan-sitewide-demo-front-dkan-demo-front,\n#block-dkan-sitewide-demo-front-dkan-demo-front {\n -webkit-box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.5);\n -moz-box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.5);\n box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.5);\n //background-color: rgba($brand-primary, 0.5);\n p {\n color: #fff;\n padding: 15px;\n }\n .media-overlay {\n position: relative;\n padding: 0;\n img {\n width: 100%;\n height: auto;\n }\n }\n .media-overlay .media-heading {\n background-color: rgba(0, 0, 0, 0.8);\n bottom: 0;\n color: #FFFFFF;\n font-size: 13px;\n left: 0;\n line-height: 18px;\n margin: 0;\n padding: 12px 10px;\n position: absolute;\n right: 0;\n z-index: 1;\n }\n}\n// Sidebar Social Links.\n.radix-layouts-sidebar .pane-dkan-sitewide-dkan-sitewide-social.pane-block .pane-content {\n padding: 0;\n li.last a:hover {\n @include border-radius(0 0 3px 3px);\n }\n}\n// Additional Information block.\n.pane-dkan-sitewide-dkan-sitewide-resource-add {\n table {\n margin-top: 0;\n }\n}\n// Rounded facet corners.\n.radix-layouts-sidebar {\n .panel-panel-inner {\n .panels-ipe-portlet-wrapper:first-child,\n > div[class*=\"pane-facetapi\"]:first-child {\n h2.pane-title {\n @include border-radius(5px 5px 0 0);\n }\n }\n .panels-ipe-portlet-wrapper:last-child,\n > div[class*=\"pane-facetapi\"]:last-child {\n .ctools-collapsed,\n &.ctools-collapsed {\n h2.pane-title {\n @include border-radius(0 0 5px 5px);\n }\n }\n }\n }\n}","// Variables\n// -----------------------------------------------------------------------------\n\n// bootstrap specific variable. set to false if not using ruby + asset pipeline / compass.\n$bootstrap-sass-asset-helper: false !default;\n\n// Global values\n// -----------------------------------------------------------------------------\n\n// Grays\n// -----------------------------------------------------------------------------\n\n$gray-darker: lighten(#000, 13.5%) !default; // #222\n$gray-dark: lighten(#000, 20%) !default; // #333\n$gray: lighten(#000, 33.5%) !default; // #555\n$gray-light: lighten(#000, 60%) !default; // #999\n$gray-lighter: lighten(#000, 93.5%) !default; // #eee\n$smoke: #ccc;\n$shade: #F3F3F3;\n$border: #ddd;\n\n// Brand colors\n// -----------------------------------------------------------------------------\n\n$brand-primary: #0A77BD;\n$brand-secondary: #002245;\n$brand-success: #5cb85c !default;\n$brand-warning: #FFE285 !default;\n$brand-danger: #d9534f !default;\n$brand-info: #5bc0de !default;\n\n// Scaffolding\n// -----------------------------------------------------------------------------\n\n$body-bg: #fff !default;\n$text-color: $gray-dark !default;\n\n// Links\n// -----------------------------------------------------------------------------\n\n$link-color: $brand-primary !default;\n$link-hover-color: darken($link-color, 15%) !default;\n\n// Typography\n// -----------------------------------------------------------------------------\n\n$font-base:\t\t\t\t\t\t\t\t'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-sans-serif: 'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n$font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base: $font-base !default;\n\n$font-size-base: 16px !default;\n$font-size-large: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-small: ceil($font-size-base * 0.85) !default; // ~12px\n\n$font-size-h1: floor($font-size-base * 2.6) !default; // ~36px\n$font-size-h2: floor($font-size-base * 2.15) !default; // ~30px\n$font-size-h3: ceil($font-size-base * 1.7) !default; // ~24px\n$font-size-h4: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-h5: $font-size-base !default;\n$font-size-h6: ceil($font-size-base * 0.85) !default; // ~12px\n\n$line-height-base: 2 !default; // 20/14\n$line-height-computed: floor($font-size-base * $line-height-base) !default; // ~20px\n\n$headings-font-family: $font-family-base !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n\n// Iconography\n// -----------------------------------------------------------------------------\n\n$icon-fa: 'FontAwesome';\n\n// Components\n// -----------------------------------------------------------------------------\n// Based on 14px font-size and 1.428 line-height (~20px to start)\n\n$padding-base-vertical: 6px !default;\n$padding-base-horizontal: 12px !default;\n\n$padding-large-vertical: 10px !default;\n$padding-large-horizontal: 16px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 10px !default;\n\n$padding-xs-vertical: 1px !default;\n$padding-xs-horizontal: 5px !default;\n\n$line-height-large: 1.33 !default;\n$line-height-small: 1.5 !default;\n\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-small: 3px !default;\n\n$component-active-color: #fff !default;\n$component-active-bg: $brand-primary !default;\n\n$caret-width-base: 4px !default;\n$caret-width-large: 5px !default;\n\n// Tables\n// -----------------------------------------------------------------------------\n\n$table-cell-padding: 8px !default;\n$table-condensed-cell-padding: 5px !default;\n\n$table-bg: transparent !default; // overall background-color\n$table-bg-accent: #f9f9f9 !default; // for striping\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n$table-border-color: #ddd !default; // table and cell border\n\n\n// Buttons\n// -----------------------------------------------------------------------------\n\n$btn-font-weight: normal !default;\n\n$btn-default-color: #333 !default;\n$btn-default-bg: #fff !default;\n$btn-default-border: #ccc !default;\n\n$btn-primary-color: #fff !default;\n$btn-primary-bg: $brand-primary !default;\n$btn-primary-border: darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color: #fff !default;\n$btn-success-bg: $brand-success !default;\n$btn-success-border: darken($btn-success-bg, 5%) !default;\n\n$btn-warning-color: #fff !default;\n$btn-warning-bg: $brand-warning !default;\n$btn-warning-border: darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color: #fff !default;\n$btn-danger-bg: $brand-danger !default;\n$btn-danger-border: darken($btn-danger-bg, 5%) !default;\n\n$btn-info-color: #fff !default;\n$btn-info-bg: $brand-info !default;\n$btn-info-border: darken($btn-info-bg, 5%) !default;\n\n$btn-link-disabled-color: $gray-light !default;\n\n\n// Forms\n// -----------------------------------------------------------------------------\n\n$input-bg: #fff !default;\n$input-bg-disabled: $gray-lighter !default;\n\n$input-color: $gray !default;\n$input-border: #ccc !default;\n$input-border-radius: $border-radius-base !default;\n$input-border-focus: #66afe9 !default;\n\n$input-color-placeholder: $gray-light !default;\n\n$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n$legend-color: $gray-dark !default;\n$legend-border-color: #e5e5e5 !default;\n\n$input-group-addon-bg: $gray-lighter !default;\n$input-group-addon-border-color: $input-border !default;\n\n\n// Dropdowns\n// -----------------------------------------------------------------------------\n\n$dropdown-bg: #fff !default;\n$dropdown-border: rgba(0,0,0,.15) !default;\n$dropdown-fallback-border: #ccc !default;\n$dropdown-divider-bg: #e5e5e5 !default;\n\n$dropdown-link-color: $gray-dark !default;\n$dropdown-link-hover-color: darken($gray-dark, 5%) !default;\n$dropdown-link-hover-bg: #f5f5f5 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-light !default;\n\n$dropdown-header-color: $gray-light !default;\n\n\n// COMPONENT VARIABLES\n// ------------------------------------------------------------------------------------------------------\n\n\n// Z-index master list\n// -----------------------------------------------------------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n\n$zindex-navbar: 1000 !default;\n$zindex-dropdown: 1000 !default;\n$zindex-popover: 1010 !default;\n$zindex-tooltip: 1030 !default;\n$zindex-navbar-fixed: 1030 !default;\n$zindex-modal-background: 1040 !default;\n$zindex-modal: 1050 !default;\n\n// Media queries breakpoints\n// ------------------------------------------------------------------------------------------------------\n\n// Extra small screen / phone\n// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1\n$screen-xs: 480px !default;\n$screen-xs-min: $screen-xs !default;\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n// Grid system\n// ------------------------------------------------------------------------------------------------------\n\n// Number of columns in the grid system\n$grid-columns: 12 !default;\n// Padding, to be divided by two and applied to the left and right of all columns\n$grid-gutter-width: 30px !default;\n\n// Navbar collapse\n\n// Point at which the navbar becomes uncollapsed\n$grid-float-breakpoint: $screen-sm-min !default;\n// Point at which the navbar begins collapsing\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n// Navbar\n// -----------------------------------------------------------------------------\n\n// Basics of a navbar\n$navbar-height: 50px !default;\n$navbar-margin-bottom: $line-height-computed !default;\n$navbar-border-radius: $border-radius-base !default;\n$navbar-padding-horizontal: floor($grid-gutter-width / 2) !default;\n$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;\n\n$navbar-default-color: #777 !default;\n$navbar-default-bg: #f8f8f8 !default;\n$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color: #777 !default;\n$navbar-default-link-hover-color: #333 !default;\n$navbar-default-link-hover-bg: transparent !default;\n$navbar-default-link-active-color: #555 !default;\n$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color: #ccc !default;\n$navbar-default-link-disabled-bg: transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color: $navbar-default-link-color !default;\n$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg: transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg: #ddd !default;\n$navbar-default-toggle-icon-bar-bg: #ccc !default;\n$navbar-default-toggle-border-color: #ddd !default;\n\n\n// Inverted navbar\n//\n// Reset inverted navbar basics\n$navbar-inverse-color: $gray-light !default;\n$navbar-inverse-bg: #222 !default;\n$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color: $gray-light !default;\n$navbar-inverse-link-hover-color: #fff !default;\n$navbar-inverse-link-hover-bg: transparent !default;\n$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color: #444 !default;\n$navbar-inverse-link-disabled-bg: transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color: $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color: #fff !default;\n$navbar-inverse-brand-hover-bg: transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg: #333 !default;\n$navbar-inverse-toggle-icon-bar-bg: #fff !default;\n$navbar-inverse-toggle-border-color: #333 !default;\n\n\n// Navs\n// -----------------------------------------------------------------------------\n\n$nav-link-padding: 10px 15px !default;\n$nav-link-hover-bg: $gray-lighter !default;\n\n$nav-disabled-link-color: $gray-light !default;\n$nav-disabled-link-hover-color: $gray-light !default;\n\n$nav-open-link-hover-color: #fff !default;\n\n// Tabs\n$nav-tabs-border-color: #ddd !default;\n\n$nav-tabs-link-hover-border-color: $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg: $body-bg !default;\n$nav-tabs-active-link-hover-color: $gray !default;\n$nav-tabs-active-link-hover-border-color: #ddd !default;\n\n$nav-tabs-justified-link-border-color: #ddd !default;\n$nav-tabs-justified-active-link-border-color: $body-bg !default;\n\n// Pills\n$nav-pills-border-radius: $border-radius-base !default;\n$nav-pills-active-link-hover-bg: $component-active-bg !default;\n$nav-pills-active-link-hover-color: $component-active-color !default;\n\n\n// Pagination\n// -----------------------------------------------------------------------------\n\n$pagination-bg: #fff !default;\n$pagination-border: #ddd !default;\n\n$pagination-hover-bg: $gray-lighter !default;\n\n$pagination-active-bg: $brand-primary !default;\n$pagination-active-color: #fff !default;\n\n$pagination-disabled-color: $gray-light !default;\n\n\n// Pager\n// -----------------------------------------------------------------------------\n\n$pager-border-radius: 15px !default;\n$pager-disabled-color: $gray-light !default;\n\n\n// Jumbotron\n// -----------------------------------------------------------------------------\n\n$jumbotron-padding: 30px !default;\n$jumbotron-color: inherit !default;\n$jumbotron-bg: $gray-lighter !default;\n$jumbotron-heading-color: inherit !default;\n$jumbotron-font-size: ceil($font-size-base * 1.5) !default;\n\n\n// Form states and alerts\n// -----------------------------------------------------------------------------\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n// Tooltips\n// -----------------------------------------------------------------------------\n$tooltip-max-width: 200px !default;\n$tooltip-color: #fff !default;\n$tooltip-bg: #000 !default;\n\n$tooltip-arrow-width: 5px !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n// -----------------------------------------------------------------------------\n$popover-bg: #fff !default;\n$popover-max-width: 276px !default;\n$popover-border-color: rgba(0,0,0,.2) !default;\n$popover-fallback-border-color: #ccc !default;\n\n$popover-title-bg: darken($popover-bg, 3%) !default;\n\n$popover-arrow-width: 10px !default;\n$popover-arrow-color: #fff !default;\n\n$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;\n$popover-arrow-outer-color: rgba(0,0,0,.25) !default;\n$popover-arrow-outer-fallback-color: #999 !default;\n\n\n// Labels\n// -----------------------------------------------------------------------------\n\n$label-default-bg: $gray-light !default;\n$label-primary-bg: $brand-primary !default;\n$label-success-bg: $brand-success !default;\n$label-info-bg: $brand-info !default;\n$label-warning-bg: $brand-warning !default;\n$label-danger-bg: $brand-danger !default;\n\n$label-color: #fff !default;\n$label-link-hover-color: #fff !default;\n\n\n// Modals\n// -----------------------------------------------------------------------------\n$modal-inner-padding: 20px !default;\n\n$modal-title-padding: 15px !default;\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: #fff !default;\n$modal-content-border-color: rgba(0,0,0,.2) !default;\n$modal-content-fallback-border-color: #999 !default;\n\n$modal-backdrop-bg: #000 !default;\n$modal-header-border-color: #e5e5e5 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n\n\n// Alerts\n// -----------------------------------------------------------------------------\n$alert-padding: 15px !default;\n$alert-border-radius: $border-radius-base !default;\n$alert-link-font-weight: bold !default;\n\n$alert-success-bg: $state-success-bg !default;\n$alert-success-text: $state-success-text !default;\n$alert-success-border: $state-success-border !default;\n\n$alert-info-bg: $state-info-bg !default;\n$alert-info-text: $state-info-text !default;\n$alert-info-border: $state-info-border !default;\n\n$alert-warning-bg: $state-warning-bg !default;\n$alert-warning-text: $state-warning-text !default;\n$alert-warning-border: $state-warning-border !default;\n\n$alert-danger-bg: $state-danger-bg !default;\n$alert-danger-text: $state-danger-text !default;\n$alert-danger-border: $state-danger-border !default;\n\n\n// Progress bars\n// -----------------------------------------------------------------------------\n$progress-bg: #f5f5f5 !default;\n$progress-bar-color: #fff !default;\n\n$progress-bar-bg: $brand-primary !default;\n$progress-bar-success-bg: $brand-success !default;\n$progress-bar-warning-bg: $brand-warning !default;\n$progress-bar-danger-bg: $brand-danger !default;\n$progress-bar-info-bg: $brand-info !default;\n\n\n// List group\n// -----------------------------------------------------------------------------\n$list-group-bg: #fff !default;\n$list-group-border: #ddd !default;\n$list-group-border-radius: $border-radius-base !default;\n\n$list-group-hover-bg: #f5f5f5 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border: $list-group-active-bg !default;\n\n$list-group-link-color: #555 !default;\n$list-group-link-heading-color: #333 !default;\n\n\n// Panels\n// -----------------------------------------------------------------------------\n$panel-bg: #fff !default;\n$panel-inner-border: #ddd !default;\n$panel-border-radius: $border-radius-base !default;\n$panel-footer-bg: #f5f5f5 !default;\n\n$panel-default-text: $gray-dark !default;\n$panel-default-border: #ddd !default;\n$panel-default-heading-bg: #f5f5f5 !default;\n\n$panel-primary-text: #fff !default;\n$panel-primary-border: $brand-primary !default;\n$panel-primary-heading-bg: $brand-primary !default;\n\n$panel-success-text: $state-success-text !default;\n$panel-success-border: $state-success-border !default;\n$panel-success-heading-bg: $state-success-bg !default;\n\n$panel-warning-text: $state-warning-text !default;\n$panel-warning-border: $state-warning-border !default;\n$panel-warning-heading-bg: $state-warning-bg !default;\n\n$panel-danger-text: $state-danger-text !default;\n$panel-danger-border: $state-danger-border !default;\n$panel-danger-heading-bg: $state-danger-bg !default;\n\n$panel-info-text: $state-info-text !default;\n$panel-info-border: $state-info-border !default;\n$panel-info-heading-bg: $state-info-bg !default;\n\n\n// Thumbnails\n// -----------------------------------------------------------------------------\n$thumbnail-padding: 4px !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border: #ddd !default;\n$thumbnail-border-radius: $border-radius-base !default;\n\n$thumbnail-caption-color: $text-color !default;\n$thumbnail-caption-padding: 9px !default;\n\n\n// Wells\n// -----------------------------------------------------------------------------\n$well-bg: #f5f5f5 !default;\n\n\n// Badges\n// -----------------------------------------------------------------------------\n$badge-color: #fff !default;\n$badge-link-hover-color: #fff !default;\n$badge-bg: $gray-light !default;\n\n$badge-active-color: $link-color !default;\n$badge-active-bg: #fff !default;\n\n$badge-font-weight: bold !default;\n$badge-line-height: 1 !default;\n$badge-border-radius: 10px !default;\n\n\n// Breadcrumbs\n// -----------------------------------------------------------------------------\n$breadcrumb-bg: #f5f5f5 !default;\n$breadcrumb-color: #ccc !default;\n$breadcrumb-active-color: $gray-light !default;\n$breadcrumb-separator: \"/\" !default;\n\n\n// Carousel\n// ------------------------\n\n$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color: #fff !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-font-size: 20px !default;\n\n$carousel-indicator-active-bg: #fff !default;\n$carousel-indicator-border-color: #fff !default;\n\n$carousel-caption-color: #fff !default;\n\n\n// Close\n// ------------------------\n$close-font-weight: bold !default;\n$close-color: #000 !default;\n$close-text-shadow: 0 1px 0 #fff !default;\n\n\n// Code\n// ------------------------\n$code-color: #c7254e !default;\n$code-bg: #f9f2f4 !default;\n\n$pre-bg: #f5f5f5 !default;\n$pre-color: $gray-dark !default;\n$pre-border-color: #ccc !default;\n$pre-scrollable-max-height: 340px !default;\n\n// Type\n// ------------------------\n$text-muted: $gray-light !default;\n$abbr-border-color: $gray-light !default;\n$headings-small-color: $gray-light !default;\n$blockquote-small-color: $gray-light !default;\n$blockquote-border-color: $gray-lighter !default;\n$page-header-border-color: $gray-lighter !default;\n\n// Miscellaneous\n// -----------------------------------------------------------------------------\n\n// Hr border color\n$hr-border: $gray-lighter !default;\n\n// Horizontal forms & lists\n$component-offset-horizontal: 180px !default;\n\n\n// Container sizes\n// ------------------------------------------------------------------------------------------------------\n\n// Small screen / tablet\n$container-tablet: ((720px + $grid-gutter-width)) !default;\n$container-sm: $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop: ((940px + $grid-gutter-width)) !default;\n$container-md: $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop: ((1140px + $grid-gutter-width)) !default;\n$container-lg: $container-large-desktop !default;\n","@media all and (max-width:768px) {\n .node-dataset .resource-list li {\n padding-right: 0;\n span.links {\n position: relative;\n top: auto;\n right: auto;\n margin: 10px 0;\n display: block;\n padding: 0;\n }\n a.btn {\n margin: 0 5px 10px 0;\n }\n }\n}\n\n.resource-list a.label {\n display: inline-block;\n overflow-wrap: break-word;\n}\n.stages {\n margin: 0 0 20px;\n li {\n font-size: 14px;\n &.first,\n &.first .highlight {\n @include border-radius(5px 0 0 5px);\n }\n &.last,\n &.last .highlight {\n @include border-radius(0 5px 5px 0);\n }\n }\n}\n.node-type-resource .item-list .list-group li {\n margin: 0;\n}\n.node-type-dataset {\n .field-name-field-tags,\n .field-name-field-topic,\n .field-name-field-preview-thumbail {\n .field-label {\n @include h4;\n }\n }\n}\n.field-name-field-topic .field-item {\n display: inline-block;\n}\n\n#edit-path-alias {\n height: 34px;\n}\n\n// Move this to dkan_dataset.css.\n.node-dataset .resource-list li {\n padding: 0 260px 0 45px;\n}\n// Move this to dkan_sitewide_profile_page.css.\np.dkan-profile-page-user-name {\n display: inline-block;\n} ","//\n// Styles for Forms\n// --------------------------------------------------\n\ninput[type=\"submit\"],\n.btn-primary,\n.btn.btn-primary {\n @extend %button;\n}\ninput.use-ajax-submit {\n margin-right: 10px;\n}\nbutton.btn,\n.btn.btn-default,\n.btn.btn-primary,\n.tabs--primary.nav-pills li a,\n.form-control {\n line-height: 1.5em;\n}\n.btn, .btn-sm {\n font-size: 14px;\n}\n\nselect.form-control {\n min-height: 36px;\n &[multiple=\"multiple\"] {\n height: auto;\n }\n}\n.form-control,\ndiv.autocomplete-deluxe-multiple {\n padding: 0 12px;\n}\n.ctools-dropbutton {\n .ctools-content a,\n input.btn,\n input[type=\"submit\"] {\n color: #666;\n &:hover,\n &:focus,\n &:active {\n border:none;\n color: $brand-primary;\n }\n }\n}\n.field-type-file input[type=\"submit\"],\n.input-group-addon,\n.input-group-btn {\n width: auto;\n}\n\n// Colorizer.\n.colorizer-form {\n .form-control {\n width: 50%;\n }\n label {\n float:none;\n display: block;\n }\n #palette {\n clear: both;\n .item-selected {\n background-color: transparent;\n }\n }\n}\n// BuEditor.\n.bue-popup {\n z-index: 999;\n}\n.bue-ui.editor-container {\n background-color: #ffffff;\n padding: 0 4px;\n border: 1px solid $border;\n @include border-radius(4px 4px 0 0);\n}\n.form-control.form-textarea {\n @include border-radius(0);\n}\n// Chosen.\n.form-control.chosen-processed {\n line-height: 34px;\n height: auto;\n padding: 0;\n border: none;\n max-width: 100% !important;\n .chosen-choices {\n @include border-radius(4px);\n border-color: #ccc;\n }\n}\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n background-position: -42px 2px;\n}\n.chzn-container-single {\n max-width: 100%;\n}\ndiv.autocomplete-deluxe-multiple,\n.chzn-container-multi {\n width: 100% !important;\n}\n.chzn-container-multi .chzn-choices .search-field input {\n height: auto;\n}\n#context-blockform td.blocks .label {\n background-color: $gray;\n}\n.tabledrag-hide .chzn-container-single {\n width: 20px !important;\n}\n\ndiv.autocomplete-deluxe-container input.autocomplete-deluxe-form-single {\n float: left;\n}\n\nfieldset fieldset {\n position: relative;\n}\nfieldset.collapsible {\n padding-top: 0;\n}\n#og-group-ref-add-more-wrapper fieldset,\nfieldset.group-primary {\n padding-top: 0;\n legend {\n display: none;\n }\n}\n\n.horizontal-tabs fieldset.horizontal-tabs-pane {\n padding: 0;\n}\ndiv.horizontal-tabs {\n border: none;\n}\n\n.form-managed-file {\n span.file {\n border: 1px solid $border;\n padding: 0 15px;\n line-height: 34px;\n display: inline-block;\n vertical-align: top;\n border-radius: 5px 0 0 5px;\n margin-right: 0;\n }\n input {\n @include border-radius($border-radius-base 0 0 $border-radius-base);\n border: 1px solid $border;\n padding: 5px;\n margin: 0 0 10px 0;\n height: 36px;\n vertical-align: top;\n }\n input.form-submit {\n @extend %button-attached;\n margin: 0 0 10px 0;\n }\n .input-group-btn {\n display: inline-block;\n vertical-align: top;\n }\n}\n.image-widget-data input.btn {\n //@extend %button-attached;\n}\n\n.path-form.panel-default {\n border-color: transparent;\n .panel-body {\n padding:0;\n }\n}\n\n// OG.\n.list-group-item {\n background-color: transparent;\n border: none;\n color: $text-color;\n padding: 0;\n}\n\n.filter-wrapper {\n padding: 10px;\n}\n\n#body-add-more-wrapper {\n .panel-body {\n padding: 0;\n }\n}\n\n// file_resup tweaks to display on top of recline\n.node-resource-form .field-name-field-upload {\n .form-type-managed-file {\n display: table;\n .file-widget {\n display: table-footer-group;\n }\n .file-resup-wrapper {\n display: table-header-group;\n }\n }\n}\n\n#search-api-admin-index-status-form {\n input {\n margin-bottom: 1em;\n }\n}\n.page-admin form {\n input[type=submit] {\n margin-right: 1em;\n }\n}","//\n// Styles for main layout\n// --------------------------------------------------\n.container,\n.container-fluid,\n.row {\n // Override Radix container and row overflow\n overflow: visible;\n}\n\naside.col-sm-3 {\n padding-left:0;\n}\nsection.col-sm-9 {\n padding-right: 0;\n}\n\n#featured,\n.panel-top {\n background-position:50% 50%;\n background-size:cover !important;\n overflow:hidden;\n position: relative;\n z-index: 0;\n .tint {\n // Let colorizer supply the background color.\n //background-color:rgba(10 , 119 , 189, .45);\n position:absolute;\n height: 900px;\n width:100%;\n z-index: -1;\n }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .pane-title,\n .pane-views-popular-tags-block .pane-title,\n .pane-dkan-sitewide-demo-front-dkan-add-front .pane-title {\n display:none;\n }\n .container {\n padding: 30px 0;\n position: relative;\n z-index: 5;\n }\n .pane-block,\n .panel-pane,\n .block-content {\n color:#fff;\n line-height: 1.33em;\n margin:0 15px;\n }\n a {\n color:#fff;\n }\n}\n.page-admin .panel-top {\n background-image: none !important;\n background-color: none;\n overflow: visible;\n .tint {\n display:none;\n }\n}\n#top-content {\n margin:20px;\n .block {\n padding:10px;\n text-align:center;\n h2.block-title {\n border:none;\n color:$gray-dark;\n font-size:1.6em;\n }\n }\n [class*=\"col-\"]{\n background-color: $smoke;\n border-left:4px solid $body-bg;\n border-right:4px solid $body-bg;\n margin-bottom: -99999px;\n padding-bottom: 99999px;\n }\n\n .row {\n overflow: hidden;\n }\n}\n@media all and (max-width:767px) {\n .branding.container {\n padding-left: 15px;\n padding-right: 15px;\n }\n}","// Menu\n// Styles for Menus and Navs\n// --------------------------------------------------\n.navigation-wrapper .container {\n overflow: visible;\n .navbar-collapse {\n overflow: visible;\n }\n}\n\n.container > .navbar-header, .container > .navbar-collapse {\n margin-left: 10px;\n margin-right: 10px;\n}\n.navbar-default .navbar-collapse, \n.navbar-default .navbar-form {\n padding: 0;\n vertical-align: top;\n}\n\n.navbar-header {\n position:relative;\n z-index:3;\n}\n\n.navbar-default {\n background:transparent;\n border:none;\n margin: 0;\n overflow: visible !important;\n position:relative;\n z-index:3;\n\n .navbar-nav,\n .user-menu {\n margin:0;\n overflow: visible;\n position:relative;\n z-index:3;\n a.dropdown-toggle {\n color: #FFFFFF;\n }\n .open > a,\n li > a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding:15px;\n &.dropdown-toggle:hover,\n &:active,\n &:hover,\n &:focus {\n background: $brand-secondary;\n color: #FFFFFF;\n text-decoration:none;\n }\n &.dropdown-toggle:focus,\n &.dropdown-toggle:active {\n background-color: transparent;\n }\n &.dropdown-toggle:hover {\n background: $brand-secondary;\n }\n }\n .dropdown-menu {\n background: $brand-primary;\n padding: 0;\n li {\n display: block;\n a {\n display: block;\n color: #ffffff;\n }\n }\n }\n }\n .navbar-toggle {\n border-color: #ffffff;\n &:hover,\n &:focus {\n background-color: rgba(0, 0, 0, .25);\n }\n .icon-bar {\n background-color: #ffffff;\n }\n }\n\n @media all and (min-width:768px) {\n .user-menu {\n float: right;\n }\n .navbar-nav li,\n .user-menu li {\n display: inline-block;\n a {\n display: inline-block;\n }\n .dropdown-menu li,\n .dropdown-menu li a {\n display: block;\n }\n }\n }\n .navbar-nav.secondary li {\n float:none;\n a {\n font-size:.7em;\n line-height:1.5em;\n padding:4px;\n }\n }\n}\n\n@media all and (max-width:767px) {\n .nav > li {\n clear: both;\n }\n .navbar-default .navbar-nav .open .dropdown-menu,\n .navbar-default .navbar-nav .dropdown-menu {\n @include box-shadow(none);\n border: none;\n display: block;\n width: 100%;\n position: relative;\n li > a {\n color: #ffffff;\n display: block;\n padding:15px 10px 15px 35px;\n &:hover,\n &:focus,\n &:active {\n background: $brand-secondary;\n color: #ffffff;\n clear: both;\n }\n }\n }\n}\n\n#block-dkan-sitewide-dkan-sitewide-user-menu {\n .links a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding:15px;\n &:hover,\n &:focus {\n background: $brand-secondary;\n color: #FFFFFF;\n text-decoration:none;\n }\n }\n img {\n margin: 10px;\n }\n @media all and (min-width:768px) {\n float: right;\n .links a {\n display: inline-block;\n }\n }\n}\n\n//override bootstrap\n.navbar .nav > li > a {\n text-shadow:none;\n}\n\n// Large screen.\n@media(min-width:768px) {\n .navbar {\n @include border-radius(0);\n }\n .container > .navbar-header {\n margin-left:0;\n }\n #nav-wrapper .navbar-default .logo {\n padding:10px 10px 0 0;\n }\n}\n\n.tabs--primary {\n margin: 10px 0;\n li {\n margin:1px;\n }\n li a {\n background: #fff;\n border:1px solid #fff;\n padding:6px 15px;\n &:hover {\n border:1px solid $brand-secondary;\n background:$brand-secondary;\n color:#fff;\n }\n &.active {\n border:1px solid $brand-primary;\n background:$brand-primary;\n color:#fff;\n }\n }\n}\n\n.nav-tabs {\n li a {\n color:$brand-primary;\n }\n}\n\n.front .tabs--primary {\n display: none;\n}\n.tabs--primary {\n .nav-pills li a.active,\n .nav-pills li.active a:hover,\n .nav-pills li.active a:focus {\n border:1px solid $brand-primary;\n background: $brand-primary;\n color:#ffffff;\n }\n}\n.btn-primary {\n background:$brand-primary;\n border-color:$brand-primary;\n}\n.btn-primary:hover, \n.btn-primary:focus, \n.btn-primary:active, \n.btn-primary.active {\n background:$brand-secondary;\n border-color:$brand-secondary;\n}\n\n.form-actions #edit-submit {\n background: $brand-success;\n border-color: $brand-success;\n}\n.form-actions #edit-submit:hover,\n.form-actions #edit-submit:focus,\n.form-actions #edit-submit:active {\n background: darken($brand-success,10%);\n border-color: darken($brand-success,10%);\n color: #fff;\n}\n\na.embed-link {\n @include border-radius(4px);\n //background:$brand-primary;\n color: #fff;\n display: inline-block;\n padding:5px 15px 5px 35px;\n position:relative;\n margin:1em 0;\n text-decoration: none;\n}\na.embed-link:hover, \na.embed-link:focus, \na.embed-link:active {\n //background:$brand-secondary;\n color:#fff;\n text-decoration:none;\n}\na.embed-link:before {\n content:'\\f121';\n color: #fff;\n font-family: $icon-fa;\n font-size: 1.3em;\n position: absolute;\n top:5px;\n left:10px;\n}\ntextarea.embed-code {\n width: 100%;\n margin-bottom:1em;\n}\n\nul.action-links {\n margin:1em 15px;\n li {\n float: none;\n display:inline-block;\n }\n}\n\n.btn:active, \n.btn.active {\n @include box-shadow(none);\n}\n\n.radix-layouts-sidebar {\n ul.menu > li > ul.menu {\n margin-left: 0;\n li a {\n padding: 10px 15px 10px 30px;\n }\n }\n}\n","//\n// Styles for Nodes\n// --------------------------------------------------\n.node-type-dataset {\n .field-name-field-tags {\n margin: 1em 0;\n }\n .field-name-field-topic {\n margin: -20px 0 15px 0;\n }\n // Dataset field labels.\n h4 {\n @include h4;\n }\n .field-name-field-related-content,\n .field-name-field-topic,\n .field-name-field-tags,\n .field-name-field-topic,\n .field-name-field-preview-thumbail {\n .field-label {\n @include h4;\n }\n }\n}\n\n/** UI Tabs **/\n.node-resource-form .horizontal-tabs {\n border:none;\n ul.horizontal-tabs-list {\n background-color: transparent;\n border: 0;\n padding-top: 10px;\n li,\n li.selected {\n border: 0;\n background-color: transparent;\n min-width: 10em;\n a:hover {\n background:transparent;\n }\n #active-horizontal-tab {\n background: url(../images/sprite-ckan-icons.png) no-repeat -193px 2px;\n display: block;\n text-indent: -9999px;\n width: 16px;\n height: 16px;\n margin: 0 0 0 28px;\n clip: auto;\n }\n &.horizontal-tab-button-1 .summary,\n &.horizontal-tab-button-2 .summary {\n background: url(../images/sprite-ckan-icons.png) no-repeat -160px 0;\n }\n .summary{\n background: url(../images/sprite-ckan-icons.png) no-repeat -144px 0;\n width: 16px;\n height: 16px;\n position: absolute;\n top:5px;\n left:10px;\n }\n a {\n font-size: 1.1em;\n position: relative;\n padding: 5px 15px 5px 30px;\n }\n }\n }\n .horizontal-tabs-panes {\n @include border-radius($border-radius-base);\n border:1px solid $border;\n padding: 8px;\n fieldset.htab_link_upload,\n fieldset.htab_link_api,\n fieldset.htab_link_file {\n legend.panel-heading {\n display: none;\n }\n .field-widget-recline-widget legend.panel-heading {\n border:none;\n border-bottom: 1px solid $border;\n display: block;\n background:transparent;\n color: $gray;\n padding: 5px 0;\n //margin-top:10px;\n }\n }\n .form-type-checkbox label,\n .form-type-select label {\n display: block;\n line-height: 36px;\n padding-top:2px;\n }\n .filefield-source-remotefile {\n input {\n margin-right: 0;\n }\n input.btn {\n @include border-radius(0 $border-radius-base $border-radius-base 0);\n margin-left: -1px;\n }\n }\n .form-item-field-upload-und-0-embed {\n clear: both;\n }\n }\n}\n.page-node-add-resource {\n .field-group-htabs.group-data div.horizontal-tabs {\n border: 0;\n }\n .form-item {\n margin: 0;\n }\n}\n\n#action-info {\n color: $brand-danger;\n margin: 1em 0;\n &:before {\n color: $brand-danger;\n content: \"\\f071\";\n font-family: \"FontAwesome\";\n font-size: 1.5em;\n font-style: normal;\n margin-right: 5px;\n vertical-align: middle;\n }\n}\n.field-name-body {\n a {\n overflow-wrap: break-word;\n }\n ul {\n list-style-type:disc;\n margin:10px 20px;\n li {\n margin:6px 10px;\n }\n }\n}\n.field-group-table-description {\n color:$gray;\n display:block;\n padding:8px 10px 8px 40px;\n position:relative;\n .icon-info-sign:before {\n color:$gray-light;\n content:\"\\f05a\";\n font-family:$icon-fa;\n font-size:2.5em;\n font-style: normal;\n height:30px;\n left:0;\n margin:10px 15px 0 0;\n padding:6px 0;\n position:absolute;\n top:-6px;\n width:30px;\n }\n}\n\n.node-type-group {\n .horizontal-tabs {\n margin: 0;\n #edit-field-image-und-0-remove-button {\n @include border-radius($border-radius-base);\n margin-left: 5px;\n }\n }\n}\n\n.group-owner-message {\n margin-bottom:20px;\n}\n\n.field-type-text-with-summary {\n padding: 0;\n}\n.field-name-field-additional-info {\n margin-top: 2em;\n}\n.field-name-field-related-content .field-item {\n @include item-list;\n}","//\n// Styles for individual pages\n// --------------------------------------------------\n.main {\n padding-top:20px;\n padding-bottom: 20px;\n}\n.front .main {\n padding: 0;\n}\n.page-admin {\n .main {\n padding: 20px 15px;\n }\n .region-content {\n margin: 0;\n }\n .breadcrumb,\n .alert,\n .tabs--primary,\n .page-header {\n margin: 0 0 15px;\n }\n}\n","//\n// Styles for panels and panes.\n// --------------------------------------------------\n\n.panel-body {\n\toverflow: visible;\n}\n.pane-content {\n .field-name-body {\n line-height: 2em;\n }\n}\n.main .panel-pane {\n\tmargin-bottom: 3em;\n}\nh2.pane-title {\n\tborder-bottom: 1px solid $border;\n\tpadding-bottom: 10px;\n}\n\n#panels-choose-layout .form-type-radio input,\n.panels-choose-layout .form-type-radio input {\n\twidth: 15px;\n}\n\n.radix-layouts-sidebar {\n\t.pane-title {\n\t\t@include block-title;\n\t}\n\t.pane-block {\n\t\t@include blockbox;\n\t}\n}\n.page-user {\n\t.radix-layouts-content .pane-content {\n \tpadding: 0;\n\t .profile {\n\t \tmargin-top: 0;\n\t }\n\t}\n}\n.radix-layouts-content {\n\t.pane-title {\n\t\tfont-size: 36px;\n \tline-height: 42px;\n\t\tmargin:0 0 15px 0;\n\t}\n\t.pane-content {\n\t\tpadding: 20px 0;\n\t\tmargin-bottom: 1em;\n\t}\n\t.pane-node-field-topic .pane-content {\n\t\tpadding: 0\n\t}\n\t.pane-page-breadcrumb {\n\t\t.breadcrumb {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 0 15px 0;\n\t\t}\n\t}\n}\n.node-type-group .radix-layouts-content {\n\t@media (max-width: 991px) {\n\t\t.pane-title {\n\t\t\tmargin-top: 2em;\n\t\t}\n\t}\n\t.pane-content {\n\t\tpadding: 20px 0 0;\n\t\tmargin-bottom: 0;\n\t}\n}\n\n.page-manager-wrapper .panel-region {\n\t.pane-title {\n\t\tbackground-image: none;\n\t\tborder: none;\n\t\tfont-size: 1em;\n\t\tline-height: normal;\n\t}\n\t.panel-pane-collapsible {\n\t\t.pane-content {\n\t\t\tpadding: 10px 15px;\n\t\t}\n\t}\n}\n\n#panelizer-edit-content-form input {\n\tmargin-right: 1em;\n}\n\n.panel-full-width .panel-top {\n\tmargin-bottom: 15px;\n}\n@media (max-width: 768px) {\n\t.panel-full-width .panel-bottom {\n\t\t.panel-col-first,\n\t\t.panel-col-second,\n\t\t.panel-col-third {\n\t\t\tfloat: none;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n}\n","// Recline css overrides.\n.recline-pager .pagination {\n li {\n vertical-align: middle;\n a {\n line-height: 1em;\n padding: 0 10px;\n &.btn {\n line-height: 32px;\n }\n }\n }\n input {\n\t height: 20px;\n\t font-size: .8em;\n }\n}\n.recline-data-explorer {\n .form-control {\n border-color: #ccc;\n }\n .btn {\n \tborder:1px solid $smoke;\n \tfont-size: 14px;\n \tpadding: 0px 12px;\n line-height: 32px;\n }\n}\n.dropdown-menu.slick-contextmenu {\n background: #fff;\n li {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n","@media all and (max-width:767px) {\n\taside[class|='col'],\n\tsection[class|='col'] {\n\t\tpadding: 0;\n\t}\n\t.container {\n\t\twidth: 100%;\n\t}\n\t// Adjust custom full width panels.\n\t.panel-full-width .panel-top .panel-col-first,\n\t.panel-full-width .panel-top .panel-col-second,\n\t.panel-full-width .panel-bottom .panel-col-first,\n\t.panel-full-width .panel-bottom .panel-col-second,\n\t.panel-full-width .panel-bottom .panel-col-third {\n\t width: 100%;\n\t float: none;\n\t .inside {\n\t \tmargin: 20px 15px;\n\t }\n\t}\n\t\n}\n\n","#views-exposed-form-dkan-datasets-panel-pane-1 {\n .views-exposed-form .views-widget-filter-search_api_views_fulltext {\n max-width: 320px;\n }\n}\n\n#dkan-sitewide-dataset-search-form,\n#dkan-sitewide-dataset-search-form--2 {\n @include searchbox;\n position: relative;\n}\n#dkan-sitewide-dataset-search-form,\n#dkan-sitewide-dataset-search-form--2 {\n label {\n @extend %screenreader;\n }\n}\n\n#region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label {\n @extend %screenreader;\n}\n\n#block-dkan-sitewide-dkan-sitewide-search-bar {\n @media all and (min-width:768px) {\n position: absolute;\n top: 10px;\n right: 15px;\n width:172px;\n form {\n width:172px;\n }\n input.form-control {\n width:170px;\n height: 36px;\n margin: 0;\n }\n }\n @include searchbox;\n clear: both;\n .views-exposed-form .form-submit {\n margin:22px 0 0;\n text-shadow: none;\n }\n}\n\n.facetapi-terms span[class*=font-icon-select]:before,\n.icon-dkan.facet-icon:before {\n font-family: 'DKAN-Topics';\n font-size: 24px;\n padding-right: .3em;\n vertical-align: middle;\n}\n\n.node-search-result {\n .icon-dkan.facet-icon:before {\n font-size: 42px;\n margin-top: 0.7em;\n display: block;\n }\n .resource-list li {\n display: inline-block;\n }\n .icon-container {\n text-align: center;\n }\n}\n\n.search-result {\n ul.resource-list {\n margin-top: 0.9em;\n\n li {\n display: inline-block;\n a,\n &:first-child {\n margin-left: 0px;\n }\n }\n }\n .dataset-list {\n list-style: none;\n margin: 0;\n padding: 0;\n li {\n list-style: none;\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em;\n &:before {\n content: \"\\e97e\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em;\n }\n }\n }\n .group-membership {\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em;\n &:before {\n content: \"\\e981\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em;\n }\n }\n &.search-result-group .group-membership {\n display: none;\n }\n p {\n margin-bottom: 0px;\n }\n}\n\n.node-search-result {\n h2.node-title {\n margin: 1.5em 0 .5em 0;\n }\n}","//\n// Styles for Tabs, Messages, ..etc\n// --------------------------------------------------\nbody {\n font-family:$font-base;\n font-size:16px;\n line-height:1.35em;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\nbody.modal-open {\n overflow: visible !important;\n}\n.branding {\n position: relative;\n .logo {\n margin: 20px 20px 15px 0;\n }\n}\n@media (max-width: 768px) {\n .logo img {\n max-width: 100%;\n }\n}\n\n.site-name {\n display: block;\n font-size: 2em;\n line-height: 1.15em;\n margin: 50px 20px 0;\n @media(max-width:460px) {\n clear: left;\n float: none;\n margin: 10px 20px 5px 0;\n }\n &:hover {\n text-decoration: none;\n }\n}\n.site-slogan {\n margin-bottom: 20px;\n}\nh1 {\n font-size: 30px;\n line-height: 36px;\n margin-bottom: 15px;\n}\nh1,h2,h3,h4 {\n color:$gray-dark;\n font-weight:300;\n}\nh3.media-heading {\n margin:.5em 0;\n}\nh4 {\n margin-top: 2em;\n margin-bottom: .5em;\n}\n\na {\n color:$brand-primary;\n &:hover {\n color:$brand-secondary;\n }\n}\np,\np:last-child {\n margin: 0 0 1.25em 0;\n}\n\n.breadcrumb {\n background: none;\n border: none;\n font-size: 1em;\n list-style: none;\n padding: 0;\n position: relative;\n li {\n float:none;\n a {\n span {\n display:none;\n }\n }\n &.home-link a {\n font-size:1.3em;\n i {\n display: block;\n }\n }\n }\n}\n\n.alert {\n border: none;\n padding: 15px 35px;\n position: relative;\n .close {\n line-height: 18px;\n position: absolute;\n right: 10px;\n top: 5px;\n }\n &.alert-warning {\n background: #FFE285;//$brand-warning;\n }\n &:before {\n font-family: $icon-fa;\n font-size: 1.5em;\n position: absolute;\n top: 15px;\n left: 10px;\n }\n &.alert-danger:before {\n content: '\\f06a';\n color: $brand-danger;\n }\n &.alert-warning:before {\n content: '\\f05a';\n color: #8a6d3b;\n }\n &.alert-success:before {\n content: '\\f058';\n color: $brand-success;\n }\n}\n.page-admin .alert {\n margin: 10px 0;\n}\n// Tables\ntable,\ntable.group_additional {\n border-collapse:collapse;\n margin:1em 0;\n width:100%;\n thead > tr > th {\n //@include background-image(linear-gradient(#F5F5F5, #F0F0F0));\n background-color: lighten($border, 4%);\n border: 1px solid $border !important;\n padding: 4px 8px;\n font-weight: bold;\n }\n thead th:first-child {\n //@inlclude border-top-left-radius(4px);\n }\n thead th:last-child,\n thead th:last-child {\n //@include border-top-right-radius(4px);\n }\n tbody th,\n td {\n border:1px solid $border;\n padding:4px 8px;\n vertical-align:top;\n }\n tr:hover {\n background:#FFFEEE;\n }\n}\n\n@media screen and (max-width: 1024px) {\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: normal;\n }\n}\n.field-name-field-additional-info .field-label {\n margin-bottom: 1em;\n}\n.group_additional,\n.field-name-field-additional-info table,\n.field-name-field-additional-info .table-responsive {\n margin: 0;\n td,\n th {\n white-space: normal;\n width: auto;\n }\n td:nth-of-type(2n) {\n @include wrap;\n }\n @media all and (min-width:768px) {\n th:nth-of-type(1n),\n td:nth-of-type(1n),\n th:nth-of-type(4n),\n td:nth-of-type(4n) {\n width: 5%;\n border-right: 1px solid $border;\n }\n th:nth-of-type(2n),\n td:nth-of-type(2n) {\n width: 90%;\n .form-control {\n min-width: 40%;\n }\n }\n }\n}\n\ntable.group_additional,\n.field-name-field-additional-info table {\n th,\n td,\n th:nth-of-type(1n),\n td:nth-of-type(1n),\n th:nth-of-type(2n),\n td:nth-of-type(2n) {\n width: auto;\n .form-control {\n display: inline-block;\n width: auto;\n vertical-align: top\n }\n }\n margin-top: 0;\n}\n.table > thead:first-child > tr:first-child > th,\ntable thead:first-child tr:first-child th {\n border: 1px solid $border;\n}\n.table-bordered > thead > tr > th,\ntable thead > tr > th {\n background-color: lighten($border, 4%);\n border: 1px solid $border;\n padding:4px 8px;\n}\n\n// Striped tables.\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9;\n}\n.table tbody tr:hover td, \n.table tbody tr:hover th,\n.table-striped > tbody > tr:nth-child(odd):hover {\n background-color: #FFFEEE;\n}\n\n\ndl {\n margin:0;\n padding:0;\n clear:both;\n overflow:hidden;\n}\ndt {\n clear: both;\n margin:0;\n padding:8px 5px;\n float:left;\n width:28%;\n}\ndd {\n margin:0;\n padding:8px 5px;\n float:right;\n width:72%;\n}\ndt,\ndd {\n border-top: 1px solid $border;\n}\n\n.item-list .pagination {\n li:first-child > span,\n li:first-child > a {\n @include border-radius(4px 0 0 4px);\n }\n li:last-child > span,\n li:last-child > a {\n @include border-radius(0 4px 4px 0);\n }\n}\n\n.radix-layouts-sidebar .item-list ul,\n.nav-simple {\n margin: 0;\n list-style: none;\n padding: 0;\n li {\n margin:0;\n line-height: 1.1666666666666667em;\n padding: 0;\n border-bottom: 1px dotted #CCC;\n position:relative;\n a {\n display: block;\n margin:0;\n }\n a:hover {\n background:#FFFEEE;\n }\n &.last {\n border-bottom: none;\n }\n }\n}\n\n// Keep images inside their containers.\nimg {\n max-width: 100%;\n height: auto;\n}\n// Bootstrap/Radix Overrides.\n.thumbnail {\n padding: 0;\n margin: 0;\n background-color: transparent;\n border: none;\n border-radius: 0;\n} ","//\n// Styles for Taxonomy\n// --------------------------------------------------\n\n.field-name-field-tags .field-item {\n display:inline-block;\n}\n.field-name-field-tags {\n label {\n display: block;\n }\n input.form-control {\n height: auto;\n }\n .field-item {\n a {\n display: inline-block;\n padding:2px 10px 2px;\n font-size:12px;\n line-height: 20px;\n @include border-radius(0 5px 5px 0);\n background-color: $shade;\n margin:3px 5px 3px 20px;\n position:relative;\n color:$gray-dark;\n border:1px solid $border;\n border-left:0;\n z-index:2;\n &:after {\n content:\"\";\n width: 20px;\n height: 20px;\n background-color: $shade;\n @include rotate(45deg);\n @include border-radius(2px);\n position:absolute;\n top:2px;\n left:-9px;\n z-index:-1;\n border:1px solid $border;\n border-top:none;\n border-right:none;\n }\n &:before {\n content:\"\";\n width:2px;\n height:2px;\n background:$gray-light;\n position:absolute;\n top:11px;\n left:-5px;\n @include border-radius(0);\n }\n }\n a:hover,\n a:hover:after {\n background: #fff;\n color:#000;\n text-decoration:none;\n }\n }\n}\n\n.field-name-field-topic {\n .field-item { \n margin: 0 1.5em .5em 0;\n .field-item {\n margin: 0;\n }\n }\n}\n.field-name-field-topic-icon span::before, \n.view-dkan-datasets .field-name-field-topic-icon span::before {\n font-size: 18px;\n}\n.font_icon_select_options .label {\n color: #333;\n}","//\n// Styles for Views\n// --------------------------------------------------\n.front .view-popular-tags {\n margin-top:20px;\n}\n.view-popular-tags {\n margin: 15px 0;\n ul.tag-list {\n margin: 0;\n padding: 0;\n li {\n display:inline-block;\n margin-right:2em;\n a {\n color:#fff;\n }\n }\n }\n}\n.view-content h2 {\n font-size: 1.5em;\n margin:1em 0 .5em;\n}\n.view-groups-search .views-row {\n border-bottom:1px dotted $smoke;\n padding:1em 0;\n}\n\n// .views-field-field-image img {\n// display:block;\n// height:auto;\n// margin:0 auto 5px;\n// max-width:220px;\n// width:100%;\n// }\n.view-front-page-group-list {\n .views-row {\n position: relative;\n padding-left: 120px;\n min-height: 110px;\n img {\n position: absolute;\n top: 0;\n left: 0;\n }\n }\n}\n\n.view-user-profile-fields img {\n height:auto;\n margin:0 auto;\n max-width:190px;\n width:100%; \n}\n\n.view-front-page-group-grid {\n .row {\n span {\n display:block;\n margin:15px 0;\n .media-content {\n padding:0 10px 10px 120px;\n }\n .media-image {\n float:left;\n margin:0;\n padding:0;\n img {\n margin:5px 10px 5px 0;\n }\n }\n h3.media-heading {\n font-size:1.3em;\n margin:.5em 0;\n padding:0;\n }\n }\n }\n @media(min-width:768px) {\n .span6,\n .col-lg-6 {\n float:left;\n margin:0;\n width:50%;\n }\n }\n}\n\n.view-dkan-groups {\n .node-teaser {\n min-height: 365px;\n margin-bottom: 20px;\n h2.node-title {\n margin: .75em 0;\n }\n .btn-primary {\n margin: 0 auto 1.5em;\n }\n }\n}\n.view-groups-page {\n .views-column {\n float:left;\n margin:0;\n width:50%;\n }\n}\n.view-group-block {\n .views-field-title {\n font-size:1.2em;\n }\n .views-field-nid a {\n background: $brand-primary;\n color:#fff;\n display: block;\n margin:1em 0 0 0;\n padding:5px 8px;\n text-align: center;\n }\n}\n.view-dataset {\n form {\n margin: 0;\n position: relative;\n }\n .views-row {\n margin:1.5em 0;\n }\n}\n.views-exposed-form {\n position:relative;\n .views-exposed-widget {\n display: inline;\n padding: .5em .5em 0 0;\n .views-widget-filter-search_api_views_fulltext,\n .views-widget-sort-by,\n .views-widget-sort-order,\n .views-submit-button,\n .form-submit {\n display: inline;\n float:none;\n margin: 0;\n position:relative;\n }\n &.views-reset-button,\n &.views-submit-button {\n margin: 0;\n padding: 2.1em .5em 0 0;\n }\n }\n .description {\n @include text-shadow(none);\n position:absolute;\n color: #999999;\n font-size:12px;\n left: 7px;\n top: 10px;\n }\n}\n\n#views-exposed-form-dkan-datasets-panel-pane-1 .views-exposed-form .description { display: none;}\n\n.view-dkan-groups-featured,\n.pane-dkan-groups-featured {\n .row {\n text-align: center;\n div[class*='views-column'] {\n margin-bottom: 1.25em;\n }\n }\n}\n\n.view-admin-content table {\n margin-top: 0;\n}","@import \"shared\";\n\n// These defaults make the arguments optional for this mixin\n// If you like, set different defaults in your project\n\n$default-text-shadow-color: #aaa !default;\n$default-text-shadow-h-offset: 0px !default;\n$default-text-shadow-v-offset: 0px !default;\n$default-text-shadow-blur: 1px !default;\n$default-text-shadow-spread: false !default;\n\n// Provides cross-browser text shadows when one or more shadows are needed.\n// Each shadow argument should adhere to the standard css3 syntax for the\n// text-shadow property.\n//\n// Note: if any shadow has a spread parameter, this will cause the mixin\n// to emit the shadow declaration twice, first without the spread,\n// then with the spread included. This allows you to progressively\n// enhance the browsers that do support the spread parameter.\n@mixin text-shadow(\n $shadow-1 : default,\n $shadow-2 : false,\n $shadow-3 : false,\n $shadow-4 : false,\n $shadow-5 : false,\n $shadow-6 : false,\n $shadow-7 : false,\n $shadow-8 : false,\n $shadow-9 : false,\n $shadow-10: false\n) {\n @if $shadow-1 == default {\n $shadow-1: compact($default-text-shadow-h-offset $default-text-shadow-v-offset $default-text-shadow-blur $default-text-shadow-spread $default-text-shadow-color);\n }\n $shadows-without-spread: join((),(),comma);\n $shadows: join((),(),comma);\n $has-spread: false;\n @each $shadow in compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5,\n $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10) {\n @if length($shadow) > 4 {\n $has-spread: true;\n $shadows-without-spread: append($shadows-without-spread, nth($shadow,1) nth($shadow,2) nth($shadow,3) nth($shadow,5));\n $shadows: append($shadows, $shadow);\n } else {\n $shadows-without-spread: append($shadows-without-spread, $shadow);\n $shadows: append($shadows, $shadow);\n }\n }\n @if $has-spread {\n text-shadow: $shadows-without-spread;\n }\n text-shadow: $shadows;\n}\n\n// Provides a single cross-browser CSS text shadow.\n//\n// Provides sensible defaults for the color, horizontal offset, vertical offset, blur, and spread\n// according to the configuration defaults above.\n@mixin single-text-shadow(\n $hoff: false,\n $voff: false,\n $blur: false,\n $spread: false,\n $color: false\n) {\n // A lot of people think the color comes first. It doesn't.\n @if type-of($hoff) == color {\n $temp-color: $hoff;\n $hoff: $voff;\n $voff: $blur;\n $blur: $spread;\n $spread: $color;\n $color: $temp-color;\n }\n // Can't rely on default assignment with multiple supported argument orders.\n $hoff: if($hoff, $hoff, $default-text-shadow-h-offset);\n $voff: if($voff, $voff, $default-text-shadow-v-offset);\n $blur: if($blur, $blur, $default-text-shadow-blur );\n $spread: if($spread, $spread, $default-text-shadow-spread );\n $color: if($color, $color, $default-text-shadow-color );\n // We don't need experimental support for this property.\n @if $color == none or $hoff == none {\n @include text-shadow(none);\n } @else {\n @include text-shadow(compact($hoff $voff $blur $spread $color));\n }\n}\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["nuboot_radix.style.css","../bower_components/compass-mixins/lib/compass/functions/_lists.scss","../bower_components/compass-mixins/lib/compass/functions/_constants.scss","../bower_components/compass-mixins/lib/compass/functions/_display.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_scaffolding.scss","../bower_components/compass-mixins/lib/compass/css3/_shared.scss","../bower_components/compass-mixins/lib/compass/css3/_box-sizing.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_variables.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_tab-focus.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_image.scss","../bower_components/compass-mixins/lib/compass/css3/_transition.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_type.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_background-variant.scss","../bower_components/compass-mixins/lib/compass/utilities/general/_clearfix.scss","../bower_components/compass-mixins/lib/compass/utilities/general/_hacks.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_text-overflow.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_code.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_grid.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_grid-framework.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_tables.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_table-row.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_forms.scss","../bower_components/compass-mixins/lib/compass/css3/_box-shadow.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_forms.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_buttons.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_buttons.scss","../bower_components/compass-mixins/lib/compass/css3/_opacity.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_normalize.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_print.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_glyphicons.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_component-animations.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_dropdowns.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-divider.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-filter.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_button-groups.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_input-groups.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_navs.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_navbar.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_breadcrumbs.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_pagination.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_pagination.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_pager.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_labels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_labels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_badges.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_jumbotron.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_thumbnails.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_alerts.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_alerts.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_progress-bars.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_gradients.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_progress-bar.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_media.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_list-group.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_list-group.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_panels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_panels.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-embed.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_wells.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_close.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_modals.scss","../bower_components/compass-mixins/lib/compass/css3/_transform.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_tooltip.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_reset-text.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_popovers.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_carousel.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_utilities.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_center-block.scss","../bower_components/compass-mixins/lib/compass/typography/text/_replacement.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/_responsive-utilities.scss","../bower_components/bootstrap-sass/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss","../bower_components/font-awesome/scss/font-awesome.scss","../bower_components/font-awesome/scss/_path.scss","../bower_components/font-awesome/scss/_core.scss","../bower_components/font-awesome/scss/_larger.scss","../bower_components/font-awesome/scss/_fixed-width.scss","../bower_components/font-awesome/scss/_list.scss","../bower_components/font-awesome/scss/_variables.scss","../bower_components/font-awesome/scss/_bordered-pulled.scss","../bower_components/font-awesome/scss/_animated.scss","../bower_components/font-awesome/scss/_rotated-flipped.scss","../bower_components/font-awesome/scss/_mixins.scss","../bower_components/font-awesome/scss/_stacked.scss","../bower_components/font-awesome/scss/_icons.scss","radix/_admin.scss","radix/_comment.scss","radix/_form.scss","radix/_mixins.scss","radix/_layout.scss","radix/_maintenance.scss","radix/_modal.scss","radix/_nav.scss","radix/_node.scss","radix/_panel.scss","radix/_structure.scss","radix/_view.scss","base/_mixins.scss","components/_admin.scss","components/_block.scss","base/_variables.scss","components/_dkan.scss","components/_form.scss","components/_layout.scss","components/_menu.scss","components/_node.scss","components/_page.scss","components/_panel.scss","components/_recline.scss","components/_responsive.scss","components/_search.scss","components/_structure.scss","components/_term.scss","components/_view.scss","../bower_components/compass-mixins/lib/compass/css3/_text-shadow.scss"],"names":[],"mappings":"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gBlBpB0B;EkBqB1B,iBlBiC2B;EkBhC3B,mBlBoC2B,EkBnC5B;;AAED;;;EACE,alB0ImC;EkBzInC,kBlByImC,EkBxIpC;;AAED;;;;;;;EACE,aAAa,EACd;;AFsPH;EAEI,ahBpHmC;EgBqHnC,kBhBzO4B;EgB0O5B,gBhB1R0B;EgB2R1B,iBhBrO2B;EgBsO3B,mBhBlO2B,EgBmO5B;;AAPH;EASI,ahB3HmC;EgB4HnC,kBhB5HmC,EgB6HpC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ahBnImC;EgBoInC,iBAAkC;EAClC,kBhBzP4B;EgB0P5B,gBhB1S0B;EgB2S1B,iBhBrP2B,EgBsP5B;;AE3RD;;;;EACE,alBgJkC;EkB/IlC,mBlB0B4B;EkBzB5B,gBlBrB0B;EkBsB1B,qBlBgCiC;EkB/BjC,mBlBmC2B,EkBlC5B;;AAED;;;EACE,alBwIkC;EkBvIlC,kBlBuIkC,EkBtInC;;AAED;;;;;;;EACE,aAAa,EACd;;AFgRH;EAEI,ahBhJkC;EgBiJlC,mBhBtQ4B;EgBuQ5B,gBhBrT0B;EgBsT1B,qBhBhQiC;EgBiQjC,mBhB7P2B,EgB8P5B;;AAPH;EASI,ahBvJkC;EgBwJlC,kBhBxJkC,EgByJnC;;AAXH;;EAcI,aAAa,EACd;;AAfH;EAiBI,ahB/JkC;EgBgKlC,iBAAkC;EAClC,mBhBtR4B;EgBuR5B,gBhBrU0B;EgBsU1B,qBhBhRiC,EgBiRlC;;AAQH;EAEE,mBAAmB,EAMpB;EARD;IAMI,sBAAkC,EACnC;;AAGH;EACE,mBAAmB;EACnB,OAAO;EACP,SAAS;EACT,WAAW;EACX,eAAe;EACf,YhB9LqD;EgB+LrD,ahB/LqD;EgBgMrD,kBhBhMqD;EgBiMrD,mBAAmB;EACnB,qBAAqB,EACtB;;AACD;;;;;;EAGE,YhBrMoC;EgBsMpC,ahBtMoC;EgBuMpC,kBhBvMoC,EgBwMrC;;AACD;;;;;;EAGE,YhB1MqC;EgB2MrC,ahB3MqC;EgB4MrC,kBhB5MqC,EgB6MtC;;AAGD;;;;;;;;;;EExZI,elBseoC,EkBrerC;;AFuZH;EEpZI,sBlBkeoC;EFpeyB,yHmB0B9C,ECjBh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IACpB,sBAAoB,EACzB;EDuDH;ICrDI,YrB0IiC;IqBzIjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkDH;;;;IC9CI,YrBmIiC;IqBlIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmCH;;;;;;;;;;MCvCM,YrB4H+B;MqB3H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoCL;;;;IC/BI,uBAAuB,EACxB;ED8BH;;;;;;;;;;;;;;;;ICvBM,0BrB9BwB;IqB+BpB,sBrB6G6B,EqB5GlC;EDqBL;ICjBI,erBpC0B;IqBqC1B,uBrBqGiC,EqBpGlC;;ADmBH;ECpEE,YrByJmC;EqBxJnC,0BrBW6B;EqBV7B,sBrByJqC,EoBrFtC;EAFD;IC9DI,YrBmJiC;IqBlJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED2DH;ICzDI,YrB8IiC;IqB7IjC,0BAAwB;IACpB,sBAAoB,EACzB;EDsDH;;IClDI,YrBuIiC;IqBtIjC,0BAAwB;IACpB,sBAAoB,EASzB;IDuCH;;;;MC3CM,YrBgI+B;MqB/H/B,0BAAwB;MACpB,sBAAoB,EACzB;EDwCL;;ICnCI,uBAAuB,EACxB;EDkCH;;;;IC3BM,0BrB7ByB;IqB8BrB,sBrBiH6B,EqBhHlC;EDyBL;ICrBI,erBnC2B;IqBoC3B,uBrByGiC,EqBxGlC;;ADuBH;ECxEE,YrB6JmC;EqB5JnC,0BrBY6B;EqBX7B,sBrB6JqC,EoBrFtC;EAFD;IClEI,YrBuJiC;IqBtJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED+DH;IC7DI,YrBkJiC;IqBjJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED0DH;;ICtDI,YrB2IiC;IqB1IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID2CH;;;;MC/CM,YrBoI+B;MqBnI/B,0BAAwB;MACpB,sBAAoB,EACzB;ED4CL;;ICvCI,uBAAuB,EACxB;EDsCH;;;;IC/BM,0BrB5ByB;IqB6BrB,sBrBqH6B,EqBpHlC;ED6BL;ICzBI,erBlC2B;IqBmC3B,uBrB6GiC,EqB5GlC;;AD2BH;EC5EE,YrBiKmC;EqBhKnC,0BrBa6B;EqBZ7B,sBrBiKqC,EoBrFtC;EAFD;ICtEI,YrB2JiC;IqB1JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDmEH;ICjEI,YrBsJiC;IqBrJjC,0BAAwB;IACpB,sBAAoB,EACzB;ED8DH;;IC1DI,YrB+IiC;IqB9IjC,0BAAwB;IACpB,sBAAoB,EASzB;ID+CH;;;;MCnDM,YrBwI+B;MqBvI/B,0BAAwB;MACpB,sBAAoB,EACzB;EDgDL;;IC3CI,uBAAuB,EACxB;ED0CH;;;;ICnCM,0BrB3ByB;IqB4BrB,sBrByH6B,EqBxHlC;EDiCL;IC7BI,erBjC2B;IqBkC3B,uBrBiHiC,EqBhHlC;;AD+BH;EChFE,YrBqKmC;EqBpKnC,0BrBc6B;EqBb7B,sBrBqKqC,EoBrFtC;EAFD;IC1EI,YrB+JiC;IqB9JjC,0BAAwB;IACpB,sBAAoB,EACzB;EDuEH;ICrEI,YrB0JiC;IqBzJjC,0BAAwB;IACpB,sBAAoB,EACzB;EDkEH;;IC9DI,YrBmJiC;IqBlJjC,0BAAwB;IACpB,sBAAoB,EASzB;IDmDH;;;;MCvDM,YrB4I+B;MqB3I/B,0BAAwB;MACpB,sBAAoB,EACzB;EDoDL;;IC/CI,uBAAuB,EACxB;ED8CH;;;;ICvCM,0BrB1ByB;IqB2BrB,sBrB6H6B,EqB5HlC;EDqCL;ICjCI,erBhC2B;IqBiC3B,uBrBqHiC,EqBpHlC;;ADwCH;EACE,epB/E4B;EoBgF5B,oBAAoB;EACpB,iBAAiB,EA8BlB;EAjCD;;IAUI,8BAA8B;ItBtF+B,yFmB0B9C,EG8DhB;EAZH;IAiBI,0BAA0B,EAC3B;EAlBH;IAqBI,epBhF0B;IoBiF1B,2BpB/E6B;IoBgF7B,8BAA8B,EAC/B;EAxBH;;;IA6BM,epB9G0B;IoB+G1B,sBAAsB,EACvB;;AAQL;EC1EE,mBrBsC8B;EqBrC9B,gBrBT4B;EqBU5B,qBrB4CmC;EqB3CnC,mBrB+C6B,EoB2B9B;;AACD;EC9EE,kBrByC8B;EqBxC9B,gBrBR4B;EqBS5B,iBrB6C6B;EqB5C7B,mBrBgD6B,EoB8B9B;;AACD;EClFE,iBrB4C6B;EqB3C7B,gBrBR4B;EqBS5B,iBrB6C6B;EqB5C7B,mBrBgD6B,EoBiC9B;;AAMD;EACE,eAAe;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I;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AASpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAAI;;AACpE;EAA+C,iBAAiB,EAA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BjC1C8C,EiC2C/C;EAzBP;IA+BQ,YjChDuC;IiCiDvC,0BjChDyC,EiCiD1C;EAjCP;IAuCQ,YjCtDuC;IiCuDvC,8BjCtD8C,EiCuD/C;EAzCP;IA8CI,mBjClD2C,EiC0D5C;IAtDH;MAiDM,uBjCvDyC,EiCwD1C;IAlDL;MAoDM,uBjCzDyC,EiC0D1C;EArDL;;IA0DI,sBjCjFqC,EiCkFtC;EA3DH;IAoEQ,0BjCpFyC;IiCqFzC,YjCtFuC,EiCuFxC;EAGH;IAzEJ;MA6EU,YjCjGqC,EiCuGtC;MAnFT;QAgFY,YjCnGmC;QiCoGnC,8BjCnG0C,EiCoG3C;IAlFX;MAwFY,YjCzGmC;MiC0GnC,0BjCzGqC,EiC0GtC;IA1FX;MAgGY,YjC/GmC;MiCgHnC,8BjC/G0C,EiCgH3C,EAAA;EAlGX;IA8GI,YjClI2C,EiCsI5C;IAlHH;MAgHM,YjCnIyC,EiCoI1C;EAjHL;IAqHI,YjCzI2C,EiCqJ5C;IAjIH;MAwHM,YjC3IyC,EiC4I1C;IAzHL;;;MA8HQ,YjC7IuC,EiC8IxC;;AAOP;EACE,uBjCrI8C;EiCsI9C,sBjCrIgD,EiCsQjD;EAnID;IAKI,ejCrI+C,EiC2IhD;IAXH;MAQM,YjC9H0C;MiC+H1C,8BjC9HiD,EiC+HlD;EAVL;IAcI,ejCnJ+C,EiCoJhD;EAfH;IAmBM,ejCnJ6C,EiC0J9C;IA1BL;MAuBQ,YjCtJwC;MiCuJxC,8BjCtJ+C,EiCuJhD;EAzBP;IA+BQ,YjC9JwC;IiC+JxC,0BjC5J0C,EiC6J3C;EAjCP;IAuCQ,YjClKwC;IiCmKxC,8BjClK+C,EiCmKhD;EAzCP;IA+CI,mBjC/J4C,EiCuK7C;IAvDH;MAkDM,uBjCpK0C,EiCqK3C;IAnDL;MAqDM,uBjCtK0C,EiCuK3C;EAtDL;;IA2DI,sBAAoB,EACrB;EA5DH;IAoEQ,0BjChM0C;IiCiM1C,YjCpMwC,EiCqMzC;EAGH;IAzEJ;MA6EU,sBjChNwC,EiCiNzC;IA9ET;MAgFU,0BjCnNwC,EiCoNzC;IAjFT;MAmFU,ejCnNyC,EiCyN1C;MAzFT;QAsFY,YjCrNoC;QiCsNpC,8BjCrN2C,EiCsN5C;IAxFX;MA8FY,YjC7NoC;MiC8NpC,0BjC3NsC,EiC4NvC;IAhGX;MAsGY,YjCjOoC;MiCkOpC,8BjCjO2C,EiCkO5C,EAAA;EAxGX;IA+GI,ejC/O+C,EiCmPhD;IAnHH;MAiHM,YjChP0C,EiCiP3C;EAlHL;IAsHI,ejCtP+C,EiCkQhD;IAlIH;MAyHM,YjCxP0C,EiCyP3C;IA1HL;;;MA+HQ,YjC1PwC,EiC2PzC;;AE7oBP;EACE,kBnCqxBkC;EmCpxBlC,oBnC0D6B;EmCzD7B,iBAAiB;EACjB,0BnCoxBqC;EmCnxBrC,mBnCmG6B,EmClF9B;EAtBD;IAQI,sBAAsB,EASvB;IAjBH;MAaM,cAA2C;MAC3C,eAAe;MACf,YnC2wB8B,EmC1wB/B;EAhBL;IAoBI,enCX4B,EmCY7B;;ACvBH;EACE,sBAAsB;EACtB,gBAAgB;EAChB,eAA+B;EAC/B,mBpCsG6B,EoClC9B;EAxED;IAOI,gBAAgB,EA0BjB;IAjCH;;MAUM,mBAAmB;MACnB,YAAY;MACZ,kBpCgF0B;MoC/E1B,qBpC+C+B;MoC9C/B,sBAAsB;MACtB,epCDwB;MoCExB,uBpCobqC;MoCnbrC,uBpCobqC;MoCnbrC,kBAAkB,EACnB;IAnBL;;MAuBQ,eAAe;MtCP0C,4BE0FlC;MF1FkC,+BE0FlC,EoCjFxB;IAzBP;;MtCgBiE,6BE0FlC;MF1FkC,gCE0FlC,EoC3ExB;EA/BP;;;IAuCM,WAAW;IACX,epCPwB;IoCQxB,0BpC7B0B;IoC8B1B,mBpC+ZqC,EoC9ZtC;EA3CL;;;;IAmDM,WAAW;IACX,YpCuZqC;IoCtZrC,0BpCvCwB;IoCwCxB,sBpCxCwB;IoCyCxB,gBAAgB,EACjB;EAxDL;;;;;;IAkEM,epCvD0B;IoCwD1B,uBpC6YqC;IoC5YrC,mBpC6YqC;IoC5YrC,oBpC+JsC,EoC9JvC;;AAQL;;EC3EM,mBrC4F0B;EqC3F1B,gBrC6CwB;EqC5CxB,qBrCkG+B,EqCjGhC;;ADwEL;;EtC9DiE,4BE2FlC;EF3FkC,+BE2FlC,EqChGxB;;ADmEP;;EtC9DiE,6BE2FlC;EF3FkC,gCE2FlC,EqC1FxB;;ADkEP;;EChFM,kBrC+F0B;EqC9F1B,gBrC8CwB;EqC7C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,EAS/B;EAXD;;IAMI,mBAAmB;IACnB,UAAU;IACV,aAAa;IACb,eAAe,EAChB;;AAOH;ECvDE,0B7CqfsC;E6CpftC,sB7CqfqC;E6CpfrC,e7CkfsC,E4C3bvC;EAFD;IClDI,0BAAwB,EACzB;EDiDH;IC/CI,eAAa,EACd;;ADkDH;EC3DE,0B7CyfsC;E6CxftC,sB7CyfqC;E6CxfrC,e7CsfsC,E4C3bvC;EAFD;ICtDI,0BAAwB,EACzB;EDqDH;ICnDI,eAAa,EACd;;ADsDH;EC/DE,0B7C6fsC;E6C5ftC,sB7C6fqC;E6C5frC,e7C0fsC,E4C3bvC;EAFD;IC1DI,0BAAwB,EACzB;EDyDH;ICvDI,eAAa,EACd;;AD0DH;ECnEE,0B7CigBsC;E6ChgBtC,sB7CigBqC;E6ChgBrC,e7C8fsC,E4C3bvC;EAFD;IC9DI,0BAAwB,EACzB;ED6DH;IC3DI,eAAa,EACd;;ACGH;EACE;IAAQ,4BAA4B,EAAA;EACpC;IAAQ,yBAAyB,EAAA,EAAA;;AAQnC;EACE,iBAAiB;EACjB,a9CsC6B;E8CrC7B,oB9CqC6B;E8CpC7B,0B9CgnBmC;E8C/mBnC,mB9C+E6B;EF1FkC,uHmB0B9C,E6BblB;;AAGD;EACE,YAAY;EACZ,UAAU;EACV,aAAa;EACb,gB9Cc4B;E8Cb5B,kB9CyB6B;E8CxB7B,Y9CsmBgC;E8CrmBhC,mBAAmB;EACnB,0B9C1B4B;EFEmC,uHmB0B9C;Ed+IuC,oGArChC,E2CzGzB;;AAOD;;ECGE,sMAAiC;EDAjC,2BAA2B,EAC5B;;AAMD;;E3B1CU,mD2B4CkD,EAC3D;;AAMD;EErEE,0BhDe6B,E8CwD9B;EAFD;IChBE,sMAAiC,EChDhC;;AFoEH;EEzEE,0BhDgB6B,E8C2D9B;EAFD;ICpBE,sMAAiC,EChDhC;;AFwEH;EE7EE,0BhDiB6B,E8C8D9B;EAFD;ICxBE,sMAAiC,EChDhC;;AF4EH;EEjFE,0BhDkB6B,E8CiE9B;EAFD;IC5BE,sMAAiC,EChDhC;;ACRH;EAEE,iBAAiB,EAKlB;EAPD;IAKI,cAAc,EACf;;AAGH;;EAEE,QAAQ;EACR,iBAAiB,EAClB;;AAED;EACE,eAAe,EAC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lPM,erDGwB;MqDFxB,uBrDosB4B,EqDnsB7B;EDgPL;IC5OM,6BrDHwB,EqDIzB;;AD8OL;EChQE,sBrDsfqC,EoDpPtC;EAFD;IC7PI,erDifoC;IqDhfpC,0BrDifoC;IqDhfpC,sBrDifmC,EqDxepC;IDkPH;MCxPM,0BrD8eiC,EqD7elC;IDuPL;MCrPM,erD0ekC;MqDzelC,0BrDwekC,EqDvenC;EDmPL;IC/OM,6BrDqeiC,EqDpelC;;ADiPL;ECnQE,sBrD0fqC,EoDrPtC;EAFD;IChQI,erDqfoC;IqDpfpC,0BrDqfoC;IqDpfpC,sBrDqfmC,EqD5epC;IDqPH;MC3PM,0BrDkfiC,EqDjflC;ID0PL;MCxPM,erD8ekC;MqD7elC,0BrD4ekC,EqD3enC;EDsPL;IClPM,6BrDyeiC,EqDxelC;;ADoPL;ECtQE,sBrD8fqC,EoDtPtC;EAFD;ICnQI,erDyfoC;IqDxfpC,0BrDyfoC;IqDxfpC,sBrDyfmC,EqDhfpC;IDwPH;MC9PM,0BrDsfiC,EqDrflC;ID6PL;MC3PM,erDkfkC;MqDjflC,0BrDgfkC,EqD/enC;EDyPL;ICrPM,6BrD6eiC,EqD5elC;;ADuPL;ECzQE,sBrDkgBqC,EoDvPtC;EAFD;ICtQI,erD6foC;IqD5fpC,0BrD6foC;IqD5fpC,sBrD6fmC,EqDpfpC;ID2PH;MCjQM,0BrD0fiC,EqDzflC;IDgQL;MC9PM,erDsfkC;MqDrflC,0BrDofkC,EqDnfnC;ED4PL;ICxPM,6BrDifiC,EqDhflC;;ACjBL;EACE,mBAAmB;EACnB,eAAe;EACf,UAAU;EACV,WAAW;EACX,iBAAiB,EAelB;EApBD;;;;;IAYI,mBAAmB;IACnB,OAAO;IACP,QAAQ;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,UAAU,EACX;;AAIH;EACE,uBAAuB,EACxB;;AAGD;EACE,oBAAoB,EACrB;;AC5BD;EACE,iBAAiB;EACjB,cAAc;EACd,oBAAoB;EACpB,0BvDqvBmC;EuDpvBnC,0BvDqvBkC;EuDpvBlC,mBvDiG6B;EF1FkC,wHmB0B9C,EsC3BlB;EAZD;IASI,mBAAmB;IACnB,kCAAkB,EACnB;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iBvB;EAAE,aN2nBY,EAAO;;AM1nBrB;EAAE,aNsPY,EAAO;;AMrPrB;EAAE,aNykBgB,EAAO;;AMxkBzB;EAAE,aNukBU,EAAO;;AMtkBnB;EAAE,aNwkBe,EAAO;;AMvkBxB;EAAE,aNyHa,EAAO;;AMxHtB;;;EAAE,aN6kBa,EAAO;;AM5kBtB;EAAE,aN+emB,EAAO;;AM9e5B;EAAE,aN6eoB,EAAO;;AM5e7B;EAAE,aNqciB,EAAO;;AMpc1B;EAAE,aN8fc,EAAO;;AM7fvB;;EAAE,aNkJW,EAAO;;AMjJpB;EAAE,aNslBe,EAAO;;AMrlBxB;EAAE,aNiTY,EAAO;;AMhTrB;EAAE,aN6Nc,EAAO;;AM5NvB;EAAE,aNmIe,EAAO;;AMlIxB;EAAE,aNudY,EAAO;;AMtdrB;EAAE,aN+KgB,EAAO;;AM9KzB;EAAE,aNU2B,EAAO;;AMTpC;EAAE,aNYyB,EAAO;;AMXlC;EAAE,aN0Ta,EAAO;;AMzTtB;EAAE,aNmbqB,EAAO;;AMlb9B;;EAAE,aN4cc,EAAO;;AM3cvB;EAAE,aNsce,EAAO;;AMrcxB;EAAE,aN6VgB,EAAO;;AM5VzB;EAAE,aNgWY,EAAO;;AM/VrB;EAAE,aNkOY,EAAO;;AMjOrB;EAAE,aN8RkB,EAAO;;AM7R3B;EAAE,aN+mBkB,EAAO;;AM9mB3B;EAAE,aN6mBmB,EAAO;;AM5mB5B;EAAE,aN8mBiB,EAAO;;AM7mB1B;EAAE,aNmbc,EAAO;;AMlbvB;EAAE,aNmBe,EAAO;;AMlBxB;EAAE,aNgiBW,EAAO;;AM/hBpB;EAAE,aNgiBY,EAAO;;AM/hBrB;EAAE,aN8CY,EAAO;;AM7CrB;EAAE,aN8CgB,EAAO;;AM7CzB;EAAE,aN0aa,EAAO;;AMzatB;EAAE,aN+Dc,EAAO;;AM9DvB;EAAE,aNgOY,EAAO;;AM/NrB;EAAE,aNsCY,EAAO;;AMrCrB;EAAE,aNgTc,EAAO;;AM/SvB;EAAE,aN8hBmB,EAAO;;AM7hB5B;EAAE,aN8hBkB,EAAO;;AM7hB3B;EAAE,aNpCkB,EAAO;;AMqC3B;EAAE,aNvCoB,EAAO;;AMwC7B;EAAE,aNrCmB,EAAO;;AMsC5B;EAAE,aNxCqB,EAAO;;AMyC9B;EAAE,aNoUY,EAAO;;AMnUrB;;EAAE,aN4Xe,EAAO;;AM3XxB;EAAE,aN6Rc,EAAO;;AM5RvB;EAAE,aNklBoB,EAAO;;AMjlB7B;;;EAAE,aN0YiB,EAAO;;AMzY1B;EAAE,aNmYc,EAAO;;AMlYvB;EAAE,aN+UkB,EAAO;;AM9U3B;EAAE,aNnDc,EAAO;;AMoDvB;EAAE,aN8hBY,EAAO;;AM7hBrB;;EAAE,aNiYuB,EAAO;;AMhYhC;EAAE,aNqcsB,EAAO;;AMpc/B;EAAE,aNuEsB,EAAO;;AMtE/B;EAAE,aNtBc,EAAO;;AMuBvB;EAAE,aNifqB,EAAO;;AMhf9B;EAAE,aNgKqB,EAAO;;AM/J9B;EAAE,aNlBgB,EAAO;;AMmBzB;EAAE,aNsYY,EAAO;;AMrYrB;EAAE,aNoXa,EAAO;;AMnXtB;EAAE,aNifY,EAAO;;AMhfrB;EAAE,aNuMe,EAAO;;AMtMxB;EAAE,aN2JoB,EAAO;;AM1J7B;EAAE,aN0eoB,EAAO;;AMze7B;EAAE,aN+Ha,EAAO;;AM9HtB;EAAE,aNiEoB,EAAO;;AMhE7B;EAAE,aNiEqB,EAAO;;AMhE9B;EAAE,aNkYmB,EAAO;;AMjY5B;EAAE,aN6UoB,EAAO;;AM5U7B;EAAE,aNygBoB,EAAO;;AMxgB7B;EAAE,aNmDoB,EAAO;;AMlD7B;EAAE,aNuYuB,EAAO;;AMtYhC;EAAE,aNoQmB,EAAO;;AMnQ5B;EAAE,aNgGkB,EAAO;;AM/F3B;EAAE,aNqgBsB,EAAO;;AMpgB/B;EAAE,aN+CsB,EAAO;;AM9C/B;EAAE,aNnCW,EAAO;;AMoCpB;EAAE,aNhDkB,EAAO;;AMiD3B;EAAE,aNhDmB,EAAO;;AMiD5B;EAAE,aNhDgB,EAAO;;AMiDzB;EAAE,aNpDkB,EAAO;;AMqD3B;;EAAE,aNoaa,EAAO;;AMnatB;EAAE,aN2Hc,EAAO;;AM1HvB;EAAE,aN8EgB,EAAO;;AM7EzB;EAAE,aNgXY,EAAO;;AM/WrB;EAAE,aN2Ta,EAAO;;AM1TtB;EAAE,aNlDgB,EAAO;;AMmDzB;EAAE,aNoH0B,EAAO;;AMnHnC;EAAE,aN0LY,EAAO;;AMzLrB;EAAE,aNqQY,EAAO;;AMpQrB;EAAE,aNyJY,EAAO;;AMxJrB;EAAE,aNsHW,EAAO;;AMrHpB;EAAE,aNsHiB,EAAO;;AMrH1B;;EAAE,aN+G4B,EAAO;;AM9GrC;EAAE,aNiWa,EAAO;;AMhWtB;EAAE,aNNgB,EAAO;;AMOzB;EAAE,aNkXc,EAAO;;AMjXvB;EAAE,aNyDe,EAAO;;AMxDxB;EAAE,aNuRc,EAAO;;AMtRvB;EAAE,aNiCkB,EAAO;;AMhC3B;EAAE,aN6BoB,EAAO;;AM5B7B;EAAE,aN0Xe,EAAO;;AMzXxB;EAAE,aNyZqB,EAAO;;AMxZ9B;EAAE,aNsJc,EAAO;;AMrJvB;EAAE,aNuJmB,EAAO;;AMtJ5B;EAAE,aNtEgB,EAAO;;AMuEzB;EAAE,aNxEgB,EAAO;;AMyEzB;;EAAE,aNhEiB,EAAO;;AMiE1B;EAAE,aN8fsB,EAAO;;AM7f/B;EAAE,aN0GuB,EAAO;;AMzGhC;EAAE,aNdoB,EAAO;;AMe7B;EAAE,aNwOW,EAAO;;AMvOpB;;EAAE,aNwCY,EAAO;;AMvCrB;EAAE,aN6CgB,EAAO;;AM5CzB;EAAE,aNwdmB,EAAO;;AMvd5B;EAAE,aNsdqB,EAAO;;AMrd9B;EAAE,aN6aiB,EAAO;;AM5a1B;EAAE,aNgMe,EAAO;;AM/LxB;EAAE,aN2YgB,EAAO;;AM1YzB;EAAE,aNqPuB,EAAO;;AMpPhC;EAAE,aN+ckB,EAAO;;AM9c3B;EAAE,aNsFqB,EAAO;;AMrF9B;EAAE,aNsYe,EAAO;;AMrYxB;EAAE,aNqec,EAAO;;AMpevB;EAAE,aN2JqB,EAAO;;AM1J9B;EAAE,aNsfc,EAAO;;AMrfvB;EAAE,aNmOe,EAAO;;AMlOxB;EAAE,aNsTa,EAAO;;AMrTtB;EAAE,aN6ZgB,EAAO;;AM5ZzB;EAAE,aNpDkB,EAAO;;AMqD3B;EAAE,aNoToB,EAAO;;AMnT7B;EAAE,aNsee,EAAO;;AMrexB;;EAAE,aNgFgB,EAAO;;AM/EzB;EAAE,aNgJc,EAAO;;AM/IvB;EAAE,aN0ec,EAAO;;AMzevB;EAAE,aNgCmB,EAAO;;AM/B5B;;EAAE,aN8VW,EAAO;;AM7VpB;EAAE,aNwKa,EAAO;;AMvKtB;EAAE,aNvDgB,EAAO;;AMwDzB;EAAE,aN9EY,EAAO;;AM+ErB;EAAE,aNvBmB,EAAO;;AMwB5B;EAAE,aN2JoB,EAAO;;AM1J7B;EAAE,aNyJmB,EAAO;;AMxJ5B;EAAE,aN0JiB,EAAO;;AMzJ1B;EAAE,aNsJmB,EAAO;;AMrJ5B;EAAE,aN5HyB,EAAO;;AM6HlC;EAAE,aNxH0B,EAAO;;AMyHnC;EAAE,aNxHuB,EAAO;;AMyHhC;EAAE,aNhIyB,EAAO;;AMiIlC;EAAE,aNqIa,EAAO;;AMpItB;EAAE,aN4fc,EAAO;;AM3fvB;EAAE,aNsaa,EAAO;;AMratB;EAAE,aN0Fc,EAAO;;AMzFvB;EAAE,aN3EiB,EAAO;;AM4E1B;EAAE,aNzHkB,EAAO;;AM0H3B;;EAAE,aN+da,EAAO;;AM9dtB;;EAAE,aN8MY,EAAO;;AM7MrB;EAAE,aNda,EAAO;;AMetB;EAAE,aN4Fa,EAAO;;AM3FtB;;EAAE,aN8UgB,EAAO;;AM7UzB;;EAAE,aNgFe,EAAO;;AM/ExB;EAAE,aN2QiB,EAAO;;AM1Q1B;;EAAE,aN0FgB,EAAO;;AMzFzB;EAAE,aNyXc,EAAO;;AMxXvB;;;EAAE,aNtHY,EAAO;;AMuHrB;EAAE,aN4Me,EAAO;;AM3MxB;EAAE,aN0Me,EAAO;;AMzMxB;EAAE,aNwYqB,EAAO;;AMvY9B;EAAE,aNociB,EAAO;;AMnc1B;EAAE,aN+Ya,EAAO;;AM9YtB;EAAE,aN8Ma,EAAO;;AM7MtB;EAAE,aNsba,EAAO;;AMrbtB;EAAE,aNgRiB,EAAO;;AM/Q1B;EAAE,aNiRwB,EAAO;;AMhRjC;EAAE,aN+G0B,EAAO;;AM9GnC;EAAE,aN6GmB,EAAO;;AM5G5B;EAAE,aNsOa,EAAO;;AMrOtB;EAAE,aN/EkB,EAAO;;AMgF3B;EAAE,aNzEgB,EAAO;;AM0EzB;EAAE,aNhFkB,EAAO;;AMiF3B;EAAE,aNhFmB,EAAO;;AMiF5B;EAAE,aN5Be,EAAO;;AM6BxB;;EAAE,aNsVY,EAAO;;AMrVrB;;EAAE,aN2ViB,EAAO;;AM1V1B;;EAAE,aNyVgB,EAAO;;AMxVzB;EAAE,aNUgB,EAAO;;AMTzB;EAAE,aNiLgB,EAAO;;AMhLzB;;EAAE,aNkbY,EAAO;;AMjbrB;;EAAE,aN6Ea,EAAO;;AM5EtB;;EAAE,aN6XkB,EAAO;;AM5X3B;EAAE,aNnCiB,EAAO;;AMoC1B;EAAE,aNhCkB,EAAO;;AMiC3B;;EAAE,aNvHY,EAAO;;AMwHrB;EAAE,aNmUe,EAAO;;AMlUxB;EAAE,aNyagB,EAAO;;AMxazB;;EAAE,aNxDiB,EAAO;;AMyD1B;EAAE,aNoKmB,EAAO;;AMnK5B;EAAE,aNIgB,EAAO;;AMHzB;EAAE,aNtDsB,EAAO;;AMuD/B;EAAE,aNtDoB,EAAO;;AMuD7B;EAAE,aN8ae,EAAO;;AM7axB;EAAE,aNiWmB,EAAO;;AMhW5B;EAAE,aN0WgB,EAAO;;AMzWzB;EAAE,aN7Ic,EAAO;;AM8IvB;EAAE,aNtDc,EAAO;;AMuDvB;EAAE,aN/Be,EAAO;;AMgCxB;EAAE,aN8BmB,EAAO;;AM7B5B;EAAE,aN7HkB,EAAO;;AM8H3B;EAAE,aNyGkB,EAAO;;AMxG3B;EAAE,aN5MiB,EAAO;;AM6M1B;EAAE,aNyLc,EAAO;;AMxLvB;EAAE,aNUmB,EAAO;;AMT5B;EAAE,aN1JY,EAAO;;AM2JrB;EAAE,aN6EgB,EAAO;;AM5EzB;EAAE,aNgPmB,EAAO;;AM/O5B;EAAE,aN7MyB,EAAO;;AM8MlC;EAAE,aN7M0B,EAAO;;AM8MnC;EAAE,aN7MuB,EAAO;;AM8MhC;EAAE,aNjNyB,EAAO;;AMkNlC;EAAE,aN7MkB,EAAO;;AM8M3B;EAAE,aN7MmB,EAAO;;AM8M5B;EAAE,aN7MgB,EAAO;;AM8MzB;EAAE,aNjNkB,EAAO;;AMkN3B;EAAE,aN3Ce,EAAO;;AM4CxB;EAAE,aN2Hc,EAAO;;AM1HvB;EAAE,aNwVc,EAAO;;AMvVvB;;EAAE,aNkLc,EAAO;;AMjLvB;EAAE,aN3FgB,EAAO;;AM4FzB;EAAE,aN2OkB,EAAO;;AM1O3B;EAAE,aN2OmB,EAAO;;AM1O5B;EAAE,aNmTe,EAAO;;AMlTxB;EAAE,aNhGc,EAAO;;AMiGvB;;EAAE,aNqPa,EAAO;;AMpPtB;EAAE,aN6CkB,EAAO;;AM5C3B;EAAE,aNoBgB,EAAO;;AMnBzB;EAAE,aNqBqB,EAAO;;AMpB9B;EAAE,aN8Re,EAAO;;AM7RxB;EAAE,aNyBe,EAAO;;AMxBxB;EAAE,aN8Ja,EAAO;;AM7JtB;EAAE,aNyBe,EAAO;;AMxBxB;EAAE,aNwGkB,EAAO;;AMvG3B;EAAE,aNOc,EAAO;;AMNvB;EAAE,aNKsB,EAAO;;AMJ/B;EAAE,aN8UgB,EAAO;;AM7UzB;EAAE,aNjGY,EAAO;;AMkGrB;;EAAE,aNyOiB,EAAO;;AMxO1B;;;EAAE,aN8SmB,EAAO;;AM7S5B;EAAE,aN2HsB,EAAO;;AM1H/B;EAAE,aNhFY,EAAO;;AMiFrB;EAAE,aNrGiB,EAAO;;AMsG1B;;EAAE,aNnIoB,EAAO;;AMoI7B;EAAE,aNkNgB,EAAO;;AMjNzB;EAAE,aN+EY,EAAO;;AM9ErB;EAAE,aNnDmB,EAAO;;AMoD5B;EAAE,aNwTmB,EAAO;;AMvT5B;EAAE,aNmTiB,EAAO;;AMlT1B;EAAE,aN1Dc,EAAO;;AM2DvB;EAAE,aNyMoB,EAAO;;AMxM7B;EAAE,aN4IkB,EAAO;;AM3I3B;EAAE,aN4IwB,EAAO;;AM3IjC;EAAE,aNwPc,EAAO;;AMvPvB;EAAE,aNzKkB,EAAO;;AM0K3B;EAAE,aNlByB,EAAO;;AMmBlC;EAAE,aN2Nc,EAAO;;AM1NvB;EAAE,aNgIc,EAAO;;AM/HvB;EAAE,aN3I2B,EAAO;;AM4IpC;EAAE,aN3I4B,EAAO;;AM4IrC;EAAE,aN3IyB,EAAO;;AM4IlC;EAAE,aN/I2B,EAAO;;AMgJpC;EAAE,aNuDa,EAAO;;AMtDtB;EAAE,aNpGY,EAAO;;AMqGrB;EAAE,aNzQc,EAAO;;AM0QvB;EAAE,aNiWkB,EAAO;;AMhW3B;EAAE,aN7LgB,EAAO;;AM8LzB;EAAE,aNlFkB,EAAO;;AMmF3B;EAAE,aNlFkB,EAAO;;AMmF3B;EAAE,aNmNkB,EAAO;;AMlN3B;EAAE,aN4KmB,EAAO;;AM3K5B;EAAE,aNsTc,EAAO;;AMrTvB;EAAE,aN2HoB,EAAO;;AM1H7B;EAAE,aN2HsB,EAAO;;AM1H/B;EAAE,aN0EgB,EAAO;;AMzEzB;EAAE,aNwEkB,EAAO;;AMvE3B;EAAE,aNhKoB,EAAO;;AMiK7B;EAAE,aNuJqB,EAAO;;AMtJ9B;EAAE,aN7E4B,EAAO;;AM8ErC;EAAE,aN0NoB,EAAO;;AMzN7B;EAAE,aN/He,EAAO;;AMgIxB;;EAAE,aN3L2B,EAAO;;AM4LpC;;EAAE,aNzLyB,EAAO;;AM0LlC;;EAAE,aN3L4B,EAAO;;AM4LrC;;EAAE,aN5FW,EAAO;;AM6FpB;EAAE,aN1BW,EAAO;;AM2BpB;;EAAE,aN+UW,EAAO;;AM9UpB;;EAAE,aNuCW,EAAO;;AMtCpB;;;;EAAE,aN8CW,EAAO;;AM7CpB;;;EAAE,aNgMW,EAAO;;AM/LpB;;EAAE,aNgDW,EAAO;;AM/CpB;;EAAE,aN3NW,EAAO;;AM4NpB;EAAE,aN7EY,EAAO;;AM8ErB;EAAE,aNjEiB,EAAO;;AMkE1B;EAAE,aNgOsB,EAAO;;AM/N/B;EAAE,aNgOuB,EAAO;;AM/NhC;EAAE,aNgOuB,EAAO;;AM/NhC;EAAE,aNgOwB,EAAO;;AM/NjC;EAAE,aNmOwB,EAAO;;AMlOjC;EAAE,aNmOyB,EAAO;;AMlOlC;EAAE,aNwRiB,EAAO;;AMvR1B;EAAE,aNoRmB,EAAO;;AMnR5B;EAAE,aNyWsB,EAAO;;AMxW/B;EAAE,aNsWe,EAAO;;AMrWxB;EAAE,aN4VY,EAAO;;AM3VrB;EAAE,aN4VmB,EAAO;;AM3V5B;EAAE,aNoWoB,EAAO;;AMnW7B;EAAE,aN9He,EAAO;;AM+HxB;EAAE,aNoOsB,EAAO;;AMnO/B;EAAE,aNkBiB,EAAO;;AMjB1B;EAAE,aNlEc,EAAO;;AMmEvB;EAAE,aN/TW,EAAO;;AMgUpB;EAAE,aN3PiB,EAAO;;AM4P1B;EAAE,aN3PwB,EAAO;;AM4PjC;EAAE,aNmSc,EAAO;;AMlSvB;EAAE,aNmSqB,EAAO;;AMlS9B;EAAE,aNiDuB,EAAO;;AMhDhC;EAAE,aNmDqB,EAAO;;AMlD9B;EAAE,aNgDuB,EAAO;;AM/ChC;EAAE,aNgDwB,EAAO;;AM/CjC;EAAE,aNtTa,EAAO;;AMuTtB;EAAE,aNuUe,EAAO;;AMtUxB;EAAE,aNlUe,EAAO;;AMmUxB;EAAE,aNmCa,EAAO;;AMlCtB;EAAE,aNhJgB,EAAO;;AMiJzB;EAAE,aN0La,EAAO;;AMzLtB;EAAE,aNxEkB,EAAO;;AMyE3B;EAAE,aNgRc,EAAO;;AM/QvB;EAAE,aNnHc,EAAO;;AMoHvB;EAAE,aN6CY,EAAO;;AM5CrB;;EAAE,aNjDgB,EAAO;;AMkDzB;EAAE,aNmOa,EAAO;;AMlOtB;EAAE,aNoEc,EAAO;;AMnEvB;EAAE,aNlUe,EAAO;;AMmUxB;EAAE,aNrQW,EAAO;;AMsQpB;EAAE,aN6SU,EAAO;;AM5SnB;EAAE,aNkTa,EAAO;;AMjTtB;EAAE,aNkIc,EAAO;;AMjIvB;EAAE,aN+EiB,EAAO;;AM9E1B;EAAE,aNoMsB,EAAO;;AMnM/B;EAAE,aNnU4B,EAAO;;AMoUrC;EAAE,aNrU2B,EAAO;;AMsUpC;;EAAE,aNvP2B,EAAO;;AMwPpC;EAAE,aNrKoB,EAAO;;AMsK7B;EAAE,aN6SkB,EAAO;;AM5S3B;EAAE,aNiSoB,EAAO;;AMhS7B;;EAAE,aNiQW,EAAO;;AMhQpB;EAAE,aNqGqB,EAAO;;AMpG9B;EAAE,aNqLqB,EAAO;;AMpL9B;EAAE,aNmKa,EAAO;;AMlKtB;EAAE,aNhKuB,EAAO;;AMiKhC;EAAE,aN2SiB,EAAO;;AM1S1B;EAAE,aN6Dc,EAAO;;AM5DvB;;;EAAE,aNsQkB,EAAO;;AMrQ3B;;EAAE,aN1EsB,EAAO;;AM2E/B;EAAE,aN6Sa,EAAO;;AM5StB;EAAE,aNhFc,EAAO;;AMiFvB;EAAE,aNyGc,EAAO;;AMxGvB;EAAE,aNyGqB,EAAO;;AMxG9B;EAAE,aNmM0B,EAAO;;AMlMnC;EAAE,aNiMmB,EAAO;;AMhM5B;EAAE,aN7LiB,EAAO;;AM8L1B;EAAE,aN1LY,EAAO;;AM2LrB;EAAE,aNwEkB,EAAO;;AMvE3B;EAAE,aNwEsB,EAAO;;AMvE/B;EAAE,aNvLc,EAAO;;AMwLvB;EAAE,aNjCc,EAAO;;AMkCvB;EAAE,aN5BgB,EAAO;;AM6BzB;EAAE,aN7JW,EAAO;;AM8JpB;EAAE,aNvSgB,EAAO;;AMwSzB;EAAE,aNpPa,EAAO;;AMqPtB;EAAE,aNsDW,EAAO;;AMrDpB;EAAE,aN+Ja,EAAO;;AM9JtB;EAAE,aNjNY,EAAO;;AMkNrB;EAAE,aNjNa,EAAO;;AMkNtB;EAAE,aNnUe,EAAO;;AMoUxB;EAAE,aNnUsB,EAAO;;AMoU/B;EAAE,aNsKa,EAAO;;AMrKtB;EAAE,aNsKoB,EAAO;;AMrK7B;EAAE,aNkFe,EAAO;;AMjFxB;;EAAE,aNlSW,EAAO;;AMmSpB;;EAAE,aN0LY,EAAO;;AMzLrB;EAAE,aNwNY,EAAO;;AMvNrB;EAAE,aNqJe,EAAO;;AMpJxB;EAAE,aNlNkB,EAAO;;AMmN3B;EAAE,aN+IkB,EAAO;;AM9I3B;EAAE,aNxNgB,EAAO;;AMyNzB;EAAE,aNpKkB,EAAO;;AMqK3B;EAAE,aN7JmB,EAAO;;AM8J5B;EAAE,aN1KoB,EAAO;;AM2K7B;EAAE,aNpKyB,EAAO;;AMqKlC;;;EAAE,aN3KoB,EAAO;;AM4K7B;;EAAE,aNhLsB,EAAO;;AMiL/B;;EAAE,aNhLoB,EAAO;;AMiL7B;;EAAE,aNpKoB,EAAO;;AMqK7B;EAAE,aNjLmB,EAAO;;AMkL5B;EAAE,aN+OY,EAAO;;AM9OrB;EAAE,aN/Pe,EAAO;;AMgQxB;EAAE,aN/DgB,EAAO;;AMgEzB;;;;;EAAE,aNhDiB,EAAO;;AMiD1B;EAAE,aN9QsB,EAAO;;AM+Q/B;;EAAE,aN2Da,EAAO;;AM1DtB;;EAAE,aNvNc,EAAO;;AMwNvB;EAAE,aNtIkB,EAAO;;AMuI3B;EAAE,aNxIW,EAAO;;AMyIpB;;;EAAE,aNzHmB,EAAO;;AM0H5B;EAAE,aNmKqB,EAAO;;AMlK9B;EAAE,aN6CU,EAAO;;AM5CnB;;EAAE,aN2Oc,EAAO;;AM1OvB;;EAAE,aNUmB,EAAO;;AMT5B;;EAAE,aNUqB,EAAO;;AMT9B;EAAE,aN3Ge,EAAO;;AM4GxB;EAAE,aNzRmB,EAAO;;AM0R5B;EAAE,aNlHc,EAAO;;AMmHvB;EAAE,aNQiB,EAAO;;AMP1B;EAAE,aNkGe,EAAO;;AMjGxB;EAAE,aN+EiB,EAAO;;AM9E1B;EAAE,aN+EwB,EAAO;;AM9EjC;EAAE,aN/VY,EAAO;;AMgWrB;;EAAE,aNnKgB,EAAO;;AMoKzB;EAAE,aNwLW,EAAO;;AMvLpB;EAAE,aN1WkB,EAAO;;AM2W3B;EAAE,aNsBY,EAAO;;AMrBrB;EAAE,aN2FkB,EAAO;;AM1F3B;EAAE,aNyLc,EAAO;;AMxLvB;EAAE,aN0OY,EAAO;;AMzOrB;EAAE,aNnBmB,EAAO;;AMoB5B;EAAE,aN2NY,EAAO;;AM1NrB;EAAE,aN3VkB,EAAO;;AM4V3B;EAAE,aNHc,EAAO;;AMIvB;EAAE,aNvJqB,EAAO;;AMwJ9B;EAAE,aNlUe,EAAO;;AMmUxB;EAAE,aNtUqB,EAAO;;AMuU9B;EAAE,aNzUmB,EAAO;;AM0U5B;EAAE,aN5Ue,EAAO;;AM6UxB;EAAE,aNxUiB,EAAO;;AMyU1B;EAAE,aNxUiB,EAAO;;AMyU1B;EAAE,aN7XkB,EAAO;;AM8X3B;EAAE,aN7XoB,EAAO;;AM8X7B;EAAE,aN6Ja,EAAO;;AM5JtB;EAAE,aN1RiB,EAAO;;AM2R1B;EAAE,aN3ZU,EAAO;;AM4ZnB;EAAE,aN9OkB,EAAO;;AM+O3B;EAAE,aNzBmB,EAAO;;AM0B5B;EAAE,aNhYqB,EAAO;;AMiY9B;EAAE,aNjbkB,EAAO;;AMkb3B;EAAE,aNZiB,EAAO;;AMa1B;EAAE,aN7FkB,EAAO;;AM8F3B;EAAE,aN3Gc,EAAO;;AM4GvB;EAAE,aN3GqB,EAAO;;AM4G9B;EAAE,aN0IkB,EAAO;;AMzI3B;EAAE,aN0IiB,EAAO;;AMzI1B;EAAE,aN1Ye,EAAO;;AM2YxB;EAAE,aNvXW,EAAO;;AMwXpB;EAAE,aN3He,EAAO;;AM4HxB;EAAE,aNtciB,EAAO;;AMuc1B;EAAE,aNnWU,EAAO;;AMoWnB;;;EAAE,aN1IW,EAAO;;AM2IpB;EAAE,aNxEgB,EAAO;;AMyEzB;EAAE,aN5XkB,EAAO;;AM6X3B;EAAE,aNjTsB,EAAO;;AMkT/B;EAAE,aNpSgB,EAAO;;AMqSzB;EAAE,aNlNgB,EAAO;;AMmNzB;EAAE,aNvHe,EAAO;;AMwHxB;EAAE,aN0Bc,EAAO;;AMzBvB;EAAE,aNsCoB,EAAO;;AMrC7B;EAAE,aN0CmB,EAAO;;AMzC5B;EAAE,aN2CgB,EAAO;;AM1CzB;EAAE,aNhXiB,EAAO;;AMiX1B;EAAE,aNlXuB,EAAO;;AMmXhC;EAAE,aNvSe,EAAO;;AMwSxB;EAAE,aN+BY,EAAO;;AM9BrB;EAAE,aNyJmB,EAAO;;AMxJ5B;EAAE,aNvEkB,EAAO;;AMwE3B;EAAE,aN6EmB,EAAO;;AM5E5B;EAAE,aN5KiB,EAAO;;AM6K1B;EAAE,aNwJa,EAAO;;AMvJtB;EAAE,aNjGY,EAAO;;AMkGrB;EAAE,aNxFe,EAAO;;AMyFxB;;EAAE,aNmHmB,EAAO;;AMlH5B;EAAE,aNmHuB,EAAO;;AMlHhC;EAAE,aNoJoB,EAAO;;AMnJ7B;EAAE,aNrGmB,EAAO;;AMsG5B;EAAE,aNmJkB,EAAO;;AMlJ3B;EAAE,aNtGmB,EAAO;;AMuG5B;EAAE,aNrGqB,EAAO;;AMsG9B;EAAE,aNvGqB,EAAO;;AMwG9B;EAAE,aNjFc,EAAO;;AMkFvB;EAAE,aNjOkB,EAAO;;AMkO3B;EAAE,aN1RyB,EAAO;;AM2RlC;EAAE,aNpDmB,EAAO;;AMqD5B;EAAE,aNyJgB,EAAO;;AMxJzB;EAAE,aNCc,EAAO;;AMAvB;EAAE,aNmIiB,EAAO;;AMlI1B;EAAE,aNoIkB,EAAO;;AMnI3B;;EAAE,aN7bW,EAAO;;AM8bpB;EAAE,aNuIe,EAAO;;AMtIxB;EAAE,aNgGa,EAAO;;AM/FtB;EAAE,aN0Dc,EAAO;;AMzDvB;EAAE,aNhHc,EAAO;;AMiHvB;;EAAE,aN0JoB,EAAO;;AMzJ7B;EAAE,aNtFqB,EAAO;;AMuF9B;EAAE,aN1FgB,EAAO;;AM2FzB;EAAE,aNhToB,EAAO;;AMiT7B;;EAAE,aN1coB,EAAO;;AM2c7B;;EAAE,aNxc8B,EAAO;;AMycvC;;EAAE,aN3coB,EAAO;;AM4c7B;;EAAE,aN3cuB,EAAO;;AM4chC;;EAAE,aN/cqB,EAAO;;AMgd9B;EAAE,aN1GqB,EAAO;;AM2G9B;EAAE,aNhMgB,EAAO;;AMiMzB;EAAE,aNvGoB,EAAO;;AMwG7B;EAAE,aNvGsB,EAAO;;AMwG/B;EAAE,aNmCmB,EAAO;;AMlC5B;EAAE,aNmCqB,EAAO;;AMlC9B;EAAE,aN1Zc,EAAO;;AM2ZvB;EAAE,aN7ZsB,EAAO;;AM8Z/B;EAAE,aN/Xa,EAAO;;AMgYtB;EAAE,aNreqB,EAAO;;AMse9B;EAAE,aN7MmB,EAAO;;AM8M5B;;E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","file":"nuboot_radix.style.css","sourcesContent":["@charset \"UTF-8\";\n/*\n * A partial implementation of the Ruby list functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/lists.rb\n */\n/*\n * A partial implementation of the Ruby constants functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/constants.rb\n */\n/*\n * A partial implementation of the Ruby display functions from Compass:\n * https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/display.rb\n */\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: transparent; }\n\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857;\n color: #333333;\n background-color: #fff; }\n\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit; }\n\na {\n color: #337ab7;\n text-decoration: none; }\n a:hover, a:focus {\n color: #23527c;\n text-decoration: underline; }\n a:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\nfigure {\n margin: 0; }\n\nimg {\n vertical-align: middle; }\n\n.img-responsive {\n display: block;\n max-width: 100%;\n height: auto; }\n\n.img-rounded {\n border-radius: 6px; }\n\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: compact(compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(all 0.2s ease-in-out, false, false, false, false, false, false, false, false, false);\n display: inline-block;\n max-width: 100%;\n height: auto; }\n\n.img-circle {\n border-radius: 50%; }\n\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee; }\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0; }\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto; }\n\n[role=\"button\"] {\n cursor: pointer; }\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit; }\n h1 small,\n h1 .small, h2 small,\n h2 .small, h3 small,\n h3 .small, h4 small,\n h4 .small, h5 small,\n h5 .small, h6 small,\n h6 .small,\n .h1 small,\n .h1 .small, .h2 small,\n .h2 .small, .h3 small,\n .h3 .small, .h4 small,\n .h4 .small, .h5 small,\n .h5 .small, .h6 small,\n .h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777; }\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: 20px;\n margin-bottom: 10px; }\n h1 small,\n h1 .small, .h1 small,\n .h1 .small,\n h2 small,\n h2 .small, .h2 small,\n .h2 .small,\n h3 small,\n h3 .small, .h3 small,\n .h3 .small {\n font-size: 65%; }\n\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: 10px;\n margin-bottom: 10px; }\n h4 small,\n h4 .small, .h4 small,\n .h4 .small,\n h5 small,\n h5 .small, .h5 small,\n .h5 .small,\n h6 small,\n h6 .small, .h6 small,\n .h6 .small {\n font-size: 75%; }\n\nh1, .h1 {\n font-size: 36px; }\n\nh2, .h2 {\n font-size: 30px; }\n\nh3, .h3 {\n font-size: 24px; }\n\nh4, .h4 {\n font-size: 18px; }\n\nh5, .h5 {\n font-size: 14px; }\n\nh6, .h6 {\n font-size: 12px; }\n\np {\n margin: 0 0 10px; }\n\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4; }\n @media (min-width: 768px) {\n .lead {\n font-size: 21px; } }\n\nsmall,\n.small {\n font-size: 85%; }\n\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em; }\n\n.text-left {\n text-align: left; }\n\n.text-right {\n text-align: right; }\n\n.text-center {\n text-align: center; }\n\n.text-justify {\n text-align: justify; }\n\n.text-nowrap {\n white-space: nowrap; }\n\n.text-lowercase {\n text-transform: lowercase; }\n\n.text-uppercase, .initialism {\n text-transform: uppercase; }\n\n.text-capitalize {\n text-transform: capitalize; }\n\n.text-muted, body.maintenance-page .tasks-list > div {\n color: #777777; }\n\n.text-primary {\n color: #337ab7; }\n\na.text-primary:hover,\na.text-primary:focus {\n color: #286090; }\n\n.text-success {\n color: #3c763d; }\n\na.text-success:hover,\na.text-success:focus {\n color: #2b542c; }\n\n.text-info {\n color: #31708f; }\n\na.text-info:hover,\na.text-info:focus {\n color: #245269; }\n\n.text-warning {\n color: #8a6d3b; }\n\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c; }\n\n.text-danger {\n color: #a94442; }\n\na.text-danger:hover,\na.text-danger:focus {\n color: #843534; }\n\n.bg-primary {\n color: #fff; }\n\n.bg-primary {\n background-color: #337ab7; }\n\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090; }\n\n.bg-success {\n background-color: #dff0d8; }\n\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3; }\n\n.bg-info {\n background-color: #d9edf7; }\n\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee; }\n\n.bg-warning {\n background-color: #fcf8e3; }\n\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5; }\n\n.bg-danger {\n background-color: #f2dede; }\n\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9; }\n\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee; }\n\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px; }\n ul ul,\n ul ol,\n ol ul,\n ol ol {\n margin-bottom: 0; }\n\n.list-unstyled {\n padding-left: 0;\n list-style: none; }\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px; }\n .list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px; }\n\ndl {\n margin-top: 0;\n margin-bottom: 20px; }\n\ndt,\ndd {\n line-height: 1.42857; }\n\ndt {\n font-weight: bold; }\n\ndd {\n margin-left: 0; }\n\n.dl-horizontal dd {\n overflow: hidden;\n *zoom: 1; }\n\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap; }\n .dl-horizontal dd {\n margin-left: 180px; } }\n\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777; }\n\n.initialism {\n font-size: 90%; }\n\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee; }\n blockquote p:last-child,\n blockquote ul:last-child,\n blockquote ol:last-child {\n margin-bottom: 0; }\n blockquote footer,\n blockquote small,\n blockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857;\n color: #777777; }\n blockquote footer:before,\n blockquote small:before,\n blockquote .small:before {\n content: '\\2014 \\00A0'; }\n\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right; }\n .blockquote-reverse footer:before,\n .blockquote-reverse small:before,\n .blockquote-reverse .small:before,\n blockquote.pull-right footer:before,\n blockquote.pull-right small:before,\n blockquote.pull-right .small:before {\n content: ''; }\n .blockquote-reverse footer:after,\n .blockquote-reverse small:after,\n .blockquote-reverse .small:after,\n blockquote.pull-right footer:after,\n blockquote.pull-right small:after,\n blockquote.pull-right .small:after {\n content: '\\00A0 \\2014'; }\n\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }\n\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px; }\n\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); }\n kbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none; }\n\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px; }\n pre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0; }\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll; }\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n overflow: hidden;\n *zoom: 1; }\n @media (min-width: 768px) {\n .container {\n width: 750px; } }\n @media (min-width: 992px) {\n .container {\n width: 970px; } }\n @media (min-width: 1200px) {\n .container {\n width: 1170px; } }\n\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n overflow: hidden;\n *zoom: 1; }\n\n.row {\n margin-left: -15px;\n margin-right: -15px;\n overflow: hidden;\n *zoom: 1; }\n\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .calendar-calendar, .view .row > .list-group, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px; }\n\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left; }\n\n.col-xs-1 {\n width: 8.33333%; }\n\n.col-xs-2 {\n width: 16.66667%; }\n\n.col-xs-3 {\n width: 25%; }\n\n.col-xs-4 {\n width: 33.33333%; }\n\n.col-xs-5 {\n width: 41.66667%; }\n\n.col-xs-6 {\n width: 50%; }\n\n.col-xs-7 {\n width: 58.33333%; }\n\n.col-xs-8 {\n width: 66.66667%; }\n\n.col-xs-9 {\n width: 75%; }\n\n.col-xs-10 {\n width: 83.33333%; }\n\n.col-xs-11 {\n width: 91.66667%; }\n\n.col-xs-12 {\n width: 100%; }\n\n.col-xs-pull-0 {\n right: auto; }\n\n.col-xs-pull-1 {\n right: 8.33333%; }\n\n.col-xs-pull-2 {\n right: 16.66667%; }\n\n.col-xs-pull-3 {\n right: 25%; }\n\n.col-xs-pull-4 {\n right: 33.33333%; }\n\n.col-xs-pull-5 {\n right: 41.66667%; }\n\n.col-xs-pull-6 {\n right: 50%; }\n\n.col-xs-pull-7 {\n right: 58.33333%; }\n\n.col-xs-pull-8 {\n right: 66.66667%; }\n\n.col-xs-pull-9 {\n right: 75%; }\n\n.col-xs-pull-10 {\n right: 83.33333%; }\n\n.col-xs-pull-11 {\n right: 91.66667%; }\n\n.col-xs-pull-12 {\n right: 100%; }\n\n.col-xs-push-0 {\n left: auto; }\n\n.col-xs-push-1 {\n left: 8.33333%; }\n\n.col-xs-push-2 {\n left: 16.66667%; }\n\n.col-xs-push-3 {\n left: 25%; }\n\n.col-xs-push-4 {\n left: 33.33333%; }\n\n.col-xs-push-5 {\n left: 41.66667%; }\n\n.col-xs-push-6 {\n left: 50%; }\n\n.col-xs-push-7 {\n left: 58.33333%; }\n\n.col-xs-push-8 {\n left: 66.66667%; }\n\n.col-xs-push-9 {\n left: 75%; }\n\n.col-xs-push-10 {\n left: 83.33333%; }\n\n.col-xs-push-11 {\n left: 91.66667%; }\n\n.col-xs-push-12 {\n left: 100%; }\n\n.col-xs-offset-0 {\n margin-left: 0%; }\n\n.col-xs-offset-1 {\n margin-left: 8.33333%; }\n\n.col-xs-offset-2 {\n margin-left: 16.66667%; }\n\n.col-xs-offset-3 {\n margin-left: 25%; }\n\n.col-xs-offset-4 {\n margin-left: 33.33333%; }\n\n.col-xs-offset-5 {\n margin-left: 41.66667%; }\n\n.col-xs-offset-6 {\n margin-left: 50%; }\n\n.col-xs-offset-7 {\n margin-left: 58.33333%; }\n\n.col-xs-offset-8 {\n margin-left: 66.66667%; }\n\n.col-xs-offset-9 {\n margin-left: 75%; }\n\n.col-xs-offset-10 {\n margin-left: 83.33333%; }\n\n.col-xs-offset-11 {\n margin-left: 91.66667%; }\n\n.col-xs-offset-12 {\n margin-left: 100%; }\n\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left; }\n .col-sm-1 {\n width: 8.33333%; }\n .col-sm-2 {\n width: 16.66667%; }\n .col-sm-3 {\n width: 25%; }\n .col-sm-4 {\n width: 33.33333%; }\n .col-sm-5 {\n width: 41.66667%; }\n .col-sm-6 {\n width: 50%; }\n .col-sm-7 {\n width: 58.33333%; }\n .col-sm-8 {\n width: 66.66667%; }\n .col-sm-9 {\n width: 75%; }\n .col-sm-10 {\n width: 83.33333%; }\n .col-sm-11 {\n width: 91.66667%; }\n .col-sm-12 {\n width: 100%; }\n .col-sm-pull-0 {\n right: auto; }\n .col-sm-pull-1 {\n right: 8.33333%; }\n .col-sm-pull-2 {\n right: 16.66667%; }\n .col-sm-pull-3 {\n right: 25%; }\n .col-sm-pull-4 {\n right: 33.33333%; }\n .col-sm-pull-5 {\n right: 41.66667%; }\n .col-sm-pull-6 {\n right: 50%; }\n .col-sm-pull-7 {\n right: 58.33333%; }\n .col-sm-pull-8 {\n right: 66.66667%; }\n .col-sm-pull-9 {\n right: 75%; }\n .col-sm-pull-10 {\n right: 83.33333%; }\n .col-sm-pull-11 {\n right: 91.66667%; }\n .col-sm-pull-12 {\n right: 100%; }\n .col-sm-push-0 {\n left: auto; }\n .col-sm-push-1 {\n left: 8.33333%; }\n .col-sm-push-2 {\n left: 16.66667%; }\n .col-sm-push-3 {\n left: 25%; }\n .col-sm-push-4 {\n left: 33.33333%; }\n .col-sm-push-5 {\n left: 41.66667%; }\n .col-sm-push-6 {\n left: 50%; }\n .col-sm-push-7 {\n left: 58.33333%; }\n .col-sm-push-8 {\n left: 66.66667%; }\n .col-sm-push-9 {\n left: 75%; }\n .col-sm-push-10 {\n left: 83.33333%; }\n .col-sm-push-11 {\n left: 91.66667%; }\n .col-sm-push-12 {\n left: 100%; }\n .col-sm-offset-0 {\n margin-left: 0%; }\n .col-sm-offset-1 {\n margin-left: 8.33333%; }\n .col-sm-offset-2 {\n margin-left: 16.66667%; }\n .col-sm-offset-3 {\n margin-left: 25%; }\n .col-sm-offset-4 {\n margin-left: 33.33333%; }\n .col-sm-offset-5 {\n margin-left: 41.66667%; }\n .col-sm-offset-6 {\n margin-left: 50%; }\n .col-sm-offset-7 {\n margin-left: 58.33333%; }\n .col-sm-offset-8 {\n margin-left: 66.66667%; }\n .col-sm-offset-9 {\n margin-left: 75%; }\n .col-sm-offset-10 {\n margin-left: 83.33333%; }\n .col-sm-offset-11 {\n margin-left: 91.66667%; }\n .col-sm-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .calendar-calendar, .view .row > .list-group {\n float: left; }\n .col-md-1 {\n width: 8.33333%; }\n .col-md-2 {\n width: 16.66667%; }\n .col-md-3 {\n width: 25%; }\n .col-md-4 {\n width: 33.33333%; }\n .col-md-5 {\n width: 41.66667%; }\n .col-md-6 {\n width: 50%; }\n .col-md-7 {\n width: 58.33333%; }\n .col-md-8 {\n width: 66.66667%; }\n .col-md-9 {\n width: 75%; }\n .col-md-10 {\n width: 83.33333%; }\n .col-md-11 {\n width: 91.66667%; }\n .col-md-12, .calendar-calendar, .view .row > .list-group {\n width: 100%; }\n .col-md-pull-0 {\n right: auto; }\n .col-md-pull-1 {\n right: 8.33333%; }\n .col-md-pull-2 {\n right: 16.66667%; }\n .col-md-pull-3 {\n right: 25%; }\n .col-md-pull-4 {\n right: 33.33333%; }\n .col-md-pull-5 {\n right: 41.66667%; }\n .col-md-pull-6 {\n right: 50%; }\n .col-md-pull-7 {\n right: 58.33333%; }\n .col-md-pull-8 {\n right: 66.66667%; }\n .col-md-pull-9 {\n right: 75%; }\n .col-md-pull-10 {\n right: 83.33333%; }\n .col-md-pull-11 {\n right: 91.66667%; }\n .col-md-pull-12 {\n right: 100%; }\n .col-md-push-0 {\n left: auto; }\n .col-md-push-1 {\n left: 8.33333%; }\n .col-md-push-2 {\n left: 16.66667%; }\n .col-md-push-3 {\n left: 25%; }\n .col-md-push-4 {\n left: 33.33333%; }\n .col-md-push-5 {\n left: 41.66667%; }\n .col-md-push-6 {\n left: 50%; }\n .col-md-push-7 {\n left: 58.33333%; }\n .col-md-push-8 {\n left: 66.66667%; }\n .col-md-push-9 {\n left: 75%; }\n .col-md-push-10 {\n left: 83.33333%; }\n .col-md-push-11 {\n left: 91.66667%; }\n .col-md-push-12 {\n left: 100%; }\n .col-md-offset-0 {\n margin-left: 0%; }\n .col-md-offset-1 {\n margin-left: 8.33333%; }\n .col-md-offset-2 {\n margin-left: 16.66667%; }\n .col-md-offset-3 {\n margin-left: 25%; }\n .col-md-offset-4 {\n margin-left: 33.33333%; }\n .col-md-offset-5 {\n margin-left: 41.66667%; }\n .col-md-offset-6 {\n margin-left: 50%; }\n .col-md-offset-7 {\n margin-left: 58.33333%; }\n .col-md-offset-8 {\n margin-left: 66.66667%; }\n .col-md-offset-9 {\n margin-left: 75%; }\n .col-md-offset-10 {\n margin-left: 83.33333%; }\n .col-md-offset-11 {\n margin-left: 91.66667%; }\n .col-md-offset-12 {\n margin-left: 100%; } }\n\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left; }\n .col-lg-1 {\n width: 8.33333%; }\n .col-lg-2 {\n width: 16.66667%; }\n .col-lg-3 {\n width: 25%; }\n .col-lg-4 {\n width: 33.33333%; }\n .col-lg-5 {\n width: 41.66667%; }\n .col-lg-6 {\n width: 50%; }\n .col-lg-7 {\n width: 58.33333%; }\n .col-lg-8 {\n width: 66.66667%; }\n .col-lg-9 {\n width: 75%; }\n .col-lg-10 {\n width: 83.33333%; }\n .col-lg-11 {\n width: 91.66667%; }\n .col-lg-12 {\n width: 100%; }\n .col-lg-pull-0 {\n right: auto; }\n .col-lg-pull-1 {\n right: 8.33333%; }\n .col-lg-pull-2 {\n right: 16.66667%; }\n .col-lg-pull-3 {\n right: 25%; }\n .col-lg-pull-4 {\n right: 33.33333%; }\n .col-lg-pull-5 {\n right: 41.66667%; }\n .col-lg-pull-6 {\n right: 50%; }\n .col-lg-pull-7 {\n right: 58.33333%; }\n .col-lg-pull-8 {\n right: 66.66667%; }\n .col-lg-pull-9 {\n right: 75%; }\n .col-lg-pull-10 {\n right: 83.33333%; }\n .col-lg-pull-11 {\n right: 91.66667%; }\n .col-lg-pull-12 {\n right: 100%; }\n .col-lg-push-0 {\n left: auto; }\n .col-lg-push-1 {\n left: 8.33333%; }\n .col-lg-push-2 {\n left: 16.66667%; }\n .col-lg-push-3 {\n left: 25%; }\n .col-lg-push-4 {\n left: 33.33333%; }\n .col-lg-push-5 {\n left: 41.66667%; }\n .col-lg-push-6 {\n left: 50%; }\n .col-lg-push-7 {\n left: 58.33333%; }\n .col-lg-push-8 {\n left: 66.66667%; }\n .col-lg-push-9 {\n left: 75%; }\n .col-lg-push-10 {\n left: 83.33333%; }\n .col-lg-push-11 {\n left: 91.66667%; }\n .col-lg-push-12 {\n left: 100%; }\n .col-lg-offset-0 {\n margin-left: 0%; }\n .col-lg-offset-1 {\n margin-left: 8.33333%; }\n .col-lg-offset-2 {\n margin-left: 16.66667%; }\n .col-lg-offset-3 {\n margin-left: 25%; }\n .col-lg-offset-4 {\n margin-left: 33.33333%; }\n .col-lg-offset-5 {\n margin-left: 41.66667%; }\n .col-lg-offset-6 {\n margin-left: 50%; }\n .col-lg-offset-7 {\n margin-left: 58.33333%; }\n .col-lg-offset-8 {\n margin-left: 66.66667%; }\n .col-lg-offset-9 {\n margin-left: 75%; }\n .col-lg-offset-10 {\n margin-left: 83.33333%; }\n .col-lg-offset-11 {\n margin-left: 91.66667%; }\n .col-lg-offset-12 {\n margin-left: 100%; } }\n\ntable {\n background-color: transparent; }\n\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left; }\n\nth {\n text-align: left; }\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px; }\n .table > thead > tr > th,\n .table > thead > tr > td,\n .table > tbody > tr > th,\n .table > tbody > tr > td,\n .table > tfoot > tr > th,\n .table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857;\n vertical-align: top;\n border-top: 1px solid #ddd; }\n .table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd; }\n .table > caption + thead > tr:first-child > th,\n .table > caption + thead > tr:first-child > td,\n .table > colgroup + thead > tr:first-child > th,\n .table > colgroup + thead > tr:first-child > td,\n .table > thead:first-child > tr:first-child > th,\n .table > thead:first-child > tr:first-child > td {\n border-top: 0; }\n .table > tbody + tbody {\n border-top: 2px solid #ddd; }\n .table .table {\n background-color: #fff; }\n\n.table-condensed > thead > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > th,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > th,\n.table-condensed > tfoot > tr > td {\n padding: 5px; }\n\n.table-bordered, .calendar-calendar table.mini {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th, .calendar-calendar table.mini > thead > tr > th,\n .table-bordered > thead > tr > td, .calendar-calendar table.mini > thead > tr > td,\n .table-bordered > tbody > tr > th, .calendar-calendar table.mini > tbody > tr > th,\n .table-bordered > tbody > tr > td, .calendar-calendar table.mini > tbody > tr > td,\n .table-bordered > tfoot > tr > th, .calendar-calendar table.mini > tfoot > tr > th,\n .table-bordered > tfoot > tr > td, .calendar-calendar table.mini > tfoot > tr > td {\n border: 1px solid #ddd; }\n .table-bordered > thead > tr > th, .calendar-calendar table.mini > thead > tr > th,\n .table-bordered > thead > tr > td, .calendar-calendar table.mini > thead > tr > td {\n border-bottom-width: 2px; }\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9; }\n\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5; }\n\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column; }\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell; }\n\n.table > thead > tr > td.active,\n.table > thead > tr > th.active,\n.table > thead > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr > td.active,\n.table > tbody > tr > th.active,\n.table > tbody > tr.active > td,\n.table > tbody > tr.active > th,\n.table > tfoot > tr > td.active,\n.table > tfoot > tr > th.active,\n.table > tfoot > tr.active > td,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5; }\n\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8; }\n\n.table > thead > tr > td.success,\n.table > thead > tr > th.success,\n.table > thead > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr > td.success,\n.table > tbody > tr > th.success,\n.table > tbody > tr.success > td,\n.table > tbody > tr.success > th,\n.table > tfoot > tr > td.success,\n.table > tfoot > tr > th.success,\n.table > tfoot > tr.success > td,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8; }\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6; }\n\n.table > thead > tr > td.info,\n.table > thead > tr > th.info,\n.table > thead > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr > td.info,\n.table > tbody > tr > th.info,\n.table > tbody > tr.info > td,\n.table > tbody > tr.info > th,\n.table > tfoot > tr > td.info,\n.table > tfoot > tr > th.info,\n.table > tfoot > tr.info > td,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7; }\n\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3; }\n\n.table > thead > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr > td.warning,\n.table > tbody > tr > th.warning,\n.table > tbody > tr.warning > td,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr > td.warning,\n.table > tfoot > tr > th.warning,\n.table > tfoot > tr.warning > td,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3; }\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc; }\n\n.table > thead > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr > td.danger,\n.table > tbody > tr > th.danger,\n.table > tbody > tr.danger > td,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr > td.danger,\n.table > tfoot > tr > th.danger,\n.table > tfoot > tr.danger > td,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede; }\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc; }\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; }\n @media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd; }\n .table-responsive > .table {\n margin-bottom: 0; }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap; }\n .table-responsive > .table-bordered, .calendar-calendar .table-responsive > table.mini {\n border: 0; }\n .table-responsive > .table-bordered > thead > tr > th:first-child, .calendar-calendar .table-responsive > table.mini > thead > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child, .calendar-calendar\n .table-responsive > table.mini > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > td:first-child {\n border-left: 0; }\n .table-responsive > .table-bordered > thead > tr > th:last-child, .calendar-calendar .table-responsive > table.mini > thead > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child, .calendar-calendar\n .table-responsive > table.mini > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child, .calendar-calendar\n .table-responsive > table.mini > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr > td:last-child {\n border-right: 0; }\n .table-responsive > .table-bordered > tbody > tr:last-child > th, .calendar-calendar .table-responsive > table.mini > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td, .calendar-calendar\n .table-responsive > table.mini > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td, .calendar-calendar\n .table-responsive > table.mini > tfoot > tr:last-child > td {\n border-bottom: 0; } }\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0; }\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5; }\n\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold; }\n\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box; }\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal; }\n\ninput[type=\"file\"] {\n display: block; }\n\ninput[type=\"range\"] {\n display: block;\n width: 100%; }\n\nselect[multiple],\nselect[size] {\n height: auto; }\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857;\n color: #555555; }\n\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -webkit-transition: compact(compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false) false false false);\n transition: compact(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, false, false, false, false, false, false, false, false); }\n .form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6), false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6), false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6), false, false, false, false, false, false, false, false); }\n .form-control::-moz-placeholder {\n color: #999;\n opacity: 1; }\n .form-control:-ms-input-placeholder {\n color: #999; }\n .form-control::-webkit-input-placeholder {\n color: #999; }\n .form-control::-ms-expand {\n border: 0;\n background-color: transparent; }\n .form-control[disabled], .form-control[readonly],\n fieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1; }\n .form-control[disabled],\n fieldset[disabled] .form-control {\n cursor: not-allowed; }\n\ntextarea.form-control {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: none; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px; }\n input[type=\"date\"].input-sm, .input-group-sm > input[type=\"date\"].form-control,\n .input-group-sm > input[type=\"date\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"date\"].btn,\n .input-group-sm input[type=\"date\"],\n input[type=\"time\"].input-sm,\n .input-group-sm > input[type=\"time\"].form-control,\n .input-group-sm > input[type=\"time\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"time\"].btn,\n .input-group-sm\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-sm,\n .input-group-sm > input[type=\"datetime-local\"].form-control,\n .input-group-sm > input[type=\"datetime-local\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-sm\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-sm,\n .input-group-sm > input[type=\"month\"].form-control,\n .input-group-sm > input[type=\"month\"].input-group-addon,\n .input-group-sm > .input-group-btn > input[type=\"month\"].btn,\n .input-group-sm\n input[type=\"month\"] {\n line-height: 30px; }\n input[type=\"date\"].input-lg, .input-group-lg > input[type=\"date\"].form-control,\n .input-group-lg > input[type=\"date\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"date\"].btn,\n .input-group-lg input[type=\"date\"],\n input[type=\"time\"].input-lg,\n .input-group-lg > input[type=\"time\"].form-control,\n .input-group-lg > input[type=\"time\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"time\"].btn,\n .input-group-lg\n input[type=\"time\"],\n input[type=\"datetime-local\"].input-lg,\n .input-group-lg > input[type=\"datetime-local\"].form-control,\n .input-group-lg > input[type=\"datetime-local\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"datetime-local\"].btn,\n .input-group-lg\n input[type=\"datetime-local\"],\n input[type=\"month\"].input-lg,\n .input-group-lg > input[type=\"month\"].form-control,\n .input-group-lg > input[type=\"month\"].input-group-addon,\n .input-group-lg > .input-group-btn > input[type=\"month\"].btn,\n .input-group-lg\n input[type=\"month\"] {\n line-height: 46px; } }\n\n.form-group {\n margin-bottom: 15px; }\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px; }\n .radio label,\n .checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer; }\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9; }\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; }\n\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer; }\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; }\n\ninput[type=\"radio\"][disabled], input[type=\"radio\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled]\ninput[type=\"checkbox\"] {\n cursor: not-allowed; }\n\n.radio-inline.disabled,\nfieldset[disabled] .radio-inline,\n.checkbox-inline.disabled,\nfieldset[disabled]\n.checkbox-inline {\n cursor: not-allowed; }\n\n.radio.disabled label,\nfieldset[disabled] .radio label,\n.checkbox.disabled label,\nfieldset[disabled]\n.checkbox label {\n cursor: not-allowed; }\n\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px; }\n .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control,\n .input-group-lg > .form-control-static.input-group-addon,\n .input-group-lg > .input-group-btn > .form-control-static.btn,\n .input-group-lg > .media-widget.input-group-btn > a.form-control-static, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control,\n .input-group-sm > .form-control-static.input-group-addon,\n .input-group-sm > .input-group-btn > .form-control-static.btn,\n .input-group-sm > .media-widget.input-group-btn > a.form-control-static {\n padding-left: 0;\n padding-right: 0; }\n\n.input-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn,\n.input-group-sm > .media-widget.input-group-btn > a {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\nselect.input-sm, .input-group-sm > select.form-control,\n.input-group-sm > select.input-group-addon,\n.input-group-sm > .input-group-btn > select.btn {\n height: 30px;\n line-height: 30px; }\n\ntextarea.input-sm, .input-group-sm > textarea.form-control,\n.input-group-sm > textarea.input-group-addon,\n.input-group-sm > .input-group-btn > textarea.btn,\nselect[multiple].input-sm,\n.input-group-sm > select[multiple].form-control,\n.input-group-sm > select[multiple].input-group-addon,\n.input-group-sm > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px; }\n\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto; }\n\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.input-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn,\n.input-group-lg > .media-widget.input-group-btn > a {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\nselect.input-lg, .input-group-lg > select.form-control,\n.input-group-lg > select.input-group-addon,\n.input-group-lg > .input-group-btn > select.btn {\n height: 46px;\n line-height: 46px; }\n\ntextarea.input-lg, .input-group-lg > textarea.form-control,\n.input-group-lg > textarea.input-group-addon,\n.input-group-lg > .input-group-btn > textarea.btn,\nselect[multiple].input-lg,\n.input-group-lg > select[multiple].form-control,\n.input-group-lg > select[multiple].input-group-addon,\n.input-group-lg > .input-group-btn > select[multiple].btn {\n height: auto; }\n\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px; }\n\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto; }\n\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.33333; }\n\n.has-feedback {\n position: relative; }\n .has-feedback .form-control {\n padding-right: 42.5px; }\n\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none; }\n\n.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,\n.input-group-lg > .input-group-addon + .form-control-feedback,\n.input-group-lg > .input-group-btn > .btn + .form-control-feedback,\n.input-group-lg > .media-widget.input-group-btn > a + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px; }\n\n.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,\n.input-group-sm > .input-group-addon + .form-control-feedback,\n.input-group-sm > .input-group-btn > .btn + .form-control-feedback,\n.input-group-sm > .media-widget.input-group-btn > a + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px; }\n\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d; }\n\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false); }\n .has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168, false, false, false, false, false, false, false, false, false); }\n\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8; }\n\n.has-success .form-control-feedback {\n color: #3c763d; }\n\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b; }\n\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false); }\n .has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b, false, false, false, false, false, false, false, false, false); }\n\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3; }\n\n.has-warning .form-control-feedback {\n color: #8a6d3b; }\n\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442; }\n\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), false, false, false, false, false, false, false, false, false); }\n .has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483, false, false, false, false, false, false, false, false, false); }\n\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede; }\n\n.has-error .form-control-feedback {\n color: #a94442; }\n\n.has-feedback label ~ .form-control-feedback {\n top: 25px; }\n\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0; }\n\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373; }\n\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .form-inline .form-control-static {\n display: inline-block; }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle; }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto; }\n .form-inline .input-group > .form-control {\n width: 100%; }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0; }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .form-inline .has-feedback .form-control-feedback {\n top: 0; } }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px; }\n\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px; }\n\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n overflow: hidden;\n *zoom: 1; }\n\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px; } }\n\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px; }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px; } }\n\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px; } }\n\n.btn, .media-widget > a {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none; }\n .btn:focus, .media-widget > a:focus, .btn.focus, .media-widget > a.focus, .btn:active:focus, .media-widget > a:active:focus, .btn:active.focus, .media-widget > a:active.focus, .btn.active:focus, .media-widget > a.active:focus, .btn.active.focus, .media-widget > a.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px; }\n .btn:hover, .media-widget > a:hover, .btn:focus, .media-widget > a:focus, .btn.focus, .media-widget > a.focus {\n color: #333;\n text-decoration: none; }\n .btn:active, .media-widget > a:active, .btn.active, .media-widget > a.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false); }\n .btn.disabled, .media-widget > a.disabled, .btn[disabled], .media-widget > a[disabled],\n fieldset[disabled] .btn,\n fieldset[disabled] .media-widget > a {\n cursor: not-allowed;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=65);\n opacity: 0.65;\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n\na.btn.disabled, .media-widget > a.disabled,\nfieldset[disabled] a.btn,\nfieldset[disabled] .media-widget > a {\n pointer-events: none; }\n\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc; }\n .btn-default:focus, .btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c; }\n .btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad; }\n .btn-default:active:hover, .btn-default:active:focus, .btn-default:active.focus, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus,\n .open > .btn-default.dropdown-toggle:hover,\n .open > .btn-default.dropdown-toggle:focus,\n .open > .btn-default.dropdown-toggle.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c; }\n .btn-default:active, .btn-default.active,\n .open > .btn-default.dropdown-toggle {\n background-image: none; }\n .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled].focus,\n fieldset[disabled] .btn-default:hover,\n fieldset[disabled] .btn-default:focus,\n fieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc; }\n .btn-default .badge {\n color: #fff;\n background-color: #333; }\n\n.btn-primary, body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary:focus, body.maintenance-page .form-actions .btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a:focus:first-child, .btn-primary.focus, body.maintenance-page .form-actions .focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a.focus:first-child {\n color: #fff;\n background-color: #286090;\n border-color: #122b40; }\n .btn-primary:hover, body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a:hover:first-child {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active, body.maintenance-page .form-actions .btn:active:first-child, body.maintenance-page .form-actions .media-widget > a:active:first-child, .btn-primary.active, body.maintenance-page .form-actions .active.btn:first-child, body.maintenance-page .form-actions .media-widget > a.active:first-child,\n .open > .btn-primary.dropdown-toggle, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:first-child {\n color: #fff;\n background-color: #286090;\n border-color: #204d74; }\n .btn-primary:active:hover, body.maintenance-page .form-actions .btn:active:hover:first-child, body.maintenance-page .form-actions .media-widget > a:active:hover:first-child, .btn-primary:active:focus, body.maintenance-page .form-actions .btn:active:focus:first-child, body.maintenance-page .form-actions .media-widget > a:active:focus:first-child, .btn-primary:active.focus, body.maintenance-page .form-actions .btn:active.focus:first-child, body.maintenance-page .form-actions .media-widget > a:active.focus:first-child, .btn-primary.active:hover, body.maintenance-page .form-actions .active.btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a.active:hover:first-child, .btn-primary.active:focus, body.maintenance-page .form-actions .active.btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a.active:focus:first-child, .btn-primary.active.focus, body.maintenance-page .form-actions .active.focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a.active.focus:first-child,\n .open > .btn-primary.dropdown-toggle:hover, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:hover:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:hover:first-child,\n .open > .btn-primary.dropdown-toggle:focus, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:focus:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:focus:first-child,\n .open > .btn-primary.dropdown-toggle.focus, body.maintenance-page .form-actions\n .open > .dropdown-toggle.focus.btn:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle.focus:first-child {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40; }\n .btn-primary:active, body.maintenance-page .form-actions .btn:active:first-child, body.maintenance-page .form-actions .media-widget > a:active:first-child, .btn-primary.active, body.maintenance-page .form-actions .active.btn:first-child, body.maintenance-page .form-actions .media-widget > a.active:first-child,\n .open > .btn-primary.dropdown-toggle, body.maintenance-page .form-actions\n .open > .dropdown-toggle.btn:first-child, body.maintenance-page .form-actions\n .media-widget.open > a.dropdown-toggle:first-child {\n background-image: none; }\n .btn-primary.disabled:hover, body.maintenance-page .form-actions .disabled.btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a.disabled:hover:first-child, .btn-primary.disabled:focus, body.maintenance-page .form-actions .disabled.btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a.disabled:focus:first-child, .btn-primary.disabled.focus, body.maintenance-page .form-actions .disabled.focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a.disabled.focus:first-child, .btn-primary[disabled]:hover, body.maintenance-page .form-actions [disabled].btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a[disabled]:hover:first-child, .btn-primary[disabled]:focus, body.maintenance-page .form-actions [disabled].btn:focus:first-child, body.maintenance-page .form-actions .media-widget > a[disabled]:focus:first-child, .btn-primary[disabled].focus, body.maintenance-page .form-actions [disabled].focus.btn:first-child, body.maintenance-page .form-actions .media-widget > a[disabled].focus:first-child,\n fieldset[disabled] .btn-primary:hover,\n fieldset[disabled] body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .btn:hover:first-child,\n fieldset[disabled] body.maintenance-page .form-actions .media-widget > a:hover:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .media-widget > a:hover:first-child,\n fieldset[disabled] .btn-primary:focus,\n fieldset[disabled] body.maintenance-page .form-actions .btn:focus:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .btn:focus:first-child,\n fieldset[disabled] body.maintenance-page .form-actions .media-widget > a:focus:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .media-widget > a:focus:first-child,\n fieldset[disabled] .btn-primary.focus,\n fieldset[disabled] body.maintenance-page .form-actions .focus.btn:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .focus.btn:first-child,\n fieldset[disabled] body.maintenance-page .form-actions .media-widget > a.focus:first-child, body.maintenance-page .form-actions\n fieldset[disabled] .media-widget > a.focus:first-child {\n background-color: #337ab7;\n border-color: #2e6da4; }\n .btn-primary .badge, body.maintenance-page .form-actions .btn:first-child .badge, body.maintenance-page .form-actions .media-widget > a:first-child .badge {\n color: #337ab7;\n background-color: #fff; }\n\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success:focus, .btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625; }\n .btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #449d44;\n border-color: #398439; }\n .btn-success:active:hover, .btn-success:active:focus, .btn-success:active.focus, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus,\n .open > .btn-success.dropdown-toggle:hover,\n .open > .btn-success.dropdown-toggle:focus,\n .open > .btn-success.dropdown-toggle.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625; }\n .btn-success:active, .btn-success.active,\n .open > .btn-success.dropdown-toggle {\n background-image: none; }\n .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled].focus,\n fieldset[disabled] .btn-success:hover,\n fieldset[disabled] .btn-success:focus,\n fieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c; }\n .btn-success .badge {\n color: #5cb85c;\n background-color: #fff; }\n\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info:focus, .btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85; }\n .btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc; }\n .btn-info:active:hover, .btn-info:active:focus, .btn-info:active.focus, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus,\n .open > .btn-info.dropdown-toggle:hover,\n .open > .btn-info.dropdown-toggle:focus,\n .open > .btn-info.dropdown-toggle.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85; }\n .btn-info:active, .btn-info.active,\n .open > .btn-info.dropdown-toggle {\n background-image: none; }\n .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled].focus,\n fieldset[disabled] .btn-info:hover,\n fieldset[disabled] .btn-info:focus,\n fieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da; }\n .btn-info .badge {\n color: #5bc0de;\n background-color: #fff; }\n\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning:focus, .btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d; }\n .btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512; }\n .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning:active.focus, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus,\n .open > .btn-warning.dropdown-toggle:hover,\n .open > .btn-warning.dropdown-toggle:focus,\n .open > .btn-warning.dropdown-toggle.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d; }\n .btn-warning:active, .btn-warning.active,\n .open > .btn-warning.dropdown-toggle {\n background-image: none; }\n .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled].focus,\n fieldset[disabled] .btn-warning:hover,\n fieldset[disabled] .btn-warning:focus,\n fieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236; }\n .btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff; }\n\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger:focus, .btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19; }\n .btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925; }\n .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger:active.focus, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus,\n .open > .btn-danger.dropdown-toggle:hover,\n .open > .btn-danger.dropdown-toggle:focus,\n .open > .btn-danger.dropdown-toggle.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19; }\n .btn-danger:active, .btn-danger.active,\n .open > .btn-danger.dropdown-toggle {\n background-image: none; }\n .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled].focus,\n fieldset[disabled] .btn-danger:hover,\n fieldset[disabled] .btn-danger:focus,\n fieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a; }\n .btn-danger .badge {\n color: #d9534f;\n background-color: #fff; }\n\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0; }\n .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled],\n fieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active {\n border-color: transparent; }\n .btn-link:hover, .btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent; }\n .btn-link[disabled]:hover, .btn-link[disabled]:focus,\n fieldset[disabled] .btn-link:hover,\n fieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none; }\n\n.btn-lg, .btn-group-lg > .btn, .media-widget.btn-group-lg > a {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333;\n border-radius: 6px; }\n\n.btn-sm, .btn-group-sm > .btn, .media-widget.btn-group-sm > a {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-xs, .btn-group-xs > .btn, .media-widget.btn-group-xs > a {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px; }\n\n.btn-block {\n display: block;\n width: 100%; }\n\n.btn-block + .btn-block {\n margin-top: 5px; }\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%; }\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%; }\n\nbody {\n margin: 0; }\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block; }\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline; }\n\naudio:not([controls]) {\n display: none;\n height: 0; }\n\n[hidden],\ntemplate {\n display: none; }\n\na {\n background-color: transparent; }\n\na:active,\na:hover {\n outline: 0; }\n\nabbr[title] {\n border-bottom: 1px dotted; }\n\nb,\nstrong {\n font-weight: bold; }\n\ndfn {\n font-style: italic; }\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0; }\n\nmark {\n background: #ff0;\n color: #000; }\n\nsmall {\n font-size: 80%; }\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline; }\n\nsup {\n top: -0.5em; }\n\nsub {\n bottom: -0.25em; }\n\nimg {\n border: 0; }\n\nsvg:not(:root) {\n overflow: hidden; }\n\nfigure {\n margin: 1em 40px; }\n\nhr {\n box-sizing: content-box;\n height: 0; }\n\npre {\n overflow: auto; }\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em; }\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0; }\n\nbutton {\n overflow: visible; }\n\nbutton,\nselect {\n text-transform: none; }\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer; }\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default; }\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0; }\n\ninput {\n line-height: normal; }\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0; }\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto; }\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box; }\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none; }\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em; }\n\nlegend {\n border: 0;\n padding: 0; }\n\ntextarea {\n overflow: auto; }\n\noptgroup {\n font-weight: bold; }\n\ntable {\n border-collapse: collapse;\n border-spacing: 0; }\n\ntd,\nth {\n padding: 0; }\n\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important; }\n a,\n a:visited {\n text-decoration: underline; }\n a[href]:after {\n content: \" (\" attr(href) \")\"; }\n abbr[title]:after {\n content: \" (\" attr(title) \")\"; }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\"; }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid; }\n thead {\n display: table-header-group; }\n tr,\n img {\n page-break-inside: avoid; }\n img {\n max-width: 100% !important; }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3; }\n h2,\n h3 {\n page-break-after: avoid; }\n .navbar {\n display: none; }\n .btn > .caret, .media-widget > a > .caret,\n .dropup > .btn > .caret,\n .media-widget.dropup > a > .caret {\n border-top-color: #000 !important; }\n .label {\n border: 1px solid #000; }\n .table {\n border-collapse: collapse !important; }\n .table td,\n .table th {\n background-color: #fff !important; }\n .table-bordered th, .calendar-calendar table.mini th,\n .table-bordered td, .calendar-calendar table.mini td {\n border: 1px solid #ddd !important; } }\n\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot\");\n src: url(\"../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix\") format(\"embedded-opentype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff2\") format(\"woff2\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.woff\") format(\"woff\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.ttf\") format(\"truetype\"), url(\"../fonts/bootstrap/glyphicons-halflings-regular.svg#glyphicons_halflingsregular\") format(\"svg\"); }\n\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n.glyphicon-asterisk:before {\n content: \"\\002a\"; }\n\n.glyphicon-plus:before {\n content: \"\\002b\"; }\n\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\"; }\n\n.glyphicon-minus:before {\n content: \"\\2212\"; }\n\n.glyphicon-cloud:before {\n content: \"\\2601\"; }\n\n.glyphicon-envelope:before {\n content: \"\\2709\"; }\n\n.glyphicon-pencil:before {\n content: \"\\270f\"; }\n\n.glyphicon-glass:before {\n content: \"\\e001\"; }\n\n.glyphicon-music:before {\n content: \"\\e002\"; }\n\n.glyphicon-search:before {\n content: \"\\e003\"; }\n\n.glyphicon-heart:before {\n content: \"\\e005\"; }\n\n.glyphicon-star:before {\n content: \"\\e006\"; }\n\n.glyphicon-star-empty:before {\n content: \"\\e007\"; }\n\n.glyphicon-user:before {\n content: \"\\e008\"; }\n\n.glyphicon-film:before {\n content: \"\\e009\"; }\n\n.glyphicon-th-large:before {\n content: \"\\e010\"; }\n\n.glyphicon-th:before {\n content: \"\\e011\"; }\n\n.glyphicon-th-list:before {\n content: \"\\e012\"; }\n\n.glyphicon-ok:before {\n content: \"\\e013\"; }\n\n.glyphicon-remove:before {\n content: \"\\e014\"; }\n\n.glyphicon-zoom-in:before {\n content: \"\\e015\"; }\n\n.glyphicon-zoom-out:before {\n content: \"\\e016\"; }\n\n.glyphicon-off:before {\n content: \"\\e017\"; }\n\n.glyphicon-signal:before {\n content: \"\\e018\"; }\n\n.glyphicon-cog:before {\n content: \"\\e019\"; }\n\n.glyphicon-trash:before {\n content: \"\\e020\"; }\n\n.glyphicon-home:before {\n content: \"\\e021\"; }\n\n.glyphicon-file:before {\n content: \"\\e022\"; }\n\n.glyphicon-time:before {\n content: \"\\e023\"; }\n\n.glyphicon-road:before {\n content: \"\\e024\"; }\n\n.glyphicon-download-alt:before {\n content: \"\\e025\"; }\n\n.glyphicon-download:before {\n content: \"\\e026\"; }\n\n.glyphicon-upload:before {\n content: \"\\e027\"; }\n\n.glyphicon-inbox:before {\n content: \"\\e028\"; }\n\n.glyphicon-play-circle:before {\n content: \"\\e029\"; }\n\n.glyphicon-repeat:before {\n content: \"\\e030\"; }\n\n.glyphicon-refresh:before {\n content: \"\\e031\"; }\n\n.glyphicon-list-alt:before {\n content: \"\\e032\"; }\n\n.glyphicon-lock:before {\n content: \"\\e033\"; }\n\n.glyphicon-flag:before {\n content: \"\\e034\"; }\n\n.glyphicon-headphones:before {\n content: \"\\e035\"; }\n\n.glyphicon-volume-off:before {\n content: \"\\e036\"; }\n\n.glyphicon-volume-down:before {\n content: \"\\e037\"; }\n\n.glyphicon-volume-up:before {\n content: \"\\e038\"; }\n\n.glyphicon-qrcode:before {\n content: \"\\e039\"; }\n\n.glyphicon-barcode:before {\n content: \"\\e040\"; }\n\n.glyphicon-tag:before {\n content: \"\\e041\"; }\n\n.glyphicon-tags:before {\n content: \"\\e042\"; }\n\n.glyphicon-book:before {\n content: \"\\e043\"; }\n\n.glyphicon-bookmark:before {\n content: \"\\e044\"; }\n\n.glyphicon-print:before {\n content: \"\\e045\"; }\n\n.glyphicon-camera:before {\n content: \"\\e046\"; }\n\n.glyphicon-font:before {\n content: \"\\e047\"; }\n\n.glyphicon-bold:before {\n content: \"\\e048\"; }\n\n.glyphicon-italic:before {\n content: \"\\e049\"; }\n\n.glyphicon-text-height:before {\n content: \"\\e050\"; }\n\n.glyphicon-text-width:before {\n content: \"\\e051\"; }\n\n.glyphicon-align-left:before {\n content: \"\\e052\"; }\n\n.glyphicon-align-center:before {\n content: \"\\e053\"; }\n\n.glyphicon-align-right:before {\n content: \"\\e054\"; }\n\n.glyphicon-align-justify:before {\n content: \"\\e055\"; }\n\n.glyphicon-list:before {\n content: \"\\e056\"; }\n\n.glyphicon-indent-left:before {\n content: \"\\e057\"; }\n\n.glyphicon-indent-right:before {\n content: \"\\e058\"; }\n\n.glyphicon-facetime-video:before {\n content: \"\\e059\"; }\n\n.glyphicon-picture:before {\n content: \"\\e060\"; }\n\n.glyphicon-map-marker:before {\n content: \"\\e062\"; }\n\n.glyphicon-adjust:before {\n content: \"\\e063\"; }\n\n.glyphicon-tint:before {\n content: \"\\e064\"; }\n\n.glyphicon-edit:before {\n content: \"\\e065\"; }\n\n.glyphicon-share:before {\n content: \"\\e066\"; }\n\n.glyphicon-check:before {\n content: \"\\e067\"; }\n\n.glyphicon-move:before {\n content: \"\\e068\"; }\n\n.glyphicon-step-backward:before {\n content: \"\\e069\"; }\n\n.glyphicon-fast-backward:before {\n content: \"\\e070\"; }\n\n.glyphicon-backward:before {\n content: \"\\e071\"; }\n\n.glyphicon-play:before {\n content: \"\\e072\"; }\n\n.glyphicon-pause:before {\n content: \"\\e073\"; }\n\n.glyphicon-stop:before {\n content: \"\\e074\"; }\n\n.glyphicon-forward:before {\n content: \"\\e075\"; }\n\n.glyphicon-fast-forward:before {\n content: \"\\e076\"; }\n\n.glyphicon-step-forward:before {\n content: \"\\e077\"; }\n\n.glyphicon-eject:before {\n content: \"\\e078\"; }\n\n.glyphicon-chevron-left:before {\n content: \"\\e079\"; }\n\n.glyphicon-chevron-right:before {\n content: \"\\e080\"; }\n\n.glyphicon-plus-sign:before {\n content: \"\\e081\"; }\n\n.glyphicon-minus-sign:before {\n content: \"\\e082\"; }\n\n.glyphicon-remove-sign:before {\n content: \"\\e083\"; }\n\n.glyphicon-ok-sign:before {\n content: \"\\e084\"; }\n\n.glyphicon-question-sign:before {\n content: \"\\e085\"; }\n\n.glyphicon-info-sign:before {\n content: \"\\e086\"; }\n\n.glyphicon-screenshot:before {\n content: \"\\e087\"; }\n\n.glyphicon-remove-circle:before {\n content: \"\\e088\"; }\n\n.glyphicon-ok-circle:before {\n content: \"\\e089\"; }\n\n.glyphicon-ban-circle:before {\n content: \"\\e090\"; }\n\n.glyphicon-arrow-left:before {\n content: \"\\e091\"; }\n\n.glyphicon-arrow-right:before {\n content: \"\\e092\"; }\n\n.glyphicon-arrow-up:before {\n content: \"\\e093\"; }\n\n.glyphicon-arrow-down:before {\n content: \"\\e094\"; }\n\n.glyphicon-share-alt:before {\n content: \"\\e095\"; }\n\n.glyphicon-resize-full:before {\n content: \"\\e096\"; }\n\n.glyphicon-resize-small:before {\n content: \"\\e097\"; }\n\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\"; }\n\n.glyphicon-gift:before {\n content: \"\\e102\"; }\n\n.glyphicon-leaf:before {\n content: \"\\e103\"; }\n\n.glyphicon-fire:before {\n content: \"\\e104\"; }\n\n.glyphicon-eye-open:before {\n content: \"\\e105\"; }\n\n.glyphicon-eye-close:before {\n content: \"\\e106\"; }\n\n.glyphicon-warning-sign:before {\n content: \"\\e107\"; }\n\n.glyphicon-plane:before {\n content: \"\\e108\"; }\n\n.glyphicon-calendar:before {\n content: \"\\e109\"; }\n\n.glyphicon-random:before {\n content: \"\\e110\"; }\n\n.glyphicon-comment:before {\n content: \"\\e111\"; }\n\n.glyphicon-magnet:before {\n content: \"\\e112\"; }\n\n.glyphicon-chevron-up:before {\n content: \"\\e113\"; }\n\n.glyphicon-chevron-down:before {\n content: \"\\e114\"; }\n\n.glyphicon-retweet:before {\n content: \"\\e115\"; }\n\n.glyphicon-shopping-cart:before {\n content: \"\\e116\"; }\n\n.glyphicon-folder-close:before {\n content: \"\\e117\"; }\n\n.glyphicon-folder-open:before {\n content: \"\\e118\"; }\n\n.glyphicon-resize-vertical:before {\n content: \"\\e119\"; }\n\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\"; }\n\n.glyphicon-hdd:before {\n content: \"\\e121\"; }\n\n.glyphicon-bullhorn:before {\n content: \"\\e122\"; }\n\n.glyphicon-bell:before {\n content: \"\\e123\"; }\n\n.glyphicon-certificate:before {\n content: \"\\e124\"; }\n\n.glyphicon-thumbs-up:before {\n content: \"\\e125\"; }\n\n.glyphicon-thumbs-down:before {\n content: \"\\e126\"; }\n\n.glyphicon-hand-right:before {\n content: \"\\e127\"; }\n\n.glyphicon-hand-left:before {\n content: \"\\e128\"; }\n\n.glyphicon-hand-up:before {\n content: \"\\e129\"; }\n\n.glyphicon-hand-down:before {\n content: \"\\e130\"; }\n\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\"; }\n\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\"; }\n\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\"; }\n\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\"; }\n\n.glyphicon-globe:before {\n content: \"\\e135\"; }\n\n.glyphicon-wrench:before {\n content: \"\\e136\"; }\n\n.glyphicon-tasks:before {\n content: \"\\e137\"; }\n\n.glyphicon-filter:before {\n content: \"\\e138\"; }\n\n.glyphicon-briefcase:before {\n content: \"\\e139\"; }\n\n.glyphicon-fullscreen:before {\n content: \"\\e140\"; }\n\n.glyphicon-dashboard:before {\n content: \"\\e141\"; }\n\n.glyphicon-paperclip:before {\n content: \"\\e142\"; }\n\n.glyphicon-heart-empty:before {\n content: \"\\e143\"; }\n\n.glyphicon-link:before {\n content: \"\\e144\"; }\n\n.glyphicon-phone:before {\n content: \"\\e145\"; }\n\n.glyphicon-pushpin:before {\n content: \"\\e146\"; }\n\n.glyphicon-usd:before {\n content: \"\\e148\"; }\n\n.glyphicon-gbp:before {\n content: \"\\e149\"; }\n\n.glyphicon-sort:before {\n content: \"\\e150\"; }\n\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\"; }\n\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\"; }\n\n.glyphicon-sort-by-order:before {\n content: \"\\e153\"; }\n\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\"; }\n\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\"; }\n\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\"; }\n\n.glyphicon-unchecked:before {\n content: \"\\e157\"; }\n\n.glyphicon-expand:before {\n content: \"\\e158\"; }\n\n.glyphicon-collapse-down:before {\n content: \"\\e159\"; }\n\n.glyphicon-collapse-up:before {\n content: \"\\e160\"; }\n\n.glyphicon-log-in:before {\n content: \"\\e161\"; }\n\n.glyphicon-flash:before {\n content: \"\\e162\"; }\n\n.glyphicon-log-out:before {\n content: \"\\e163\"; }\n\n.glyphicon-new-window:before {\n content: \"\\e164\"; }\n\n.glyphicon-record:before {\n content: \"\\e165\"; }\n\n.glyphicon-save:before {\n content: \"\\e166\"; }\n\n.glyphicon-open:before {\n content: \"\\e167\"; }\n\n.glyphicon-saved:before {\n content: \"\\e168\"; }\n\n.glyphicon-import:before {\n content: \"\\e169\"; }\n\n.glyphicon-export:before {\n content: \"\\e170\"; }\n\n.glyphicon-send:before {\n content: \"\\e171\"; }\n\n.glyphicon-floppy-disk:before {\n content: \"\\e172\"; }\n\n.glyphicon-floppy-saved:before {\n content: \"\\e173\"; }\n\n.glyphicon-floppy-remove:before {\n content: \"\\e174\"; }\n\n.glyphicon-floppy-save:before {\n content: \"\\e175\"; }\n\n.glyphicon-floppy-open:before {\n content: \"\\e176\"; }\n\n.glyphicon-credit-card:before {\n content: \"\\e177\"; }\n\n.glyphicon-transfer:before {\n content: \"\\e178\"; }\n\n.glyphicon-cutlery:before {\n content: \"\\e179\"; }\n\n.glyphicon-header:before {\n content: \"\\e180\"; }\n\n.glyphicon-compressed:before {\n content: \"\\e181\"; }\n\n.glyphicon-earphone:before {\n content: \"\\e182\"; }\n\n.glyphicon-phone-alt:before {\n content: \"\\e183\"; }\n\n.glyphicon-tower:before {\n content: \"\\e184\"; }\n\n.glyphicon-stats:before {\n content: \"\\e185\"; }\n\n.glyphicon-sd-video:before {\n content: \"\\e186\"; }\n\n.glyphicon-hd-video:before {\n content: \"\\e187\"; }\n\n.glyphicon-subtitles:before {\n content: \"\\e188\"; }\n\n.glyphicon-sound-stereo:before {\n content: \"\\e189\"; }\n\n.glyphicon-sound-dolby:before {\n content: \"\\e190\"; }\n\n.glyphicon-sound-5-1:before {\n content: \"\\e191\"; }\n\n.glyphicon-sound-6-1:before {\n content: \"\\e192\"; }\n\n.glyphicon-sound-7-1:before {\n content: \"\\e193\"; }\n\n.glyphicon-copyright-mark:before {\n content: \"\\e194\"; }\n\n.glyphicon-registration-mark:before {\n content: \"\\e195\"; }\n\n.glyphicon-cloud-download:before {\n content: \"\\e197\"; }\n\n.glyphicon-cloud-upload:before {\n content: \"\\e198\"; }\n\n.glyphicon-tree-conifer:before {\n content: \"\\e199\"; }\n\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\"; }\n\n.glyphicon-cd:before {\n content: \"\\e201\"; }\n\n.glyphicon-save-file:before {\n content: \"\\e202\"; }\n\n.glyphicon-open-file:before {\n content: \"\\e203\"; }\n\n.glyphicon-level-up:before {\n content: \"\\e204\"; }\n\n.glyphicon-copy:before {\n content: \"\\e205\"; }\n\n.glyphicon-paste:before {\n content: \"\\e206\"; }\n\n.glyphicon-alert:before {\n content: \"\\e209\"; }\n\n.glyphicon-equalizer:before {\n content: \"\\e210\"; }\n\n.glyphicon-king:before {\n content: \"\\e211\"; }\n\n.glyphicon-queen:before {\n content: \"\\e212\"; }\n\n.glyphicon-pawn:before {\n content: \"\\e213\"; }\n\n.glyphicon-bishop:before {\n content: \"\\e214\"; }\n\n.glyphicon-knight:before {\n content: \"\\e215\"; }\n\n.glyphicon-baby-formula:before {\n content: \"\\e216\"; }\n\n.glyphicon-tent:before {\n content: \"\\26fa\"; }\n\n.glyphicon-blackboard:before {\n content: \"\\e218\"; }\n\n.glyphicon-bed:before {\n content: \"\\e219\"; }\n\n.glyphicon-apple:before {\n content: \"\\f8ff\"; }\n\n.glyphicon-erase:before {\n content: \"\\e221\"; }\n\n.glyphicon-hourglass:before {\n content: \"\\231b\"; }\n\n.glyphicon-lamp:before {\n content: \"\\e223\"; }\n\n.glyphicon-duplicate:before {\n content: \"\\e224\"; }\n\n.glyphicon-piggy-bank:before {\n content: \"\\e225\"; }\n\n.glyphicon-scissors:before {\n content: \"\\e226\"; }\n\n.glyphicon-bitcoin:before {\n content: \"\\e227\"; }\n\n.glyphicon-btc:before {\n content: \"\\e227\"; }\n\n.glyphicon-xbt:before {\n content: \"\\e227\"; }\n\n.glyphicon-yen:before {\n content: \"\\00a5\"; }\n\n.glyphicon-jpy:before {\n content: \"\\00a5\"; }\n\n.glyphicon-ruble:before {\n content: \"\\20bd\"; }\n\n.glyphicon-rub:before {\n content: \"\\20bd\"; }\n\n.glyphicon-scale:before {\n content: \"\\e230\"; }\n\n.glyphicon-ice-lolly:before {\n content: \"\\e231\"; }\n\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\"; }\n\n.glyphicon-education:before {\n content: \"\\e233\"; }\n\n.glyphicon-option-horizontal:before {\n content: \"\\e234\"; }\n\n.glyphicon-option-vertical:before {\n content: \"\\e235\"; }\n\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\"; }\n\n.glyphicon-modal-window:before {\n content: \"\\e237\"; }\n\n.glyphicon-oil:before {\n content: \"\\e238\"; }\n\n.glyphicon-grain:before {\n content: \"\\e239\"; }\n\n.glyphicon-sunglasses:before {\n content: \"\\e240\"; }\n\n.glyphicon-text-size:before {\n content: \"\\e241\"; }\n\n.glyphicon-text-color:before {\n content: \"\\e242\"; }\n\n.glyphicon-text-background:before {\n content: \"\\e243\"; }\n\n.glyphicon-object-align-top:before {\n content: \"\\e244\"; }\n\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\"; }\n\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\"; }\n\n.glyphicon-object-align-left:before {\n content: \"\\e247\"; }\n\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\"; }\n\n.glyphicon-object-align-right:before {\n content: \"\\e249\"; }\n\n.glyphicon-triangle-right:before {\n content: \"\\e250\"; }\n\n.glyphicon-triangle-left:before {\n content: \"\\e251\"; }\n\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\"; }\n\n.glyphicon-triangle-top:before {\n content: \"\\e253\"; }\n\n.glyphicon-console:before {\n content: \"\\e254\"; }\n\n.glyphicon-superscript:before {\n content: \"\\e255\"; }\n\n.glyphicon-subscript:before {\n content: \"\\e256\"; }\n\n.glyphicon-menu-left:before {\n content: \"\\e257\"; }\n\n.glyphicon-menu-right:before {\n content: \"\\e258\"; }\n\n.glyphicon-menu-down:before {\n content: \"\\e259\"; }\n\n.glyphicon-menu-up:before {\n content: \"\\e260\"; }\n\n.fade {\n opacity: 0;\n -webkit-transition: compact(compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(opacity 0.15s linear, false, false, false, false, false, false, false, false, false); }\n .fade.in {\n opacity: 1; }\n\n.collapse {\n display: none; }\n .collapse.in {\n display: block; }\n\ntr.collapse.in {\n display: table-row; }\n\ntbody.collapse.in {\n display: table-row-group; }\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n -moz-transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n -o-transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n transition-property: compact(height, visibility, false, false, false, false, false, false, false, false);\n -webkit-transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n -moz-transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n -o-transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n transition-duration: compact(0.35s, false, false, false, false, false, false, false, false, false);\n -webkit-transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false);\n -moz-transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false);\n -o-transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false);\n transition-timing-function: compact(ease, false, false, false, false, false, false, false, false, false); }\n\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent; }\n\n.dropup,\n.dropdown {\n position: relative; }\n\n.dropdown-toggle:focus {\n outline: 0; }\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: compact(0 6px 12px rgba(0, 0, 0, 0.175), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 6px 12px rgba(0, 0, 0, 0.175), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 6px 12px rgba(0, 0, 0, 0.175), false, false, false, false, false, false, false, false, false);\n background-clip: padding-box; }\n .dropdown-menu.pull-right {\n right: 0;\n left: auto; }\n .dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857;\n color: #333333;\n white-space: nowrap; }\n\n.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5; }\n\n.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7; }\n\n.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n color: #777777; }\n\n.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed; }\n\n.open > .dropdown-menu {\n display: block; }\n\n.open > a {\n outline: 0; }\n\n.dropdown-menu-right {\n left: auto;\n right: 0; }\n\n.dropdown-menu-left {\n left: 0;\n right: auto; }\n\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857;\n color: #777777;\n white-space: nowrap; }\n\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990; }\n\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto; }\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\"; }\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px; }\n\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto; }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto; } }\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; }\n .btn-group > .btn, .media-widget.btn-group > a,\n .btn-group-vertical > .btn,\n .media-widget.btn-group-vertical > a {\n position: relative;\n float: left; }\n .btn-group > .btn:hover, .media-widget.btn-group > a:hover, .btn-group > .btn:focus, .media-widget.btn-group > a:focus, .btn-group > .btn:active, .media-widget.btn-group > a:active, .btn-group > .btn.active, .media-widget.btn-group > a.active,\n .btn-group-vertical > .btn:hover,\n .media-widget.btn-group-vertical > a:hover,\n .btn-group-vertical > .btn:focus,\n .media-widget.btn-group-vertical > a:focus,\n .btn-group-vertical > .btn:active,\n .media-widget.btn-group-vertical > a:active,\n .btn-group-vertical > .btn.active,\n .media-widget.btn-group-vertical > a.active {\n z-index: 2; }\n\n.btn-group .btn + .btn, .btn-group .media-widget > a + .btn, .btn-group .media-widget > .btn + a, .btn-group .media-widget > a + a,\n.btn-group .btn + .btn-group,\n.btn-group .media-widget > a + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .media-widget > .btn-group + a,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px; }\n\n.btn-toolbar {\n margin-left: -5px;\n overflow: hidden;\n *zoom: 1; }\n .btn-toolbar .btn, .btn-toolbar .media-widget > a,\n .btn-toolbar .btn-group,\n .btn-toolbar .input-group {\n float: left; }\n .btn-toolbar > .btn, .media-widget.btn-toolbar > a,\n .btn-toolbar > .btn-group,\n .btn-toolbar > .input-group {\n margin-left: 5px; }\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle), .media-widget.btn-group > a:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0; }\n\n.btn-group > .btn:first-child, .media-widget.btn-group > a:first-child {\n margin-left: 0; }\n .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle), .media-widget.btn-group > a:first-child:not(:last-child):not(.dropdown-toggle) {\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group > .btn:last-child:not(:first-child), .media-widget.btn-group > a:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group > .btn-group {\n float: left; }\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn, .btn-group > .media-widget.btn-group:not(:first-child):not(:last-child) > a {\n border-radius: 0; }\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .media-widget.btn-group:first-child:not(:last-child) > a:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child, .btn-group > .media-widget.btn-group:last-child:not(:first-child) > a:first-child {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0; }\n\n.btn-group > .btn + .dropdown-toggle, .media-widget.btn-group > a + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px; }\n\n.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle, .media-widget.btn-group-lg.btn-group > a + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px; }\n\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 3px 5px rgba(0, 0, 0, 0.125), false, false, false, false, false, false, false, false, false); }\n .btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n\n.btn .caret, .media-widget > a .caret {\n margin-left: 0; }\n\n.btn-lg .caret, .btn-group-lg > .btn .caret, .media-widget.btn-group-lg > a .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0; }\n\n.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .caret, .dropup .media-widget.btn-group-lg > a .caret {\n border-width: 0 5px 5px; }\n\n.btn-group-vertical > .btn, .media-widget.btn-group-vertical > a,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn,\n.btn-group-vertical > .media-widget.btn-group > a {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%; }\n\n.btn-group-vertical > .btn-group {\n overflow: hidden;\n *zoom: 1; }\n .btn-group-vertical > .btn-group > .btn, .btn-group-vertical > .media-widget.btn-group > a {\n float: none; }\n\n.btn-group-vertical > .btn + .btn, .media-widget.btn-group-vertical > a + .btn, .media-widget.btn-group-vertical > .btn + a, .media-widget.btn-group-vertical > a + a,\n.btn-group-vertical > .btn + .btn-group,\n.media-widget.btn-group-vertical > a + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.media-widget.btn-group-vertical > .btn-group + a,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0; }\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child), .media-widget.btn-group-vertical > a:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.btn-group-vertical > .btn:first-child:not(:last-child), .media-widget.btn-group-vertical > a:first-child:not(:last-child) {\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group-vertical > .btn:last-child:not(:first-child), .media-widget.btn-group-vertical > a:last-child:not(:first-child) {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px; }\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn, .btn-group-vertical > .media-widget.btn-group:not(:first-child):not(:last-child) > a {\n border-radius: 0; }\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .media-widget.btn-group:first-child:not(:last-child) > a:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child, .btn-group-vertical > .media-widget.btn-group:last-child:not(:first-child) > a:first-child {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate; }\n .btn-group-justified > .btn, .media-widget.btn-group-justified > a,\n .btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%; }\n .btn-group-justified > .btn-group .btn, .btn-group-justified > .btn-group .media-widget > a {\n width: 100%; }\n .btn-group-justified > .btn-group .dropdown-menu {\n left: auto; }\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"], .media-widget[data-toggle=\"buttons\"] > a input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n.media-widget[data-toggle=\"buttons\"] > a input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .media-widget.btn-group > a input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .media-widget.btn-group > a input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none; }\n\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate; }\n .input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0; }\n .input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0; }\n .input-group .form-control:focus {\n z-index: 3; }\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell; }\n .input-group-addon:not(:first-child):not(:last-child),\n .input-group-btn:not(:first-child):not(:last-child),\n .input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0; }\n\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; }\n\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px; }\n .input-group-addon.input-sm,\n .input-group-sm > .input-group-addon,\n .input-group-sm > .input-group-btn > .input-group-addon.btn,\n .input-group-sm > .media-widget.input-group-btn > a.input-group-addon {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px; }\n .input-group-addon.input-lg,\n .input-group-lg > .input-group-addon,\n .input-group-lg > .input-group-btn > .input-group-addon.btn,\n .input-group-lg > .media-widget.input-group-btn > a.input-group-addon {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px; }\n .input-group-addon input[type=\"radio\"],\n .input-group-addon input[type=\"checkbox\"] {\n margin-top: 0; }\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.media-widget.input-group-btn:first-child > a,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .media-widget.btn-group > a,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.media-widget.input-group-btn:last-child > a:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn,\n.input-group-btn:last-child > .media-widget.btn-group:not(:last-child) > a {\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.input-group-addon:first-child {\n border-right: 0; }\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.media-widget.input-group-btn:last-child > a,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .media-widget.btn-group > a,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.media-widget.input-group-btn:first-child > a:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn,\n.input-group-btn:first-child > .media-widget.btn-group:not(:first-child) > a {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0; }\n\n.input-group-addon:last-child {\n border-left: 0; }\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap; }\n .input-group-btn > .btn, .media-widget.input-group-btn > a {\n position: relative; }\n .input-group-btn > .btn + .btn, .media-widget.input-group-btn > a + .btn, .media-widget.input-group-btn > .btn + a, .media-widget.input-group-btn > a + a {\n margin-left: -1px; }\n .input-group-btn > .btn:hover, .media-widget.input-group-btn > a:hover, .input-group-btn > .btn:focus, .media-widget.input-group-btn > a:focus, .input-group-btn > .btn:active, .media-widget.input-group-btn > a:active {\n z-index: 2; }\n .input-group-btn:first-child > .btn, .media-widget.input-group-btn:first-child > a,\n .input-group-btn:first-child > .btn-group {\n margin-right: -1px; }\n .input-group-btn:last-child > .btn, .media-widget.input-group-btn:last-child > a,\n .input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px; }\n\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n overflow: hidden;\n *zoom: 1; }\n .nav > li {\n position: relative;\n display: block; }\n .nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px; }\n .nav > li > a:hover, .nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .nav > li.disabled > a {\n color: #777777; }\n .nav > li.disabled > a:hover, .nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed; }\n .nav .open > a, .nav .open > a:hover, .nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7; }\n .nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5; }\n .nav > li > a > img {\n max-width: none; }\n\n.nav-tabs {\n border-bottom: 1px solid #ddd; }\n .nav-tabs > li {\n float: left;\n margin-bottom: -1px; }\n .nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0; }\n .nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd; }\n .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default; }\n\n.nav-pills > li {\n float: left; }\n .nav-pills > li > a {\n border-radius: 4px; }\n .nav-pills > li + li {\n margin-left: 2px; }\n .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7; }\n\n.nav-stacked > li {\n float: none; }\n .nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0; }\n\n.nav-justified, .nav-tabs.nav-justified {\n width: 100%; }\n .nav-justified > li, .nav-tabs.nav-justified > li {\n float: none; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px; }\n .nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto; }\n @media (min-width: 768px) {\n .nav-justified > li, .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%; }\n .nav-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-bottom: 0; } }\n\n.nav-tabs-justified, .nav-tabs.nav-justified {\n border-bottom: 0; }\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd; }\n @media (min-width: 768px) {\n .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0; }\n .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,\n .nav-tabs-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus, .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff; } }\n\n.tab-content > .tab-pane {\n display: none; }\n\n.tab-content > .active {\n display: block; }\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n overflow: hidden;\n *zoom: 1; }\n @media (min-width: 768px) {\n .navbar {\n border-radius: 4px; } }\n\n.navbar-header {\n overflow: hidden;\n *zoom: 1; }\n @media (min-width: 768px) {\n .navbar-header {\n float: left; } }\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n overflow: hidden;\n *zoom: 1;\n -webkit-overflow-scrolling: touch; }\n .navbar-collapse.in {\n overflow-y: auto; }\n @media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none; }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important; }\n .navbar-collapse.in {\n overflow-y: visible; }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0; } }\n\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px; }\n @media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px; } }\n\n.container > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-header,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px; }\n @media (min-width: 768px) {\n .container > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-header,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0; } }\n\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px; }\n @media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0; } }\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030; }\n @media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0; } }\n\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px; }\n\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0; }\n\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px; }\n .navbar-brand:hover, .navbar-brand:focus {\n text-decoration: none; }\n .navbar-brand > img {\n display: block; }\n @media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px; } }\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px; }\n .navbar-toggle:focus {\n outline: 0; }\n .navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px; }\n .navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px; }\n @media (min-width: 768px) {\n .navbar-toggle {\n display: none; } }\n\n.navbar-nav {\n margin: 7.5px -15px; }\n .navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px; }\n @media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none; }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px; }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px; }\n .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none; } }\n @media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0; }\n .navbar-nav > li {\n float: left; }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px; } }\n\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: compact(inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1), false, false, false, false, false, false, false, false, false);\n margin-top: 8px;\n margin-bottom: 8px; }\n @media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle; }\n .navbar-form .form-control-static {\n display: inline-block; }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle; }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto; }\n .navbar-form .input-group > .form-control {\n width: 100%; }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle; }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0; }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0; }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0; } }\n @media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px; }\n .navbar-form .form-group:last-child {\n margin-bottom: 0; } }\n @media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); } }\n\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px;\n -moz-border-radius-bottomleft: 0;\n -webkit-border-bottom-left-radius: 0;\n border-bottom-left-radius: 0;\n -moz-border-radius-bottomright: 0;\n -webkit-border-bottom-right-radius: 0;\n border-bottom-right-radius: 0; }\n\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px; }\n .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn, .media-widget.btn-group-sm > a.navbar-btn {\n margin-top: 10px;\n margin-bottom: 10px; }\n .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn, .media-widget.btn-group-xs > a.navbar-btn {\n margin-top: 14px;\n margin-bottom: 14px; }\n\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px; }\n @media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px; } }\n\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important; }\n .navbar-right {\n float: right !important;\n margin-right: -15px; }\n .navbar-right ~ .navbar-right {\n margin-right: 0; } }\n\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7; }\n .navbar-default .navbar-brand {\n color: #777; }\n .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent; }\n .navbar-default .navbar-text {\n color: #777; }\n .navbar-default .navbar-nav > li > a {\n color: #777; }\n .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent; }\n .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7; }\n .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent; }\n .navbar-default .navbar-toggle {\n border-color: #ddd; }\n .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n background-color: #ddd; }\n .navbar-default .navbar-toggle .icon-bar {\n background-color: #888; }\n .navbar-default .navbar-collapse,\n .navbar-default .navbar-form {\n border-color: #e7e7e7; }\n .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555; }\n @media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777; }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent; }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7; }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent; } }\n .navbar-default .navbar-link {\n color: #777; }\n .navbar-default .navbar-link:hover {\n color: #333; }\n .navbar-default .btn-link {\n color: #777; }\n .navbar-default .btn-link:hover, .navbar-default .btn-link:focus {\n color: #333; }\n .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-default .btn-link:hover,\n fieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc; }\n\n.navbar-inverse {\n background-color: #222;\n border-color: #090909; }\n .navbar-inverse .navbar-brand {\n color: #9d9d9d; }\n .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-text {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #090909; }\n .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent; }\n .navbar-inverse .navbar-toggle {\n border-color: #333; }\n .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {\n background-color: #333; }\n .navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff; }\n .navbar-inverse .navbar-collapse,\n .navbar-inverse .navbar-form {\n border-color: #101010; }\n .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #090909;\n color: #fff; }\n @media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #090909; }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent; } }\n .navbar-inverse .navbar-link {\n color: #9d9d9d; }\n .navbar-inverse .navbar-link:hover {\n color: #fff; }\n .navbar-inverse .btn-link {\n color: #9d9d9d; }\n .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {\n color: #fff; }\n .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus,\n fieldset[disabled] .navbar-inverse .btn-link:hover,\n fieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444; }\n\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px; }\n .breadcrumb > li {\n display: inline-block; }\n .breadcrumb > li + li:before {\n content: \"/ \";\n padding: 0 5px;\n color: #ccc; }\n .breadcrumb > .active {\n color: #777777; }\n\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px; }\n .pagination > li {\n display: inline; }\n .pagination > li > a,\n .pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px; }\n .pagination > li:first-child > a,\n .pagination > li:first-child > span {\n margin-left: 0;\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px; }\n .pagination > li:last-child > a,\n .pagination > li:last-child > span {\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px; }\n .pagination > li > a:hover, .pagination > li > a:focus,\n .pagination > li > span:hover,\n .pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd; }\n .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,\n .pagination > .active > span,\n .pagination > .active > span:hover,\n .pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default; }\n .pagination > .disabled > span,\n .pagination > .disabled > span:hover,\n .pagination > .disabled > span:focus,\n .pagination > .disabled > a,\n .pagination > .disabled > a:hover,\n .pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed; }\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33333; }\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n -moz-border-radius-topleft: 6px;\n -webkit-border-top-left-radius: 6px;\n border-top-left-radius: 6px;\n -moz-border-radius-bottomleft: 6px;\n -webkit-border-bottom-left-radius: 6px;\n border-bottom-left-radius: 6px; }\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n -moz-border-radius-topright: 6px;\n -webkit-border-top-right-radius: 6px;\n border-top-right-radius: 6px;\n -moz-border-radius-bottomright: 6px;\n -webkit-border-bottom-right-radius: 6px;\n border-bottom-right-radius: 6px; }\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5; }\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px; }\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n overflow: hidden;\n *zoom: 1; }\n .pager li {\n display: inline; }\n .pager li > a,\n .pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px; }\n .pager li > a:hover,\n .pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee; }\n .pager .next > a,\n .pager .next > span {\n float: right; }\n .pager .previous > a,\n .pager .previous > span {\n float: left; }\n .pager .disabled > a,\n .pager .disabled > a:hover,\n .pager .disabled > a:focus,\n .pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed; }\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em; }\n .label:empty {\n display: none; }\n .btn .label, .media-widget > a .label {\n position: relative;\n top: -1px; }\n\na.label:hover, a.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.label-default {\n background-color: #777777; }\n .label-default[href]:hover, .label-default[href]:focus {\n background-color: #5e5e5e; }\n\n.label-primary {\n background-color: #337ab7; }\n .label-primary[href]:hover, .label-primary[href]:focus {\n background-color: #286090; }\n\n.label-success {\n background-color: #5cb85c; }\n .label-success[href]:hover, .label-success[href]:focus {\n background-color: #449d44; }\n\n.label-info {\n background-color: #5bc0de; }\n .label-info[href]:hover, .label-info[href]:focus {\n background-color: #31b0d5; }\n\n.label-warning {\n background-color: #f0ad4e; }\n .label-warning[href]:hover, .label-warning[href]:focus {\n background-color: #ec971f; }\n\n.label-danger {\n background-color: #d9534f; }\n .label-danger[href]:hover, .label-danger[href]:focus {\n background-color: #c9302c; }\n\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px; }\n .badge:empty {\n display: none; }\n .btn .badge, .media-widget > a .badge {\n position: relative;\n top: -1px; }\n .btn-xs .badge, .btn-group-xs > .btn .badge, .media-widget.btn-group-xs > a .badge,\n .btn-group-xs > .btn .badge,\n .media-widget.btn-group-xs > a .badge {\n top: 0;\n padding: 1px 5px; }\n .list-group-item.active > .badge,\n .nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff; }\n .list-group-item > .badge {\n float: right; }\n .list-group-item > .badge + .badge {\n margin-right: 5px; }\n .nav-pills > li > a > .badge {\n margin-left: 3px; }\n\na.badge:hover, a.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer; }\n\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee; }\n .jumbotron h1,\n .jumbotron .h1 {\n color: inherit; }\n .jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200; }\n .jumbotron > hr {\n border-top-color: #d5d5d5; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px; }\n .jumbotron .container {\n max-width: 100%; }\n @media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px; }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px; }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px; } }\n\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: compact(compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(border 0.2s ease-in-out, false, false, false, false, false, false, false, false, false); }\n .thumbnail > img,\n .thumbnail a > img {\n display: block;\n max-width: 100%;\n height: auto;\n margin-left: auto;\n margin-right: auto; }\n .thumbnail .caption {\n padding: 9px;\n color: #333333; }\n\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7; }\n\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px; }\n .alert h4 {\n margin-top: 0;\n color: inherit; }\n .alert .alert-link {\n font-weight: bold; }\n .alert > p,\n .alert > ul {\n margin-bottom: 0; }\n .alert > p + p {\n margin-top: 5px; }\n\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px; }\n .alert-dismissable .close,\n .alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit; }\n\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d; }\n .alert-success hr {\n border-top-color: #c9e2b3; }\n .alert-success .alert-link {\n color: #2b542c; }\n\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f; }\n .alert-info hr {\n border-top-color: #a6e1ec; }\n .alert-info .alert-link {\n color: #245269; }\n\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b; }\n .alert-warning hr {\n border-top-color: #f7e1b5; }\n .alert-warning .alert-link {\n color: #66512c; }\n\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442; }\n .alert-danger hr {\n border-top-color: #e4b9c0; }\n .alert-danger .alert-link {\n color: #843534; }\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0; }\n to {\n background-position: 0 0; } }\n\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 2px rgba(0, 0, 0, 0.1), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 2px rgba(0, 0, 0, 0.1), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 2px rgba(0, 0, 0, 0.1), false, false, false, false, false, false, false, false, false); }\n\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: compact(inset 0 -1px 0 rgba(0, 0, 0, 0.15), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 -1px 0 rgba(0, 0, 0, 0.15), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 -1px 0 rgba(0, 0, 0, 0.15), false, false, false, false, false, false, false, false, false);\n -webkit-transition: compact(compact(width 0.6s ease, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(width 0.6s ease, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(width 0.6s ease, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(width 0.6s ease, false, false, false, false, false, false, false, false, false); }\n\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n background-size: 40px 40px; }\n\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite; }\n\n.progress-bar-success {\n background-color: #5cb85c; }\n .progress-striped .progress-bar-success {\n 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);\n 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);\n 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); }\n\n.progress-bar-info {\n background-color: #5bc0de; }\n .progress-striped .progress-bar-info {\n 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);\n 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);\n 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); }\n\n.progress-bar-warning {\n background-color: #f0ad4e; }\n .progress-striped .progress-bar-warning {\n 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);\n 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);\n 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); }\n\n.progress-bar-danger {\n background-color: #d9534f; }\n .progress-striped .progress-bar-danger {\n 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);\n 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);\n 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); }\n\n.media {\n margin-top: 15px; }\n .media:first-child {\n margin-top: 0; }\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden; }\n\n.media-body {\n width: 10000px; }\n\n.media-object {\n display: block; }\n .media-object.img-thumbnail {\n max-width: none; }\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px; }\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px; }\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top; }\n\n.media-middle {\n vertical-align: middle; }\n\n.media-bottom {\n vertical-align: bottom; }\n\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.media-list {\n padding-left: 0;\n list-style: none; }\n\n.list-group {\n margin-bottom: 20px;\n padding-left: 0; }\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd; }\n .list-group-item:first-child {\n -moz-border-radius-topleft: 4px;\n -webkit-border-top-left-radius: 4px;\n border-top-left-radius: 4px;\n -moz-border-radius-topright: 4px;\n -webkit-border-top-right-radius: 4px;\n border-top-right-radius: 4px; }\n .list-group-item:last-child {\n margin-bottom: 0;\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px; }\n\na.list-group-item,\nbutton.list-group-item {\n color: #555; }\n a.list-group-item .list-group-item-heading,\n button.list-group-item .list-group-item-heading {\n color: #333; }\n a.list-group-item:hover, a.list-group-item:focus,\n button.list-group-item:hover,\n button.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5; }\n\nbutton.list-group-item {\n width: 100%;\n text-align: left; }\n\n.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed; }\n .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading {\n color: inherit; }\n .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text {\n color: #777777; }\n\n.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .list-group-item.active .list-group-item-heading,\n .list-group-item.active .list-group-item-heading > small,\n .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,\n .list-group-item.active:hover .list-group-item-heading > small,\n .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,\n .list-group-item.active:focus .list-group-item-heading > small,\n .list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit; }\n .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text {\n color: #c7ddef; }\n\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8; }\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d; }\n a.list-group-item-success .list-group-item-heading,\n button.list-group-item-success .list-group-item-heading {\n color: inherit; }\n a.list-group-item-success:hover, a.list-group-item-success:focus,\n button.list-group-item-success:hover,\n button.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6; }\n a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus,\n button.list-group-item-success.active,\n button.list-group-item-success.active:hover,\n button.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d; }\n\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7; }\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f; }\n a.list-group-item-info .list-group-item-heading,\n button.list-group-item-info .list-group-item-heading {\n color: inherit; }\n a.list-group-item-info:hover, a.list-group-item-info:focus,\n button.list-group-item-info:hover,\n button.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3; }\n a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus,\n button.list-group-item-info.active,\n button.list-group-item-info.active:hover,\n button.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f; }\n\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3; }\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b; }\n a.list-group-item-warning .list-group-item-heading,\n button.list-group-item-warning .list-group-item-heading {\n color: inherit; }\n a.list-group-item-warning:hover, a.list-group-item-warning:focus,\n button.list-group-item-warning:hover,\n button.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc; }\n a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus,\n button.list-group-item-warning.active,\n button.list-group-item-warning.active:hover,\n button.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b; }\n\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede; }\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442; }\n a.list-group-item-danger .list-group-item-heading,\n button.list-group-item-danger .list-group-item-heading {\n color: inherit; }\n a.list-group-item-danger:hover, a.list-group-item-danger:focus,\n button.list-group-item-danger:hover,\n button.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc; }\n a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus,\n button.list-group-item-danger.active,\n button.list-group-item-danger.active:hover,\n button.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442; }\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px; }\n\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3; }\n\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: compact(0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false); }\n\n.panel-body {\n padding: 15px;\n overflow: hidden;\n *zoom: 1; }\n\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px; }\n .panel-heading > .dropdown .dropdown-toggle {\n color: inherit; }\n\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit; }\n .panel-title > a,\n .panel-title > small,\n .panel-title > .small,\n .panel-title > small > a,\n .panel-title > .small > a {\n color: inherit; }\n\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0; }\n .panel > .list-group .list-group-item,\n .panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0; }\n .panel > .list-group:first-child .list-group-item:first-child,\n .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .list-group:last-child .list-group-item:last-child,\n .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n -moz-border-radius-topleft: 0;\n -webkit-border-top-left-radius: 0;\n border-top-left-radius: 0;\n -moz-border-radius-topright: 0;\n -webkit-border-top-right-radius: 0;\n border-top-right-radius: 0; }\n\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0; }\n\n.list-group + .panel-footer {\n border-top-width: 0; }\n\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0; }\n .panel > .table caption,\n .panel > .table-responsive > .table caption,\n .panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px; }\n\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n -moz-border-radius-topleft: 3px;\n -webkit-border-top-left-radius: 3px;\n border-top-left-radius: 3px;\n -moz-border-radius-topright: 3px;\n -webkit-border-top-right-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px; }\n .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px; }\n\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n -moz-border-radius-bottomleft: 3px;\n -webkit-border-bottom-left-radius: 3px;\n border-bottom-left-radius: 3px;\n -moz-border-radius-bottomright: 3px;\n -webkit-border-bottom-right-radius: 3px;\n border-bottom-right-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px; }\n .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px; }\n\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd; }\n\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0; }\n\n.panel > .table-bordered, .calendar-calendar .panel > table.mini,\n.panel > .table-responsive > .table-bordered, .calendar-calendar\n.panel > .table-responsive > table.mini {\n border: 0; }\n .panel > .table-bordered > thead > tr > th:first-child, .calendar-calendar .panel > table.mini > thead > tr > th:first-child,\n .panel > .table-bordered > thead > tr > td:first-child, .calendar-calendar\n .panel > table.mini > thead > tr > td:first-child,\n .panel > .table-bordered > tbody > tr > th:first-child, .calendar-calendar\n .panel > table.mini > tbody > tr > th:first-child,\n .panel > .table-bordered > tbody > tr > td:first-child, .calendar-calendar\n .panel > table.mini > tbody > tr > td:first-child,\n .panel > .table-bordered > tfoot > tr > th:first-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > th:first-child,\n .panel > .table-bordered > tfoot > tr > td:first-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > td:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > th:first-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > td:first-child {\n border-left: 0; }\n .panel > .table-bordered > thead > tr > th:last-child, .calendar-calendar .panel > table.mini > thead > tr > th:last-child,\n .panel > .table-bordered > thead > tr > td:last-child, .calendar-calendar\n .panel > table.mini > thead > tr > td:last-child,\n .panel > .table-bordered > tbody > tr > th:last-child, .calendar-calendar\n .panel > table.mini > tbody > tr > th:last-child,\n .panel > .table-bordered > tbody > tr > td:last-child, .calendar-calendar\n .panel > table.mini > tbody > tr > td:last-child,\n .panel > .table-bordered > tfoot > tr > th:last-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > th:last-child,\n .panel > .table-bordered > tfoot > tr > td:last-child, .calendar-calendar\n .panel > table.mini > tfoot > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr > td:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > th:last-child,\n .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr > td:last-child {\n border-right: 0; }\n .panel > .table-bordered > thead > tr:first-child > td, .calendar-calendar .panel > table.mini > thead > tr:first-child > td,\n .panel > .table-bordered > thead > tr:first-child > th, .calendar-calendar\n .panel > table.mini > thead > tr:first-child > th,\n .panel > .table-bordered > tbody > tr:first-child > td, .calendar-calendar\n .panel > table.mini > tbody > tr:first-child > td,\n .panel > .table-bordered > tbody > tr:first-child > th, .calendar-calendar\n .panel > table.mini > tbody > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > thead > tr:first-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:first-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:first-child > th {\n border-bottom: 0; }\n .panel > .table-bordered > tbody > tr:last-child > td, .calendar-calendar .panel > table.mini > tbody > tr:last-child > td,\n .panel > .table-bordered > tbody > tr:last-child > th, .calendar-calendar\n .panel > table.mini > tbody > tr:last-child > th,\n .panel > .table-bordered > tfoot > tr:last-child > td, .calendar-calendar\n .panel > table.mini > tfoot > tr:last-child > td,\n .panel > .table-bordered > tfoot > tr:last-child > th, .calendar-calendar\n .panel > table.mini > tfoot > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > tbody > tr:last-child > th,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr:last-child > td,\n .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, .calendar-calendar\n .panel > .table-responsive > table.mini > tfoot > tr:last-child > th {\n border-bottom: 0; }\n\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0; }\n\n.panel-group {\n margin-bottom: 20px; }\n .panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px; }\n .panel-group .panel + .panel {\n margin-top: 5px; }\n .panel-group .panel-heading {\n border-bottom: 0; }\n .panel-group .panel-heading + .panel-collapse > .panel-body,\n .panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd; }\n .panel-group .panel-footer {\n border-top: 0; }\n .panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd; }\n\n.panel-default {\n border-color: #ddd; }\n .panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd; }\n .panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd; }\n .panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333; }\n .panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd; }\n\n.panel-primary {\n border-color: #337ab7; }\n .panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7; }\n .panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7; }\n .panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff; }\n .panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7; }\n\n.panel-success {\n border-color: #d6e9c6; }\n .panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6; }\n .panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6; }\n .panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d; }\n .panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6; }\n\n.panel-info {\n border-color: #bce8f1; }\n .panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1; }\n .panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1; }\n .panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f; }\n .panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1; }\n\n.panel-warning {\n border-color: #faebcc; }\n .panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc; }\n .panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc; }\n .panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b; }\n .panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc; }\n\n.panel-danger {\n border-color: #ebccd1; }\n .panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1; }\n .panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1; }\n .panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442; }\n .panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1; }\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden; }\n .embed-responsive .embed-responsive-item,\n .embed-responsive iframe,\n .embed-responsive embed,\n .embed-responsive object,\n .embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0; }\n\n.embed-responsive-16by9 {\n padding-bottom: 56.25%; }\n\n.embed-responsive-4by3 {\n padding-bottom: 75%; }\n\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false); }\n .well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n\n.well-lg {\n padding: 24px;\n border-radius: 6px; }\n\n.well-sm {\n padding: 9px;\n border-radius: 3px; }\n\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);\n opacity: 0.2; }\n .close:hover, .close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n opacity: 0.5; }\n\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none; }\n\n.modal-open {\n overflow: hidden; }\n\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0; }\n .modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -moz-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out; }\n .modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -moz-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0); }\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto; }\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px; }\n\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: compact(0 3px 9px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 3px 9px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 3px 9px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n background-clip: padding-box;\n outline: 0; }\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000; }\n .modal-backdrop.fade {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n .modal-backdrop.in {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n opacity: 0.5; }\n\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n overflow: hidden;\n *zoom: 1; }\n\n.modal-header .close {\n margin-top: -2px; }\n\n.modal-title {\n margin: 0;\n line-height: 1.42857; }\n\n.modal-body {\n position: relative;\n padding: 15px; }\n\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n overflow: hidden;\n *zoom: 1; }\n .modal-footer .btn + .btn, .modal-footer .media-widget > a + .btn, .modal-footer .media-widget > .btn + a, .modal-footer .media-widget > a + a {\n margin-left: 5px;\n margin-bottom: 0; }\n .modal-footer .btn-group .btn + .btn, .modal-footer .btn-group .media-widget > a + .btn, .modal-footer .btn-group .media-widget > .btn + a, .modal-footer .btn-group .media-widget > a + a {\n margin-left: -1px; }\n .modal-footer .btn-block + .btn-block {\n margin-left: 0; }\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll; }\n\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto; }\n .modal-content {\n -webkit-box-shadow: compact(0 5px 15px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 5px 15px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 5px 15px rgba(0, 0, 0, 0.5), false, false, false, false, false, false, false, false, false); }\n .modal-sm {\n width: 300px; } }\n\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px; } }\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n opacity: 0; }\n .tooltip.in {\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n opacity: 0.9; }\n .tooltip.top {\n margin-top: -3px;\n padding: 5px 0; }\n .tooltip.right {\n margin-left: 3px;\n padding: 0 5px; }\n .tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0; }\n .tooltip.left {\n margin-left: -3px;\n padding: 0 5px; }\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px; }\n\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000; }\n\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000; }\n\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000; }\n\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000; }\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: compact(0 5px 10px rgba(0, 0, 0, 0.2), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(0 5px 10px rgba(0, 0, 0, 0.2), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(0 5px 10px rgba(0, 0, 0, 0.2), false, false, false, false, false, false, false, false, false); }\n .popover.top {\n margin-top: -10px; }\n .popover.right {\n margin-left: 10px; }\n .popover.bottom {\n margin-top: 10px; }\n .popover.left {\n margin-left: -10px; }\n\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0; }\n\n.popover-content {\n padding: 9px 14px; }\n\n.popover > .arrow, .popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid; }\n\n.popover > .arrow {\n border-width: 11px; }\n\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\"; }\n\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px; }\n .popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff; }\n\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25); }\n .popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff; }\n\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px; }\n .popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff; }\n\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25); }\n .popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px; }\n\n.carousel {\n position: relative; }\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%; }\n .carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: compact(compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false) false false);\n -moz-transition: compact(compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false) false false false);\n -o-transition: compact(compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false) false false false);\n transition: compact(0.6s ease-in-out left, false, false, false, false, false, false, false, false, false); }\n .carousel-inner > .item > img,\n .carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n line-height: 1; }\n @media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n -ms-backface-visibility: hidden;\n -o-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n -ms-perspective: 1000px;\n -o-perspective: 1000px;\n perspective: 1000px; }\n .carousel-inner > .item.next, .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n -moz-transform: translate3d(100%, 0, 0);\n -ms-transform: translate3d(100%, 0, 0);\n -o-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.prev, .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n -moz-transform: translate3d(-100%, 0, 0);\n -ms-transform: translate3d(-100%, 0, 0);\n -o-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0; }\n .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n -moz-transform: translate3d(0, 0, 0);\n -ms-transform: translate3d(0, 0, 0);\n -o-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0; } }\n .carousel-inner > .active,\n .carousel-inner > .next,\n .carousel-inner > .prev {\n display: block; }\n .carousel-inner > .active {\n left: 0; }\n .carousel-inner > .next,\n .carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%; }\n .carousel-inner > .next {\n left: 100%; }\n .carousel-inner > .prev {\n left: -100%; }\n .carousel-inner > .next.left,\n .carousel-inner > .prev.right {\n left: 0; }\n .carousel-inner > .active.left {\n left: -100%; }\n .carousel-inner > .active.right {\n left: 100%; }\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n opacity: 0.5;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: transparent; }\n .carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); }\n .carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); }\n .carousel-control:hover, .carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n opacity: 0.9; }\n .carousel-control .icon-prev,\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block; }\n .carousel-control .icon-prev,\n .carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px; }\n .carousel-control .icon-next,\n .carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px; }\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif; }\n .carousel-control .icon-prev:before {\n content: '\\2039'; }\n .carousel-control .icon-next:before {\n content: '\\203a'; }\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center; }\n .carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: transparent; }\n .carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff; }\n\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); }\n .carousel-caption .btn, .carousel-caption .media-widget > a {\n text-shadow: none; }\n\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px; }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px; }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px; }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px; }\n .carousel-indicators {\n bottom: 20px; } }\n\n.clearfix {\n overflow: hidden;\n *zoom: 1; }\n\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto; }\n\n.pull-right {\n float: right !important; }\n\n.pull-left {\n float: left !important; }\n\n.hide {\n display: none !important; }\n\n.show {\n display: block !important; }\n\n.invisible {\n visibility: hidden; }\n\n.text-hide {\n text-indent: -119988px;\n overflow: hidden;\n text-align: left; }\n\n.hidden {\n display: none !important; }\n\n.affix {\n position: fixed; }\n\n@-ms-viewport {\n width: device-width; }\n\n.visible-xs {\n display: none !important; }\n\n.visible-sm {\n display: none !important; }\n\n.visible-md {\n display: none !important; }\n\n.visible-lg {\n display: none !important; }\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important; }\n\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important; }\n table.visible-xs {\n display: table !important; }\n tr.visible-xs {\n display: table-row !important; }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important; } }\n\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important; }\n table.visible-sm {\n display: table !important; }\n tr.visible-sm {\n display: table-row !important; }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important; }\n table.visible-md {\n display: table !important; }\n tr.visible-md {\n display: table-row !important; }\n th.visible-md,\n td.visible-md {\n display: table-cell !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important; }\n table.visible-lg {\n display: table !important; }\n tr.visible-lg {\n display: table-row !important; }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important; } }\n\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important; } }\n\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important; } }\n\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important; } }\n\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important; } }\n\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important; } }\n\n.visible-print {\n display: none !important; }\n\n@media print {\n .visible-print {\n display: block !important; }\n table.visible-print {\n display: table !important; }\n tr.visible-print {\n display: table-row !important; }\n th.visible-print,\n td.visible-print {\n display: table-cell !important; } }\n\n.visible-print-block {\n display: none !important; }\n @media print {\n .visible-print-block {\n display: block !important; } }\n\n.visible-print-inline {\n display: none !important; }\n @media print {\n .visible-print-inline {\n display: inline !important; } }\n\n.visible-print-inline-block {\n display: none !important; }\n @media print {\n .visible-print-inline-block {\n display: inline-block !important; } }\n\n@media print {\n .hidden-print {\n display: none !important; } }\n\n/*!\n * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n font-family: 'FontAwesome';\n src: url(\"../fonts/fontawesome-webfont.eot?v=4.4.0\");\n src: url(\"../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0\") format(\"embedded-opentype\"), url(\"../fonts/fontawesome-webfont.woff2?v=4.4.0\") format(\"woff2\"), url(\"../fonts/fontawesome-webfont.woff?v=4.4.0\") format(\"woff\"), url(\"../fonts/fontawesome-webfont.ttf?v=4.4.0\") format(\"truetype\"), url(\"../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular\") format(\"svg\");\n font-weight: normal;\n font-style: normal; }\n\n.fa {\n display: inline-block;\n font: normal normal normal 14px/1 FontAwesome;\n font-size: inherit;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n font-size: 1.33333em;\n line-height: 0.75em;\n vertical-align: -15%; }\n\n.fa-2x {\n font-size: 2em; }\n\n.fa-3x {\n font-size: 3em; }\n\n.fa-4x {\n font-size: 4em; }\n\n.fa-5x {\n font-size: 5em; }\n\n.fa-fw {\n width: 1.28571em;\n text-align: center; }\n\n.fa-ul {\n padding-left: 0;\n margin-left: 2.14286em;\n list-style-type: none; }\n .fa-ul > li {\n position: relative; }\n\n.fa-li {\n position: absolute;\n left: -2.14286em;\n width: 2.14286em;\n top: 0.14286em;\n text-align: center; }\n .fa-li.fa-lg {\n left: -1.85714em; }\n\n.fa-border {\n padding: .2em .25em .15em;\n border: solid 0.08em #eee;\n border-radius: .1em; }\n\n.fa-pull-left {\n float: left; }\n\n.fa-pull-right {\n float: right; }\n\n.fa.fa-pull-left {\n margin-right: .3em; }\n\n.fa.fa-pull-right {\n margin-left: .3em; }\n\n/* Deprecated as of 4.4.0 */\n.pull-right {\n float: right; }\n\n.pull-left {\n float: left; }\n\n.fa.pull-left {\n margin-right: .3em; }\n\n.fa.pull-right {\n margin-left: .3em; }\n\n.fa-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear; }\n\n.fa-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8); }\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg); } }\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg); }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg); } }\n\n.fa-rotate-90 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n -webkit-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n transform: rotate(90deg); }\n\n.fa-rotate-180 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n -webkit-transform: rotate(180deg);\n -ms-transform: rotate(180deg);\n transform: rotate(180deg); }\n\n.fa-rotate-270 {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n -webkit-transform: rotate(270deg);\n -ms-transform: rotate(270deg);\n transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0);\n -webkit-transform: scale(-1, 1);\n -ms-transform: scale(-1, 1);\n transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n -webkit-transform: scale(1, -1);\n -ms-transform: scale(1, -1);\n transform: scale(1, -1); }\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n filter: none; }\n\n.fa-stack {\n position: relative;\n display: inline-block;\n width: 2em;\n height: 2em;\n line-height: 2em;\n vertical-align: middle; }\n\n.fa-stack-1x, .fa-stack-2x {\n position: absolute;\n left: 0;\n width: 100%;\n text-align: center; }\n\n.fa-stack-1x {\n line-height: inherit; }\n\n.fa-stack-2x {\n font-size: 2em; }\n\n.fa-inverse {\n color: #fff; }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n.fa-glass:before {\n content: \"\"; }\n\n.fa-music:before {\n content: \"\"; }\n\n.fa-search:before {\n content: \"\"; }\n\n.fa-envelope-o:before {\n content: \"\"; }\n\n.fa-heart:before {\n content: \"\"; }\n\n.fa-star:before {\n content: \"\"; }\n\n.fa-star-o:before {\n content: \"\"; }\n\n.fa-user:before {\n content: \"\"; }\n\n.fa-film:before {\n content: \"\"; }\n\n.fa-th-large:before {\n content: \"\"; }\n\n.fa-th:before {\n content: \"\"; }\n\n.fa-th-list:before {\n content: \"\"; }\n\n.fa-check:before {\n content: \"\"; }\n\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n content: \"\"; }\n\n.fa-search-plus:before {\n content: \"\"; }\n\n.fa-search-minus:before {\n content: \"\"; }\n\n.fa-power-off:before {\n content: \"\"; }\n\n.fa-signal:before {\n content: \"\"; }\n\n.fa-gear:before,\n.fa-cog:before {\n content: \"\"; }\n\n.fa-trash-o:before {\n content: \"\"; }\n\n.fa-home:before {\n content: \"\"; }\n\n.fa-file-o:before {\n content: \"\"; }\n\n.fa-clock-o:before {\n content: \"\"; }\n\n.fa-road:before {\n content: \"\"; }\n\n.fa-download:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-down:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-up:before {\n content: \"\"; }\n\n.fa-inbox:before {\n content: \"\"; }\n\n.fa-play-circle-o:before {\n content: \"\"; }\n\n.fa-rotate-right:before,\n.fa-repeat:before {\n content: \"\"; }\n\n.fa-refresh:before {\n content: \"\"; }\n\n.fa-list-alt:before {\n content: \"\"; }\n\n.fa-lock:before {\n content: \"\"; }\n\n.fa-flag:before {\n content: \"\"; }\n\n.fa-headphones:before {\n content: \"\"; }\n\n.fa-volume-off:before {\n content: \"\"; }\n\n.fa-volume-down:before {\n content: \"\"; }\n\n.fa-volume-up:before {\n content: \"\"; }\n\n.fa-qrcode:before {\n content: \"\"; }\n\n.fa-barcode:before {\n content: \"\"; }\n\n.fa-tag:before {\n content: \"\"; }\n\n.fa-tags:before {\n content: \"\"; }\n\n.fa-book:before {\n content: \"\"; }\n\n.fa-bookmark:before {\n content: \"\"; }\n\n.fa-print:before {\n content: \"\"; }\n\n.fa-camera:before {\n content: \"\"; }\n\n.fa-font:before {\n content: \"\"; }\n\n.fa-bold:before {\n content: \"\"; }\n\n.fa-italic:before {\n content: \"\"; }\n\n.fa-text-height:before {\n content: \"\"; }\n\n.fa-text-width:before {\n content: \"\"; }\n\n.fa-align-left:before {\n content: \"\"; }\n\n.fa-align-center:before {\n content: \"\"; }\n\n.fa-align-right:before {\n content: \"\"; }\n\n.fa-align-justify:before {\n content: \"\"; }\n\n.fa-list:before {\n content: \"\"; }\n\n.fa-dedent:before,\n.fa-outdent:before {\n content: \"\"; }\n\n.fa-indent:before {\n content: \"\"; }\n\n.fa-video-camera:before {\n content: \"\"; }\n\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n content: \"\"; }\n\n.fa-pencil:before {\n content: \"\"; }\n\n.fa-map-marker:before {\n content: \"\"; }\n\n.fa-adjust:before {\n content: \"\"; }\n\n.fa-tint:before {\n content: \"\"; }\n\n.fa-edit:before,\n.fa-pencil-square-o:before {\n content: \"\"; }\n\n.fa-share-square-o:before {\n content: \"\"; }\n\n.fa-check-square-o:before {\n content: \"\"; }\n\n.fa-arrows:before {\n content: \"\"; }\n\n.fa-step-backward:before {\n content: \"\"; }\n\n.fa-fast-backward:before {\n content: \"\"; }\n\n.fa-backward:before {\n content: \"\"; }\n\n.fa-play:before {\n content: \"\"; }\n\n.fa-pause:before {\n content: \"\"; }\n\n.fa-stop:before {\n content: \"\"; }\n\n.fa-forward:before {\n content: \"\"; }\n\n.fa-fast-forward:before {\n content: \"\"; }\n\n.fa-step-forward:before {\n content: \"\"; }\n\n.fa-eject:before {\n content: \"\"; }\n\n.fa-chevron-left:before {\n content: \"\"; }\n\n.fa-chevron-right:before {\n content: \"\"; }\n\n.fa-plus-circle:before {\n content: \"\"; }\n\n.fa-minus-circle:before {\n content: \"\"; }\n\n.fa-times-circle:before {\n content: \"\"; }\n\n.fa-check-circle:before {\n content: \"\"; }\n\n.fa-question-circle:before {\n content: \"\"; }\n\n.fa-info-circle:before {\n content: \"\"; }\n\n.fa-crosshairs:before {\n content: \"\"; }\n\n.fa-times-circle-o:before {\n content: \"\"; }\n\n.fa-check-circle-o:before {\n content: \"\"; }\n\n.fa-ban:before {\n content: \"\"; }\n\n.fa-arrow-left:before {\n content: \"\"; }\n\n.fa-arrow-right:before {\n content: \"\"; }\n\n.fa-arrow-up:before {\n content: \"\"; }\n\n.fa-arrow-down:before {\n content: \"\"; }\n\n.fa-mail-forward:before,\n.fa-share:before {\n content: \"\"; }\n\n.fa-expand:before {\n content: \"\"; }\n\n.fa-compress:before {\n content: \"\"; }\n\n.fa-plus:before {\n content: \"\"; }\n\n.fa-minus:before {\n content: \"\"; }\n\n.fa-asterisk:before {\n content: \"\"; }\n\n.fa-exclamation-circle:before {\n content: \"\"; }\n\n.fa-gift:before {\n content: \"\"; }\n\n.fa-leaf:before {\n content: \"\"; }\n\n.fa-fire:before {\n content: \"\"; }\n\n.fa-eye:before {\n content: \"\"; }\n\n.fa-eye-slash:before {\n content: \"\"; }\n\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n content: \"\"; }\n\n.fa-plane:before {\n content: \"\"; }\n\n.fa-calendar:before {\n content: \"\"; }\n\n.fa-random:before {\n content: \"\"; }\n\n.fa-comment:before {\n content: \"\"; }\n\n.fa-magnet:before {\n content: \"\"; }\n\n.fa-chevron-up:before {\n content: \"\"; }\n\n.fa-chevron-down:before {\n content: \"\"; }\n\n.fa-retweet:before {\n content: \"\"; }\n\n.fa-shopping-cart:before {\n content: \"\"; }\n\n.fa-folder:before {\n content: \"\"; }\n\n.fa-folder-open:before {\n content: \"\"; }\n\n.fa-arrows-v:before {\n content: \"\"; }\n\n.fa-arrows-h:before {\n content: \"\"; }\n\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n content: \"\"; }\n\n.fa-twitter-square:before {\n content: \"\"; }\n\n.fa-facebook-square:before {\n content: \"\"; }\n\n.fa-camera-retro:before {\n content: \"\"; }\n\n.fa-key:before {\n content: \"\"; }\n\n.fa-gears:before,\n.fa-cogs:before {\n content: \"\"; }\n\n.fa-comments:before {\n content: \"\"; }\n\n.fa-thumbs-o-up:before {\n content: \"\"; }\n\n.fa-thumbs-o-down:before {\n content: \"\"; }\n\n.fa-star-half:before {\n content: \"\"; }\n\n.fa-heart-o:before {\n content: \"\"; }\n\n.fa-sign-out:before {\n content: \"\"; }\n\n.fa-linkedin-square:before {\n content: \"\"; }\n\n.fa-thumb-tack:before {\n content: \"\"; }\n\n.fa-external-link:before {\n content: \"\"; }\n\n.fa-sign-in:before {\n content: \"\"; }\n\n.fa-trophy:before {\n content: \"\"; }\n\n.fa-github-square:before {\n content: \"\"; }\n\n.fa-upload:before {\n content: \"\"; }\n\n.fa-lemon-o:before {\n content: \"\"; }\n\n.fa-phone:before {\n content: \"\"; }\n\n.fa-square-o:before {\n content: \"\"; }\n\n.fa-bookmark-o:before {\n content: \"\"; }\n\n.fa-phone-square:before {\n content: \"\"; }\n\n.fa-twitter:before {\n content: \"\"; }\n\n.fa-facebook-f:before,\n.fa-facebook:before {\n content: \"\"; }\n\n.fa-github:before {\n content: \"\"; }\n\n.fa-unlock:before {\n content: \"\"; }\n\n.fa-credit-card:before {\n content: \"\"; }\n\n.fa-feed:before,\n.fa-rss:before {\n content: \"\"; }\n\n.fa-hdd-o:before {\n content: \"\"; }\n\n.fa-bullhorn:before {\n content: \"\"; }\n\n.fa-bell:before {\n content: \"\"; }\n\n.fa-certificate:before {\n content: \"\"; }\n\n.fa-hand-o-right:before {\n content: \"\"; }\n\n.fa-hand-o-left:before {\n content: \"\"; }\n\n.fa-hand-o-up:before {\n content: \"\"; }\n\n.fa-hand-o-down:before {\n content: \"\"; }\n\n.fa-arrow-circle-left:before {\n content: \"\"; }\n\n.fa-arrow-circle-right:before {\n content: \"\"; }\n\n.fa-arrow-circle-up:before {\n content: \"\"; }\n\n.fa-arrow-circle-down:before {\n content: \"\"; }\n\n.fa-globe:before {\n content: \"\"; }\n\n.fa-wrench:before {\n content: \"\"; }\n\n.fa-tasks:before {\n content: \"\"; }\n\n.fa-filter:before {\n content: \"\"; }\n\n.fa-briefcase:before {\n content: \"\"; }\n\n.fa-arrows-alt:before {\n content: \"\"; }\n\n.fa-group:before,\n.fa-users:before {\n content: \"\"; }\n\n.fa-chain:before,\n.fa-link:before {\n content: \"\"; }\n\n.fa-cloud:before {\n content: \"\"; }\n\n.fa-flask:before {\n content: \"\"; }\n\n.fa-cut:before,\n.fa-scissors:before {\n content: \"\"; }\n\n.fa-copy:before,\n.fa-files-o:before {\n content: \"\"; }\n\n.fa-paperclip:before {\n content: \"\"; }\n\n.fa-save:before,\n.fa-floppy-o:before {\n content: \"\"; }\n\n.fa-square:before {\n content: \"\"; }\n\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n content: \"\"; }\n\n.fa-list-ul:before {\n content: \"\"; }\n\n.fa-list-ol:before {\n content: \"\"; }\n\n.fa-strikethrough:before {\n content: \"\"; }\n\n.fa-underline:before {\n content: \"\"; }\n\n.fa-table:before {\n content: \"\"; }\n\n.fa-magic:before {\n content: \"\"; }\n\n.fa-truck:before {\n content: \"\"; }\n\n.fa-pinterest:before {\n content: \"\"; }\n\n.fa-pinterest-square:before {\n content: \"\"; }\n\n.fa-google-plus-square:before {\n content: \"\"; }\n\n.fa-google-plus:before {\n content: \"\"; }\n\n.fa-money:before {\n content: \"\"; }\n\n.fa-caret-down:before {\n content: \"\"; }\n\n.fa-caret-up:before {\n content: \"\"; }\n\n.fa-caret-left:before {\n content: \"\"; }\n\n.fa-caret-right:before {\n content: \"\"; }\n\n.fa-columns:before {\n content: \"\"; }\n\n.fa-unsorted:before,\n.fa-sort:before {\n content: \"\"; }\n\n.fa-sort-down:before,\n.fa-sort-desc:before {\n content: \"\"; }\n\n.fa-sort-up:before,\n.fa-sort-asc:before {\n content: \"\"; }\n\n.fa-envelope:before {\n content: \"\"; }\n\n.fa-linkedin:before {\n content: \"\"; }\n\n.fa-rotate-left:before,\n.fa-undo:before {\n content: \"\"; }\n\n.fa-legal:before,\n.fa-gavel:before {\n content: \"\"; }\n\n.fa-dashboard:before,\n.fa-tachometer:before {\n content: \"\"; }\n\n.fa-comment-o:before {\n content: \"\"; }\n\n.fa-comments-o:before {\n content: \"\"; }\n\n.fa-flash:before,\n.fa-bolt:before {\n content: \"\"; }\n\n.fa-sitemap:before {\n content: \"\"; }\n\n.fa-umbrella:before {\n content: \"\"; }\n\n.fa-paste:before,\n.fa-clipboard:before {\n content: \"\"; }\n\n.fa-lightbulb-o:before {\n content: \"\"; }\n\n.fa-exchange:before {\n content: \"\"; }\n\n.fa-cloud-download:before {\n content: \"\"; }\n\n.fa-cloud-upload:before {\n content: \"\"; }\n\n.fa-user-md:before {\n content: \"\"; }\n\n.fa-stethoscope:before {\n content: \"\"; }\n\n.fa-suitcase:before {\n content: \"\"; }\n\n.fa-bell-o:before {\n content: \"\"; }\n\n.fa-coffee:before {\n content: \"\"; }\n\n.fa-cutlery:before {\n content: \"\"; }\n\n.fa-file-text-o:before {\n content: \"\"; }\n\n.fa-building-o:before {\n content: \"\"; }\n\n.fa-hospital-o:before {\n content: \"\"; }\n\n.fa-ambulance:before {\n content: \"\"; }\n\n.fa-medkit:before {\n content: \"\"; }\n\n.fa-fighter-jet:before {\n content: \"\"; }\n\n.fa-beer:before {\n content: \"\"; }\n\n.fa-h-square:before {\n content: \"\"; }\n\n.fa-plus-square:before {\n content: \"\"; }\n\n.fa-angle-double-left:before {\n content: \"\"; }\n\n.fa-angle-double-right:before {\n content: \"\"; }\n\n.fa-angle-double-up:before {\n content: \"\"; }\n\n.fa-angle-double-down:before {\n content: \"\"; }\n\n.fa-angle-left:before {\n content: \"\"; }\n\n.fa-angle-right:before {\n content: \"\"; }\n\n.fa-angle-up:before {\n content: \"\"; }\n\n.fa-angle-down:before {\n content: \"\"; }\n\n.fa-desktop:before {\n content: \"\"; }\n\n.fa-laptop:before {\n content: \"\"; }\n\n.fa-tablet:before {\n content: \"\"; }\n\n.fa-mobile-phone:before,\n.fa-mobile:before {\n content: \"\"; }\n\n.fa-circle-o:before {\n content: \"\"; }\n\n.fa-quote-left:before {\n content: \"\"; }\n\n.fa-quote-right:before {\n content: \"\"; }\n\n.fa-spinner:before {\n content: \"\"; }\n\n.fa-circle:before {\n content: \"\"; }\n\n.fa-mail-reply:before,\n.fa-reply:before {\n content: \"\"; }\n\n.fa-github-alt:before {\n content: \"\"; }\n\n.fa-folder-o:before {\n content: \"\"; }\n\n.fa-folder-open-o:before {\n content: \"\"; }\n\n.fa-smile-o:before {\n content: \"\"; }\n\n.fa-frown-o:before {\n content: \"\"; }\n\n.fa-meh-o:before {\n content: \"\"; }\n\n.fa-gamepad:before {\n content: \"\"; }\n\n.fa-keyboard-o:before {\n content: \"\"; }\n\n.fa-flag-o:before {\n content: \"\"; }\n\n.fa-flag-checkered:before {\n content: \"\"; }\n\n.fa-terminal:before {\n content: \"\"; }\n\n.fa-code:before {\n content: \"\"; }\n\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n content: \"\"; }\n\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n content: \"\"; }\n\n.fa-location-arrow:before {\n content: \"\"; }\n\n.fa-crop:before {\n content: \"\"; }\n\n.fa-code-fork:before {\n content: \"\"; }\n\n.fa-unlink:before,\n.fa-chain-broken:before {\n content: \"\"; }\n\n.fa-question:before {\n content: \"\"; }\n\n.fa-info:before {\n content: \"\"; }\n\n.fa-exclamation:before {\n content: \"\"; }\n\n.fa-superscript:before {\n content: \"\"; }\n\n.fa-subscript:before {\n content: \"\"; }\n\n.fa-eraser:before {\n content: \"\"; }\n\n.fa-puzzle-piece:before {\n content: \"\"; }\n\n.fa-microphone:before {\n content: \"\"; }\n\n.fa-microphone-slash:before {\n content: \"\"; }\n\n.fa-shield:before {\n content: \"\"; }\n\n.fa-calendar-o:before {\n content: \"\"; }\n\n.fa-fire-extinguisher:before {\n content: \"\"; }\n\n.fa-rocket:before {\n content: \"\"; }\n\n.fa-maxcdn:before {\n content: \"\"; }\n\n.fa-chevron-circle-left:before {\n content: \"\"; }\n\n.fa-chevron-circle-right:before {\n content: \"\"; }\n\n.fa-chevron-circle-up:before {\n content: \"\"; }\n\n.fa-chevron-circle-down:before {\n content: \"\"; }\n\n.fa-html5:before {\n content: \"\"; }\n\n.fa-css3:before {\n content: \"\"; }\n\n.fa-anchor:before {\n content: \"\"; }\n\n.fa-unlock-alt:before {\n content: \"\"; }\n\n.fa-bullseye:before {\n content: \"\"; }\n\n.fa-ellipsis-h:before {\n content: \"\"; }\n\n.fa-ellipsis-v:before {\n content: \"\"; }\n\n.fa-rss-square:before {\n content: \"\"; }\n\n.fa-play-circle:before {\n content: \"\"; }\n\n.fa-ticket:before {\n content: \"\"; }\n\n.fa-minus-square:before {\n content: \"\"; }\n\n.fa-minus-square-o:before {\n content: \"\"; }\n\n.fa-level-up:before {\n content: \"\"; }\n\n.fa-level-down:before {\n content: \"\"; }\n\n.fa-check-square:before {\n content: \"\"; }\n\n.fa-pencil-square:before {\n content: \"\"; }\n\n.fa-external-link-square:before {\n content: \"\"; }\n\n.fa-share-square:before {\n content: \"\"; }\n\n.fa-compass:before {\n content: \"\"; }\n\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n content: \"\"; }\n\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n content: \"\"; }\n\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n content: \"\"; }\n\n.fa-euro:before,\n.fa-eur:before {\n content: \"\"; }\n\n.fa-gbp:before {\n content: \"\"; }\n\n.fa-dollar:before,\n.fa-usd:before {\n content: \"\"; }\n\n.fa-rupee:before,\n.fa-inr:before {\n content: \"\"; }\n\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n content: \"\"; }\n\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n content: \"\"; }\n\n.fa-won:before,\n.fa-krw:before {\n content: \"\"; }\n\n.fa-bitcoin:before,\n.fa-btc:before {\n content: \"\"; }\n\n.fa-file:before {\n content: \"\"; }\n\n.fa-file-text:before {\n content: \"\"; }\n\n.fa-sort-alpha-asc:before {\n content: \"\"; }\n\n.fa-sort-alpha-desc:before {\n content: \"\"; }\n\n.fa-sort-amount-asc:before {\n content: \"\"; }\n\n.fa-sort-amount-desc:before {\n content: \"\"; }\n\n.fa-sort-numeric-asc:before {\n content: \"\"; }\n\n.fa-sort-numeric-desc:before {\n content: \"\"; }\n\n.fa-thumbs-up:before {\n content: \"\"; }\n\n.fa-thumbs-down:before {\n content: \"\"; }\n\n.fa-youtube-square:before {\n content: \"\"; }\n\n.fa-youtube:before {\n content: \"\"; }\n\n.fa-xing:before {\n content: \"\"; }\n\n.fa-xing-square:before {\n content: \"\"; }\n\n.fa-youtube-play:before {\n content: \"\"; }\n\n.fa-dropbox:before {\n content: \"\"; }\n\n.fa-stack-overflow:before {\n content: \"\"; }\n\n.fa-instagram:before {\n content: \"\"; }\n\n.fa-flickr:before {\n content: \"\"; }\n\n.fa-adn:before {\n content: \"\"; }\n\n.fa-bitbucket:before {\n content: \"\"; }\n\n.fa-bitbucket-square:before {\n content: \"\"; }\n\n.fa-tumblr:before {\n content: \"\"; }\n\n.fa-tumblr-square:before {\n content: \"\"; }\n\n.fa-long-arrow-down:before {\n content: \"\"; }\n\n.fa-long-arrow-up:before {\n content: \"\"; }\n\n.fa-long-arrow-left:before {\n content: \"\"; }\n\n.fa-long-arrow-right:before {\n content: \"\"; }\n\n.fa-apple:before {\n content: \"\"; }\n\n.fa-windows:before {\n content: \"\"; }\n\n.fa-android:before {\n content: \"\"; }\n\n.fa-linux:before {\n content: \"\"; }\n\n.fa-dribbble:before {\n content: \"\"; }\n\n.fa-skype:before {\n content: \"\"; }\n\n.fa-foursquare:before {\n content: \"\"; }\n\n.fa-trello:before {\n content: \"\"; }\n\n.fa-female:before {\n content: \"\"; }\n\n.fa-male:before {\n content: \"\"; }\n\n.fa-gittip:before,\n.fa-gratipay:before {\n content: \"\"; }\n\n.fa-sun-o:before {\n content: \"\"; }\n\n.fa-moon-o:before {\n content: \"\"; }\n\n.fa-archive:before {\n content: \"\"; }\n\n.fa-bug:before {\n content: \"\"; }\n\n.fa-vk:before {\n content: \"\"; }\n\n.fa-weibo:before {\n content: \"\"; }\n\n.fa-renren:before {\n content: \"\"; }\n\n.fa-pagelines:before {\n content: \"\"; }\n\n.fa-stack-exchange:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-right:before {\n content: \"\"; }\n\n.fa-arrow-circle-o-left:before {\n content: \"\"; }\n\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n content: \"\"; }\n\n.fa-dot-circle-o:before {\n content: \"\"; }\n\n.fa-wheelchair:before {\n content: \"\"; }\n\n.fa-vimeo-square:before {\n content: \"\"; }\n\n.fa-turkish-lira:before,\n.fa-try:before {\n content: \"\"; }\n\n.fa-plus-square-o:before {\n content: \"\"; }\n\n.fa-space-shuttle:before {\n content: \"\"; }\n\n.fa-slack:before {\n content: \"\"; }\n\n.fa-envelope-square:before {\n content: \"\"; }\n\n.fa-wordpress:before {\n content: \"\"; }\n\n.fa-openid:before {\n content: \"\"; }\n\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n content: \"\"; }\n\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n content: \"\"; }\n\n.fa-yahoo:before {\n content: \"\"; }\n\n.fa-google:before {\n content: \"\"; }\n\n.fa-reddit:before {\n content: \"\"; }\n\n.fa-reddit-square:before {\n content: \"\"; }\n\n.fa-stumbleupon-circle:before {\n content: \"\"; }\n\n.fa-stumbleupon:before {\n content: \"\"; }\n\n.fa-delicious:before {\n content: \"\"; }\n\n.fa-digg:before {\n content: \"\"; }\n\n.fa-pied-piper:before {\n content: \"\"; }\n\n.fa-pied-piper-alt:before {\n content: \"\"; }\n\n.fa-drupal:before {\n content: \"\"; }\n\n.fa-joomla:before {\n content: \"\"; }\n\n.fa-language:before {\n content: \"\"; }\n\n.fa-fax:before {\n content: \"\"; }\n\n.fa-building:before {\n content: \"\"; }\n\n.fa-child:before {\n content: \"\"; }\n\n.fa-paw:before {\n content: \"\"; }\n\n.fa-spoon:before {\n content: \"\"; }\n\n.fa-cube:before {\n content: \"\"; }\n\n.fa-cubes:before {\n content: \"\"; }\n\n.fa-behance:before {\n content: \"\"; }\n\n.fa-behance-square:before {\n content: \"\"; }\n\n.fa-steam:before {\n content: \"\"; }\n\n.fa-steam-square:before {\n content: \"\"; }\n\n.fa-recycle:before {\n content: \"\"; }\n\n.fa-automobile:before,\n.fa-car:before {\n content: \"\"; }\n\n.fa-cab:before,\n.fa-taxi:before {\n content: \"\"; }\n\n.fa-tree:before {\n content: \"\"; }\n\n.fa-spotify:before {\n content: \"\"; }\n\n.fa-deviantart:before {\n content: \"\"; }\n\n.fa-soundcloud:before {\n content: \"\"; }\n\n.fa-database:before {\n content: \"\"; }\n\n.fa-file-pdf-o:before {\n content: \"\"; }\n\n.fa-file-word-o:before {\n content: \"\"; }\n\n.fa-file-excel-o:before {\n content: \"\"; }\n\n.fa-file-powerpoint-o:before {\n content: \"\"; }\n\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n content: \"\"; }\n\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n content: \"\"; }\n\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n content: \"\"; }\n\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n content: \"\"; }\n\n.fa-file-code-o:before {\n content: \"\"; }\n\n.fa-vine:before {\n content: \"\"; }\n\n.fa-codepen:before {\n content: \"\"; }\n\n.fa-jsfiddle:before {\n content: \"\"; }\n\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n content: \"\"; }\n\n.fa-circle-o-notch:before {\n content: \"\"; }\n\n.fa-ra:before,\n.fa-rebel:before {\n content: \"\"; }\n\n.fa-ge:before,\n.fa-empire:before {\n content: \"\"; }\n\n.fa-git-square:before {\n content: \"\"; }\n\n.fa-git:before {\n content: \"\"; }\n\n.fa-y-combinator-square:before,\n.fa-yc-square:before,\n.fa-hacker-news:before {\n content: \"\"; }\n\n.fa-tencent-weibo:before {\n content: \"\"; }\n\n.fa-qq:before {\n content: \"\"; }\n\n.fa-wechat:before,\n.fa-weixin:before {\n content: \"\"; }\n\n.fa-send:before,\n.fa-paper-plane:before {\n content: \"\"; }\n\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n content: \"\"; }\n\n.fa-history:before {\n content: \"\"; }\n\n.fa-circle-thin:before {\n content: \"\"; }\n\n.fa-header:before {\n content: \"\"; }\n\n.fa-paragraph:before {\n content: \"\"; }\n\n.fa-sliders:before {\n content: \"\"; }\n\n.fa-share-alt:before {\n content: \"\"; }\n\n.fa-share-alt-square:before {\n content: \"\"; }\n\n.fa-bomb:before {\n content: \"\"; }\n\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n content: \"\"; }\n\n.fa-tty:before {\n content: \"\"; }\n\n.fa-binoculars:before {\n content: \"\"; }\n\n.fa-plug:before {\n content: \"\"; }\n\n.fa-slideshare:before {\n content: \"\"; }\n\n.fa-twitch:before {\n content: \"\"; }\n\n.fa-yelp:before {\n content: \"\"; }\n\n.fa-newspaper-o:before {\n content: \"\"; }\n\n.fa-wifi:before {\n content: \"\"; }\n\n.fa-calculator:before {\n content: \"\"; }\n\n.fa-paypal:before {\n content: \"\"; }\n\n.fa-google-wallet:before {\n content: \"\"; }\n\n.fa-cc-visa:before {\n content: \"\"; }\n\n.fa-cc-mastercard:before {\n content: \"\"; }\n\n.fa-cc-discover:before {\n content: \"\"; }\n\n.fa-cc-amex:before {\n content: \"\"; }\n\n.fa-cc-paypal:before {\n content: \"\"; }\n\n.fa-cc-stripe:before {\n content: \"\"; }\n\n.fa-bell-slash:before {\n content: \"\"; }\n\n.fa-bell-slash-o:before {\n content: \"\"; }\n\n.fa-trash:before {\n content: \"\"; }\n\n.fa-copyright:before {\n content: \"\"; }\n\n.fa-at:before {\n content: \"\"; }\n\n.fa-eyedropper:before {\n content: \"\"; }\n\n.fa-paint-brush:before {\n content: \"\"; }\n\n.fa-birthday-cake:before {\n content: \"\"; }\n\n.fa-area-chart:before {\n content: \"\"; }\n\n.fa-pie-chart:before {\n content: \"\"; }\n\n.fa-line-chart:before {\n content: \"\"; }\n\n.fa-lastfm:before {\n content: \"\"; }\n\n.fa-lastfm-square:before {\n content: \"\"; }\n\n.fa-toggle-off:before {\n content: \"\"; }\n\n.fa-toggle-on:before {\n content: \"\"; }\n\n.fa-bicycle:before {\n content: \"\"; }\n\n.fa-bus:before {\n content: \"\"; }\n\n.fa-ioxhost:before {\n content: \"\"; }\n\n.fa-angellist:before {\n content: \"\"; }\n\n.fa-cc:before {\n content: \"\"; }\n\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n content: \"\"; }\n\n.fa-meanpath:before {\n content: \"\"; }\n\n.fa-buysellads:before {\n content: \"\"; }\n\n.fa-connectdevelop:before {\n content: \"\"; }\n\n.fa-dashcube:before {\n content: \"\"; }\n\n.fa-forumbee:before {\n content: \"\"; }\n\n.fa-leanpub:before {\n content: \"\"; }\n\n.fa-sellsy:before {\n content: \"\"; }\n\n.fa-shirtsinbulk:before {\n content: \"\"; }\n\n.fa-simplybuilt:before {\n content: \"\"; }\n\n.fa-skyatlas:before {\n content: \"\"; }\n\n.fa-cart-plus:before {\n content: \"\"; }\n\n.fa-cart-arrow-down:before {\n content: \"\"; }\n\n.fa-diamond:before {\n content: \"\"; }\n\n.fa-ship:before {\n content: \"\"; }\n\n.fa-user-secret:before {\n content: \"\"; }\n\n.fa-motorcycle:before {\n content: \"\"; }\n\n.fa-street-view:before {\n content: \"\"; }\n\n.fa-heartbeat:before {\n content: \"\"; }\n\n.fa-venus:before {\n content: \"\"; }\n\n.fa-mars:before {\n content: \"\"; }\n\n.fa-mercury:before {\n content: \"\"; }\n\n.fa-intersex:before,\n.fa-transgender:before {\n content: \"\"; }\n\n.fa-transgender-alt:before {\n content: \"\"; }\n\n.fa-venus-double:before {\n content: \"\"; }\n\n.fa-mars-double:before {\n content: \"\"; }\n\n.fa-venus-mars:before {\n content: \"\"; }\n\n.fa-mars-stroke:before {\n content: \"\"; }\n\n.fa-mars-stroke-v:before {\n content: \"\"; }\n\n.fa-mars-stroke-h:before {\n content: \"\"; }\n\n.fa-neuter:before {\n content: \"\"; }\n\n.fa-genderless:before {\n content: \"\"; }\n\n.fa-facebook-official:before {\n content: \"\"; }\n\n.fa-pinterest-p:before {\n content: \"\"; }\n\n.fa-whatsapp:before {\n content: \"\"; }\n\n.fa-server:before {\n content: \"\"; }\n\n.fa-user-plus:before {\n content: \"\"; }\n\n.fa-user-times:before {\n content: \"\"; }\n\n.fa-hotel:before,\n.fa-bed:before {\n content: \"\"; }\n\n.fa-viacoin:before {\n content: \"\"; }\n\n.fa-train:before {\n content: \"\"; }\n\n.fa-subway:before {\n content: \"\"; }\n\n.fa-medium:before {\n content: \"\"; }\n\n.fa-yc:before,\n.fa-y-combinator:before {\n content: \"\"; }\n\n.fa-optin-monster:before {\n content: \"\"; }\n\n.fa-opencart:before {\n content: \"\"; }\n\n.fa-expeditedssl:before {\n content: \"\"; }\n\n.fa-battery-4:before,\n.fa-battery-full:before {\n content: \"\"; }\n\n.fa-battery-3:before,\n.fa-battery-three-quarters:before {\n content: \"\"; }\n\n.fa-battery-2:before,\n.fa-battery-half:before {\n content: \"\"; }\n\n.fa-battery-1:before,\n.fa-battery-quarter:before {\n content: \"\"; }\n\n.fa-battery-0:before,\n.fa-battery-empty:before {\n content: \"\"; }\n\n.fa-mouse-pointer:before {\n content: \"\"; }\n\n.fa-i-cursor:before {\n content: \"\"; }\n\n.fa-object-group:before {\n content: \"\"; }\n\n.fa-object-ungroup:before {\n content: \"\"; }\n\n.fa-sticky-note:before {\n content: \"\"; }\n\n.fa-sticky-note-o:before {\n content: \"\"; }\n\n.fa-cc-jcb:before {\n content: \"\"; }\n\n.fa-cc-diners-club:before {\n content: \"\"; }\n\n.fa-clone:before {\n content: \"\"; }\n\n.fa-balance-scale:before {\n content: \"\"; }\n\n.fa-hourglass-o:before {\n content: \"\"; }\n\n.fa-hourglass-1:before,\n.fa-hourglass-start:before {\n content: \"\"; }\n\n.fa-hourglass-2:before,\n.fa-hourglass-half:before {\n content: \"\"; }\n\n.fa-hourglass-3:before,\n.fa-hourglass-end:before {\n content: \"\"; }\n\n.fa-hourglass:before {\n content: \"\"; }\n\n.fa-hand-grab-o:before,\n.fa-hand-rock-o:before {\n content: \"\"; }\n\n.fa-hand-stop-o:before,\n.fa-hand-paper-o:before {\n content: \"\"; }\n\n.fa-hand-scissors-o:before {\n content: \"\"; }\n\n.fa-hand-lizard-o:before {\n content: \"\"; }\n\n.fa-hand-spock-o:before {\n content: \"\"; }\n\n.fa-hand-pointer-o:before {\n content: \"\"; }\n\n.fa-hand-peace-o:before {\n content: \"\"; }\n\n.fa-trademark:before {\n content: \"\"; }\n\n.fa-registered:before {\n content: \"\"; }\n\n.fa-creative-commons:before {\n content: \"\"; }\n\n.fa-gg:before {\n content: \"\"; }\n\n.fa-gg-circle:before {\n content: \"\"; }\n\n.fa-tripadvisor:before {\n content: \"\"; }\n\n.fa-odnoklassniki:before {\n content: \"\"; }\n\n.fa-odnoklassniki-square:before {\n content: \"\"; }\n\n.fa-get-pocket:before {\n content: \"\"; }\n\n.fa-wikipedia-w:before {\n content: \"\"; }\n\n.fa-safari:before {\n content: \"\"; }\n\n.fa-chrome:before {\n content: \"\"; }\n\n.fa-firefox:before {\n content: \"\"; }\n\n.fa-opera:before {\n content: \"\"; }\n\n.fa-internet-explorer:before {\n content: \"\"; }\n\n.fa-tv:before,\n.fa-television:before {\n content: \"\"; }\n\n.fa-contao:before {\n content: \"\"; }\n\n.fa-500px:before {\n content: \"\"; }\n\n.fa-amazon:before {\n content: \"\"; }\n\n.fa-calendar-plus-o:before {\n content: \"\"; }\n\n.fa-calendar-minus-o:before {\n content: \"\"; }\n\n.fa-calendar-times-o:before {\n content: \"\"; }\n\n.fa-calendar-check-o:before {\n content: \"\"; }\n\n.fa-industry:before {\n content: \"\"; }\n\n.fa-map-pin:before {\n content: \"\"; }\n\n.fa-map-signs:before {\n content: \"\"; }\n\n.fa-map-o:before {\n content: \"\"; }\n\n.fa-map:before {\n content: \"\"; }\n\n.fa-commenting:before {\n content: \"\"; }\n\n.fa-commenting-o:before {\n content: \"\"; }\n\n.fa-houzz:before {\n content: \"\"; }\n\n.fa-vimeo:before {\n content: \"\"; }\n\n.fa-black-tie:before {\n content: \"\"; }\n\n.fa-fonticons:before {\n content: \"\"; }\n\n.views-display-setting .views-admin-label {\n display: inline-block;\n float: left;\n /* LTR */\n margin-right: 3pt;\n /* LTR */ }\n\n.comment {\n margin-top: 15px; }\n .comment .user-picture {\n float: left;\n margin-right: 10px; }\n .comment .user-picture a {\n display: block; }\n .comment .submitted {\n font-size: 0.90em; }\n .comment .submitted .permalink {\n margin-left: 5px; }\n .comment .submitted .new {\n color: #d9534f; }\n .comment .content {\n margin: 10px 0; }\n .comment .links {\n font-size: 0.80em; }\n\n.form-item {\n margin-top: 0; }\n\nform .form-managed-file input {\n display: inline-block;\n margin: 0 10px 0 0; }\n\nform .container-inline-date .date-padding {\n padding: 0;\n float: none; }\n\nform .form-actions .btn, form .form-actions .media-widget > a {\n margin-right: 10px; }\n\nform .field-type-datetime select {\n min-width: 80px; }\n\nform .format-toggle {\n float: none; }\n\nform .field-multiple-table thead th {\n padding: 10px !important; }\n form .field-multiple-table thead th label {\n margin: 0;\n font-weight: bold; }\n\nform .description {\n margin: 2px 0;\n color: #555555; }\n\n.media-widget > a {\n margin: 0 10px 0 0; }\n\nfieldset {\n padding: 0; }\n fieldset legend {\n float: left;\n line-height: 1em;\n margin: 0; }\n fieldset .panel-body {\n clear: both; }\n\nhtml.js input.form-autocomplete {\n background: image-url(\"throbber.gif\") no-repeat right 8px #fff !important; }\n\nhtml.js input.throbbing {\n background-position: right -122px !important; }\n\nhtml.js fieldset.collapsed {\n height: auto;\n border-left-width: 1px;\n border-right-width: 1px; }\n\n.views-exposed-form .views-exposed-widget .form-submit {\n margin-top: 1.8em; }\n\n@media (max-width: 767px) {\n form .btn, form .media-widget > a {\n width: 100%;\n display: block;\n clear: both;\n margin: 0 0 5px; }\n form input.form-text,\n form textarea,\n form select {\n width: 100%; }\n form .confirm-parent,\n form .password-parent,\n form .password-suggestions {\n width: auto !important; }\n form .password-parent div.password-strength {\n width: 150px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px; }\n form .confirm-parent div.password-confirm {\n width: 110px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px; } }\n\n#node-edit #edit-title {\n font-size: 1.6em;\n line-height: 1.6em;\n height: 45px;\n width: 90%; }\n\n#node-edit .form-item-path-alias {\n overflow: hidden;\n *zoom: 1; }\n #node-edit .form-item-path-alias label, #node-edit .form-item-path-alias input {\n display: inline; }\n\n#node-edit .burr-flipped-sidebar .panel-pane {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n padding: 10px; }\n #node-edit .burr-flipped-sidebar .panel-pane blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n #node-edit .burr-flipped-sidebar .panel-pane .pane-title {\n margin-top: 0; }\n\n#node-edit .burr-flipped-sidebar .pane-node-form-buttons {\n background: none;\n padding: inherit; }\n #node-edit .burr-flipped-sidebar .pane-node-form-buttons .form-actions {\n margin: 0;\n border-top: 0; }\n\n#node-edit .pane-node-form-buttons {\n clear: both; }\n\n.filter-wrapper {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n -webkit-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n box-shadow: compact(inset 0 1px 1px rgba(0, 0, 0, 0.05), false, false, false, false, false, false, false, false, false);\n margin-top: 10px; }\n .filter-wrapper blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15); }\n .filter-wrapper .form-item {\n margin: 0 0 10px;\n padding: 0; }\n .filter-wrapper .filter-guidelines {\n padding: 0; }\n .filter-wrapper .filter-guidelines .tips {\n margin-left: 0; }\n\n.page-admin form table select,\n.page-admin form table input.form-text {\n width: 150px; }\n\n#features-export-form .features-export-parent {\n margin: 0 0 20px; }\n #features-export-form .features-export-parent fieldset.collapsed {\n min-height: 43px !important;\n background: none; }\n #features-export-form .features-export-parent .features-export-list {\n padding: 10px; }\n #features-export-form .features-export-parent .features-export-list .form-item {\n float: none !important; }\n\n#panels-panel-context-edit-move .container,\n#panels-panel-context-edit-content .container {\n width: auto;\n padding: 0; }\n #panels-panel-context-edit-move .container .row,\n #panels-panel-context-edit-content .container .row {\n margin-bottom: 20px; }\n\n.navbar-form .form-wrapper {\n padding: 0; }\n\n.navbar-form .form-item-keys,\n.navbar-form .form-item {\n margin-top: 0 !important; }\n\n.navbar-form .form-submit {\n display: none; }\n\n.pane-search-box form .form-wrapper .form-group {\n display: block;\n margin-bottom: 10px; }\n\n.tabledrag-handle .handle {\n box-sizing: content-box; }\n\n.container .container,\n.container .container-fluid {\n width: auto;\n margin-left: -15px;\n margin-right: -15px; }\n\n#footer {\n margin: 36px 0; }\n\nbody.maintenance-page .container {\n max-width: 970px !important; }\n\nbody.maintenance-page .jumbotron {\n background-color: #000000;\n color: white;\n padding: 20px 0; }\n body.maintenance-page .jumbotron h1 {\n font-size: 3.0em;\n margin-top: 0; }\n @media (min-width: 992px) {\n body.maintenance-page .jumbotron {\n padding-top: 30px;\n padding-bottom: 30px; } }\n\nbody.maintenance-page .main {\n padding-top: 20px;\n padding-bottom: 50px; }\n\nbody.maintenance-page .page-header h1 {\n font-size: 24px; }\n @media (min-width: 992px) {\n body.maintenance-page .page-header h1 {\n font-size: 36px; } }\n\nbody.maintenance-page .tasks-list > div {\n margin-bottom: 25px; }\n body.maintenance-page .tasks-list > div h6 {\n margin-bottom: 2px;\n font-size: 14px;\n font-weight: normal; }\n body.maintenance-page .tasks-list > div h4 {\n margin-top: 0;\n font-size: 14px; }\n body.maintenance-page .tasks-list > div.active, body.maintenance-page .tasks-list > div.done {\n color: black; }\n\nbody.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child {\n background-color: white;\n border-color: black;\n color: black; }\n body.maintenance-page .form-actions .btn:first-child:hover, body.maintenance-page .form-actions .media-widget > a:first-child:hover, body.maintenance-page .form-actions .btn:first-child:focus, body.maintenance-page .form-actions .media-widget > a:first-child:focus {\n background-color: black;\n border-color: white; }\n\nbody.maintenance-page .progress .progress-bar {\n background-color: black; }\n\nbody.maintenance-page #panopoly-theme-selection-form .form-type-radio {\n margin: 0 0 2em; }\n body.maintenance-page #panopoly-theme-selection-form .form-type-radio label {\n display: block; }\n body.maintenance-page #panopoly-theme-selection-form .form-type-radio .form-radio {\n margin: 0;\n left: 0;\n top: 40%; }\n\nbody.ctools-modal-open {\n overflow: hidden; }\n\n#modalContent .modal-content {\n width: 100%;\n overflow: hidden;\n box-shadow: none !important; }\n\n#modalContent #modal-content {\n overflow: auto;\n width: 100% !important;\n background: white; }\n\n#modalContent .panels-add-content-modal {\n background: none;\n padding: 0;\n height: 100%;\n margin: -20px -20px 0;\n width: 100%;\n position: absolute; }\n\n#modalContent .panels-section-columns,\n#modalContent .panels-categories-description {\n border: none; }\n\n#modalContent .panels-section-column-categories {\n margin-left: 0;\n border-right: 1px solid #ccc;\n height: 100%;\n background: white;\n overflow: auto;\n padding-bottom: 20px; }\n #modalContent .panels-section-column-categories .btn, #modalContent .panels-section-column-categories .media-widget > a {\n border: 1px solid #777777 !important;\n line-height: inherit;\n margin: 0;\n text-align: left; }\n\n#modalContent .panels-categories-box {\n border: 0; }\n #modalContent .panels-categories-box a.btn, #modalContent .panels-categories-box .media-widget > a {\n padding: 5px 10px; }\n #modalContent .panels-categories-box a.active {\n background: #eeeeee;\n box-shadow: none; }\n\n#modalContent .panels-root-content-box a.btn, #modalContent .panels-root-content-box .media-widget > a {\n padding: 5px 10px; }\n\n#modalContent .panels-categories-description {\n padding: 20px; }\n\n#modalContent .panels-section-columns {\n padding-bottom: 20px; }\n\n#modalContent fieldset.widget-preview {\n margin-top: 18px;\n margin-bottom: 0;\n position: static;\n border: 1px solid #ddd; }\n #modalContent fieldset.widget-preview .panel-heading {\n position: relative; }\n #modalContent fieldset.widget-preview .panel-heading .btn, #modalContent fieldset.widget-preview .panel-heading .media-widget > a {\n position: absolute;\n right: 10px;\n top: 5px; }\n\n#modalContent .ctools-auto-submit-full-form fieldset {\n width: 48%;\n display: block; }\n #modalContent .ctools-auto-submit-full-form fieldset fieldset {\n width: 100%; }\n #modalContent .ctools-auto-submit-full-form fieldset.widget-preview-single {\n float: right;\n margin-left: 1em;\n margin-top: 0;\n width: 48%;\n max-width: 48% !important; }\n\n#modalContent .ctools-auto-submit-full-form .form-actions {\n float: right;\n clear: right;\n width: 48%;\n max-width: 48%;\n text-align: right; }\n\n#modalContent .form-item-view-settings {\n display: block; }\n\n#modalContent .form-item-exposed-use-pager {\n display: block; }\n\n#modalContent #panopoly-form-widget-preview {\n width: 50%;\n float: right; }\n #modalContent #panopoly-form-widget-preview .container {\n width: auto; }\n\nul.menu > li > ul.menu {\n margin-left: 1em;\n /* LTR */ }\n\nul.nav > li.dropdown:after {\n width: 100%;\n height: 2px;\n background: none;\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n content: ''; }\n\n.nav-expanded .caret {\n display: none; }\n\n.nav-expanded > li > a {\n font-size: 1.2em;\n text-align: left;\n font-weight: 700;\n color: #333333; }\n .nav-expanded > li > a:hover, .nav-expanded > li > a:focus, .nav-expanded > li > a.active, .nav-expanded > li > a.active-trail {\n color: #23527c;\n background: none; }\n\n.nav-expanded > li ul.dropdown-menu {\n background: none;\n display: block;\n border: 0;\n padding: 0;\n position: static;\n float: none;\n border-radius: 0;\n box-shadow: none; }\n .nav-expanded > li ul.dropdown-menu li a {\n padding: 3px 15px;\n color: #333333; }\n .nav-expanded > li ul.dropdown-menu li a:hover, .nav-expanded > li ul.dropdown-menu li a:focus, .nav-expanded > li ul.dropdown-menu li a.active, .nav-expanded > li ul.dropdown-menu li a.active-trail {\n color: #23527c;\n background: none; }\n .nav-expanded > li ul.dropdown-menu ul {\n display: none !important; }\n\n@media (min-width: 992px) {\n .nav-expanded > li {\n float: none;\n margin-bottom: 18px; } }\n\n.nav-expanded > li.open > a {\n color: #333333;\n background: none; }\n .nav-expanded > li.open > a:hover, .nav-expanded > li.open > a:focus, .nav-expanded > li.open > a.active, .nav-expanded > li.open > a.active-trail {\n color: #23527c;\n background: none; }\n\n.field-collection-container {\n border: 0; }\n .field-collection-container .field-collection-view {\n margin: 0;\n padding: 0;\n border: none; }\n\n.node-panopoly-page.node-teaser .panel-pane {\n margin: 0 0 10px 260px; }\n\n.node-panopoly-page.node-teaser .pane-node-field-featured-image {\n float: left;\n margin-left: 0; }\n\n@media (max-width: 767px) {\n .node-panopoly-page .panel-pane {\n float: none !important;\n margin: 0 0 10px !important; } }\n\n.node-panopoly-news-article.node-teaser .panel-pane {\n margin: 0 0 10px 260px; }\n\n.node-panopoly-news-article.node-teaser .pane-node-field-featured-image {\n float: left;\n margin-left: 0; }\n\n@media (max-width: 767px) {\n .node-panopoly-news-article .panel-pane {\n float: none !important;\n margin: 0 0 10px !important; } }\n\n.panel-display > .row {\n margin-bottom: 20px; }\n\n.panel-flexible .panel-separator {\n display: none; }\n\n.panels-layouts-checkboxes input[type=\"radio\"] {\n position: static;\n margin-left: 0px;\n margin-bottom: 20px; }\n\n.panels-layouts-checkboxes label {\n margin-left: 0px; }\n\n.panels-layouts-checkboxes .form-type-radio {\n margin: 0 !important; }\n\nbody.panels-ipe {\n margin-bottom: 55px !important; }\n\ndiv#panels-ipe-control-container {\n width: auto;\n left: 0;\n right: 0;\n box-shadow: none; }\n div#panels-ipe-control-container .panels-ipe-button-container {\n text-align: center; }\n div#panels-ipe-control-container .panels-ipe-button-container .panels-ipe-pseudobutton-container {\n margin: 0 5px; }\n div#panels-ipe-control-container .panels-ipe-button-container .panels-ipe-pseudobutton-container a {\n padding: 0px 10px 0px 34px; }\n div#panels-ipe-control-container .panels-ipe-button-container .panels-ipe-pseudobutton-container a:hover {\n text-decoration: none; }\n div#panels-ipe-control-container .panels-ipe-form-container form > div {\n text-align: center; }\n div#panels-ipe-control-container .panels-ipe-form-container form .form-submit {\n margin: 0 5px;\n padding: 0px 10px 0px 34px; }\n div#panels-ipe-control-container .panels-ipe-form-container form .form-submit:hover {\n box-shadow: none; }\n\nul.panels-ipe-linkbar {\n list-style: none outside none; }\n ul.panels-ipe-linkbar > li {\n display: inline-block;\n margin: 0 0 0 5px; }\n ul.panels-ipe-linkbar > li a {\n margin: 0 !important; }\n\n#logo {\n display: block;\n float: left;\n margin-right: 15px;\n height: 100%;\n width: auto; }\n\n#site-name {\n float: left; }\n\n.page-header {\n margin: 0 0 18px; }\n .page-header h1 {\n margin: 0; }\n\n.page-title-hidden .page-header {\n display: none; }\n\n.breadcrumb a i {\n display: none; }\n\n.tabs,\n.nav-tabs {\n margin: 0 0 18px; }\n\n.action-links {\n list-style: none outside none;\n margin: 0 0 18px;\n padding: 0;\n overflow: hidden;\n *zoom: 1; }\n .action-links > li {\n float: left;\n margin: 0 10px 0 0; }\n\ndiv.vertical-tabs {\n border: none;\n border: 1px solid #DDD;\n outline: none;\n border-radius: 4px; }\n div.vertical-tabs ul.vertical-tabs-list {\n border: none;\n margin-top: 20px;\n margin-bottom: 20px;\n outline: none; }\n div.vertical-tabs ul.vertical-tabs-list li {\n border: none;\n background: none;\n outline: none !important;\n border-radius: 4px 0 0 4px;\n border: 1px solid;\n border-color: #fff #ddd #fff #fff; }\n div.vertical-tabs ul.vertical-tabs-list li.selected {\n border-color: #ddd #fff #ddd #ddd; }\n div.vertical-tabs ul.vertical-tabs-list li a {\n outline: none !important;\n border-radius: 4px 0 0 4px; }\n div.vertical-tabs ul.vertical-tabs-list li a:hover {\n color: #fff;\n background: #337ab7;\n text-decoration: none; }\n div.vertical-tabs ul.vertical-tabs-list li a:hover strong {\n text-decoration: none;\n color: #fff; }\n div.vertical-tabs .vertical-tabs-panes {\n padding: 20px 10px; }\n div.vertical-tabs .form-type-textfield input {\n width: 90%;\n box-sizing: content-box; }\n\ntable {\n width: 100%;\n margin-bottom: 1.42857; }\n table th,\n table td {\n padding: 8px;\n line-height: 1.42857;\n text-align: left;\n vertical-align: top;\n border-top: 1px solid #ddd; }\n table th.checkbox,\n table td.checkbox {\n text-align: center;\n display: table-cell;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0; }\n table th.checkbox input,\n table td.checkbox input {\n float: none !important;\n margin-left: 0 !important; }\n table th.checkbox div.checkbox,\n table td.checkbox div.checkbox {\n text-align: center;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0; }\n table th {\n font-weight: bold; }\n table thead th {\n vertical-align: bottom; }\n table caption + thead tr:first-child th,\n table caption + thead tr:first-child td,\n table colgroup + thead tr:first-child th,\n table colgroup + thead tr:first-child td,\n table thead:first-child tr:first-child th,\n table thead:first-child tr:first-child td {\n border-top: 0; }\n table tbody + tbody {\n border-top: 2px solid #ddd; }\n\nul.links {\n padding: 0;\n list-style: none outside none; }\n ul.links.inline {\n margin: 0; }\n ul.links.inline li {\n margin: 0 10px 0 0;\n padding: 0; }\n\n.carousel .carousel-control {\n z-index: 100; }\n\n.carousel .carousel-indicators li {\n float: none;\n margin-left: 3px;\n margin-right: 3px; }\n .carousel .carousel-indicators li a {\n display: none; }\n\n.carousel .carousel-caption h1, .carousel .carousel-caption h2, .carousel .carousel-caption h3, .carousel .carousel-caption h4, .carousel .carousel-caption h5, .carousel .carousel-caption h6 {\n color: white; }\n\n.item-list ul.pagination {\n margin: 20px 0; }\n .item-list ul.pagination > li {\n margin: 0;\n display: inline-block;\n padding: 0;\n position: relative; }\n .item-list ul.pagination > li > a, .item-list ul.pagination > li > span {\n padding: 6px 12px;\n border-radius: inherit; }\n .item-list ul.pagination > li > a.progress-disabled, .item-list ul.pagination > li > span.progress-disabled {\n float: left; }\n .item-list ul.pagination > li .ajax-progress {\n float: left;\n padding: 6px 5px 6px 10px; }\n\n.ctools-dropdown-container hr {\n margin: 0; }\n\nul.nav,\nul.navl li,\nul.dropdown-menu,\nul.dropdown-menu li {\n list-style: none outside none !important; }\n\n.calendar-calendar table.mini td {\n border: 1px solid #eeeeee !important;\n padding: 5px; }\n\n.view-header .date-nav-wrapper h3 {\n margin-top: 5px !important;\n margin-bottom: 0; }\n\n.ui-tabs .ui-tabs-nav {\n padding: 0 5px 5px 5px; }\n\n.views-exposed-form .views-submit-button,\n.views-exposed-form .views-reset-button {\n margin-top: 3px; }\n\ninput[type=\"submit\"],\n.btn-primary, body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child,\n.btn.btn-primary, .media-widget > a.btn-primary {\n color: white;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n white-space: nowrap;\n padding: 5px 12px;\n line-height: 1.4em;\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px; }\n\ninput[type=\"submit\"]:hover,\n.btn-primary:hover, body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a:hover:first-child,\ninput[type=\"submit\"]:focus,\n.btn-primary:focus,\nbody.maintenance-page .form-actions .btn:focus:first-child,\nbody.maintenance-page .form-actions .media-widget > a:focus:first-child,\ninput[type=\"submit\"]:active,\n.btn-primary:active,\nbody.maintenance-page .form-actions .btn:active:first-child,\nbody.maintenance-page .form-actions .media-widget > a:active:first-child {\n color: white;\n text-decoration: none; }\n\n.form-managed-file input.form-submit {\n -webkit-border-radius: 0 4px 4px 0;\n -moz-border-radius: 0 4px 4px 0;\n -ms-border-radius: 0 4px 4px 0;\n -o-border-radius: 0 4px 4px 0;\n border-radius: 0 4px 4px 0;\n padding-left: 10px;\n padding-right: 10px; }\n\n#dkan-sitewide-dataset-search-form label,\n#dkan-sitewide-dataset-search-form--2 label, #region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label, .screenreader {\n position: absolute;\n top: 0;\n left: -9999px; }\n\n#dkan-sitewide-dataset-search-form label,\n#dkan-sitewide-dataset-search-form--2 label, #region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label, .screenreader {\n position: absolute;\n top: 0;\n left: -9999px; }\n\n.clearfix {\n overflow: visible; }\n\n.admin-list dt, .admin-list dd {\n display: inline-block;\n float: none;\n vertical-align: top; }\n\n.views-edit-view .action-list input.btn,\n.views-edit-view .action-list input.btn:active,\n.views-edit-view .action-list input.btn:focus,\n.views-edit-view .action-list input.btn:hover,\n.views-edit-view .action-list input[type=\"submit\"]:hover {\n background: inherit;\n border: none;\n color: inherit; }\n\n.views-edit-view .footer {\n background: inherit; }\n\n.modal-content .panels-root-content-box a.btn, .modal-content .panels-root-content-box .media-widget > a {\n white-space: normal; }\n\n.modal-content .panel-title {\n padding-right: 55px; }\n\n.views-displays .secondary .open > a:hover {\n color: #666; }\n\n.media-thumbnails-select {\n padding: 0 0 40px; }\n\n.page-admin .alert {\n margin: 10px 0; }\n\n.page-admin .container.main {\n width: 100%; }\n\n.page-admin .table-bordered > thead > tr > th, .page-admin .calendar-calendar table.mini > thead > tr > th, .calendar-calendar .page-admin table.mini > thead > tr > th,\n.page-admin .table-bordered > tbody > tr > th,\n.page-admin .calendar-calendar table.mini > tbody > tr > th, .calendar-calendar\n.page-admin table.mini > tbody > tr > th,\n.page-admin .table-bordered > tbody > tr > td,\n.page-admin .calendar-calendar table.mini > tbody > tr > td, .calendar-calendar\n.page-admin table.mini > tbody > tr > td {\n border: none; }\n\n.page-admin table thead > tr > th.checkbox,\n.page-admin table.table thead > tr > th.checkbox,\n.page-admin .table-bordered > tbody > tr > th.checkbox,\n.page-admin .calendar-calendar table.mini > tbody > tr > th.checkbox, .calendar-calendar\n.page-admin table.mini > tbody > tr > th.checkbox,\n.page-admin .table-bordered > tbody > tr > td.checkbox,\n.page-admin .calendar-calendar table.mini > tbody > tr > td.checkbox, .calendar-calendar\n.page-admin table.mini > tbody > tr > td.checkbox,\n.page-admin .table-striped > tbody > tr:nth-child(odd) > td.checkbox,\n.page-admin .table-striped > tbody > tr:nth-child(odd) > th.checkbox {\n background-color: transparent;\n border: none;\n margin: 0;\n display: table-cell;\n position: relative; }\n\n.page-admin .table tbody tr:hover td.checkbox,\n.page-admin .table tbody tr:hover th.checkbox {\n background-color: #FFFEEE; }\n\n.page-admin table th.checkbox label,\n.page-admin table td.checkbox label {\n line-height: 0;\n padding: 4px;\n vertical-align: top; }\n\n.page-admin table th.checkbox input[type=\"checkbox\"],\n.page-admin table th.checkbox input,\n.page-admin table td.checkbox input[type=\"checkbox\"],\n.page-admin table td.checkbox input {\n float: none !important;\n margin: 0 !important;\n position: relative; }\n\n.pane-dkan-sitewide-dkan-sitewide-other-access a.btn, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a,\n#block-dkan-sitewide-dkan-sitewide-other-access a.btn,\n#block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a {\n background-image: auto;\n border: 1px solid #ccc;\n padding: 6px 10px 6px 36px;\n position: relative; }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn i, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn i,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i {\n background-position: 0 0;\n position: absolute;\n top: 8px;\n left: 5px;\n visibility: visible; }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-rdfxml, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-rdfxml,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-rdfxml,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-rdfxml {\n background-image: url(../images/rdf.png); }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-json, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-json,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn i.ckan-icon-json,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a i.ckan-icon-json {\n background-image: url(../images/json.png); }\n .pane-dkan-sitewide-dkan-sitewide-other-access a.btn:hover, .pane-dkan-sitewide-dkan-sitewide-other-access .media-widget > a:hover,\n #block-dkan-sitewide-dkan-sitewide-other-access a.btn:hover,\n #block-dkan-sitewide-dkan-sitewide-other-access .media-widget > a:hover {\n background-color: #eeeeee; }\n\n.pane-dkan-sitewide-dkan-sitewide-other-access .btn-group,\n#block-dkan-sitewide-dkan-sitewide-other-access .btn-group {\n margin: .6em 0; }\n .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:first-child, .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:first-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:first-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:first-child {\n background-image: url(../images/json.png);\n background-repeat: no-repeat;\n background-position: 10px 10px; }\n .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:last-child, .pane-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:last-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .btn:last-child,\n #block-dkan-sitewide-dkan-sitewide-other-access .btn-group .media-widget > a:last-child {\n background-image: url(../images/rdf.png);\n background-repeat: no-repeat;\n background-position: 10px 10px; }\n\n#block-dkan-forms-dkan-forms-dataset-help h2.block-title::before {\n content: \"\\f05a\";\n font-family: \"FontAwesome\";\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em; }\n\n.radix-layouts-sidebar .ctools-collapsible-container.pane-block,\n.radix-layouts-sidebar .ctools-collapsible-container .pane-content,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"].pane-block,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] .pane-content,\n.radix-layouts-sidebar .block-facetapi.pane-block,\n.radix-layouts-sidebar .block-facetapi .pane-content {\n border: none;\n margin: 0;\n padding: 0;\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n\n.radix-layouts-sidebar .ctools-collapsible-container .item-list,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] .item-list,\n.radix-layouts-sidebar .block-facetapi .item-list {\n border: 1px solid #ddd; }\n .radix-layouts-sidebar .ctools-collapsible-container .item-list .facetapi-limit-link,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] .item-list .facetapi-limit-link,\n .radix-layouts-sidebar .block-facetapi .item-list .facetapi-limit-link {\n padding: 10px 22px; }\n .radix-layouts-sidebar .ctools-collapsible-container .item-list .facetapi-limit-link:before,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] .item-list .facetapi-limit-link:before,\n .radix-layouts-sidebar .block-facetapi .item-list .facetapi-limit-link:before {\n top: 10px;\n right: 22px; }\n\n.radix-layouts-sidebar .ctools-collapsible-container h2.pane-title,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] h2.pane-title,\n.radix-layouts-sidebar .block-facetapi h2.pane-title {\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0;\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: normal;\n position: relative;\n padding: 9px 21px 9px 12px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1); }\n .radix-layouts-sidebar .ctools-collapsible-container h2.pane-title:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] h2.pane-title:after,\n .radix-layouts-sidebar .block-facetapi h2.pane-title:after {\n font-family: \"fontawesome\";\n content: \"\\f077\";\n color: rgba(255, 255, 255, 0.7);\n font-size: 12px;\n font-weight: bold;\n position: absolute;\n right: 14px;\n top: 10px; }\n\n.radix-layouts-sidebar .ctools-collapsible-container.ctools-collapsed h2.pane-title:after,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"].ctools-collapsed h2.pane-title:after,\n.radix-layouts-sidebar .block-facetapi.ctools-collapsed h2.pane-title:after {\n content: \"\\f078\"; }\n\n.radix-layouts-sidebar .ctools-collapsible-container .ctools-toggle,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] .ctools-toggle,\n.radix-layouts-sidebar .block-facetapi .ctools-toggle {\n background: none; }\n\n.radix-layouts-sidebar .ctools-collapsible-container ul,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul,\n.radix-layouts-sidebar .block-facetapi ul {\n margin: 0;\n padding: 0; }\n\n.radix-layouts-sidebar .ctools-collapsible-container ul li.leaf,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf,\n.radix-layouts-sidebar .block-facetapi ul li.leaf {\n list-style-type: none;\n list-style-image: none;\n margin: 0;\n padding: 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf li,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf li,\n .radix-layouts-sidebar .block-facetapi ul li.leaf li {\n position: relative; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf li a,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf li a,\n .radix-layouts-sidebar .block-facetapi ul li.leaf li a {\n padding-right: 48px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf.last,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf.last,\n .radix-layouts-sidebar .block-facetapi ul li.leaf.last {\n border-bottom: none; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf li:before,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf li:before,\n .radix-layouts-sidebar .block-facetapi ul li.leaf li:before {\n content: \"\\f178\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 4px;\n right: 30px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a {\n color: #333333;\n display: block;\n padding: 6px 20px 6px 10px;\n position: relative;\n line-height: 22px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a:focus, .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a:hover,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a:focus,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a:hover,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a:focus,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a:hover {\n color: #1a1a1a;\n background: rgba(0, 0, 0, 0.03);\n text-decoration: none; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a:hover:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a:hover:after,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a:hover:after {\n content: \"\\f055\";\n color: #5cb85c;\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a img,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a img,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a img {\n height: 25px;\n width: 25px;\n margin: 0 16px 0 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active {\n background: #ccc;\n color: #333;\n z-index: 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active:before,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active:before,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active:before {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 17px 0 17px 15px;\n border-color: transparent #ccc;\n display: block;\n width: 0;\n z-index: 1;\n right: -15px;\n top: 0; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active:after,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active:after {\n content: \"\\f00d\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px; }\n .radix-layouts-sidebar .ctools-collapsible-container ul li.leaf a.facetapi-active:hover:after,\n .radix-layouts-sidebar div[class*=\"pane-facetapi\"] ul li.leaf a.facetapi-active:hover:after,\n .radix-layouts-sidebar .block-facetapi ul li.leaf a.facetapi-active:hover:after {\n color: red; }\n\n.radix-layouts-sidebar .ctools-collapsible-container a.facetapi-limit-link,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] a.facetapi-limit-link,\n.radix-layouts-sidebar .block-facetapi a.facetapi-limit-link {\n display: block;\n padding: 5px 30px 5px 5px;\n position: relative; }\n\n.radix-layouts-sidebar .ctools-collapsible-container a.facetapi-limit-link:before,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] a.facetapi-limit-link:before,\n.radix-layouts-sidebar .block-facetapi a.facetapi-limit-link:before {\n content: \"\\f150\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 15px; }\n\n.radix-layouts-sidebar .ctools-collapsible-container a.facetapi-limit-link.open:before,\n.radix-layouts-sidebar div[class*=\"pane-facetapi\"] a.facetapi-limit-link.open:before,\n.radix-layouts-sidebar .block-facetapi a.facetapi-limit-link.open:before {\n content: \"\\f151\"; }\n\n.radix-layouts-sidebar .ctools-collapsible-container .ctools-toggle {\n width: 12px; }\n\n.facetapi-facet-changed li.expanded a.facetapi-active {\n background: #ccc;\n border-bottom: 1px dotted #eee;\n color: #333;\n line-height: 22px;\n padding: 6px 20px 6px 10px; }\n .facetapi-facet-changed li.expanded a.facetapi-active:hover {\n background: #ccc;\n color: #333;\n text-decoration: none; }\n .facetapi-facet-changed li.expanded a.facetapi-active:hover:after {\n color: red; }\n .facetapi-facet-changed li.expanded a.facetapi-active:before {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 17px 0 17px 15px;\n border-color: transparent #ccc;\n display: block;\n width: 0;\n z-index: 1;\n right: -15px;\n top: 0; }\n .facetapi-facet-changed li.expanded a.facetapi-active:after {\n content: \"\\f00d\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px; }\n\n.facetapi-facet-changed li.expanded ul.expanded li.leaf a,\n.facetapi-facet-changed li.expanded li.expanded a {\n padding: 6px 20px 6px 20px; }\n\n.facetapi-facet-changed li.expanded .item-list {\n border: none; }\n\n.facetapi-facet-field-license a {\n white-space: pre;\n /* CSS 2.0 */\n white-space: pre-wrap;\n /* CSS 2.1 */\n white-space: pre-line;\n /* CSS 3.0 */\n white-space: -pre-wrap;\n /* Opera 4-6 */\n white-space: -o-pre-wrap;\n /* Opera 7 */\n white-space: -moz-pre-wrap;\n /* Mozilla */\n white-space: -hp-pre-wrap;\n /* HP Printers */\n word-wrap: break-word;\n /* IE 5+ */\n word-break: break-word; }\n\n.pane-views-group-block-block,\n#block-views-group-block-block {\n overflow: hidden; }\n .pane-views-group-block-block .views-field-title a,\n #block-views-group-block-block .views-field-title a {\n display: block;\n padding: .5em 0; }\n .pane-views-group-block-block .views-field-body p,\n #block-views-group-block-block .views-field-body p {\n margin: .5em 0 1em; }\n .pane-views-group-block-block .group-subscribe-message,\n #block-views-group-block-block .group-subscribe-message {\n -moz-border-radius-bottomleft: 4px;\n -webkit-border-bottom-left-radius: 4px;\n border-bottom-left-radius: 4px;\n -moz-border-radius-bottomright: 4px;\n -webkit-border-bottom-right-radius: 4px;\n border-bottom-right-radius: 4px;\n background: #0A77BD;\n color: #fff;\n padding: 5px;\n text-align: center;\n margin-left: -15px;\n margin-right: -15px; }\n .pane-views-group-block-block .group-subscribe-message a,\n #block-views-group-block-block .group-subscribe-message a {\n color: #fff;\n display: block; }\n\n.radix-layouts-sidebar .pane-block.pane-views-group-block-block .pane-content {\n padding: 0 15px; }\n\n#block-dkan-dataset-dkan-dataset-dataset-help .content {\n padding: 10px; }\n\n#block-dkan-forms-dkan-forms-dataset-help h2:before {\n content: \"\\f05a\";\n font-family: \"FontAwesome\";\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em; }\n\n.pane-dkan-sitewide-demo-front-dkan-demo-front,\n#block-dkan-sitewide-demo-front-dkan-demo-front {\n -webkit-box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.5);\n -moz-box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.5);\n box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.5); }\n .pane-dkan-sitewide-demo-front-dkan-demo-front p,\n #block-dkan-sitewide-demo-front-dkan-demo-front p {\n color: #fff;\n padding: 15px; }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .media-overlay,\n #block-dkan-sitewide-demo-front-dkan-demo-front .media-overlay {\n position: relative;\n padding: 0; }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .media-overlay img,\n #block-dkan-sitewide-demo-front-dkan-demo-front .media-overlay img {\n width: 100%;\n height: auto; }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .media-overlay .media-heading,\n #block-dkan-sitewide-demo-front-dkan-demo-front .media-overlay .media-heading {\n background-color: rgba(0, 0, 0, 0.8);\n bottom: 0;\n color: #FFFFFF;\n font-size: 13px;\n left: 0;\n line-height: 18px;\n margin: 0;\n padding: 12px 10px;\n position: absolute;\n right: 0;\n z-index: 1; }\n\n.radix-layouts-sidebar .pane-dkan-sitewide-dkan-sitewide-social.pane-block .pane-content {\n padding: 0; }\n .radix-layouts-sidebar .pane-dkan-sitewide-dkan-sitewide-social.pane-block .pane-content li.last a:hover {\n -webkit-border-radius: 0 0 3px 3px;\n -moz-border-radius: 0 0 3px 3px;\n -ms-border-radius: 0 0 3px 3px;\n -o-border-radius: 0 0 3px 3px;\n border-radius: 0 0 3px 3px; }\n\n.pane-dkan-sitewide-dkan-sitewide-resource-add table {\n margin-top: 0; }\n\n.radix-layouts-sidebar .panel-panel-inner .panels-ipe-portlet-wrapper:first-child h2.pane-title,\n.radix-layouts-sidebar .panel-panel-inner > div[class*=\"pane-facetapi\"]:first-child h2.pane-title {\n -webkit-border-radius: 5px 5px 0 0;\n -moz-border-radius: 5px 5px 0 0;\n -ms-border-radius: 5px 5px 0 0;\n -o-border-radius: 5px 5px 0 0;\n border-radius: 5px 5px 0 0; }\n\n.radix-layouts-sidebar .panel-panel-inner .panels-ipe-portlet-wrapper:last-child .ctools-collapsed h2.pane-title, .radix-layouts-sidebar .panel-panel-inner .panels-ipe-portlet-wrapper:last-child.ctools-collapsed h2.pane-title,\n.radix-layouts-sidebar .panel-panel-inner > div[class*=\"pane-facetapi\"]:last-child .ctools-collapsed h2.pane-title,\n.radix-layouts-sidebar .panel-panel-inner > div[class*=\"pane-facetapi\"]:last-child.ctools-collapsed h2.pane-title {\n -webkit-border-radius: 0 0 5px 5px;\n -moz-border-radius: 0 0 5px 5px;\n -ms-border-radius: 0 0 5px 5px;\n -o-border-radius: 0 0 5px 5px;\n border-radius: 0 0 5px 5px; }\n\n@media all and (max-width: 768px) {\n .node-dataset .resource-list li {\n padding-right: 0; }\n .node-dataset .resource-list li span.links {\n position: relative;\n top: auto;\n right: auto;\n margin: 10px 0;\n display: block;\n padding: 0; }\n .node-dataset .resource-list li a.btn, .node-dataset .resource-list li .media-widget > a {\n margin: 0 5px 10px 0; } }\n\n.resource-list a.label {\n display: inline-block;\n overflow-wrap: break-word; }\n\n.stages {\n margin: 0 0 20px; }\n .stages li {\n font-size: 14px; }\n .stages li.first,\n .stages li.first .highlight {\n -webkit-border-radius: 5px 0 0 5px;\n -moz-border-radius: 5px 0 0 5px;\n -ms-border-radius: 5px 0 0 5px;\n -o-border-radius: 5px 0 0 5px;\n border-radius: 5px 0 0 5px; }\n .stages li.last,\n .stages li.last .highlight {\n -webkit-border-radius: 0 5px 5px 0;\n -moz-border-radius: 0 5px 5px 0;\n -ms-border-radius: 0 5px 5px 0;\n -o-border-radius: 0 5px 5px 0;\n border-radius: 0 5px 5px 0; }\n\n.node-type-resource .item-list .list-group li {\n margin: 0; }\n\n.node-type-dataset .field-name-field-tags .field-label,\n.node-type-dataset .field-name-field-topic .field-label,\n.node-type-dataset .field-name-field-preview-thumbail .field-label {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em; }\n\n.field-name-field-topic .field-item {\n display: inline-block; }\n\n#edit-path-alias {\n height: 34px; }\n\n.node-dataset .resource-list li {\n padding: 0 260px 0 45px; }\n\np.dkan-profile-page-user-name {\n display: inline-block; }\n\ninput.use-ajax-submit {\n margin-right: 10px; }\n\nbutton.btn,\n.btn.btn-default,\n.media-widget > a.btn-default,\n.btn.btn-primary,\n.media-widget > a.btn-primary,\nbody.maintenance-page .form-actions .btn:first-child,\nbody.maintenance-page .form-actions .media-widget > a:first-child,\n.tabs--primary.nav-pills li a,\n.form-control {\n line-height: 1.5em; }\n\n.btn, .media-widget > a, .btn-sm, .btn-group-sm > .btn, .media-widget.btn-group-sm > a {\n font-size: 14px; }\n\nselect.form-control {\n min-height: 36px; }\n select.form-control[multiple=\"multiple\"] {\n height: auto; }\n\n.form-control,\ndiv.autocomplete-deluxe-multiple {\n padding: 0 12px; }\n\n.ctools-dropbutton .ctools-content a,\n.ctools-dropbutton input.btn,\n.ctools-dropbutton input[type=\"submit\"] {\n color: #666; }\n .ctools-dropbutton .ctools-content a:hover, .ctools-dropbutton .ctools-content a:focus, .ctools-dropbutton .ctools-content a:active,\n .ctools-dropbutton input.btn:hover,\n .ctools-dropbutton input.btn:focus,\n .ctools-dropbutton input.btn:active,\n .ctools-dropbutton input[type=\"submit\"]:hover,\n .ctools-dropbutton input[type=\"submit\"]:focus,\n .ctools-dropbutton input[type=\"submit\"]:active {\n border: none;\n color: #0A77BD; }\n\n.field-type-file input[type=\"submit\"],\n.input-group-addon,\n.input-group-btn {\n width: auto; }\n\n.colorizer-form .form-control {\n width: 50%; }\n\n.colorizer-form label {\n float: none;\n display: block; }\n\n.colorizer-form #palette {\n clear: both; }\n .colorizer-form #palette .item-selected {\n background-color: transparent; }\n\n.bue-popup {\n z-index: 999; }\n\n.bue-ui.editor-container {\n background-color: #ffffff;\n padding: 0 4px;\n border: 1px solid #ddd;\n -webkit-border-radius: 4px 4px 0 0;\n -moz-border-radius: 4px 4px 0 0;\n -ms-border-radius: 4px 4px 0 0;\n -o-border-radius: 4px 4px 0 0;\n border-radius: 4px 4px 0 0; }\n\n.form-control.form-textarea {\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n\n.form-control.chosen-processed {\n line-height: 34px;\n height: auto;\n padding: 0;\n border: none;\n max-width: 100% !important; }\n .form-control.chosen-processed .chosen-choices {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n border-color: #ccc; }\n\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n background-position: -42px 2px; }\n\n.chzn-container-single {\n max-width: 100%; }\n\ndiv.autocomplete-deluxe-multiple,\n.chzn-container-multi {\n width: 100% !important; }\n\n.chzn-container-multi .chzn-choices .search-field input {\n height: auto; }\n\n#context-blockform td.blocks .label {\n background-color: #555555; }\n\n.tabledrag-hide .chzn-container-single {\n width: 20px !important; }\n\ndiv.autocomplete-deluxe-container input.autocomplete-deluxe-form-single {\n float: left; }\n\nfieldset fieldset {\n position: relative; }\n\nfieldset.collapsible {\n padding-top: 0; }\n\n#og-group-ref-add-more-wrapper fieldset,\nfieldset.group-primary {\n padding-top: 0; }\n #og-group-ref-add-more-wrapper fieldset legend,\n fieldset.group-primary legend {\n display: none; }\n\n.horizontal-tabs fieldset.horizontal-tabs-pane {\n padding: 0; }\n\ndiv.horizontal-tabs {\n border: none; }\n\n.form-managed-file span.file {\n border: 1px solid #ddd;\n padding: 0 15px;\n line-height: 34px;\n display: inline-block;\n vertical-align: top;\n border-radius: 5px 0 0 5px;\n margin-right: 0; }\n\n.form-managed-file input {\n -webkit-border-radius: 4px 0 0 4px;\n -moz-border-radius: 4px 0 0 4px;\n -ms-border-radius: 4px 0 0 4px;\n -o-border-radius: 4px 0 0 4px;\n border-radius: 4px 0 0 4px;\n border: 1px solid #ddd;\n padding: 5px;\n margin: 0 0 10px 0;\n height: 36px;\n vertical-align: top; }\n\n.form-managed-file input.form-submit {\n margin: 0 0 10px 0; }\n\n.form-managed-file .input-group-btn {\n display: inline-block;\n vertical-align: top; }\n\n.path-form.panel-default {\n border-color: transparent; }\n .path-form.panel-default .panel-body {\n padding: 0; }\n\n.list-group-item {\n background-color: transparent;\n border: none;\n color: #333333;\n padding: 0; }\n\n.filter-wrapper {\n padding: 10px; }\n\n#body-add-more-wrapper .panel-body {\n padding: 0; }\n\n.node-resource-form .field-name-field-upload .form-type-managed-file {\n display: table; }\n .node-resource-form .field-name-field-upload .form-type-managed-file .file-widget {\n display: table-footer-group; }\n .node-resource-form .field-name-field-upload .form-type-managed-file .file-resup-wrapper {\n display: table-header-group; }\n\n#search-api-admin-index-status-form input {\n margin-bottom: 1em; }\n\n.page-admin form input[type=submit] {\n margin-right: 1em; }\n\n.container,\n.container-fluid,\n.row {\n overflow: visible; }\n\naside.col-sm-3 {\n padding-left: 0; }\n\nsection.col-sm-9 {\n padding-right: 0; }\n\n#featured,\n.panel-top {\n background-position: 50% 50%;\n background-size: cover !important;\n overflow: hidden;\n position: relative;\n z-index: 0; }\n #featured .tint,\n .panel-top .tint {\n position: absolute;\n height: 900px;\n width: 100%;\n z-index: -1; }\n #featured .pane-dkan-sitewide-demo-front-dkan-demo-front .pane-title,\n #featured .pane-views-popular-tags-block .pane-title,\n #featured .pane-dkan-sitewide-demo-front-dkan-add-front .pane-title,\n .panel-top .pane-dkan-sitewide-demo-front-dkan-demo-front .pane-title,\n .panel-top .pane-views-popular-tags-block .pane-title,\n .panel-top .pane-dkan-sitewide-demo-front-dkan-add-front .pane-title {\n display: none; }\n #featured .container,\n .panel-top .container {\n padding: 30px 0;\n position: relative;\n z-index: 5; }\n #featured .pane-block,\n #featured .panel-pane,\n #featured .block-content,\n .panel-top .pane-block,\n .panel-top .panel-pane,\n .panel-top .block-content {\n color: #fff;\n line-height: 1.33em;\n margin: 0 15px; }\n #featured a,\n .panel-top a {\n color: #fff; }\n\n.page-admin .panel-top {\n background-image: none !important;\n background-color: none;\n overflow: visible; }\n .page-admin .panel-top .tint {\n display: none; }\n\n#top-content {\n margin: 20px; }\n #top-content .block {\n padding: 10px;\n text-align: center; }\n #top-content .block h2.block-title {\n border: none;\n color: #333333;\n font-size: 1.6em; }\n #top-content [class*=\"col-\"] {\n background-color: #ccc;\n border-left: 4px solid #fff;\n border-right: 4px solid #fff;\n margin-bottom: -99999px;\n padding-bottom: 99999px; }\n #top-content .row {\n overflow: hidden; }\n\n@media all and (max-width: 767px) {\n .branding.container {\n padding-left: 15px;\n padding-right: 15px; } }\n\n.navigation-wrapper .container {\n overflow: visible; }\n .navigation-wrapper .container .navbar-collapse {\n overflow: visible; }\n\n.container > .navbar-header, .container > .navbar-collapse {\n margin-left: 10px;\n margin-right: 10px; }\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n padding: 0;\n vertical-align: top; }\n\n.navbar-header {\n position: relative;\n z-index: 3; }\n\n.navbar-default {\n background: transparent;\n border: none;\n margin: 0;\n overflow: visible !important;\n position: relative;\n z-index: 3; }\n .navbar-default .navbar-nav,\n .navbar-default .user-menu {\n margin: 0;\n overflow: visible;\n position: relative;\n z-index: 3; }\n .navbar-default .navbar-nav a.dropdown-toggle,\n .navbar-default .user-menu a.dropdown-toggle {\n color: #FFFFFF; }\n .navbar-default .navbar-nav .open > a,\n .navbar-default .navbar-nav li > a,\n .navbar-default .user-menu .open > a,\n .navbar-default .user-menu li > a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding: 15px; }\n .navbar-default .navbar-nav .open > a.dropdown-toggle:hover, .navbar-default .navbar-nav .open > a:active, .navbar-default .navbar-nav .open > a:hover, .navbar-default .navbar-nav .open > a:focus,\n .navbar-default .navbar-nav li > a.dropdown-toggle:hover,\n .navbar-default .navbar-nav li > a:active,\n .navbar-default .navbar-nav li > a:hover,\n .navbar-default .navbar-nav li > a:focus,\n .navbar-default .user-menu .open > a.dropdown-toggle:hover,\n .navbar-default .user-menu .open > a:active,\n .navbar-default .user-menu .open > a:hover,\n .navbar-default .user-menu .open > a:focus,\n .navbar-default .user-menu li > a.dropdown-toggle:hover,\n .navbar-default .user-menu li > a:active,\n .navbar-default .user-menu li > a:hover,\n .navbar-default .user-menu li > a:focus {\n background: #002245;\n color: #FFFFFF;\n text-decoration: none; }\n .navbar-default .navbar-nav .open > a.dropdown-toggle:focus, .navbar-default .navbar-nav .open > a.dropdown-toggle:active,\n .navbar-default .navbar-nav li > a.dropdown-toggle:focus,\n .navbar-default .navbar-nav li > a.dropdown-toggle:active,\n .navbar-default .user-menu .open > a.dropdown-toggle:focus,\n .navbar-default .user-menu .open > a.dropdown-toggle:active,\n .navbar-default .user-menu li > a.dropdown-toggle:focus,\n .navbar-default .user-menu li > a.dropdown-toggle:active {\n background-color: transparent; }\n .navbar-default .navbar-nav .open > a.dropdown-toggle:hover,\n .navbar-default .navbar-nav li > a.dropdown-toggle:hover,\n .navbar-default .user-menu .open > a.dropdown-toggle:hover,\n .navbar-default .user-menu li > a.dropdown-toggle:hover {\n background: #002245; }\n .navbar-default .navbar-nav .dropdown-menu,\n .navbar-default .user-menu .dropdown-menu {\n background: #0A77BD;\n padding: 0; }\n .navbar-default .navbar-nav .dropdown-menu li,\n .navbar-default .user-menu .dropdown-menu li {\n display: block; }\n .navbar-default .navbar-nav .dropdown-menu li a,\n .navbar-default .user-menu .dropdown-menu li a {\n display: block;\n color: #ffffff; }\n .navbar-default .navbar-toggle {\n border-color: #ffffff; }\n .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {\n background-color: rgba(0, 0, 0, 0.25); }\n .navbar-default .navbar-toggle .icon-bar {\n background-color: #ffffff; }\n @media all and (min-width: 768px) {\n .navbar-default .user-menu {\n float: right; }\n .navbar-default .navbar-nav li,\n .navbar-default .user-menu li {\n display: inline-block; }\n .navbar-default .navbar-nav li a,\n .navbar-default .user-menu li a {\n display: inline-block; }\n .navbar-default .navbar-nav li .dropdown-menu li,\n .navbar-default .navbar-nav li .dropdown-menu li a,\n .navbar-default .user-menu li .dropdown-menu li,\n .navbar-default .user-menu li .dropdown-menu li a {\n display: block; } }\n .navbar-default .navbar-nav.secondary li {\n float: none; }\n .navbar-default .navbar-nav.secondary li a {\n font-size: .7em;\n line-height: 1.5em;\n padding: 4px; }\n\n@media all and (max-width: 767px) {\n .nav > li {\n clear: both; }\n .navbar-default .navbar-nav .open .dropdown-menu,\n .navbar-default .navbar-nav .dropdown-menu {\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n border: none;\n display: block;\n width: 100%;\n position: relative; }\n .navbar-default .navbar-nav .open .dropdown-menu li > a,\n .navbar-default .navbar-nav .dropdown-menu li > a {\n color: #ffffff;\n display: block;\n padding: 15px 10px 15px 35px; }\n .navbar-default .navbar-nav .open .dropdown-menu li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu li > a:focus, .navbar-default .navbar-nav .open .dropdown-menu li > a:active,\n .navbar-default .navbar-nav .dropdown-menu li > a:hover,\n .navbar-default .navbar-nav .dropdown-menu li > a:focus,\n .navbar-default .navbar-nav .dropdown-menu li > a:active {\n background: #002245;\n color: #ffffff;\n clear: both; } }\n\n#block-dkan-sitewide-dkan-sitewide-user-menu .links a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding: 15px; }\n #block-dkan-sitewide-dkan-sitewide-user-menu .links a:hover, #block-dkan-sitewide-dkan-sitewide-user-menu .links a:focus {\n background: #002245;\n color: #FFFFFF;\n text-decoration: none; }\n\n#block-dkan-sitewide-dkan-sitewide-user-menu img {\n margin: 10px; }\n\n@media all and (min-width: 768px) {\n #block-dkan-sitewide-dkan-sitewide-user-menu {\n float: right; }\n #block-dkan-sitewide-dkan-sitewide-user-menu .links a {\n display: inline-block; } }\n\n.navbar .nav > li > a {\n text-shadow: none; }\n\n@media (min-width: 768px) {\n .navbar {\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n .container > .navbar-header {\n margin-left: 0; }\n #nav-wrapper .navbar-default .logo {\n padding: 10px 10px 0 0; } }\n\n.tabs--primary {\n margin: 10px 0; }\n .tabs--primary li {\n margin: 1px; }\n .tabs--primary li a {\n background: #fff;\n border: 1px solid #fff;\n padding: 6px 15px; }\n .tabs--primary li a:hover {\n border: 1px solid #002245;\n background: #002245;\n color: #fff; }\n .tabs--primary li a.active {\n border: 1px solid #0A77BD;\n background: #0A77BD;\n color: #fff; }\n\n.nav-tabs li a {\n color: #0A77BD; }\n\n.front .tabs--primary {\n display: none; }\n\n.tabs--primary .nav-pills li a.active,\n.tabs--primary .nav-pills li.active a:hover,\n.tabs--primary .nav-pills li.active a:focus {\n border: 1px solid #0A77BD;\n background: #0A77BD;\n color: #ffffff; }\n\n.btn-primary, body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .media-widget > a:first-child {\n background: #0A77BD;\n border-color: #0A77BD; }\n\n.btn-primary:hover, body.maintenance-page .form-actions .btn:hover:first-child, body.maintenance-page .form-actions .media-widget > a:hover:first-child,\n.btn-primary:focus,\nbody.maintenance-page .form-actions .btn:focus:first-child,\nbody.maintenance-page .form-actions .media-widget > a:focus:first-child,\n.btn-primary:active,\nbody.maintenance-page .form-actions .btn:active:first-child,\nbody.maintenance-page .form-actions .media-widget > a:active:first-child,\n.btn-primary.active,\nbody.maintenance-page .form-actions .active.btn:first-child,\nbody.maintenance-page .form-actions .media-widget > a.active:first-child {\n background: #002245;\n border-color: #002245; }\n\n.form-actions #edit-submit {\n background: #5cb85c;\n border-color: #5cb85c; }\n\n.form-actions #edit-submit:hover,\n.form-actions #edit-submit:focus,\n.form-actions #edit-submit:active {\n background: #449d44;\n border-color: #449d44;\n color: #fff; }\n\na.embed-link {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n color: #fff;\n display: inline-block;\n padding: 5px 15px 5px 35px;\n position: relative;\n margin: 1em 0;\n text-decoration: none; }\n\na.embed-link:hover,\na.embed-link:focus,\na.embed-link:active {\n color: #fff;\n text-decoration: none; }\n\na.embed-link:before {\n content: '\\f121';\n color: #fff;\n font-family: \"FontAwesome\";\n font-size: 1.3em;\n position: absolute;\n top: 5px;\n left: 10px; }\n\ntextarea.embed-code {\n width: 100%;\n margin-bottom: 1em; }\n\nul.action-links {\n margin: 1em 15px; }\n ul.action-links li {\n float: none;\n display: inline-block; }\n\n.btn:active, .media-widget > a:active,\n.btn.active,\n.media-widget > a.active {\n -webkit-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n -moz-box-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n box-shadow: compact(none, false, false, false, false, false, false, false, false, false); }\n\n.radix-layouts-sidebar ul.menu > li > ul.menu {\n margin-left: 0; }\n .radix-layouts-sidebar ul.menu > li > ul.menu li a {\n padding: 10px 15px 10px 30px; }\n\n.node-type-dataset .field-name-field-tags {\n margin: 1em 0; }\n\n.node-type-dataset .field-name-field-topic {\n margin: -20px 0 15px 0; }\n\n.node-type-dataset h4 {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em; }\n\n.node-type-dataset .field-name-field-related-content .field-label,\n.node-type-dataset .field-name-field-topic .field-label,\n.node-type-dataset .field-name-field-tags .field-label,\n.node-type-dataset .field-name-field-topic .field-label,\n.node-type-dataset .field-name-field-preview-thumbail .field-label {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em; }\n\n/** UI Tabs **/\n.node-resource-form .horizontal-tabs {\n border: none; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list {\n background-color: transparent;\n border: 0;\n padding-top: 10px; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected {\n border: 0;\n background-color: transparent;\n min-width: 4em; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li a:hover,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected a:hover {\n background: transparent; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li #active-horizontal-tab,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected #active-horizontal-tab {\n background: url(../images/sprite-ckan-icons.png) no-repeat -193px 2px;\n display: block;\n text-indent: -9999px;\n width: 16px;\n height: 16px;\n left: 50%;\n clip: auto; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.horizontal-tab-button-1 .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.horizontal-tab-button-2 .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected.horizontal-tab-button-1 .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected.horizontal-tab-button-2 .summary {\n background: url(../images/sprite-ckan-icons.png) no-repeat -160px 0; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li .summary,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected .summary {\n background: url(../images/sprite-ckan-icons.png) no-repeat -144px 0;\n width: 16px;\n height: 16px;\n position: absolute;\n top: 5px;\n left: 10px; }\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li a,\n .node-resource-form .horizontal-tabs ul.horizontal-tabs-list li.selected a {\n font-size: 1.1em;\n position: relative;\n padding: 5px 15px 5px 30px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n border: 1px solid #ddd;\n padding: 8px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_upload legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_api legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_file legend.panel-heading {\n display: none; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_upload .field-widget-recline-widget legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_api .field-widget-recline-widget legend.panel-heading,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes fieldset.htab_link_file .field-widget-recline-widget legend.panel-heading {\n border: none;\n border-bottom: 1px solid #ddd;\n display: block;\n background: transparent;\n color: #555555;\n padding: 5px 0; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .form-type-checkbox label,\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .form-type-select label {\n display: block;\n line-height: 36px;\n padding-top: 2px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .filefield-source-remotefile input {\n margin-right: 0; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .filefield-source-remotefile input.btn {\n -webkit-border-radius: 0 4px 4px 0;\n -moz-border-radius: 0 4px 4px 0;\n -ms-border-radius: 0 4px 4px 0;\n -o-border-radius: 0 4px 4px 0;\n border-radius: 0 4px 4px 0;\n margin-left: -1px; }\n .node-resource-form .horizontal-tabs .horizontal-tabs-panes .form-item-field-upload-und-0-embed {\n clear: both; }\n\n.page-node-add-resource .field-group-htabs.group-data div.horizontal-tabs {\n border: 0; }\n\n.page-node-add-resource .form-item {\n margin: 0; }\n\n#action-info {\n color: #d9534f;\n margin: 1em 0; }\n #action-info:before {\n color: #d9534f;\n content: \"\\f071\";\n font-family: \"FontAwesome\";\n font-size: 1.5em;\n font-style: normal;\n margin-right: 5px;\n vertical-align: middle; }\n\n.field-name-body a {\n overflow-wrap: break-word; }\n\n.field-name-body ul {\n list-style-type: disc;\n margin: 10px 20px; }\n .field-name-body ul li {\n margin: 6px 10px; }\n\n.field-group-table-description {\n color: #555555;\n display: block;\n padding: 8px 10px 8px 40px;\n position: relative; }\n .field-group-table-description .icon-info-sign:before {\n color: #777777;\n content: \"\\f05a\";\n font-family: \"FontAwesome\";\n font-size: 2.5em;\n font-style: normal;\n height: 30px;\n left: 0;\n margin: 10px 15px 0 0;\n padding: 6px 0;\n position: absolute;\n top: -6px;\n width: 30px; }\n\n.node-type-group .horizontal-tabs {\n margin: 0; }\n .node-type-group .horizontal-tabs #edit-field-image-und-0-remove-button {\n -webkit-border-radius: 4px;\n -moz-border-radius: 4px;\n -ms-border-radius: 4px;\n -o-border-radius: 4px;\n border-radius: 4px;\n margin-left: 5px; }\n\n.group-owner-message {\n margin-bottom: 20px; }\n\n.field-type-text-with-summary {\n padding: 0; }\n\n.field-name-field-additional-info {\n margin-top: 2em; }\n\n.field-name-field-related-content .field-item a {\n border: 1px solid #ddd;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px; }\n .field-name-field-related-content .field-item a:hover {\n color: #ffffff;\n text-decoration: none;\n background: #0A77BD; }\n\n.field-name-field-related-content .field-item:first-of-type a {\n -webkit-border-radius: 4px 4px 0px 0px;\n -moz-border-radius: 4px 4px 0px 0px;\n -ms-border-radius: 4px 4px 0px 0px;\n -o-border-radius: 4px 4px 0px 0px;\n border-radius: 4px 4px 0px 0px; }\n\n.field-name-field-related-content .field-item:last-of-type a {\n -webkit-border-radius: 0px 0px 4px 4px;\n -moz-border-radius: 0px 0px 4px 4px;\n -ms-border-radius: 0px 0px 4px 4px;\n -o-border-radius: 0px 0px 4px 4px;\n border-radius: 0px 0px 4px 4px; }\n\n.main {\n padding-top: 20px;\n padding-bottom: 20px; }\n\n.front .main {\n padding: 0; }\n\n.page-admin .main {\n padding: 20px 15px; }\n\n.page-admin .region-content {\n margin: 0; }\n\n.page-admin .breadcrumb,\n.page-admin .alert,\n.page-admin .tabs--primary,\n.page-admin .page-header {\n margin: 0 0 15px; }\n\n.panel-body {\n overflow: visible; }\n\n.pane-content .field-name-body {\n line-height: 2em; }\n\n.main .panel-pane {\n margin-bottom: 0em; }\n\nh2.pane-title {\n border-bottom: 1px solid #ddd;\n padding-bottom: 10px; }\n\n#panels-choose-layout .form-type-radio input,\n.panels-choose-layout .form-type-radio input {\n width: 15px; }\n\n.radix-layouts-sidebar .pane-title {\n -webkit-border-radius: 3px 3px 0 0;\n -moz-border-radius: 3px 3px 0 0;\n -ms-border-radius: 3px 3px 0 0;\n -o-border-radius: 3px 3px 0 0;\n border-radius: 3px 3px 0 0;\n border: 1px solid;\n border-bottom: none;\n font-size: 16px;\n line-height: 1.3;\n margin: 0;\n padding: 7px 10px;\n font-weight: normal; }\n\n.radix-layouts-sidebar .pane-block {\n -webkit-border-radius: 5px;\n -moz-border-radius: 5px;\n -ms-border-radius: 5px;\n -o-border-radius: 5px;\n border-radius: 5px;\n border: 1px solid #ddd;\n margin-bottom: 20px;\n padding: 0px; }\n .radix-layouts-sidebar .pane-block .pane-content {\n background-color: transparent;\n margin: 0;\n padding: 15px; }\n\n.page-user .radix-layouts-content .pane-content {\n padding: 0; }\n .page-user .radix-layouts-content .pane-content .profile {\n margin-top: 0; }\n\n.radix-layouts-content .pane-title {\n font-size: 36px;\n line-height: 42px;\n margin: 0 0 15px 0; }\n\n.radix-layouts-content .pane-content {\n padding: 20px 0;\n margin-bottom: 0em; }\n\n.radix-layouts-content .pane-node-field-topic .pane-content {\n padding: 0; }\n\n.radix-layouts-content .pane-page-breadcrumb .breadcrumb {\n display: block;\n margin: 0 0 15px 0; }\n\n@media (max-width: 991px) {\n .node-type-group .radix-layouts-content .pane-title {\n margin-top: 2em; } }\n\n.node-type-group .radix-layouts-content .pane-content {\n padding: 20px 0 0;\n margin-bottom: 0; }\n\n.page-manager-wrapper .panel-region .pane-title {\n background-image: none;\n border: none;\n font-size: 1em;\n line-height: normal; }\n\n.page-manager-wrapper .panel-region .panel-pane-collapsible .pane-content {\n padding: 10px 15px; }\n\n#panelizer-edit-content-form input {\n margin-right: 1em; }\n\n.panel-full-width .panel-top {\n margin-bottom: 15px; }\n\n@media (max-width: 768px) {\n .panel-full-width .panel-bottom .panel-col-first,\n .panel-full-width .panel-bottom .panel-col-second,\n .panel-full-width .panel-bottom .panel-col-third {\n float: none;\n width: 100%; } }\n\n.recline-pager .pagination li {\n vertical-align: middle; }\n .recline-pager .pagination li a {\n line-height: 1em;\n padding: 0 10px; }\n .recline-pager .pagination li a.btn, .recline-pager .pagination li .media-widget > a {\n line-height: 32px; }\n\n.recline-pager .pagination input {\n height: 20px;\n font-size: .8em; }\n\n.recline-data-explorer .form-control {\n border-color: #ccc; }\n\n.recline-data-explorer .btn, .recline-data-explorer .media-widget > a {\n border: 1px solid #ccc;\n font-size: 14px;\n padding: 0px 12px;\n line-height: 32px; }\n\n.dropdown-menu.slick-contextmenu {\n background: #fff; }\n .dropdown-menu.slick-contextmenu li {\n padding-left: 5px;\n padding-right: 5px; }\n\n@media all and (max-width: 767px) {\n aside[class|='col'],\n section[class|='col'] {\n padding: 0; }\n .container {\n width: 100%; }\n .panel-full-width .panel-top .panel-col-first,\n .panel-full-width .panel-top .panel-col-second,\n .panel-full-width .panel-bottom .panel-col-first,\n .panel-full-width .panel-bottom .panel-col-second,\n .panel-full-width .panel-bottom .panel-col-third {\n width: 100%;\n float: none; }\n .panel-full-width .panel-top .panel-col-first .inside,\n .panel-full-width .panel-top .panel-col-second .inside,\n .panel-full-width .panel-bottom .panel-col-first .inside,\n .panel-full-width .panel-bottom .panel-col-second .inside,\n .panel-full-width .panel-bottom .panel-col-third .inside {\n margin: 20px 15px; } }\n\n#views-exposed-form-dkan-datasets-panel-pane-1 .views-exposed-form .views-widget-filter-search_api_views_fulltext {\n max-width: 320px; }\n\n#dkan-sitewide-dataset-search-form,\n#dkan-sitewide-dataset-search-form--2 {\n position: relative; }\n #dkan-sitewide-dataset-search-form form,\n #dkan-sitewide-dataset-search-form--2 form {\n display: block;\n margin: 8px 0;\n position: relative;\n width: 100%; }\n #dkan-sitewide-dataset-search-form input.form-text,\n #dkan-sitewide-dataset-search-form--2 input.form-text {\n padding-right: 30px; }\n #dkan-sitewide-dataset-search-form button[type=\"submit\"],\n #dkan-sitewide-dataset-search-form input[type=\"submit\"],\n #dkan-sitewide-dataset-search-form--2 button[type=\"submit\"],\n #dkan-sitewide-dataset-search-form--2 input[type=\"submit\"] {\n background: none !important;\n border: none;\n content: \"\\f002\";\n color: #555555;\n display: inline-block;\n font-size: 1.3em;\n font-family: \"FontAwesome\";\n margin: 0;\n padding: 0;\n position: absolute;\n right: 10px;\n width: 25px;\n top: 2px; }\n\n#block-dkan-sitewide-dkan-sitewide-search-bar {\n clear: both; }\n @media all and (min-width: 768px) {\n #block-dkan-sitewide-dkan-sitewide-search-bar {\n position: absolute;\n top: 10px;\n right: 15px;\n width: 172px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar form {\n width: 172px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar input.form-control {\n width: 170px;\n height: 36px;\n margin: 0; } }\n #block-dkan-sitewide-dkan-sitewide-search-bar form {\n display: block;\n margin: 8px 0;\n position: relative;\n width: 100%; }\n #block-dkan-sitewide-dkan-sitewide-search-bar input.form-text {\n padding-right: 30px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar button[type=\"submit\"],\n #block-dkan-sitewide-dkan-sitewide-search-bar input[type=\"submit\"] {\n background: none !important;\n border: none;\n content: \"\\f002\";\n color: #555555;\n display: inline-block;\n font-size: 1.3em;\n font-family: \"FontAwesome\";\n margin: 0;\n padding: 0;\n position: absolute;\n right: 10px;\n width: 25px;\n top: 2px; }\n #block-dkan-sitewide-dkan-sitewide-search-bar .views-exposed-form .form-submit {\n margin: 22px 0 0;\n text-shadow: none; }\n\n.facetapi-terms span[class*=font-icon-select]:before,\n.icon-dkan.facet-icon:before {\n font-family: 'DKAN-Topics';\n font-size: 24px;\n padding-right: .3em;\n vertical-align: middle; }\n\n.node-search-result .icon-dkan.facet-icon:before {\n font-size: 42px;\n margin-top: 0.7em;\n display: block; }\n\n.node-search-result .resource-list li {\n display: inline-block; }\n\n.node-search-result .icon-container {\n text-align: center; }\n\n.search-result ul.resource-list {\n margin-top: 0.9em; }\n .search-result ul.resource-list li {\n display: inline-block; }\n .search-result ul.resource-list li a, .search-result ul.resource-list li:first-child {\n margin-left: 0px; }\n\n.search-result .dataset-list {\n list-style: none;\n margin: 0;\n padding: 0; }\n .search-result .dataset-list li {\n list-style: none;\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em; }\n .search-result .dataset-list li:before {\n content: \"\\e97e\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em; }\n\n.search-result .group-membership {\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em; }\n .search-result .group-membership:before {\n content: \"\\e981\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em; }\n\n.search-result.search-result-group .group-membership {\n display: none; }\n\n.search-result p {\n margin-bottom: 0px; }\n\n.node-search-result h2.node-title {\n margin: 1.5em 0 .5em 0; }\n\nbody {\n font-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 16px;\n line-height: 1.35em;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale; }\n\nbody.modal-open {\n overflow: visible !important; }\n\n.branding {\n position: relative; }\n .branding .logo {\n margin: 20px 20px 15px 0; }\n\n@media (max-width: 768px) {\n .logo img {\n max-width: 100%; } }\n\n.site-name {\n display: block;\n font-size: 2em;\n line-height: 1.15em;\n margin: 50px 20px 0; }\n @media (max-width: 460px) {\n .site-name {\n clear: left;\n float: none;\n margin: 10px 20px 5px 0; } }\n .site-name:hover {\n text-decoration: none; }\n\n.site-slogan {\n margin-bottom: 20px; }\n\nh1 {\n font-size: 30px;\n line-height: 36px;\n margin-bottom: 15px; }\n\nh1, h2, h3, h4 {\n color: #333333;\n font-weight: 300; }\n\nh3.media-heading {\n margin: .5em 0; }\n\nh4 {\n margin-top: 2em;\n margin-bottom: .5em; }\n\na {\n color: #0A77BD; }\n a:hover {\n color: #002245; }\n\np,\np:last-child {\n margin: 0 0 1.25em 0; }\n\n.breadcrumb {\n background: none;\n border: none;\n font-size: 1em;\n list-style: none;\n padding: 0;\n position: relative; }\n .breadcrumb li {\n float: none; }\n .breadcrumb li a span {\n display: none; }\n .breadcrumb li.home-link a {\n font-size: 1.3em; }\n .breadcrumb li.home-link a i {\n display: block; }\n\n.alert {\n border: none;\n padding: 15px 35px;\n position: relative; }\n .alert .close {\n line-height: 18px;\n position: absolute;\n right: 10px;\n top: 5px; }\n .alert.alert-warning {\n background: #FFE285; }\n .alert:before {\n font-family: \"FontAwesome\";\n font-size: 1.5em;\n position: absolute;\n top: 15px;\n left: 10px; }\n .alert.alert-danger:before {\n content: '\\f06a';\n color: #d9534f; }\n .alert.alert-warning:before {\n content: '\\f05a';\n color: #8a6d3b; }\n .alert.alert-success:before {\n content: '\\f058';\n color: #5cb85c; }\n\n.page-admin .alert {\n margin: 10px 0; }\n\ntable,\ntable.group_additional {\n border-collapse: collapse;\n margin: 1em 0;\n width: 100%; }\n table thead > tr > th,\n table.group_additional thead > tr > th {\n background-color: #e7e7e7;\n border: 1px solid #ddd !important;\n padding: 4px 8px;\n font-weight: bold; }\n table tbody th,\n table td,\n table.group_additional tbody th,\n table.group_additional td {\n border: 1px solid #ddd;\n padding: 4px 8px;\n vertical-align: top; }\n table tr:hover,\n table.group_additional tr:hover {\n background: #FFFEEE; }\n\n@media screen and (max-width: 1024px) {\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: normal; } }\n\n.field-name-field-additional-info .field-label {\n margin-bottom: 1em; }\n\n.group_additional,\n.field-name-field-additional-info table,\n.field-name-field-additional-info .table-responsive {\n margin: 0; }\n .group_additional td,\n .group_additional th,\n .field-name-field-additional-info table td,\n .field-name-field-additional-info table th,\n .field-name-field-additional-info .table-responsive td,\n .field-name-field-additional-info .table-responsive th {\n white-space: normal;\n width: auto; }\n .group_additional td:nth-of-type(2n),\n .field-name-field-additional-info table td:nth-of-type(2n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(2n) {\n white-space: pre;\n /* CSS 2.0 */\n white-space: pre-wrap;\n /* CSS 2.1 */\n white-space: pre-line;\n /* CSS 3.0 */\n white-space: -pre-wrap;\n /* Opera 4-6 */\n white-space: -o-pre-wrap;\n /* Opera 7 */\n white-space: -moz-pre-wrap;\n /* Mozilla */\n white-space: -hp-pre-wrap;\n /* HP Printers */\n word-wrap: break-word;\n /* IE 5+ */\n word-break: break-word; }\n @media all and (min-width: 768px) {\n .group_additional th:nth-of-type(1n),\n .group_additional td:nth-of-type(1n),\n .group_additional th:nth-of-type(4n),\n .group_additional td:nth-of-type(4n),\n .field-name-field-additional-info table th:nth-of-type(1n),\n .field-name-field-additional-info table td:nth-of-type(1n),\n .field-name-field-additional-info table th:nth-of-type(4n),\n .field-name-field-additional-info table td:nth-of-type(4n),\n .field-name-field-additional-info .table-responsive th:nth-of-type(1n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(1n),\n .field-name-field-additional-info .table-responsive th:nth-of-type(4n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(4n) {\n width: 5%;\n border-right: 1px solid #ddd; }\n .group_additional th:nth-of-type(2n),\n .group_additional td:nth-of-type(2n),\n .field-name-field-additional-info table th:nth-of-type(2n),\n .field-name-field-additional-info table td:nth-of-type(2n),\n .field-name-field-additional-info .table-responsive th:nth-of-type(2n),\n .field-name-field-additional-info .table-responsive td:nth-of-type(2n) {\n width: 90%; }\n .group_additional th:nth-of-type(2n) .form-control,\n .group_additional td:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table th:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table td:nth-of-type(2n) .form-control,\n .field-name-field-additional-info .table-responsive th:nth-of-type(2n) .form-control,\n .field-name-field-additional-info .table-responsive td:nth-of-type(2n) .form-control {\n min-width: 40%; } }\n\ntable.group_additional,\n.field-name-field-additional-info table {\n margin-top: 0; }\n table.group_additional th,\n table.group_additional td,\n table.group_additional th:nth-of-type(1n),\n table.group_additional td:nth-of-type(1n),\n table.group_additional th:nth-of-type(2n),\n table.group_additional td:nth-of-type(2n),\n .field-name-field-additional-info table th,\n .field-name-field-additional-info table td,\n .field-name-field-additional-info table th:nth-of-type(1n),\n .field-name-field-additional-info table td:nth-of-type(1n),\n .field-name-field-additional-info table th:nth-of-type(2n),\n .field-name-field-additional-info table td:nth-of-type(2n) {\n width: auto; }\n table.group_additional th .form-control,\n table.group_additional td .form-control,\n table.group_additional th:nth-of-type(1n) .form-control,\n table.group_additional td:nth-of-type(1n) .form-control,\n table.group_additional th:nth-of-type(2n) .form-control,\n table.group_additional td:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table th .form-control,\n .field-name-field-additional-info table td .form-control,\n .field-name-field-additional-info table th:nth-of-type(1n) .form-control,\n .field-name-field-additional-info table td:nth-of-type(1n) .form-control,\n .field-name-field-additional-info table th:nth-of-type(2n) .form-control,\n .field-name-field-additional-info table td:nth-of-type(2n) .form-control {\n display: inline-block;\n width: auto;\n vertical-align: top; }\n\n.table > thead:first-child > tr:first-child > th,\ntable thead:first-child tr:first-child th {\n border: 1px solid #ddd; }\n\n.table-bordered > thead > tr > th, .calendar-calendar table.mini > thead > tr > th,\ntable thead > tr > th {\n background-color: #e7e7e7;\n border: 1px solid #ddd;\n padding: 4px 8px; }\n\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9; }\n\n.table tbody tr:hover td,\n.table tbody tr:hover th,\n.table-striped > tbody > tr:nth-child(odd):hover {\n background-color: #FFFEEE; }\n\ndl {\n margin: 0;\n padding: 0;\n clear: both;\n overflow: hidden; }\n\ndt {\n clear: both;\n margin: 0;\n padding: 8px 5px;\n float: left;\n width: 28%; }\n\ndd {\n margin: 0;\n padding: 8px 5px;\n float: right;\n width: 72%; }\n\ndt,\ndd {\n border-top: 1px solid #ddd; }\n\n.item-list .pagination li:first-child > span,\n.item-list .pagination li:first-child > a {\n -webkit-border-radius: 4px 0 0 4px;\n -moz-border-radius: 4px 0 0 4px;\n -ms-border-radius: 4px 0 0 4px;\n -o-border-radius: 4px 0 0 4px;\n border-radius: 4px 0 0 4px; }\n\n.item-list .pagination li:last-child > span,\n.item-list .pagination li:last-child > a {\n -webkit-border-radius: 0 4px 4px 0;\n -moz-border-radius: 0 4px 4px 0;\n -ms-border-radius: 0 4px 4px 0;\n -o-border-radius: 0 4px 4px 0;\n border-radius: 0 4px 4px 0; }\n\n.radix-layouts-sidebar .item-list ul,\n.nav-simple {\n margin: 0;\n list-style: none;\n padding: 0; }\n .radix-layouts-sidebar .item-list ul li,\n .nav-simple li {\n margin: 0;\n line-height: 1.1666666666666667em;\n padding: 0;\n border-bottom: 1px dotted #CCC;\n position: relative; }\n .radix-layouts-sidebar .item-list ul li a,\n .nav-simple li a {\n display: block;\n margin: 0; }\n .radix-layouts-sidebar .item-list ul li a:hover,\n .nav-simple li a:hover {\n background: #FFFEEE; }\n .radix-layouts-sidebar .item-list ul li.last,\n .nav-simple li.last {\n border-bottom: none; }\n\nimg {\n max-width: 100%;\n height: auto; }\n\n.thumbnail {\n padding: 0;\n margin: 0;\n background-color: transparent;\n border: none;\n border-radius: 0; }\n\n.field-name-field-tags .field-item {\n display: inline-block; }\n\n.field-name-field-tags label {\n display: block; }\n\n.field-name-field-tags input.form-control {\n height: auto; }\n\n.field-name-field-tags .field-item a {\n display: inline-block;\n padding: 2px 10px 2px;\n font-size: 12px;\n line-height: 20px;\n -webkit-border-radius: 0 5px 5px 0;\n -moz-border-radius: 0 5px 5px 0;\n -ms-border-radius: 0 5px 5px 0;\n -o-border-radius: 0 5px 5px 0;\n border-radius: 0 5px 5px 0;\n background-color: #F3F3F3;\n margin: 3px 5px 3px 20px;\n position: relative;\n color: #333333;\n border: 1px solid #ddd;\n border-left: 0;\n z-index: 2; }\n .field-name-field-tags .field-item a:after {\n content: \"\";\n width: 20px;\n height: 20px;\n background-color: #F3F3F3;\n -webkit-transform: rotate(45deg);\n -moz-transform: rotate(45deg);\n -ms-transform: rotate(45deg);\n -o-transform: rotate(45deg);\n transform: rotate(45deg);\n -webkit-border-radius: 2px;\n -moz-border-radius: 2px;\n -ms-border-radius: 2px;\n -o-border-radius: 2px;\n border-radius: 2px;\n position: absolute;\n top: 2px;\n left: -9px;\n z-index: -1;\n border: 1px solid #ddd;\n border-top: none;\n border-right: none; }\n .field-name-field-tags .field-item a:before {\n content: \"\";\n width: 2px;\n height: 2px;\n background: #777777;\n position: absolute;\n top: 11px;\n left: -5px;\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n -ms-border-radius: 0;\n -o-border-radius: 0;\n border-radius: 0; }\n\n.field-name-field-tags .field-item a:hover,\n.field-name-field-tags .field-item a:hover:after {\n background: #fff;\n color: #000;\n text-decoration: none; }\n\n.field-name-field-topic .field-item {\n margin: 0 1.5em .5em 0; }\n .field-name-field-topic .field-item .field-item {\n margin: 0; }\n\n.field-name-field-topic-icon span::before,\n.view-dkan-datasets .field-name-field-topic-icon span::before {\n font-size: 18px; }\n\n.font_icon_select_options .label {\n color: #333; }\n\n.front .view-popular-tags {\n margin-top: 20px; }\n\n.view-popular-tags {\n margin: 15px 0; }\n .view-popular-tags ul.tag-list {\n margin: 0;\n padding: 0; }\n .view-popular-tags ul.tag-list li {\n display: inline-block;\n margin-right: 2em; }\n .view-popular-tags ul.tag-list li a {\n color: #fff; }\n\n.view-content h2 {\n font-size: 1.5em;\n margin: 1em 0 .5em; }\n\n.view-groups-search .views-row {\n border-bottom: 1px dotted #ccc;\n padding: 1em 0; }\n\n.view-front-page-group-list .views-row {\n position: relative;\n padding-left: 120px;\n min-height: 110px; }\n .view-front-page-group-list .views-row img {\n position: absolute;\n top: 0;\n left: 0; }\n\n.view-user-profile-fields img {\n height: auto;\n margin: 0 auto;\n max-width: 190px;\n width: 100%; }\n\n.view-front-page-group-grid .row span {\n display: block;\n margin: 15px 0; }\n .view-front-page-group-grid .row span .media-content {\n padding: 0 10px 10px 120px; }\n .view-front-page-group-grid .row span .media-image {\n float: left;\n margin: 0;\n padding: 0; }\n .view-front-page-group-grid .row span .media-image img {\n margin: 5px 10px 5px 0; }\n .view-front-page-group-grid .row span h3.media-heading {\n font-size: 1.3em;\n margin: .5em 0;\n padding: 0; }\n\n@media (min-width: 768px) {\n .view-front-page-group-grid .span6,\n .view-front-page-group-grid .col-lg-6 {\n float: left;\n margin: 0;\n width: 50%; } }\n\n.view-dkan-groups .node-teaser {\n min-height: 365px;\n margin-bottom: 20px; }\n .view-dkan-groups .node-teaser h2.node-title {\n margin: .75em 0; }\n .view-dkan-groups .node-teaser .btn-primary, .view-dkan-groups .node-teaser body.maintenance-page .form-actions .btn:first-child, body.maintenance-page .form-actions .view-dkan-groups .node-teaser .btn:first-child, .view-dkan-groups .node-teaser body.maintenance-page .form-actions .media-widget > a:first-child, body.maintenance-page .form-actions .view-dkan-groups .node-teaser .media-widget > a:first-child {\n margin: 0 auto 1.5em; }\n .view-dkan-groups .node-teaser .field-name-field-image {\n text-align: center; }\n\n.view-groups-page .views-column {\n float: left;\n margin: 0;\n width: 50%; }\n\n.view-group-block .views-field-title {\n font-size: 1.2em; }\n\n.view-group-block .views-field-field-image {\n text-align: center; }\n\n.view-group-block .views-field-nid a {\n background: #0A77BD;\n color: #fff;\n display: block;\n margin: 1em 0 0 0;\n padding: 5px 8px;\n text-align: center; }\n\n.view-dataset form {\n margin: 0;\n position: relative; }\n\n.view-dataset .views-row {\n margin: 1.5em 0; }\n\n.views-exposed-form {\n position: relative; }\n .views-exposed-form .views-exposed-widget {\n display: inline;\n padding: .5em .5em 0 0; }\n .views-exposed-form .views-exposed-widget .views-widget-filter-search_api_views_fulltext,\n .views-exposed-form .views-exposed-widget .views-widget-sort-by,\n .views-exposed-form .views-exposed-widget .views-widget-sort-order,\n .views-exposed-form .views-exposed-widget .views-submit-button,\n .views-exposed-form .views-exposed-widget .form-submit {\n display: inline;\n float: none;\n margin: 0;\n position: relative; }\n .views-exposed-form .views-exposed-widget.views-reset-button, .views-exposed-form .views-exposed-widget.views-submit-button {\n margin: 0;\n padding: 2.1em .5em 0 0; }\n .views-exposed-form .description {\n text-shadow: compact(none, false, false, false, false, false, false, false, false, false);\n position: absolute;\n color: #999999;\n font-size: 12px;\n left: 7px;\n top: 10px; }\n\n#views-exposed-form-dkan-datasets-panel-pane-1 .views-exposed-form .description {\n display: none; }\n\n.view-dkan-groups-featured .row,\n.pane-dkan-groups-featured .row {\n text-align: center; }\n .view-dkan-groups-featured .row div[class*='views-column'],\n .pane-dkan-groups-featured .row div[class*='views-column'] {\n margin-bottom: 1.25em; }\n\n.view-admin-content table {\n margin-top: 0; }\n","/*\n * A partial implementation of the Ruby list functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/lists.rb\n */\n\n\n// compact is part of libsass\n\n@function -compass-nth($list, $place) {\n // Yep, Sass-lists are 1-indexed.\n @if $place == \"first\" {\n $place: 1;\n }\n @if $place == \"last\" {\n $place: length($list);\n }\n @return nth($list, $place);\n}\n\n// compass_list and compass_space_list can't be implemented in sass script\n\n@function -compass-list-size($list) {\n @return length($list);\n}\n\n@function -compass-slice($list, $start, $end: false) {\n @if $end == false {\n $end: length($list);\n }\n $full: nth($list, $start);\n @for $i from $start + 1 through $end {\n $full: $full, nth($list, $i);\n }\n @return $full;\n}\n\n@function reject($list, $reject1, $reject2:null, $reject3:null, $reject4:null, $reject5:null, $reject6:null, $reject7:null, $reject8:null, $reject9:null) {\n $rejects: $reject1, $reject2, $reject3, $reject4, $reject5, $reject6, $reject7, $reject8, $reject9;\n\n $full: false;\n @each $item in $list {\n @if index($rejects, $item) {}\n @else {\n @if $full {\n $full: $full, $item;\n }\n @else {\n $full: $item;\n }\n }\n }\n @return $full;\n}\n","/*\n * A partial implementation of the Ruby constants functions from Compass:\n * https://github.com/Compass/compass/blob/stable/lib/compass/sass_extensions/functions/constants.rb\n */\n\n@function opposite-position($from) {\n @if ($from == top) {\n @return bottom;\n } @else if ($from == bottom) {\n @return top;\n } @else if ($from == left) {\n @return right;\n } @else if ($from == right) {\n @return left;\n } @else if ($from == center) {\n @return center;\n }\n}\n","/*\n * A partial implementation of the Ruby display functions from Compass:\n * https://github.com/Compass/compass/blob/stable/core/lib/compass/core/sass_extensions/functions/display.rb\n */\n\n@function elements-of-type($type){\n @if ($type == block){\n @return address, article, aside, blockquote, center, dir, div, dd, details, dl, dt, fieldset, figcaption, figure, form, footer, frameset, h1, h2, h3, h4, h5, h6, hr, header, hgroup, isindex, main, menu, nav, noframes, noscript, ol, p, pre, section, summary, ul;\n } @else if ($type == inline){\n @return a, abbr, acronym, audio, b, basefont, bdo, big, br, canvas, cite, code, command, datalist, dfn, em, embed, font, i, img, input, keygen, kbd, label, mark, meter, output, progress, q, rp, rt, ruby, s, samp, select, small, span, strike, strong, sub, sup, textarea, time, tt, u, var, video, wbr;\n } @else if ($type == inline-block){\n @return img;\n } @else if ($type == table){\n @return table;\n } @else if ($type == list-item){\n @return li;\n } @else if ($type == table-row-group){\n @return tbody;\n } @else if ($type == table-header-group){\n @return thead;\n } @else if ($type == table-footer-group){\n @return tfoot;\n } @else if ($type == table-row){\n @return tr;\n } @else if ($type == table-cell){\n @return th, td;\n } @else if ($type == html5-block){\n @return article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary;\n } @else if ($type == html5-inline){\n @return audio, canvas, command, datalist, embed, keygen, mark, meter, output, progress, rp, rt, ruby, time, video, wbr;\n } @else if ($type == html5){\n @return article, aside, audio, canvas, command, datalist, details, embed, figcaption, figure, footer, header, hgroup, keygen, main, mark, menu, meter, nav, output, progress, rp, rt, ruby, section, summary, time, video, wbr;\n } @else if ($type == text-input){\n @return input, textarea;\n }\n}\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n @include box-sizing(border-box);\n}\n*:before,\n*:after {\n @include box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: $font-family-base;\n font-size: $font-size-base;\n line-height: $line-height-base;\n color: $text-color;\n background-color: $body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: $link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n\n &:focus {\n @include tab-focus;\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n @include img-responsive;\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: $border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: $thumbnail-padding;\n line-height: $line-height-base;\n background-color: $thumbnail-bg;\n border: 1px solid $thumbnail-border;\n border-radius: $thumbnail-border-radius;\n @include transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n @include img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: $line-height-computed;\n margin-bottom: $line-height-computed;\n border: 0;\n border-top: 1px solid $hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","@import \"../support\";\n\n// This mixin provides basic support for CSS3 properties and\n// their corresponding experimental CSS2 properties when\n// the implementations are identical except for the property\n// prefix.\n@mixin experimental($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { -webkit-#{$property} : $value; }\n @if $khtml and $experimental-support-for-khtml { -khtml-#{$property} : $value; }\n @if $moz and $experimental-support-for-mozilla { -moz-#{$property} : $value; }\n @if $ms and $experimental-support-for-microsoft { -ms-#{$property} : $value; }\n @if $o and $experimental-support-for-opera { -o-#{$property} : $value; }\n @if $official { #{$property} : $value; }\n}\n\n// Same as experimental(), but for cases when the property is the same and the value is vendorized\n@mixin experimental-value($property, $value,\n $moz : $experimental-support-for-mozilla,\n $webkit : $experimental-support-for-webkit,\n $o : $experimental-support-for-opera,\n $ms : $experimental-support-for-microsoft,\n $khtml : $experimental-support-for-khtml,\n $official : true\n) {\n @if $webkit and $experimental-support-for-webkit { #{$property} : -webkit-#{$value}; }\n @if $khtml and $experimental-support-for-khtml { #{$property} : -khtml-#{$value}; }\n @if $moz and $experimental-support-for-mozilla { #{$property} : -moz-#{$value}; }\n @if $ms and $experimental-support-for-microsoft { #{$property} : -ms-#{$value}; }\n @if $o and $experimental-support-for-opera { #{$property} : -o-#{$value}; }\n @if $official { #{$property} : #{$value}; }\n}\n","@import \"shared\";\n\n// Change the box model for Mozilla, Webkit, IE8 and the future\n//\n// @param $bs\n// [ content-box | border-box ]\n\n@mixin box-sizing($bs) {\n $bs: unquote($bs);\n @include experimental(box-sizing, $bs,\n -moz, -webkit, not(-o), not(-ms), not(-khtml), official\n );\n}\n","$bootstrap-sass-asset-helper: false !default;\n//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n$gray-base: #000 !default;\n$gray-darker: lighten($gray-base, 13.5%) !default; // #222\n$gray-dark: lighten($gray-base, 20%) !default; // #333\n$gray: lighten($gray-base, 33.5%) !default; // #555\n$gray-light: lighten($gray-base, 46.7%) !default; // #777\n$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee\n\n$brand-primary: darken(#428bca, 6.5%) !default; // #337ab7\n$brand-success: #5cb85c !default;\n$brand-info: #5bc0de !default;\n$brand-warning: #f0ad4e !default;\n$brand-danger: #d9534f !default;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for ``.\n$body-bg: #fff !default;\n//** Global text color on ``.\n$text-color: $gray-dark !default;\n\n//** Global textual link color.\n$link-color: $brand-primary !default;\n//** Link hover color set via `darken()` function.\n$link-hover-color: darken($link-color, 15%) !default;\n//** Link hover decoration.\n$link-hover-decoration: underline !default;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n//** Default monospace fonts for ``, ``, and `
        `.\n$font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base:        $font-family-sans-serif !default;\n\n$font-size-base:          14px !default;\n$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-small:         ceil(($font-size-base * 0.85)) !default; // ~12px\n\n$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px\n$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px\n$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px\n$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px\n$font-size-h5:            $font-size-base !default;\n$font-size-h6:            ceil(($font-size-base * 0.85)) !default; // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n$line-height-base:        1.428571429 !default; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px\n\n//** By default, this inherits from the ``.\n$headings-font-family:    inherit !default;\n$headings-font-weight:    500 !default;\n$headings-line-height:    1.1 !default;\n$headings-color:          inherit !default;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n\n// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.\n// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.\n$icon-font-path: if($bootstrap-sass-asset-helper, \"bootstrap/\", \"../fonts/bootstrap/\") !default;\n\n//** File name for all font files.\n$icon-font-name:          \"glyphicons-halflings-regular\" !default;\n//** Element ID within SVG icon file.\n$icon-font-svg-id:        \"glyphicons_halflingsregular\" !default;\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n$padding-base-vertical:     6px !default;\n$padding-base-horizontal:   12px !default;\n\n$padding-large-vertical:    10px !default;\n$padding-large-horizontal:  16px !default;\n\n$padding-small-vertical:    5px !default;\n$padding-small-horizontal:  10px !default;\n\n$padding-xs-vertical:       1px !default;\n$padding-xs-horizontal:     5px !default;\n\n$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome\n$line-height-small:         1.5 !default;\n\n$border-radius-base:        4px !default;\n$border-radius-large:       6px !default;\n$border-radius-small:       3px !default;\n\n//** Global color for active items (e.g., navs or dropdowns).\n$component-active-color:    #fff !default;\n//** Global background color for active items (e.g., navs or dropdowns).\n$component-active-bg:       $brand-primary !default;\n\n//** Width of the `border` for generating carets that indicate dropdowns.\n$caret-width-base:          4px !default;\n//** Carets increase slightly in size for larger components.\n$caret-width-large:         5px !default;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n$table-cell-padding:            8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding:  5px !default;\n\n//** Default background color used for all tables.\n$table-bg:                      transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent:               #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover:                #f5f5f5 !default;\n$table-bg-active:               $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color:            #ddd !default;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n$btn-font-weight:                normal !default;\n\n$btn-default-color:              #333 !default;\n$btn-default-bg:                 #fff !default;\n$btn-default-border:             #ccc !default;\n\n$btn-primary-color:              #fff !default;\n$btn-primary-bg:                 $brand-primary !default;\n$btn-primary-border:             darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color:              #fff !default;\n$btn-success-bg:                 $brand-success !default;\n$btn-success-border:             darken($btn-success-bg, 5%) !default;\n\n$btn-info-color:                 #fff !default;\n$btn-info-bg:                    $brand-info !default;\n$btn-info-border:                darken($btn-info-bg, 5%) !default;\n\n$btn-warning-color:              #fff !default;\n$btn-warning-bg:                 $brand-warning !default;\n$btn-warning-border:             darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color:               #fff !default;\n$btn-danger-bg:                  $brand-danger !default;\n$btn-danger-border:              darken($btn-danger-bg, 5%) !default;\n\n$btn-link-disabled-color:        $gray-light !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius-base:         $border-radius-base !default;\n$btn-border-radius-large:        $border-radius-large !default;\n$btn-border-radius-small:        $border-radius-small !default;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n$input-bg:                       #fff !default;\n//** `` background color\n$input-bg-disabled:              $gray-lighter !default;\n\n//** Text color for ``s\n$input-color:                    $gray !default;\n//** `` border color\n$input-border:                   #ccc !default;\n\n// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on ``s in CSS.\n$input-border-radius:            $border-radius-base !default;\n//** Large `.form-control` border radius\n$input-border-radius-large:      $border-radius-large !default;\n//** Small `.form-control` border radius\n$input-border-radius-small:      $border-radius-small !default;\n\n//** Border color for inputs on focus\n$input-border-focus:             #66afe9 !default;\n\n//** Placeholder text color\n$input-color-placeholder:        #999 !default;\n\n//** Default `.form-control` height\n$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n//** Large `.form-control` height\n$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n//** Small `.form-control` height\n$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n//** `.form-group` margin\n$form-group-margin-bottom:       15px !default;\n\n$legend-color:                   $gray-dark !default;\n$legend-border-color:            #e5e5e5 !default;\n\n//** Background color for textual input addons\n$input-group-addon-bg:           $gray-lighter !default;\n//** Border color for textual input addons\n$input-group-addon-border-color: $input-border !default;\n\n//** Disabled cursor for form controls and buttons.\n$cursor-disabled:                not-allowed !default;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n$dropdown-bg:                    #fff !default;\n//** Dropdown menu `border-color`.\n$dropdown-border:                rgba(0,0,0,.15) !default;\n//** Dropdown menu `border-color` **for IE8**.\n$dropdown-fallback-border:       #ccc !default;\n//** Divider color for between dropdown items.\n$dropdown-divider-bg:            #e5e5e5 !default;\n\n//** Dropdown link text color.\n$dropdown-link-color:            $gray-dark !default;\n//** Hover color for dropdown links.\n$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;\n//** Hover background for dropdown links.\n$dropdown-link-hover-bg:         #f5f5f5 !default;\n\n//** Active dropdown menu item text color.\n$dropdown-link-active-color:     $component-active-color !default;\n//** Active dropdown menu item background color.\n$dropdown-link-active-bg:        $component-active-bg !default;\n\n//** Disabled dropdown menu item background color.\n$dropdown-link-disabled-color:   $gray-light !default;\n\n//** Text color for headers within dropdown menus.\n$dropdown-header-color:          $gray-light !default;\n\n//** Deprecated `$dropdown-caret-color` as of v3.1.0\n$dropdown-caret-color:           #000 !default;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n$zindex-navbar:            1000 !default;\n$zindex-dropdown:          1000 !default;\n$zindex-popover:           1060 !default;\n$zindex-tooltip:           1070 !default;\n$zindex-navbar-fixed:      1030 !default;\n$zindex-modal-background:  1040 !default;\n$zindex-modal:             1050 !default;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs:                  480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min:              $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone:               $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm:                  768px !default;\n$screen-sm-min:              $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet:              $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md:                  992px !default;\n$screen-md-min:              $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop:             $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg:                  1200px !default;\n$screen-lg-min:              $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop:          $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max:              ($screen-sm-min - 1) !default;\n$screen-sm-max:              ($screen-md-min - 1) !default;\n$screen-md-max:              ($screen-lg-min - 1) !default;\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n$grid-columns:              12 !default;\n//** Padding between columns. Gets divided in half for the left and right.\n$grid-gutter-width:         30px !default;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n$grid-float-breakpoint:     $screen-sm-min !default;\n//** Point at which the navbar begins collapsing.\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n$container-tablet:             (720px + $grid-gutter-width) !default;\n//** For `$screen-sm-min` and up.\n$container-sm:                 $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop:            (940px + $grid-gutter-width) !default;\n//** For `$screen-md-min` and up.\n$container-md:                 $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop:      (1140px + $grid-gutter-width) !default;\n//** For `$screen-lg-min` and up.\n$container-lg:                 $container-large-desktop !default;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n$navbar-height:                    50px !default;\n$navbar-margin-bottom:             $line-height-computed !default;\n$navbar-border-radius:             $border-radius-base !default;\n$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;\n$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;\n$navbar-collapse-max-height:       340px !default;\n\n$navbar-default-color:             #777 !default;\n$navbar-default-bg:                #f8f8f8 !default;\n$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color:                #777 !default;\n$navbar-default-link-hover-color:          #333 !default;\n$navbar-default-link-hover-bg:             transparent !default;\n$navbar-default-link-active-color:         #555 !default;\n$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color:       #ccc !default;\n$navbar-default-link-disabled-bg:          transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color:               $navbar-default-link-color !default;\n$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg:            transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg:           #ddd !default;\n$navbar-default-toggle-icon-bar-bg:        #888 !default;\n$navbar-default-toggle-border-color:       #ddd !default;\n\n\n//=== Inverted navbar\n// Reset inverted navbar basics\n$navbar-inverse-color:                      lighten($gray-light, 15%) !default;\n$navbar-inverse-bg:                         #222 !default;\n$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;\n$navbar-inverse-link-hover-color:           #fff !default;\n$navbar-inverse-link-hover-bg:              transparent !default;\n$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color:        #444 !default;\n$navbar-inverse-link-disabled-bg:           transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color:          #fff !default;\n$navbar-inverse-brand-hover-bg:             transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg:            #333 !default;\n$navbar-inverse-toggle-icon-bar-bg:         #fff !default;\n$navbar-inverse-toggle-border-color:        #333 !default;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n$nav-link-padding:                          10px 15px !default;\n$nav-link-hover-bg:                         $gray-lighter !default;\n\n$nav-disabled-link-color:                   $gray-light !default;\n$nav-disabled-link-hover-color:             $gray-light !default;\n\n//== Tabs\n$nav-tabs-border-color:                     #ddd !default;\n\n$nav-tabs-link-hover-border-color:          $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg:             $body-bg !default;\n$nav-tabs-active-link-hover-color:          $gray !default;\n$nav-tabs-active-link-hover-border-color:   #ddd !default;\n\n$nav-tabs-justified-link-border-color:            #ddd !default;\n$nav-tabs-justified-active-link-border-color:     $body-bg !default;\n\n//== Pills\n$nav-pills-border-radius:                   $border-radius-base !default;\n$nav-pills-active-link-hover-bg:            $component-active-bg !default;\n$nav-pills-active-link-hover-color:         $component-active-color !default;\n\n\n//== Pagination\n//\n//##\n\n$pagination-color:                     $link-color !default;\n$pagination-bg:                        #fff !default;\n$pagination-border:                    #ddd !default;\n\n$pagination-hover-color:               $link-hover-color !default;\n$pagination-hover-bg:                  $gray-lighter !default;\n$pagination-hover-border:              #ddd !default;\n\n$pagination-active-color:              #fff !default;\n$pagination-active-bg:                 $brand-primary !default;\n$pagination-active-border:             $brand-primary !default;\n\n$pagination-disabled-color:            $gray-light !default;\n$pagination-disabled-bg:               #fff !default;\n$pagination-disabled-border:           #ddd !default;\n\n\n//== Pager\n//\n//##\n\n$pager-bg:                             $pagination-bg !default;\n$pager-border:                         $pagination-border !default;\n$pager-border-radius:                  15px !default;\n\n$pager-hover-bg:                       $pagination-hover-bg !default;\n\n$pager-active-bg:                      $pagination-active-bg !default;\n$pager-active-color:                   $pagination-active-color !default;\n\n$pager-disabled-color:                 $pagination-disabled-color !default;\n\n\n//== Jumbotron\n//\n//##\n\n$jumbotron-padding:              30px !default;\n$jumbotron-color:                inherit !default;\n$jumbotron-bg:                   $gray-lighter !default;\n$jumbotron-heading-color:        inherit !default;\n$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;\n$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text:             #3c763d !default;\n$state-success-bg:               #dff0d8 !default;\n$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text:                #31708f !default;\n$state-info-bg:                  #d9edf7 !default;\n$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text:             #8a6d3b !default;\n$state-warning-bg:               #fcf8e3 !default;\n$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text:              #a94442 !default;\n$state-danger-bg:                #f2dede !default;\n$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n$tooltip-max-width:           200px !default;\n//** Tooltip text color\n$tooltip-color:               #fff !default;\n//** Tooltip background color\n$tooltip-bg:                  #000 !default;\n$tooltip-opacity:             .9 !default;\n\n//** Tooltip arrow width\n$tooltip-arrow-width:         5px !default;\n//** Tooltip arrow color\n$tooltip-arrow-color:         $tooltip-bg !default;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n$popover-bg:                          #fff !default;\n//** Popover maximum width\n$popover-max-width:                   276px !default;\n//** Popover border color\n$popover-border-color:                rgba(0,0,0,.2) !default;\n//** Popover fallback border color\n$popover-fallback-border-color:       #ccc !default;\n\n//** Popover title background color\n$popover-title-bg:                    darken($popover-bg, 3%) !default;\n\n//** Popover arrow width\n$popover-arrow-width:                 10px !default;\n//** Popover arrow color\n$popover-arrow-color:                 $popover-bg !default;\n\n//** Popover outer arrow width\n$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;\n//** Popover outer arrow color\n$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;\n//** Popover outer arrow fallback color\n$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n$label-default-bg:            $gray-light !default;\n//** Primary label background color\n$label-primary-bg:            $brand-primary !default;\n//** Success label background color\n$label-success-bg:            $brand-success !default;\n//** Info label background color\n$label-info-bg:               $brand-info !default;\n//** Warning label background color\n$label-warning-bg:            $brand-warning !default;\n//** Danger label background color\n$label-danger-bg:             $brand-danger !default;\n\n//** Default label text color\n$label-color:                 #fff !default;\n//** Default text color of a linked label\n$label-link-hover-color:      #fff !default;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n$modal-inner-padding:         15px !default;\n\n//** Padding applied to the modal title\n$modal-title-padding:         15px !default;\n//** Modal title line-height\n$modal-title-line-height:     $line-height-base !default;\n\n//** Background color of modal content area\n$modal-content-bg:                             #fff !default;\n//** Modal content border color\n$modal-content-border-color:                   rgba(0,0,0,.2) !default;\n//** Modal content border color **for IE8**\n$modal-content-fallback-border-color:          #999 !default;\n\n//** Modal backdrop background color\n$modal-backdrop-bg:           #000 !default;\n//** Modal backdrop opacity\n$modal-backdrop-opacity:      .5 !default;\n//** Modal header border color\n$modal-header-border-color:   #e5e5e5 !default;\n//** Modal footer border color\n$modal-footer-border-color:   $modal-header-border-color !default;\n\n$modal-lg:                    900px !default;\n$modal-md:                    600px !default;\n$modal-sm:                    300px !default;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n$alert-padding:               15px !default;\n$alert-border-radius:         $border-radius-base !default;\n$alert-link-font-weight:      bold !default;\n\n$alert-success-bg:            $state-success-bg !default;\n$alert-success-text:          $state-success-text !default;\n$alert-success-border:        $state-success-border !default;\n\n$alert-info-bg:               $state-info-bg !default;\n$alert-info-text:             $state-info-text !default;\n$alert-info-border:           $state-info-border !default;\n\n$alert-warning-bg:            $state-warning-bg !default;\n$alert-warning-text:          $state-warning-text !default;\n$alert-warning-border:        $state-warning-border !default;\n\n$alert-danger-bg:             $state-danger-bg !default;\n$alert-danger-text:           $state-danger-text !default;\n$alert-danger-border:         $state-danger-border !default;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n$progress-bg:                 #f5f5f5 !default;\n//** Progress bar text color\n$progress-bar-color:          #fff !default;\n//** Variable for setting rounded corners on progress bar.\n$progress-border-radius:      $border-radius-base !default;\n\n//** Default progress bar color\n$progress-bar-bg:             $brand-primary !default;\n//** Success progress bar color\n$progress-bar-success-bg:     $brand-success !default;\n//** Warning progress bar color\n$progress-bar-warning-bg:     $brand-warning !default;\n//** Danger progress bar color\n$progress-bar-danger-bg:      $brand-danger !default;\n//** Info progress bar color\n$progress-bar-info-bg:        $brand-info !default;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n$list-group-bg:                 #fff !default;\n//** `.list-group-item` border color\n$list-group-border:             #ddd !default;\n//** List group border radius\n$list-group-border-radius:      $border-radius-base !default;\n\n//** Background color of single list items on hover\n$list-group-hover-bg:           #f5f5f5 !default;\n//** Text color of active list items\n$list-group-active-color:       $component-active-color !default;\n//** Background color of active list items\n$list-group-active-bg:          $component-active-bg !default;\n//** Border color of active list elements\n$list-group-active-border:      $list-group-active-bg !default;\n//** Text color for content within active list items\n$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;\n\n//** Text color of disabled list items\n$list-group-disabled-color:      $gray-light !default;\n//** Background color of disabled list items\n$list-group-disabled-bg:         $gray-lighter !default;\n//** Text color for content within disabled list items\n$list-group-disabled-text-color: $list-group-disabled-color !default;\n\n$list-group-link-color:         #555 !default;\n$list-group-link-hover-color:   $list-group-link-color !default;\n$list-group-link-heading-color: #333 !default;\n\n\n//== Panels\n//\n//##\n\n$panel-bg:                    #fff !default;\n$panel-body-padding:          15px !default;\n$panel-heading-padding:       10px 15px !default;\n$panel-footer-padding:        $panel-heading-padding !default;\n$panel-border-radius:         $border-radius-base !default;\n\n//** Border color for elements within panels\n$panel-inner-border:          #ddd !default;\n$panel-footer-bg:             #f5f5f5 !default;\n\n$panel-default-text:          $gray-dark !default;\n$panel-default-border:        #ddd !default;\n$panel-default-heading-bg:    #f5f5f5 !default;\n\n$panel-primary-text:          #fff !default;\n$panel-primary-border:        $brand-primary !default;\n$panel-primary-heading-bg:    $brand-primary !default;\n\n$panel-success-text:          $state-success-text !default;\n$panel-success-border:        $state-success-border !default;\n$panel-success-heading-bg:    $state-success-bg !default;\n\n$panel-info-text:             $state-info-text !default;\n$panel-info-border:           $state-info-border !default;\n$panel-info-heading-bg:       $state-info-bg !default;\n\n$panel-warning-text:          $state-warning-text !default;\n$panel-warning-border:        $state-warning-border !default;\n$panel-warning-heading-bg:    $state-warning-bg !default;\n\n$panel-danger-text:           $state-danger-text !default;\n$panel-danger-border:         $state-danger-border !default;\n$panel-danger-heading-bg:     $state-danger-bg !default;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n$thumbnail-padding:           4px !default;\n//** Thumbnail background color\n$thumbnail-bg:                $body-bg !default;\n//** Thumbnail border color\n$thumbnail-border:            #ddd !default;\n//** Thumbnail border radius\n$thumbnail-border-radius:     $border-radius-base !default;\n\n//** Custom text color for thumbnail captions\n$thumbnail-caption-color:     $text-color !default;\n//** Padding around the thumbnail caption\n$thumbnail-caption-padding:   9px !default;\n\n\n//== Wells\n//\n//##\n\n$well-bg:                     #f5f5f5 !default;\n$well-border:                 darken($well-bg, 7%) !default;\n\n\n//== Badges\n//\n//##\n\n$badge-color:                 #fff !default;\n//** Linked badge text color on hover\n$badge-link-hover-color:      #fff !default;\n$badge-bg:                    $gray-light !default;\n\n//** Badge text color in active nav link\n$badge-active-color:          $link-color !default;\n//** Badge background color in active nav link\n$badge-active-bg:             #fff !default;\n\n$badge-font-weight:           bold !default;\n$badge-line-height:           1 !default;\n$badge-border-radius:         10px !default;\n\n\n//== Breadcrumbs\n//\n//##\n\n$breadcrumb-padding-vertical:   8px !default;\n$breadcrumb-padding-horizontal: 15px !default;\n//** Breadcrumb background color\n$breadcrumb-bg:                 #f5f5f5 !default;\n//** Breadcrumb text color\n$breadcrumb-color:              #ccc !default;\n//** Text color of current page in the breadcrumb\n$breadcrumb-active-color:       $gray-light !default;\n//** Textual separator for between breadcrumb elements\n$breadcrumb-separator:          \"/\" !default;\n\n\n//== Carousel\n//\n//##\n\n$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color:                      #fff !default;\n$carousel-control-width:                      15% !default;\n$carousel-control-opacity:                    .5 !default;\n$carousel-control-font-size:                  20px !default;\n\n$carousel-indicator-active-bg:                #fff !default;\n$carousel-indicator-border-color:             #fff !default;\n\n$carousel-caption-color:                      #fff !default;\n\n\n//== Close\n//\n//##\n\n$close-font-weight:           bold !default;\n$close-color:                 #000 !default;\n$close-text-shadow:           0 1px 0 #fff !default;\n\n\n//== Code\n//\n//##\n\n$code-color:                  #c7254e !default;\n$code-bg:                     #f9f2f4 !default;\n\n$kbd-color:                   #fff !default;\n$kbd-bg:                      #333 !default;\n\n$pre-bg:                      #f5f5f5 !default;\n$pre-color:                   $gray-dark !default;\n$pre-border-color:            #ccc !default;\n$pre-scrollable-max-height:   340px !default;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n$component-offset-horizontal: 180px !default;\n//** Text muted color\n$text-muted:                  $gray-light !default;\n//** Abbreviations and acronyms border color\n$abbr-border-color:           $gray-light !default;\n//** Headings small color\n$headings-small-color:        $gray-light !default;\n//** Blockquote small color\n$blockquote-small-color:      $gray-light !default;\n//** Blockquote font size\n$blockquote-font-size:        ($font-size-base * 1.25) !default;\n//** Blockquote border color\n$blockquote-border-color:     $gray-lighter !default;\n//** Page header border color\n$page-header-border-color:    $gray-lighter !default;\n//** Width of horizontal description list titles\n$dl-horizontal-offset:        $component-offset-horizontal !default;\n//** Point at which .dl-horizontal becomes horizontal\n$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;\n//** Horizontal line color.\n$hr-border:                   $gray-lighter !default;\n","// WebKit-style focus\n\n@mixin tab-focus() {\n  // WebKit-specific. Other browsers will keep their default outline style.\n  // (Initially tried to also force default via `outline: initial`,\n  // but that seems to erroneously remove the outline in Firefox altogether.)\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n@mixin img-responsive($display: block) {\n  display: $display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-1x}\"), \"#{$file-1x}\"));\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path(\"#{$file-2x}\"), \"#{$file-2x}\"));\n    background-size: $width-1x $height-1x;\n  }\n}\n","@import \"shared\";\n\n// CSS Transitions\n// Currently only works in Webkit.\n//\n// * expected in CSS3, FireFox 3.6/7 and Opera Presto 2.3\n// * We'll be prepared.\n//\n// Including this submodule sets following defaults for the mixins:\n//\n//     $default-transition-property : all\n//     $default-transition-duration : 1s\n//     $default-transition-function : false\n//     $default-transition-delay    : false\n//\n// Override them if you like. Timing-function and delay are set to false for browser defaults (ease, 0s).\n\n$default-transition-property: all !default;\n\n$default-transition-duration: 1s !default;\n\n$default-transition-function: false !default;\n\n$default-transition-delay: false !default;\n\n$transitionable-prefixed-values: transform, transform-origin !default;\n\n// One or more properties to transition\n//\n// * for multiple, use a comma-delimited list\n// * also accepts \"all\" or \"none\"\n\n@mixin transition-property($property-1: $default-transition-property,\n  $property-2 : false,\n  $property-3 : false,\n  $property-4 : false,\n  $property-5 : false,\n  $property-6 : false,\n  $property-7 : false,\n  $property-8 : false,\n  $property-9 : false,\n  $property-10: false\n) {\n  @if type-of($property-1) == string { $property-1: unquote($property-1); }\n  $properties: compact($property-1, $property-2, $property-3, $property-4, $property-5, $property-6, $property-7, $property-8, $property-9, $property-10);\n  @if $experimental-support-for-webkit    {       -webkit-transition-property : prefixed-for-transition(-webkit, $properties); }\n  @if $experimental-support-for-mozilla   {          -moz-transition-property : prefixed-for-transition(-moz,    $properties); }\n  @if $experimental-support-for-opera     {            -o-transition-property : prefixed-for-transition(-o,      $properties); }\n                                                          transition-property : $properties;\n}\n\n// One or more durations in seconds\n//\n// * for multiple, use a comma-delimited list\n// * these durations will affect the properties in the same list position\n\n@mixin transition-duration($duration-1: $default-transition-duration,\n  $duration-2 : false,\n  $duration-3 : false,\n  $duration-4 : false,\n  $duration-5 : false,\n  $duration-6 : false,\n  $duration-7 : false,\n  $duration-8 : false,\n  $duration-9 : false,\n  $duration-10: false\n) {\n  @if type-of($duration-1) == string { $duration-1: unquote($duration-1); }\n  $durations: compact($duration-1, $duration-2, $duration-3, $duration-4, $duration-5, $duration-6, $duration-7, $duration-8, $duration-9, $duration-10);\n  @include experimental(transition-duration, $durations,\n    -moz, -webkit, -o, not(-ms), not(-khtml), official\n  );\n}\n\n// One or more timing functions\n//\n// * [ ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier(x1, y1, x2, y2)]\n// * For multiple, use a comma-delimited list\n// * These functions will effect the properties in the same list position\n\n@mixin transition-timing-function($function-1: $default-transition-function,\n  $function-2 : false,\n  $function-3 : false,\n  $function-4 : false,\n  $function-5 : false,\n  $function-6 : false,\n  $function-7 : false,\n  $function-8 : false,\n  $function-9 : false,\n  $function-10: false\n) {\n  $function-1: unquote($function-1);\n  $functions: compact($function-1, $function-2, $function-3, $function-4, $function-5, $function-6, $function-7, $function-8, $function-9, $function-10);\n  @include experimental(transition-timing-function, $functions,\n    -moz, -webkit, -o, not(-ms), not(-khtml), official\n  );\n}\n\n// One or more transition-delays in seconds\n//\n// * for multiple, use a comma-delimited list\n// * these delays will effect the properties in the same list position\n\n@mixin transition-delay($delay-1: $default-transition-delay,\n  $delay-2 : false,\n  $delay-3 : false,\n  $delay-4 : false,\n  $delay-5 : false,\n  $delay-6 : false,\n  $delay-7 : false,\n  $delay-8 : false,\n  $delay-9 : false,\n  $delay-10: false\n) {\n  @if type-of($delay-1) == string { $delay-1: unquote($delay-1); }\n  $delays: compact($delay-1, $delay-2, $delay-3, $delay-4, $delay-5, $delay-6, $delay-7, $delay-8, $delay-9, $delay-10);\n  @include experimental(transition-delay, $delays,\n    -moz, -webkit, -o, not(-ms), not(-khtml), official\n  );\n}\n\n// Transition all-in-one shorthand\n\n@mixin single-transition(\n  $property: $default-transition-property,\n  $duration: $default-transition-duration,\n  $function: $default-transition-function,\n  $delay: $default-transition-delay\n) {\n  @include transition(compact($property $duration $function $delay));\n}\n\n@mixin transition(\n  $transition-1 : default,\n  $transition-2 : false,\n  $transition-3 : false,\n  $transition-4 : false,\n  $transition-5 : false,\n  $transition-6 : false,\n  $transition-7 : false,\n  $transition-8 : false,\n  $transition-9 : false,\n  $transition-10: false\n) {\n  @if $transition-1 == default {\n    $transition-1 : compact($default-transition-property $default-transition-duration $default-transition-function $default-transition-delay);\n  }\n  $transitions: false;\n  @if type-of($transition-1) == list and type-of(nth($transition-1,1)) == list {\n    $transitions: join($transition-1, compact($transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10), comma);\n  } @else {\n    $transitions : compact($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10);\n  }\n  $delays: comma-list();\n  $has-delays: false;\n  $webkit-value: comma-list();\n  $moz-value: comma-list();\n  $o-value: comma-list();\n\n  // This block can be made considerably simpler at the point in time that\n  // we no longer need to deal with the differences in how delays are treated.\n  @each $transition in $transitions {\n    // Extract the values from the list\n    // (this would be cleaner if nth took a 3rd argument to provide a default value).\n    $property: nth($transition, 1);\n    $duration: false;\n    $timing-function: false;\n    $delay: false;\n    @if length($transition) > 1 { $duration:        nth($transition, 2); }\n    @if length($transition) > 2 { $timing-function: nth($transition, 3); }\n    @if length($transition) > 3 { $delay:           nth($transition, 4); $has-delays: true; }\n\n    // If a delay is provided without a timing function\n    @if is-time($timing-function) and not $delay { $delay: $timing-function; $timing-function: false; $has-delays: true; }\n\n    // Keep a list of delays in case one is specified\n    $delays: append($delays, if($delay, $delay, 0s));\n\n    $webkit-value: append($webkit-value, compact(prefixed-for-transition(-webkit, $property) $duration $timing-function));\n       $moz-value: append(   $moz-value, compact(prefixed-for-transition(   -moz, $property) $duration $timing-function $delay));\n         $o-value: append(     $o-value, compact(prefixed-for-transition(     -o, $property) $duration $timing-function $delay));\n  }\n\n  @if $experimental-support-for-webkit    {       -webkit-transition : $webkit-value;\n    // old webkit doesn't support the delay parameter in the shorthand so we progressively enhance it.\n    @if $has-delays                       { -webkit-transition-delay : $delays;       } }\n  @if $experimental-support-for-mozilla   {          -moz-transition : $moz-value;    }\n  @if $experimental-support-for-opera     {            -o-transition : $o-value;      }\n                                                          transition : $transitions;\n}\n\n// coerce a list to be comma delimited or make a new, empty comma delimited list.\n@function comma-list($list: ()) {\n  @return join((), $list, comma);\n}\n\n// Returns `$property` with the given prefix if it is found in `$transitionable-prefixed-values`.\n@function prefixed-for-transition($prefix, $property) {\n  @if type-of($property) == list {\n    $new-list: comma-list();\n    @each $v in $property {\n      $new-list: append($new-list, prefixed-for-transition($prefix, $v));\n    }\n    @return $new-list;\n  } @else {\n    @if index($transitionable-prefixed-values, $property) {\n      @return #{$prefix}-#{$property};\n    } @else {\n      @return $property;\n    }\n  }\n}\n\n// Checks if the value given is a unit of time.\n@function is-time($value) {\n  @if type-of($value) == number {\n    @return not(not(index(s ms, unit($value))));\n  } @else {\n    @return false;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: $headings-font-family;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: $headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: $headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: $line-height-computed;\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: ($line-height-computed / 2);\n  margin-bottom: ($line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: $font-size-h1; }\nh2, .h2 { font-size: $font-size-h2; }\nh3, .h3 { font-size: $font-size-h3; }\nh4, .h4 { font-size: $font-size-h4; }\nh5, .h5 { font-size: $font-size-h5; }\nh6, .h6 { font-size: $font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 ($line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: $line-height-computed;\n  font-size: floor(($font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: $screen-sm-min) {\n    font-size: ($font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * $font-size-small / $font-size-base));\n}\n\nmark,\n.mark {\n  background-color: $state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: $text-muted;\n}\n\n@include text-emphasis-variant('.text-primary', $brand-primary);\n\n@include text-emphasis-variant('.text-success', $state-success-text);\n\n@include text-emphasis-variant('.text-info', $state-info-text);\n\n@include text-emphasis-variant('.text-warning', $state-warning-text);\n\n@include text-emphasis-variant('.text-danger', $state-danger-text);\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n}\n@include bg-variant('.bg-primary', $brand-primary);\n\n@include bg-variant('.bg-success', $state-success-bg);\n\n@include bg-variant('.bg-info', $state-info-bg);\n\n@include bg-variant('.bg-warning', $state-warning-bg);\n\n@include bg-variant('.bg-danger', $state-danger-bg);\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: (($line-height-computed / 2) - 1);\n  margin: ($line-height-computed * 2) 0 $line-height-computed;\n  border-bottom: 1px solid $page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: ($line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// [converter] extracted from `.list-unstyled` for libsass compatibility\n@mixin list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n// [converter] extracted as `@mixin list-unstyled` for libsass compatibility\n.list-unstyled {\n  @include list-unstyled;\n}\n\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled;\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: $line-height-computed;\n}\ndt,\ndd {\n  line-height: $line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    @include clearfix; // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: $dl-horizontal-breakpoint) {\n    dt {\n      float: left;\n      width: ($dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      @include text-overflow;\n    }\n    dd {\n      margin-left: $dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted $abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  @extend .text-uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: ($line-height-computed / 2) $line-height-computed;\n  margin: 0 0 $line-height-computed;\n  font-size: $blockquote-font-size;\n  border-left: 5px solid $blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: $line-height-base;\n    color: $blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid $blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: $line-height-computed;\n  font-style: normal;\n  line-height: $line-height-base;\n}\n","// Typography\n\n// [converter] $parent hack\n@mixin text-emphasis-variant($parent, $color) {\n  #{$parent} {\n    color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    color: darken($color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n// [converter] $parent hack\n@mixin bg-variant($parent, $color) {\n  #{$parent} {\n    background-color: $color;\n  }\n  a#{$parent}:hover,\n  a#{$parent}:focus {\n    background-color: darken($color, 10%);\n  }\n}\n","// @doc off\n// Extends the bottom of the element to enclose any floats it contains.\n// @doc on\n\n@import \"hacks\";\n\n// This basic method is preferred for the usual case, when positioned\n// content will not show outside the bounds of the container.\n//\n// Recommendations include using this in conjunction with a width.\n// Credit: [quirksmode.org](http://www.quirksmode.org/blog/archives/2005/03/clearing_floats.html)\n@mixin clearfix {\n  overflow: hidden;\n  @include has-layout;\n}\n\n// This older method from Position Is Everything called\n// [Easy Clearing](http://www.positioniseverything.net/easyclearing.html)\n// has the advantage of allowing positioned elements to hang\n// outside the bounds of the container at the expense of more tricky CSS.\n@mixin legacy-pie-clearfix {\n  &:after {\n    content    : \"\\0020\";\n    display    : block;\n    height     : 0;\n    clear      : both;\n    overflow   : hidden;\n    visibility : hidden;\n  }\n  @include has-layout;\n}\n\n// This is an updated version of the PIE clearfix method that reduces the amount of CSS output.\n// If you need to support Firefox before 3.5 you need to use `legacy-pie-clearfix` instead.\n//\n// Adapted from: [A new micro clearfix hack](http://nicolasgallagher.com/micro-clearfix-hack/)\n@mixin pie-clearfix {\n  &:after {\n    content: \"\";\n    display: table;\n    clear: both;\n  }\n  @include has-layout;\n}\n","@import \"../../support\";\n\n// The `zoom` approach generates less CSS but does not validate.\n// Set this to `block` to use the display-property to hack the\n// element to gain layout.\n$default-has-layout-approach: zoom !default;\n\n// This mixin causes an element matching the selector\n// to gain the \"hasLayout\" property in internet explorer.\n// More information on [hasLayout](http://reference.sitepoint.com/css/haslayout).\n@mixin has-layout($approach: $default-has-layout-approach) {\n  @if $legacy-support-for-ie {\n    @if $approach == zoom {\n      @include has-layout-zoom;\n    } @else if $approach == block {\n      @include has-layout-block;\n    } @else {\n      @warn \"Unknown has-layout approach: #{$approach}\";\n      @include has-layout-zoom;\n    }\n  }\n}\n\n@mixin has-layout-zoom {\n  @if $legacy-support-for-ie6 or $legacy-support-for-ie7 {\n    *zoom: 1;\n  }\n}\n\n@mixin has-layout-block {\n  @if $legacy-support-for-ie {\n    // This makes ie6 get layout\n    display: inline-block;\n    // and this puts it back to block\n    & { display: block; }\n  }\n}\n\n// A hack to supply IE6 (and below) with a different property value.\n// [Read more](http://www.cssportal.com/css-hacks/#in_css-important).\n@mixin bang-hack($property, $value, $ie6-value) {\n  @if $legacy-support-for-ie6 {\n    #{$property}: #{$value} !important;\n    #{$property}: #{$ie6-value};\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n@mixin text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $code-color;\n  background-color: $code-bg;\n  border-radius: $border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  border-radius: $border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: (($line-height-computed - 1) / 2);\n  margin: 0 0 ($line-height-computed / 2);\n  font-size: ($font-size-base - 1); // 14px to 13px\n  line-height: $line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: $pre-color;\n  background-color: $pre-bg;\n  border: 1px solid $pre-border-color;\n  border-radius: $border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: $pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  @include container-fixed;\n\n  @media (min-width: $screen-sm-min) {\n    width: $container-sm;\n  }\n  @media (min-width: $screen-md-min) {\n    width: $container-md;\n  }\n  @media (min-width: $screen-lg-min) {\n    width: $container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  @include container-fixed;\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  @include make-row;\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@include make-grid-columns;\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n@include make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: $screen-sm-min) {\n  @include make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: $screen-md-min) {\n  @include make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: $screen-lg-min) {\n  @include make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n@mixin container-fixed($gutter: $grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  floor(($gutter / 2));\n  padding-right: ceil(($gutter / 2));\n  @include clearfix;\n}\n\n// Creates a wrapper for a series of columns\n@mixin make-row($gutter: $grid-gutter-width) {\n  margin-left:  ceil(($gutter / -2));\n  margin-right: floor(($gutter / -2));\n  @include clearfix;\n}\n\n// Generate the extra small columns\n@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage(($columns / $grid-columns));\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n}\n@mixin make-xs-column-offset($columns) {\n  margin-left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-push($columns) {\n  left: percentage(($columns / $grid-columns));\n}\n@mixin make-xs-column-pull($columns) {\n  right: percentage(($columns / $grid-columns));\n}\n\n// Generate the small columns\n@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-sm-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-offset($columns) {\n  @media (min-width: $screen-sm-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-push($columns) {\n  @media (min-width: $screen-sm-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-sm-column-pull($columns) {\n  @media (min-width: $screen-sm-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the medium columns\n@mixin make-md-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-md-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-offset($columns) {\n  @media (min-width: $screen-md-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-push($columns) {\n  @media (min-width: $screen-md-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-md-column-pull($columns) {\n  @media (min-width: $screen-md-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n\n// Generate the large columns\n@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  ($gutter / 2);\n  padding-right: ($gutter / 2);\n\n  @media (min-width: $screen-lg-min) {\n    float: left;\n    width: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-offset($columns) {\n  @media (min-width: $screen-lg-min) {\n    margin-left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-push($columns) {\n  @media (min-width: $screen-lg-min) {\n    left: percentage(($columns / $grid-columns));\n  }\n}\n@mixin make-lg-column-pull($columns) {\n  @media (min-width: $screen-lg-min) {\n    right: percentage(($columns / $grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin make-grid-columns($i: 1, $list: \".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}\";\n  }\n  #{$list} {\n    position: relative;\n    // Prevent columns from collapsing when empty\n    min-height: 1px;\n    // Inner gutter via padding\n    padding-left:  ceil(($grid-gutter-width / 2));\n    padding-right: floor(($grid-gutter-width / 2));\n  }\n}\n\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin float-grid-columns($class, $i: 1, $list: \".col-#{$class}-#{$i}\") {\n  @for $i from (1 + 1) through $grid-columns {\n    $list: \"#{$list}, .col-#{$class}-#{$i}\";\n  }\n  #{$list} {\n    float: left;\n  }\n}\n\n\n@mixin calc-grid-column($index, $class, $type) {\n  @if ($type == width) and ($index > 0) {\n    .col-#{$class}-#{$index} {\n      width: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index > 0) {\n    .col-#{$class}-push-#{$index} {\n      left: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == push) and ($index == 0) {\n    .col-#{$class}-push-0 {\n      left: auto;\n    }\n  }\n  @if ($type == pull) and ($index > 0) {\n    .col-#{$class}-pull-#{$index} {\n      right: percentage(($index / $grid-columns));\n    }\n  }\n  @if ($type == pull) and ($index == 0) {\n    .col-#{$class}-pull-0 {\n      right: auto;\n    }\n  }\n  @if ($type == offset) {\n    .col-#{$class}-offset-#{$index} {\n      margin-left: percentage(($index / $grid-columns));\n    }\n  }\n}\n\n// [converter] This is defined recursively in LESS, but Sass supports real loops\n@mixin loop-grid-columns($columns, $class, $type) {\n  @for $i from 0 through $columns {\n    @include calc-grid-column($i, $class, $type);\n  }\n}\n\n\n// Create grid for specific class\n@mixin make-grid($class) {\n  @include float-grid-columns($class);\n  @include loop-grid-columns($grid-columns, $class, width);\n  @include loop-grid-columns($grid-columns, $class, pull);\n  @include loop-grid-columns($grid-columns, $class, push);\n  @include loop-grid-columns($grid-columns, $class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: $table-bg;\n}\ncaption {\n  padding-top: $table-cell-padding;\n  padding-bottom: $table-cell-padding;\n  color: $text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: $line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-cell-padding;\n        line-height: $line-height-base;\n        vertical-align: top;\n        border-top: 1px solid $table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid $table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid $table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: $body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: $table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid $table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid $table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: $table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: $table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: $screen-xs-max) {\n    width: 100%;\n    margin-bottom: ($line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid $table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.#{$state},\n    > th.#{$state},\n    &.#{$state} > td,\n    &.#{$state} > th {\n      background-color: $background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.#{$state}:hover,\n    > th.#{$state}:hover,\n    &.#{$state}:hover > td,\n    &:hover > .#{$state},\n    &.#{$state}:hover > th {\n      background-color: darken($background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: $line-height-computed;\n  font-size: ($font-size-base * 1.5);\n  line-height: inherit;\n  color: $legend-color;\n  border: 0;\n  border-bottom: 1px solid $legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  @include box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  @include tab-focus;\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: ($padding-base-vertical + 1);\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  line-height: $line-height-base;\n  color: $input-color;\n  background-color: $input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid $input-border;\n  border-radius: $input-border-radius; // Note: This has no effect on s in CSS.\n  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  @include form-control-focus;\n\n  // Placeholder\n  @include placeholder;\n\n  // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n// [converter] $parent hack\n@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  #{$parent} {\n    height: $input-height;\n    padding: $padding-vertical $padding-horizontal;\n    font-size: $font-size;\n    line-height: $line-height;\n    border-radius: $border-radius;\n  }\n\n  select#{$parent} {\n    height: $input-height;\n    line-height: $input-height;\n  }\n\n  textarea#{$parent},\n  select[multiple]#{$parent} {\n    height: auto;\n  }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n@mixin animation($animation) {\n  -webkit-animation: $animation;\n       -o-animation: $animation;\n          animation: $animation;\n}\n@mixin animation-name($name) {\n  -webkit-animation-name: $name;\n          animation-name: $name;\n}\n@mixin animation-duration($duration) {\n  -webkit-animation-duration: $duration;\n          animation-duration: $duration;\n}\n@mixin animation-timing-function($timing-function) {\n  -webkit-animation-timing-function: $timing-function;\n          animation-timing-function: $timing-function;\n}\n@mixin animation-delay($delay) {\n  -webkit-animation-delay: $delay;\n          animation-delay: $delay;\n}\n@mixin animation-iteration-count($iteration-count) {\n  -webkit-animation-iteration-count: $iteration-count;\n          animation-iteration-count: $iteration-count;\n}\n@mixin animation-direction($direction) {\n  -webkit-animation-direction: $direction;\n          animation-direction: $direction;\n}\n@mixin animation-fill-mode($fill-mode) {\n  -webkit-animation-fill-mode: $fill-mode;\n          animation-fill-mode: $fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n@mixin backface-visibility($visibility) {\n  -webkit-backface-visibility: $visibility;\n     -moz-backface-visibility: $visibility;\n          backface-visibility: $visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n@mixin box-shadow($shadow...) {\n  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1\n          box-shadow: $shadow;\n}\n\n// Box sizing\n@mixin box-sizing($boxmodel) {\n  -webkit-box-sizing: $boxmodel;\n     -moz-box-sizing: $boxmodel;\n          box-sizing: $boxmodel;\n}\n\n// CSS3 Content Columns\n@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {\n  -webkit-column-count: $column-count;\n     -moz-column-count: $column-count;\n          column-count: $column-count;\n  -webkit-column-gap: $column-gap;\n     -moz-column-gap: $column-gap;\n          column-gap: $column-gap;\n}\n\n// Optional hyphenation\n@mixin hyphens($mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: $mode;\n     -moz-hyphens: $mode;\n      -ms-hyphens: $mode; // IE10+\n       -o-hyphens: $mode;\n          hyphens: $mode;\n}\n\n// Placeholder text\n@mixin placeholder($color: $input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: $color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome\n}\n\n// Transformations\n@mixin scale($ratio...) {\n  -webkit-transform: scale($ratio);\n      -ms-transform: scale($ratio); // IE9 only\n       -o-transform: scale($ratio);\n          transform: scale($ratio);\n}\n\n@mixin scaleX($ratio) {\n  -webkit-transform: scaleX($ratio);\n      -ms-transform: scaleX($ratio); // IE9 only\n       -o-transform: scaleX($ratio);\n          transform: scaleX($ratio);\n}\n@mixin scaleY($ratio) {\n  -webkit-transform: scaleY($ratio);\n      -ms-transform: scaleY($ratio); // IE9 only\n       -o-transform: scaleY($ratio);\n          transform: scaleY($ratio);\n}\n@mixin skew($x, $y) {\n  -webkit-transform: skewX($x) skewY($y);\n      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX($x) skewY($y);\n          transform: skewX($x) skewY($y);\n}\n@mixin translate($x, $y) {\n  -webkit-transform: translate($x, $y);\n      -ms-transform: translate($x, $y); // IE9 only\n       -o-transform: translate($x, $y);\n          transform: translate($x, $y);\n}\n@mixin translate3d($x, $y, $z) {\n  -webkit-transform: translate3d($x, $y, $z);\n          transform: translate3d($x, $y, $z);\n}\n@mixin rotate($degrees) {\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees); // IE9 only\n       -o-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n@mixin rotateX($degrees) {\n  -webkit-transform: rotateX($degrees);\n      -ms-transform: rotateX($degrees); // IE9 only\n       -o-transform: rotateX($degrees);\n          transform: rotateX($degrees);\n}\n@mixin rotateY($degrees) {\n  -webkit-transform: rotateY($degrees);\n      -ms-transform: rotateY($degrees); // IE9 only\n       -o-transform: rotateY($degrees);\n          transform: rotateY($degrees);\n}\n@mixin perspective($perspective) {\n  -webkit-perspective: $perspective;\n     -moz-perspective: $perspective;\n          perspective: $perspective;\n}\n@mixin perspective-origin($perspective) {\n  -webkit-perspective-origin: $perspective;\n     -moz-perspective-origin: $perspective;\n          perspective-origin: $perspective;\n}\n@mixin transform-origin($origin) {\n  -webkit-transform-origin: $origin;\n     -moz-transform-origin: $origin;\n      -ms-transform-origin: $origin; // IE9 only\n          transform-origin: $origin;\n}\n\n\n// Transitions\n\n@mixin transition($transition...) {\n  -webkit-transition: $transition;\n       -o-transition: $transition;\n          transition: $transition;\n}\n@mixin transition-property($transition-property...) {\n  -webkit-transition-property: $transition-property;\n          transition-property: $transition-property;\n}\n@mixin transition-delay($transition-delay) {\n  -webkit-transition-delay: $transition-delay;\n          transition-delay: $transition-delay;\n}\n@mixin transition-duration($transition-duration...) {\n  -webkit-transition-duration: $transition-duration;\n          transition-duration: $transition-duration;\n}\n@mixin transition-timing-function($timing-function) {\n  -webkit-transition-timing-function: $timing-function;\n          transition-timing-function: $timing-function;\n}\n@mixin transition-transform($transition...) {\n  -webkit-transition: -webkit-transform $transition;\n     -moz-transition: -moz-transform $transition;\n       -o-transition: -o-transform $transition;\n          transition: transform $transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n@mixin user-select($select) {\n  -webkit-user-select: $select;\n     -moz-user-select: $select;\n      -ms-user-select: $select; // IE10+\n          user-select: $select;\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: $btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);\n  @include user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      @include tab-focus;\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: $btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n    @include opacity(.65);\n    @include box-shadow(none);\n  }\n\n  // [converter] extracted a& to a.btn\n}\n\na.btn {\n  &.disabled,\n  fieldset[disabled] & {\n    pointer-events: none; // Future-proof disabling of clicks on `` elements\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);\n}\n.btn-primary {\n  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: $link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    @include box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: $link-hover-color;\n    text-decoration: $link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: $btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n.btn-xs {\n  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($color, $background, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n\n  &:focus,\n  &.focus {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 25%);\n  }\n  &:hover {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    color: $color;\n    background-color: darken($background, 10%);\n        border-color: darken($border, 12%);\n\n    &:hover,\n    &:focus,\n    &.focus {\n      color: $color;\n      background-color: darken($background, 17%);\n          border-color: darken($border, 25%);\n    }\n  }\n  &:active,\n  &.active,\n  .open > &.dropdown-toggle {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus,\n    &.focus {\n      background-color: $background;\n          border-color: $border;\n    }\n  }\n\n  .badge {\n    color: $background;\n    background-color: $color;\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  padding: $padding-vertical $padding-horizontal;\n  font-size: $font-size;\n  line-height: $line-height;\n  border-radius: $border-radius;\n}\n","@import \"shared\";\n\n// Provides cross-browser CSS opacity. Takes a number between 0 and 1 as the argument, e.g. 0.5 for 50% opacity.\n//\n//     @param $opacity\n//         A number between 0 and 1, where 0 is transparent and 1 is opaque.\n\n@mixin opacity($opacity) {\n  @if $legacy-support-for-ie6 or $legacy-support-for-ie7 or $legacy-support-for-ie8 {\n    filter: unquote(\"progid:DXImageTransform.Microsoft.Alpha(Opacity=#{round($opacity * 100)})\");\n  }\n  opacity: $opacity;\n}\n\n// Make an element completely transparent.\n@mixin transparent { @include opacity(0); }\n\n// Make an element completely opaque.\n@mixin opaque { @include opacity(1); }\n","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n//    without disabling user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n//  Star\n\n@at-root {\n  // Import the fonts\n  @font-face {\n    font-family: 'Glyphicons Halflings';\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot'), '#{$icon-font-path}#{$icon-font-name}.eot'));\n    src: url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.eot?#iefix'), '#{$icon-font-path}#{$icon-font-name}.eot?#iefix')) format('embedded-opentype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff2'), '#{$icon-font-path}#{$icon-font-name}.woff2')) format('woff2'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.woff'), '#{$icon-font-path}#{$icon-font-name}.woff')) format('woff'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.ttf'), '#{$icon-font-path}#{$icon-font-name}.ttf')) format('truetype'),\n         url(if($bootstrap-sass-asset-helper, twbs-font-path('#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}'), '#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}')) format('svg');\n  }\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\002a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  @include transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  // [converter] extracted tr&.in to tr.collapse.in\n  // [converter] extracted tbody&.in to tbody.collapse.in\n}\n\ntr.collapse.in    { display: table-row; }\n\ntbody.collapse.in { display: table-row-group; }\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  @include transition-property(height, visibility);\n  @include transition-duration(.35s);\n  @include transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   $caret-width-base dashed;\n  border-top:   $caret-width-base solid \\9; // IE8\n  border-right: $caret-width-base solid transparent;\n  border-left:  $caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: $zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: $font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: $dropdown-bg;\n  border: 1px solid $dropdown-fallback-border; // IE8 fallback\n  border: 1px solid $dropdown-border;\n  border-radius: $border-radius-base;\n  @include box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    @include nav-divider($dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: $line-height-base;\n    color: $dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: $dropdown-link-hover-color;\n    background-color: $dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: $dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: $dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    @include reset-filter;\n    cursor: $cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: $font-size-small;\n  line-height: $line-height-base;\n  color: $dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: ($zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: $caret-width-base dashed;\n    border-bottom: $caret-width-base solid \\9; // IE8\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      right: 0; left: auto;\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      left: 0; right: auto;\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n  height: 1px;\n  margin: (($line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: $color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n@mixin reset-filter() {\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  @include clearfix;\n\n  .btn,\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    @include border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { @extend .btn-xs; }\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: $caret-width-large $caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 $caret-width-large $caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    @include clearfix;\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    @include border-top-radius($btn-border-radius-base);\n    @include border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    @include border-top-radius(0);\n    @include border-bottom-radius($btn-border-radius-base);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    @include border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  @include border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n\n    &:focus {\n      z-index: 3;\n    }\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  @extend .input-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  @extend .input-sm;\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: $padding-base-vertical $padding-base-horizontal;\n  font-size: $font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: $input-color;\n  text-align: center;\n  background-color: $input-group-addon-bg;\n  border: 1px solid $input-group-addon-border-color;\n  border-radius: $input-border-radius;\n\n  // Sizing\n  &.input-sm {\n    padding: $padding-small-vertical $padding-small-horizontal;\n    font-size: $font-size-small;\n    border-radius: $input-border-radius-small;\n  }\n  &.input-lg {\n    padding: $padding-large-vertical $padding-large-horizontal;\n    font-size: $font-size-large;\n    border-radius: $input-border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  @include border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  @include border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      z-index: 2;\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  @include clearfix;\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: $nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: $nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: $nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: $nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: $cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: $nav-link-hover-bg;\n      border-color: $link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    @include nav-divider;\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid $nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: $line-height-base;\n      border: 1px solid transparent;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n      &:hover {\n        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-tabs-active-link-hover-color;\n        background-color: $nav-tabs-active-link-hover-bg;\n        border: 1px solid $nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    @extend .nav-justified;\n    @extend .nav-tabs-justified;\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: $nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $nav-pills-active-link-hover-color;\n        background-color: $nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: $border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid $nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: $screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid $nav-tabs-justified-link-border-color;\n      border-radius: $border-radius-base $border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: $nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  @include border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: $navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: $navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  @include clearfix;\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: $navbar-padding-horizontal;\n  padding-left:  $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  @include clearfix;\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: $navbar-collapse-max-height;\n\n    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -$navbar-padding-horizontal;\n    margin-left:  -$navbar-padding-horizontal;\n\n    @media (min-width: $grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: $zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: $zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: $grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: $navbar-padding-vertical $navbar-padding-horizontal;\n  font-size: $font-size-large;\n  line-height: $line-height-computed;\n  height: $navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -$navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: $navbar-padding-horizontal;\n  padding: 9px 10px;\n  @include navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: $border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: $grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: $line-height-computed;\n  }\n\n  @media (max-width: $grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: $line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    $navbar-padding-vertical;\n        padding-bottom: $navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -$navbar-padding-horizontal;\n  margin-right: -$navbar-padding-horizontal;\n  padding: 10px $navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  $shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  @include box-shadow($shadow);\n\n  // Mixin behavior for optimum display\n  @include form-inline;\n\n  .form-group {\n    @media (max-width: $grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  @include navbar-vertical-align($input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: $grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    @include box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  @include border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  @include border-top-radius($navbar-border-radius);\n  @include border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  @include navbar-vertical-align($input-height-base);\n\n  &.btn-sm {\n    @include navbar-vertical-align($input-height-small);\n  }\n  &.btn-xs {\n    @include navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  @include navbar-vertical-align($line-height-computed);\n\n  @media (min-width: $grid-float-breakpoint) {\n    float: left;\n    margin-left: $navbar-padding-horizontal;\n    margin-right: $navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: $grid-float-breakpoint) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  margin-right: -$navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: $navbar-default-bg;\n  border-color: $navbar-default-border;\n\n  .navbar-brand {\n    color: $navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-brand-hover-color;\n      background-color: $navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-hover-color;\n        background-color: $navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-active-color;\n        background-color: $navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n        background-color: $navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: $navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: $navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-default-link-active-bg;\n        color: $navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: $navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-hover-color;\n            background-color: $navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-active-color;\n            background-color: $navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-default-link-disabled-color;\n            background-color: $navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: $navbar-default-link-color;\n    &:hover {\n      color: $navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: $navbar-inverse-bg;\n  border-color: $navbar-inverse-border;\n\n  .navbar-brand {\n    color: $navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-brand-hover-color;\n      background-color: $navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: $navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: $navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-hover-color;\n        background-color: $navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-active-color;\n        background-color: $navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n        background-color: $navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: $navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: $navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: $navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken($navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: $navbar-inverse-link-active-bg;\n        color: $navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: $grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: $navbar-inverse-border;\n        }\n        .divider {\n          background-color: $navbar-inverse-border;\n        }\n        > li > a {\n          color: $navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-hover-color;\n            background-color: $navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-active-color;\n            background-color: $navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: $navbar-inverse-link-disabled-color;\n            background-color: $navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: $navbar-inverse-link-color;\n    &:hover {\n      color: $navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: $navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: $navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: $navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n@mixin navbar-vertical-align($element-height) {\n  margin-top: (($navbar-height - $element-height) / 2);\n  margin-bottom: (($navbar-height - $element-height) / 2);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;\n  margin-bottom: $line-height-computed;\n  list-style: none;\n  background-color: $breadcrumb-bg;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      // [converter] Workaround for https://github.com/sass/libsass/issues/1115\n      $nbsp: \"\\00a0\";\n      content: \"#{$breadcrumb-separator}#{$nbsp}\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: $breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: $breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  border-radius: $border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: $padding-base-vertical $padding-base-horizontal;\n      line-height: $line-height-base;\n      text-decoration: none;\n      color: $pagination-color;\n      background-color: $pagination-bg;\n      border: 1px solid $pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        @include border-left-radius($border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: $pagination-hover-color;\n      background-color: $pagination-hover-bg;\n      border-color: $pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 3;\n      color: $pagination-active-color;\n      background-color: $pagination-active-bg;\n      border-color: $pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: $pagination-disabled-color;\n      background-color: $pagination-disabled-bg;\n      border-color: $pagination-disabled-border;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);\n}\n","// Pagination\n\n@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: $padding-vertical $padding-horizontal;\n      font-size: $font-size;\n      line-height: $line-height;\n    }\n    &:first-child {\n      > a,\n      > span {\n        @include border-left-radius($border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        @include border-right-radius($border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: $line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  @include clearfix;\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: $pager-bg;\n      border: 1px solid $pager-border;\n      border-radius: $pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: $pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: $pager-disabled-color;\n      background-color: $pager-bg;\n      cursor: $cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: $label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // [converter] extracted a& to a.label\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Add hover effects, but only for links\na.label {\n  &:hover,\n  &:focus {\n    color: $label-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  @include label-variant($label-default-bg);\n}\n\n.label-primary {\n  @include label-variant($label-primary-bg);\n}\n\n.label-success {\n  @include label-variant($label-success-bg);\n}\n\n.label-info {\n  @include label-variant($label-info-bg);\n}\n\n.label-warning {\n  @include label-variant($label-warning-bg);\n}\n\n.label-danger {\n  @include label-variant($label-danger-bg);\n}\n","// Labels\n\n@mixin label-variant($color) {\n  background-color: $color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken($color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: $font-size-small;\n  font-weight: $badge-font-weight;\n  color: $badge-color;\n  line-height: $badge-line-height;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: $badge-bg;\n  border-radius: $badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // [converter] extracted a& to a.badge\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: $badge-active-color;\n    background-color: $badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: $badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding-top:    $jumbotron-padding;\n  padding-bottom: $jumbotron-padding;\n  margin-bottom: $jumbotron-padding;\n  color: $jumbotron-color;\n  background-color: $jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: $jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: ($jumbotron-padding / 2);\n    font-size: $jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken($jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container\n    padding-left:  ($grid-gutter-width / 2);\n    padding-right: ($grid-gutter-width / 2);\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: $screen-sm-min) {\n    padding-top:    ($jumbotron-padding * 1.6);\n    padding-bottom: ($jumbotron-padding * 1.6);\n\n    .container &,\n    .container-fluid & {\n      padding-left:  ($jumbotron-padding * 2);\n      padding-right: ($jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: $jumbotron-heading-font-size;\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: $thumbnail-padding;\n  margin-bottom: $line-height-computed;\n  line-height: $line-height-base;\n  background-color: $thumbnail-bg;\n  border: 1px solid $thumbnail-border;\n  border-radius: $thumbnail-border-radius;\n  @include transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    @include img-responsive;\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active\n\n  // Image captions\n  .caption {\n    padding: $thumbnail-caption-padding;\n    color: $thumbnail-caption-color;\n  }\n}\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: $link-color;\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: $alert-padding;\n  margin-bottom: $line-height-computed;\n  border: 1px solid transparent;\n  border-radius: $alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing $headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: $alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: ($alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);\n}\n\n.alert-info {\n  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);\n}\n\n.alert-warning {\n  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);\n}\n\n.alert-danger {\n  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);\n}\n","// Alerts\n\n@mixin alert-variant($background, $border, $text-color) {\n  background-color: $background;\n  border-color: $border;\n  color: $text-color;\n\n  hr {\n    border-top-color: darken($border, 5%);\n  }\n  .alert-link {\n    color: darken($text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: $line-height-computed;\n  margin-bottom: $line-height-computed;\n  background-color: $progress-bg;\n  border-radius: $progress-border-radius;\n  @include box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: $font-size-small;\n  line-height: $line-height-computed;\n  color: $progress-bar-color;\n  text-align: center;\n  background-color: $progress-bar-bg;\n  @include box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  @include transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  @include gradient-striped;\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  @include animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  @include progress-bar-variant($progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  @include progress-bar-variant($progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  @include progress-bar-variant($progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  @include progress-bar-variant($progress-bar-danger-bg);\n}\n","// Gradients\n\n\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n// Color stops are not available in IE9 and below.\n@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n  background-repeat: repeat-x;\n  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+\n  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12\n  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n}\n@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n  background-repeat: no-repeat;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n  background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n","// Progress bars\n\n@mixin progress-bar-variant($color) {\n  background-color: $color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    @include gradient-striped;\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n\n  // Fix collapse in webkit from max-width: 100% and display: table-cell.\n  &.img-thumbnail {\n    max-width: none;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on 
          ,
            , or
            .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: $list-group-bg;\n border: 1px solid $list-group-border;\n\n // Round the first and last items\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: $list-group-link-color;\n\n .list-group-item-heading {\n color: $list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: $list-group-link-hover-color;\n background-color: $list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: $list-group-disabled-bg;\n color: $list-group-disabled-color;\n cursor: $cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: $list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: $list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@include list-group-item-variant(success, $state-success-bg, $state-success-text);\n@include list-group-item-variant(info, $state-info-bg, $state-info-text);\n@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);\n@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n\n // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}\n }\n\n a.list-group-item-#{$state},\n button.list-group-item-#{$state} {\n color: $color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: $color;\n border-color: $color;\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: $line-height-computed;\n background-color: $panel-bg;\n border: 1px solid transparent;\n border-radius: $panel-border-radius;\n @include box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: $panel-body-padding;\n @include clearfix;\n}\n\n// Optional heading\n.panel-heading {\n padding: $panel-heading-padding;\n border-bottom: 1px solid transparent;\n @include border-top-radius(($panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil(($font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: $panel-footer-padding;\n background-color: $panel-footer-bg;\n border-top: 1px solid $panel-inner-border;\n @include border-bottom-radius(($panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n @include border-top-radius(($panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n @include border-bottom-radius(($panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n @include border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: $panel-body-padding;\n padding-right: $panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n @include border-top-radius(($panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: ($panel-border-radius - 1);\n border-top-right-radius: ($panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: ($panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: ($panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n @include border-bottom-radius(($panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: ($panel-border-radius - 1);\n border-bottom-right-radius: ($panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: ($panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: ($panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid $table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: $line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: $panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid $panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid $panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);\n}\n.panel-primary {\n @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);\n}\n.panel-success {\n @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);\n}\n.panel-info {\n @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);\n}\n.panel-warning {\n @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);\n}\n.panel-danger {\n @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);\n}\n","// Panels\n\n@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {\n border-color: $border;\n\n & > .panel-heading {\n color: $heading-text-color;\n background-color: $heading-bg-color;\n border-color: $heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: $border;\n }\n .badge {\n color: $heading-bg-color;\n background-color: $heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: $border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: $well-bg;\n border: 1px solid $well-border;\n border-radius: $border-radius-base;\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: $border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: $border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: ($font-size-base * 1.5);\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n @include opacity(.2);\n\n &:hover,\n &:focus {\n color: $close-color;\n text-decoration: none;\n cursor: pointer;\n @include opacity(.5);\n }\n\n // [converter] extracted button& to button.close\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n @include translate(0, -25%);\n @include transition-transform(0.3s ease-out);\n }\n &.in .modal-dialog { @include translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: $modal-content-bg;\n border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid $modal-content-border-color;\n border-radius: $border-radius-large;\n @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal-background;\n background-color: $modal-backdrop-bg;\n // Fade for backdrop\n &.fade { @include opacity(0); }\n &.in { @include opacity($modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: $modal-title-padding;\n border-bottom: 1px solid $modal-header-border-color;\n @include clearfix;\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: $modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid $modal-footer-border-color;\n @include clearfix; // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: $screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: $modal-md;\n margin: 30px auto;\n }\n .modal-content {\n @include box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: $modal-sm; }\n}\n\n@media (min-width: $screen-md-min) {\n .modal-lg { width: $modal-lg; }\n}\n","@import \"shared\";\n\n// @doc off\n// Note ----------------------------------------------------------------------\n// Safari, Chrome, and Firefox all support 3D transforms. However,\n// only in the most recent builds. You should also provide fallback 2d support for\n// Opera and IE. IE10 is slated to have 3d enabled, but is currently unreleased.\n// To make that easy, all 2D transforms include an browser-targeting toggle ($only3d)\n// to switch between the two support lists. The toggle defaults to 'false' (2D),\n// and also accepts 'true' (3D). Currently the lists are as follows:\n// 2D: Mozilla, Webkit, Opera, Official\n// 3D: Webkit, Firefox.\n\n// Available Transforms ------------------------------------------------------\n// - Scale (2d and 3d)\n// - Rotate (2d and 3d)\n// - Translate (2d and 3d)\n// - Skew (2d only)\n\n// Transform Parameters ------------------------------------------------------\n// - Transform Origin (2d and 3d)\n// - Perspective (3d)\n// - Perspective Origin (3d)\n// - Transform Style (3d)\n// - Backface Visibility (3d)\n\n// Mixins --------------------------------------------------------------------\n// transform-origin\n// - shortcuts: transform-origin2d, transform-origin3d\n// - helpers: apply-origin\n// transform\n// - shortcuts: transform2d, transform3d\n// - helpers: simple-transform, create-transform\n// perspective\n// - helpers: perspective-origin\n// transform-style\n// backface-visibility\n// scale\n// - shortcuts: scaleX, scaleY, scaleZ, scale3d\n// rotate\n// - shortcuts: rotateX, rotateY, rotate3d\n// translate\n// - shortcuts: translateX, translateY, translateZ, translate3d\n// skew\n// - shortcuts: skewX, skewY\n\n// Defaults ------------------------------------------------------------------\n// @doc on\n\n// The default x-origin for transforms\n$default-origin-x : 50% !default;\n// The default y-origin for transforms\n$default-origin-y : 50% !default;\n// The default z-origin for transforms\n$default-origin-z : 50% !default;\n\n\n// The default x-multiplier for scaling\n$default-scale-x : 1.25 !default;\n// The default y-multiplier for scaling\n$default-scale-y : $default-scale-x !default;\n// The default z-multiplier for scaling\n$default-scale-z : $default-scale-x !default;\n\n\n// The default angle for rotations\n$default-rotate : 45deg !default;\n\n\n// The default x-vector for the axis of 3d rotations\n$default-vector-x : 1 !default;\n// The default y-vector for the axis of 3d rotations\n$default-vector-y : 1 !default;\n// The default z-vector for the axis of 3d rotations\n$default-vector-z : 1 !default;\n\n\n// The default x-length for translations\n$default-translate-x : 1em !default;\n// The default y-length for translations\n$default-translate-y : $default-translate-x !default;\n// The default z-length for translations\n$default-translate-z : $default-translate-x !default;\n\n\n// The default x-angle for skewing\n$default-skew-x : 5deg !default;\n// The default y-angle for skewing\n$default-skew-y : 5deg !default;\n\n\n// **Transform-origin**\n// Transform-origin sent as a complete string\n//\n// @include apply-origin( origin [, 3D-only ] )\n//\n// where 'origin' is a space separated list containing 1-3 (x/y/z) coordinates\n// in percentages, absolute (px, cm, in, em etc..) or relative\n// (left, top, right, bottom, center) units\n//\n// @param only3d Set this to true to only apply this\n// mixin where browsers have 3D support.\n@mixin apply-origin($origin, $only3d) {\n $only3d: $only3d or -compass-list-size(-compass-list($origin)) > 2;\n @if $only3d {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Transform-origin sent as individual arguments:\n//\n// @include transform-origin( [ origin-x, origin-y, origin-z, 3D-only ] )\n//\n// where the 3 'origin-' arguments represent x/y/z coordinates.\n//\n// **NOTE:** setting z coordinates triggers 3D support list, leave false for 2D support\n@mixin transform-origin(\n $origin-x: $default-origin-x,\n $origin-y: $default-origin-y,\n $origin-z: false,\n $only3d: if($origin-z, true, false)\n) {\n $origin: unquote('');\n @if $origin-x or $origin-y or $origin-z {\n @if $origin-x { $origin: $origin-x; } @else { $origin: 50%; }\n @if $origin-y { $origin: $origin $origin-y; } @else { @if $origin-z { $origin: $origin 50%; }}\n @if $origin-z { $origin: $origin $origin-z; }\n @include apply-origin($origin, $only3d);\n }\n}\n\n\n// Transform sent as a complete string:\n//\n// @include transform( transforms [, 3D-only ] )\n//\n// where 'transforms' is a space separated list of all the transforms to be applied.\n@mixin transform(\n $transform,\n $only3d: false\n) {\n @if $only3d {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n } @else {\n @include experimental(transform, $transform,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n }\n}\n\n// Shortcut to target all browsers with 2D transform support\n@mixin transform2d($trans) {\n @include transform($trans, false);\n}\n\n// Shortcut to target only browsers with 3D transform support\n@mixin transform3d($trans) {\n @include transform($trans, true);\n}\n\n// @doc off\n// 3D Parameters -------------------------------------------------------------\n// @doc on\n\n// Set the perspective of 3D transforms on the children of an element:\n//\n// @include perspective( perspective )\n//\n// where 'perspective' is a unitless number representing the depth of the\n// z-axis. The higher the perspective, the more exaggerated the foreshortening.\n// values from 500 to 1000 are more-or-less \"normal\" - a good starting-point.\n@mixin perspective($p) {\n @include experimental(perspective, $p,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Set the origin position for the perspective\n//\n// @include perspective-origin(origin-x [origin-y])\n//\n// where the two arguments represent x/y coordinates\n@mixin perspective-origin($origin: 50%) {\n @include experimental(perspective-origin, $origin,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine whether a 3D objects children also live in the given 3D space\n//\n// @include transform-style( [ style ] )\n//\n// where `style` can be either `flat` or `preserve-3d`.\n// Browsers default to `flat`, mixin defaults to `preserve-3d`.\n@mixin transform-style($style: preserve-3d) {\n @include experimental(transform-style, $style,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// Determine the visibility of an element when it's back is turned\n//\n// @include backface-visibility( [ visibility ] )\n//\n// where `visibility` can be either `visible` or `hidden`.\n// Browsers default to visible, mixin defaults to hidden\n@mixin backface-visibility($visibility: hidden) {\n @include experimental(backface-visibility, $visibility,\n -moz, -webkit, -o, -ms, not(-khtml), official\n );\n}\n\n// @doc off\n// Transform Partials --------------------------------------------------------\n// These work well on their own, but they don't add to each other, they override.\n// Use along with transform parameter mixins to adjust origin, perspective and style\n// ---------------------------------------------------------------------------\n\n\n// Scale ---------------------------------------------------------------------\n// @doc on\n\n// Scale an object along the x and y axis:\n//\n// @include scale( [ scale-x, scale-y, perspective, 3D-only ] )\n//\n// where the 'scale-' arguments are unitless multipliers of the x and y dimensions\n// and perspective, which works the same as the stand-alone perspective property/mixin\n// but applies to the individual element (multiplied with any parent perspective)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale(\n $scale-x: $default-scale-x,\n $scale-y: $scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scale($scale-x, $scale-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the x axis\n// @include scaleX( [ scale-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleX(\n $scale: $default-scale-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleX($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the y axis\n// @include scaleY( [ scale-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleY(\n $scale: $default-scale-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: scaleY($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Scale an object along the z axis\n// @include scaleZ( [ scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scaleZ(\n $scale: $default-scale-z,\n $perspective: false\n) {\n $trans: scaleZ($scale);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Scale and object along all three axis\n// @include scale3d( [ scale-x, scale-y, scale-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin scale3d(\n $scale-x: $default-scale-x,\n $scale-y: $default-scale-y,\n $scale-z: $default-scale-z,\n $perspective: false\n) {\n $trans: scale3d($scale-x, $scale-y, $scale-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Rotate --------------------------------------------------------------------\n// @doc on\n\n// Rotate an object around the z axis (2D)\n// @include rotate( [ rotation, perspective, 3D-only ] )\n// where 'rotation' is an angle set in degrees (deg) or radian (rad) units\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n $trans: rotate($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// A longcut for 'rotate' in case you forget that 'z' is implied\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateZ(\n $rotate: $default-rotate,\n $perspective: false,\n $only3d: false\n) {\n @include rotate($rotate, $perspective, $only3d);\n}\n\n// Rotate an object around the x axis (3D)\n// @include rotateX( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateX(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateX($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around the y axis (3D)\n// @include rotate( [ rotation, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotateY(\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotateY($rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Rotate an object around an arbitrary axis (3D)\n// @include rotate( [ vector-x, vector-y, vector-z, rotation, perspective ] )\n// where the 'vector-' arguments accept unitless numbers.\n// These numbers are not important on their own, but in relation to one another\n// creating an axis from your transform-origin, along the axis of Xx = Yy = Zz.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin rotate3d(\n $vector-x: $default-vector-x,\n $vector-y: $default-vector-y,\n $vector-z: $default-vector-z,\n $rotate: $default-rotate,\n $perspective: false\n) {\n $trans: rotate3d($vector-x, $vector-y, $vector-z, $rotate);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Translate -----------------------------------------------------------------\n// @doc on\n\n// Move an object along the x or y axis (2D)\n// @include translate( [ translate-x, translate-y, perspective, 3D-only ] )\n// where the 'translate-' arguments accept any distance in percentages or absolute (px, cm, in, em etc..) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translate($translate-x, $translate-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the x axis (2D)\n// @include translate( [ translate-x, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateX(\n $trans-x: $default-translate-x,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateX($trans-x);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the y axis (2D)\n// @include translate( [ translate-y, perspective, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateY(\n $trans-y: $default-translate-y,\n $perspective: false,\n $only3d: false\n) {\n $trans: translateY($trans-y);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform($trans, $only3d);\n}\n\n// Move an object along the z axis (3D)\n// @include translate( [ translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translateZ(\n $trans-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translateZ($trans-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// Move an object along the x, y and z axis (3D)\n// @include translate( [ translate-x, translate-y, translate-z, perspective ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin translate3d(\n $translate-x: $default-translate-x,\n $translate-y: $default-translate-y,\n $translate-z: $default-translate-z,\n $perspective: false\n) {\n $trans: translate3d($translate-x, $translate-y, $translate-z);\n @if $perspective { $trans: perspective($perspective) $trans; }\n @include transform3d($trans);\n}\n\n// @doc off\n// Skew ----------------------------------------------------------------------\n// @doc on\n\n// Skew an element:\n//\n// @include skew( [ skew-x, skew-y, 3D-only ] )\n//\n// where the 'skew-' arguments accept css angles in degrees (deg) or radian (rad) units.\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skew(\n $skew-x: $default-skew-x,\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skew($skew-x, $skew-y);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the x axiz\n//\n// @include skew( [ skew-x, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewX(\n $skew-x: $default-skew-x,\n $only3d: false\n) {\n $trans: skewX($skew-x);\n @include transform($trans, $only3d);\n}\n\n// Skew an element along the y axis\n//\n// @include skew( [ skew-y, 3D-only ] )\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin skewY(\n $skew-y: $default-skew-y,\n $only3d: false\n) {\n $trans: skewY($skew-y);\n @include transform($trans, $only3d);\n}\n\n\n// Full transform mixins\n// For settings any combination of transforms as arguments\n// These are complex and not highly recommended for daily use. They are mainly\n// here for backward-compatibility purposes.\n//\n// * they include origin adjustments\n// * scale takes a multiplier (unitless), rotate and skew take degrees (deg)\n//\n// **Note** This mixin cannot be combined with other transform mixins.\n@mixin create-transform(\n $perspective: false,\n $scale-x: false,\n $scale-y: false,\n $scale-z: false,\n $rotate-x: false,\n $rotate-y: false,\n $rotate-z: false,\n $rotate3d: false,\n $trans-x: false,\n $trans-y: false,\n $trans-z: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false,\n $origin-z: false,\n $only3d: false\n) {\n $trans: unquote(\"\");\n\n // perspective\n @if $perspective { $trans: perspective($perspective) ; }\n\n // scale\n @if $scale-x and $scale-y {\n @if $scale-z { $trans: $trans scale3d($scale-x, $scale-y, $scale-z); }\n @else { $trans: $trans scale($scale-x, $scale-y); }\n } @else {\n @if $scale-x { $trans: $trans scaleX($scale-x); }\n @if $scale-y { $trans: $trans scaleY($scale-y); }\n @if $scale-z { $trans: $trans scaleZ($scale-z); }\n }\n\n // rotate\n @if $rotate-x { $trans: $trans rotateX($rotate-x); }\n @if $rotate-y { $trans: $trans rotateY($rotate-y); }\n @if $rotate-z { $trans: $trans rotateZ($rotate-z); }\n @if $rotate3d { $trans: $trans rotate3d($rotate3d); }\n\n // translate\n @if $trans-x and $trans-y {\n @if $trans-z { $trans: $trans translate3d($trans-x, $trans-y, $trans-z); }\n @else { $trans: $trans translate($trans-x, $trans-y); }\n } @else {\n @if $trans-x { $trans: $trans translateX($trans-x); }\n @if $trans-y { $trans: $trans translateY($trans-y); }\n @if $trans-z { $trans: $trans translateZ($trans-z); }\n }\n\n // skew\n @if $skew-x and $skew-y { $trans: $trans skew($skew-x, $skew-y); }\n @else {\n @if $skew-x { $trans: $trans skewX($skew-x); }\n @if $skew-y { $trans: $trans skewY($skew-y); }\n }\n\n // apply it!\n @include transform($trans, $only3d);\n @include transform-origin($origin-x, $origin-y, $origin-z, $only3d);\n}\n\n\n// A simplified set of options\n// backwards-compatible with the previous version of the 'transform' mixin\n@mixin simple-transform(\n $scale: false,\n $rotate: false,\n $trans-x: false,\n $trans-y: false,\n $skew-x: false,\n $skew-y: false,\n $origin-x: false,\n $origin-y: false\n) {\n @include create-transform(\n false,\n $scale, $scale, false,\n false, false, $rotate, false,\n $trans-x, $trans-y, false,\n $skew-x, $skew-y,\n $origin-x, $origin-y, false,\n false\n );\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text;\n font-size: $font-size-small;\n\n @include opacity(0);\n\n &.in { @include opacity($tooltip-opacity); }\n &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: 3px 8px;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n border-radius: $border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: $tooltip-arrow-width;\n margin-bottom: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: $tooltip-arrow-width;\n margin-bottom: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n border-right-color: $tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -$tooltip-arrow-width;\n border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-left-color: $tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: $tooltip-arrow-width;\n margin-top: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: $tooltip-arrow-width;\n margin-top: -$tooltip-arrow-width;\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n}\n","@mixin reset-text() {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: none;\n max-width: $popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text;\n font-size: $font-size-base;\n\n background-color: $popover-bg;\n background-clip: padding-box;\n border: 1px solid $popover-fallback-border-color;\n border: 1px solid $popover-border-color;\n border-radius: $border-radius-large;\n @include box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -$popover-arrow-width; }\n &.right { margin-left: $popover-arrow-width; }\n &.bottom { margin-top: $popover-arrow-width; }\n &.left { margin-left: -$popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: $font-size-base;\n background-color: $popover-title-bg;\n border-bottom: 1px solid darken($popover-title-bg, 5%);\n border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: $popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: $popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -$popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: $popover-arrow-outer-color;\n bottom: -$popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -$popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: $popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -$popover-arrow-outer-width;\n margin-top: -$popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: $popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -$popover-arrow-width;\n border-left-width: 0;\n border-right-color: $popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -$popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: $popover-arrow-outer-color;\n top: -$popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -$popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: $popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -$popover-arrow-outer-width;\n margin-top: -$popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: $popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: $popover-arrow-color;\n bottom: -$popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n @include transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n @include img-responsive;\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n @include transition-transform(0.6s ease-in-out);\n @include backface-visibility(hidden);\n @include perspective(1000px);\n\n &.next,\n &.active.right {\n @include translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n @include translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n @include translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: $carousel-control-width;\n @include opacity($carousel-control-opacity);\n font-size: $carousel-control-font-size;\n color: $carousel-control-color;\n text-align: center;\n text-shadow: $carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: $carousel-control-color;\n text-decoration: none;\n @include opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid $carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: $carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n text-shadow: $carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: $screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: ($carousel-control-font-size * 1.5);\n height: ($carousel-control-font-size * 1.5);\n margin-top: ($carousel-control-font-size / -2);\n font-size: ($carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: ($carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: ($carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n @include clearfix;\n}\n.center-block {\n @include center-block;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n @include text-hide;\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","// Center-align a block level element\n\n@mixin center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// Indicates the direction you prefer to move your text\n// when hiding it.\n//\n// `left` is more robust, especially in older browsers.\n// `right` seems have better runtime performance.\n$hide-text-direction: left !default;\n\n// Hides html text and replaces it with an image.\n// If you use this on an inline element, you will need to change the display to block or inline-block.\n// Also, if the size of the image differs significantly from the font size, you'll need to set the width and/or height.\n//\n// Parameters:\n//\n// * `img` -- the relative path from the project image directory to the image, or a url literal.\n// * `x` -- the x position of the background image.\n// * `y` -- the y position of the background image.\n@mixin replace-text($img, $x: 50%, $y: 50%) {\n @include hide-text;\n background: {\n @if is-url($img) {\n image: $img;\n } @else {\n image: image-url($img);\n }\n repeat: no-repeat;\n position: $x $y;\n };\n}\n\n// Like the `replace-text` mixin, but also sets the width\n// and height of the element according the dimensions of the image.\n//\n// If you set `$inline` to true, then an inline image (data uri) will be used.\n@mixin replace-text-with-dimensions($img, $x: 50%, $y: 50%, $inline: false) {\n @include replace-text(if($inline, inline-image($img), $img), $x, $y);\n width: image-width($img);\n height: image-height($img);\n}\n\n// Hides text in an element so you can see the background.\n//\n// The direction indicates how the text should be moved out of view.\n//\n// See `$hide-text-direction` for more information and to set this globally\n// for your application.\n@mixin hide-text($direction: $hide-text-direction) {\n @if $direction == left {\n $approximate-em-value: 12px / 1em;\n $wider-than-any-screen: -9999em;\n text-indent: $wider-than-any-screen * $approximate-em-value;\n overflow: hidden;\n text-align: left;\n } @else {\n // slightly wider than the box prevents issues with inline-block elements\n text-indent: 110%;\n white-space: nowrap;\n overflow: hidden;\n }\n}\n\n// Hides text in an element by squishing the text into oblivion.\n// Use this if you need to hide text contained in an inline element\n// but still have it read by a screen reader.\n@mixin squish-text {\n font: 0/0 serif;\n text-shadow: none;\n color: transparent;\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@at-root {\n @-ms-viewport {\n width: device-width;\n }\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n\n@include responsive-invisibility('.visible-xs');\n@include responsive-invisibility('.visible-sm');\n@include responsive-invisibility('.visible-md');\n@include responsive-invisibility('.visible-lg');\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n@media (max-width: $screen-xs-max) {\n @include responsive-visibility('.visible-xs');\n}\n.visible-xs-block {\n @media (max-width: $screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: $screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: $screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n @include responsive-visibility('.visible-sm');\n}\n.visible-sm-block {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n @include responsive-visibility('.visible-md');\n}\n.visible-md-block {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n display: inline-block !important;\n }\n}\n\n@media (min-width: $screen-lg-min) {\n @include responsive-visibility('.visible-lg');\n}\n.visible-lg-block {\n @media (min-width: $screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: $screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: $screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n@media (max-width: $screen-xs-max) {\n @include responsive-invisibility('.hidden-xs');\n}\n\n@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {\n @include responsive-invisibility('.hidden-sm');\n}\n\n@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {\n @include responsive-invisibility('.hidden-md');\n}\n\n@media (min-width: $screen-lg-min) {\n @include responsive-invisibility('.hidden-lg');\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n\n@include responsive-invisibility('.visible-print');\n\n@media print {\n @include responsive-visibility('.visible-print');\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n@media print {\n @include responsive-invisibility('.hidden-print');\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n// [converter] $parent hack\n@mixin responsive-visibility($parent) {\n #{$parent} {\n display: block !important;\n }\n table#{$parent} { display: table !important; }\n tr#{$parent} { display: table-row !important; }\n th#{$parent},\n td#{$parent} { display: table-cell !important; }\n}\n\n// [converter] $parent hack\n@mixin responsive-invisibility($parent) {\n #{$parent} {\n display: none !important;\n }\n}\n","/*!\n * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome\n * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"animated\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n","/* FONT PATH\n * -------------------------- */\n\n@font-face {\n font-family: 'FontAwesome';\n src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\n url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n font-weight: normal;\n font-style: normal;\n}\n","// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n display: inline-block;\n font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n font-size: inherit; // can't have font-size inherit on line above, so need to override\n text-rendering: auto; // optimizelegibility throws things off #1094\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n}\n","// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n font-size: (4em / 3);\n line-height: (3em / 4);\n vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n","// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n width: (18em / 14);\n text-align: center;\n}\n","// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n padding-left: 0;\n margin-left: $fa-li-width;\n list-style-type: none;\n > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n position: absolute;\n left: -$fa-li-width;\n width: $fa-li-width;\n top: (2em / 14);\n text-align: center;\n &.#{$fa-css-prefix}-lg {\n left: -$fa-li-width + (4em / 14);\n }\n}\n","// Variables\n// --------------------------\n\n$fa-font-path: \"../fonts\" !default;\n$fa-font-size-base: 14px !default;\n$fa-line-height-base: 1 !default;\n//$fa-font-path: \"//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix: fa !default;\n$fa-version: \"4.4.0\" !default;\n$fa-border-color: #eee !default;\n$fa-inverse: #fff !default;\n$fa-li-width: (30em / 14) !default;\n\n$fa-var-500px: \"\\f26e\";\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-amazon: \"\\f270\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-balance-scale: \"\\f24e\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-battery-0: \"\\f244\";\n$fa-var-battery-1: \"\\f243\";\n$fa-var-battery-2: \"\\f242\";\n$fa-var-battery-3: \"\\f241\";\n$fa-var-battery-4: \"\\f240\";\n$fa-var-battery-empty: \"\\f244\";\n$fa-var-battery-full: \"\\f240\";\n$fa-var-battery-half: \"\\f242\";\n$fa-var-battery-quarter: \"\\f243\";\n$fa-var-battery-three-quarters: \"\\f241\";\n$fa-var-bed: \"\\f236\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-black-tie: \"\\f27e\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-buysellads: \"\\f20d\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-check-o: \"\\f274\";\n$fa-var-calendar-minus-o: \"\\f272\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-calendar-plus-o: \"\\f271\";\n$fa-var-calendar-times-o: \"\\f273\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cart-arrow-down: \"\\f218\";\n$fa-var-cart-plus: \"\\f217\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-diners-club: \"\\f24c\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-jcb: \"\\f24b\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-chrome: \"\\f268\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-clone: \"\\f24d\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-commenting: \"\\f27a\";\n$fa-var-commenting-o: \"\\f27b\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-connectdevelop: \"\\f20e\";\n$fa-var-contao: \"\\f26d\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-creative-commons: \"\\f25e\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-dashcube: \"\\f210\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-diamond: \"\\f219\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-expeditedssl: \"\\f23e\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-f: \"\\f09a\";\n$fa-var-facebook-official: \"\\f230\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-feed: \"\\f09e\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-firefox: \"\\f269\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-fonticons: \"\\f280\";\n$fa-var-forumbee: \"\\f211\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-genderless: \"\\f22d\";\n$fa-var-get-pocket: \"\\f265\";\n$fa-var-gg: \"\\f260\";\n$fa-var-gg-circle: \"\\f261\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-gratipay: \"\\f184\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-grab-o: \"\\f255\";\n$fa-var-hand-lizard-o: \"\\f258\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hand-paper-o: \"\\f256\";\n$fa-var-hand-peace-o: \"\\f25b\";\n$fa-var-hand-pointer-o: \"\\f25a\";\n$fa-var-hand-rock-o: \"\\f255\";\n$fa-var-hand-scissors-o: \"\\f257\";\n$fa-var-hand-spock-o: \"\\f259\";\n$fa-var-hand-stop-o: \"\\f256\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-heartbeat: \"\\f21e\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-hotel: \"\\f236\";\n$fa-var-hourglass: \"\\f254\";\n$fa-var-hourglass-1: \"\\f251\";\n$fa-var-hourglass-2: \"\\f252\";\n$fa-var-hourglass-3: \"\\f253\";\n$fa-var-hourglass-end: \"\\f253\";\n$fa-var-hourglass-half: \"\\f252\";\n$fa-var-hourglass-o: \"\\f250\";\n$fa-var-hourglass-start: \"\\f251\";\n$fa-var-houzz: \"\\f27c\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-i-cursor: \"\\f246\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-industry: \"\\f275\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-internet-explorer: \"\\f26b\";\n$fa-var-intersex: \"\\f224\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-leanpub: \"\\f212\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map: \"\\f279\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-map-o: \"\\f278\";\n$fa-var-map-pin: \"\\f276\";\n$fa-var-map-signs: \"\\f277\";\n$fa-var-mars: \"\\f222\";\n$fa-var-mars-double: \"\\f227\";\n$fa-var-mars-stroke: \"\\f229\";\n$fa-var-mars-stroke-h: \"\\f22b\";\n$fa-var-mars-stroke-v: \"\\f22a\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medium: \"\\f23a\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-mercury: \"\\f223\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-motorcycle: \"\\f21c\";\n$fa-var-mouse-pointer: \"\\f245\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-neuter: \"\\f22c\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-object-group: \"\\f247\";\n$fa-var-object-ungroup: \"\\f248\";\n$fa-var-odnoklassniki: \"\\f263\";\n$fa-var-odnoklassniki-square: \"\\f264\";\n$fa-var-opencart: \"\\f23d\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-opera: \"\\f26a\";\n$fa-var-optin-monster: \"\\f23c\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f1a7\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-p: \"\\f231\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-registered: \"\\f25d\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-safari: \"\\f267\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-sellsy: \"\\f213\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-server: \"\\f233\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-ship: \"\\f21a\";\n$fa-var-shirtsinbulk: \"\\f214\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-simplybuilt: \"\\f215\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skyatlas: \"\\f216\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-sticky-note: \"\\f249\";\n$fa-var-sticky-note-o: \"\\f24a\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-street-view: \"\\f21d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-subway: \"\\f239\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-television: \"\\f26c\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-trademark: \"\\f25c\";\n$fa-var-train: \"\\f238\";\n$fa-var-transgender: \"\\f224\";\n$fa-var-transgender-alt: \"\\f225\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-tripadvisor: \"\\f262\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-tv: \"\\f26c\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-user-plus: \"\\f234\";\n$fa-var-user-secret: \"\\f21b\";\n$fa-var-user-times: \"\\f235\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-venus: \"\\f221\";\n$fa-var-venus-double: \"\\f226\";\n$fa-var-venus-mars: \"\\f228\";\n$fa-var-viacoin: \"\\f237\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo: \"\\f27d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-whatsapp: \"\\f232\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-wikipedia-w: \"\\f266\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-y-combinator: \"\\f23b\";\n$fa-var-y-combinator-square: \"\\f1d4\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yc: \"\\f23b\";\n$fa-var-yc-square: \"\\f1d4\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n","// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n padding: .2em .25em .15em;\n border: solid .08em $fa-border-color;\n border-radius: .1em;\n}\n\n.#{$fa-css-prefix}-pull-left { float: left; }\n.#{$fa-css-prefix}-pull-right { float: right; }\n\n.#{$fa-css-prefix} {\n &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }\n &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }\n}\n\n/* Deprecated as of 4.4.0 */\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n &.pull-left { margin-right: .3em; }\n &.pull-right { margin-left: .3em; }\n}\n","// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n -webkit-animation: fa-spin 2s infinite linear;\n animation: fa-spin 2s infinite linear;\n}\n\n.#{$fa-css-prefix}-pulse {\n -webkit-animation: fa-spin 1s infinite steps(8);\n animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n\n@keyframes fa-spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n 100% {\n -webkit-transform: rotate(359deg);\n transform: rotate(359deg);\n }\n}\n","// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n filter: none;\n}\n","// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n display: inline-block;\n font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration\n font-size: inherit; // can't have font-size inherit on line above, so need to override\n text-rendering: auto; // optimizelegibility throws things off #1094\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n -webkit-transform: rotate($degrees);\n -ms-transform: rotate($degrees);\n transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n -webkit-transform: scale($horiz, $vert);\n -ms-transform: scale($horiz, $vert);\n transform: scale($horiz, $vert);\n}\n","// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n position: relative;\n display: inline-block;\n width: 2em;\n height: 2em;\n line-height: 2em;\n vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n position: absolute;\n left: 0;\n width: 100%;\n text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n","/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook-f:before,\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-feed:before,\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before,\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-y-combinator-square:before,\n.#{$fa-css-prefix}-yc-square:before,\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\n.#{$fa-css-prefix}-intersex:before,\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\n.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; }\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\n.#{$fa-css-prefix}-hotel:before,\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\n.#{$fa-css-prefix}-yc:before,\n.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; }\n.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; }\n.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; }\n.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; }\n.#{$fa-css-prefix}-battery-4:before,\n.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; }\n.#{$fa-css-prefix}-battery-3:before,\n.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; }\n.#{$fa-css-prefix}-battery-2:before,\n.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; }\n.#{$fa-css-prefix}-battery-1:before,\n.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; }\n.#{$fa-css-prefix}-battery-0:before,\n.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; }\n.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; }\n.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; }\n.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; }\n.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; }\n.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; }\n.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; }\n.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; }\n.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; }\n.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; }\n.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; }\n.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; }\n.#{$fa-css-prefix}-hourglass-1:before,\n.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; }\n.#{$fa-css-prefix}-hourglass-2:before,\n.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; }\n.#{$fa-css-prefix}-hourglass-3:before,\n.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; }\n.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; }\n.#{$fa-css-prefix}-hand-grab-o:before,\n.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; }\n.#{$fa-css-prefix}-hand-stop-o:before,\n.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; }\n.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; }\n.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; }\n.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; }\n.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; }\n.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; }\n.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; }\n.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; }\n.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; }\n.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; }\n.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; }\n.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; }\n.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; }\n.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; }\n.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; }\n.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; }\n.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; }\n.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; }\n.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; }\n.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; }\n.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; }\n.#{$fa-css-prefix}-tv:before,\n.#{$fa-css-prefix}-television:before { content: $fa-var-television; }\n.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; }\n.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; }\n.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; }\n.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; }\n.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; }\n.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; }\n.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; }\n.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; }\n.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; }\n.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; }\n.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; }\n.#{$fa-css-prefix}-map:before { content: $fa-var-map; }\n.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; }\n.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; }\n.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; }\n.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; }\n.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; }\n.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; }\n","// Styles for admin pages.\n// --------------------------------------------------\n.views-display-setting .views-admin-label {\n // From views-admin.css\n display: inline-block;\n float: left; /* LTR */\n // From views-admin.theme.css\n margin-right: 3pt; /* LTR */\n}\n","// Comment\n// --------------------------------------------------\n.comment {\n margin-top: 15px;\n .user-picture {\n float: left;\n margin-right: 10px;\n a {\n display: block;\n }\n }\n .submitted {\n font-size: 0.90em;\n .permalink {\n margin-left: 5px;\n }\n .new {\n color: $brand-danger;\n }\n }\n .content {\n margin: 10px 0;\n }\n .links {\n font-size: 0.80em;\n }\n}\n","// General\n// -----------------------------------------------------------------------------\n.form-item {\n margin-top: 0;\n}\nform {\n .form-managed-file {\n input {\n display: inline-block;\n margin: 0 10px 0 0;\n }\n }\n .container-inline-date .date-padding {\n padding: 0;\n float: none;\n }\n .form-actions {\n .btn {\n margin-right: 10px;\n }\n }\n .field-type-datetime {\n select {\n min-width: 80px;\n }\n }\n .format-toggle {\n float: none;\n }\n .field-multiple-table {\n thead {\n th {\n padding: 10px !important;\n label {\n margin: 0;\n font-weight: bold;\n }\n }\n }\n }\n .description {\n margin: 2px 0;\n color: $gray;\n }\n}\n\n.media-widget {\n > a {\n margin: 0 10px 0 0;\n @extend .btn;\n }\n}\n\nfieldset {\n padding: 0;\n legend {\n float: left;\n line-height: 1em;\n margin: 0;\n }\n .panel-body {\n clear: both;\n }\n}\n\nhtml.js {\n input.form-autocomplete {\n background: image-url(\"throbber.gif\") no-repeat right 8px #fff !important;\n }\n input.throbbing {\n background-position: right -122px !important;\n }\n fieldset.collapsed {\n height: auto;\n border-left-width: 1px;\n border-right-width: 1px;\n }\n}\n\n.views-exposed-form .views-exposed-widget .form-submit {\n margin-top: 1.8em;\n}\n\n@media (max-width: 767px) { \n form {\n .btn {\n width: 100%;\n display: block;\n clear: both;\n margin: 0 0 5px;\n }\n input.form-text,\n textarea,\n select {\n width: 100%;\n }\n .confirm-parent, \n .password-parent, \n .password-suggestions {\n width: auto !important;\n }\n .password-parent {\n div.password-strength {\n width: 150px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px;\n }\n }\n .confirm-parent {\n div.password-confirm {\n width: 110px;\n float: right;\n margin-top: 0;\n font-size: 10px;\n margin-bottom: 5px;\n margin-top: -5px;\n }\n }\n }\n}\n\n// Node Edit Form\n// -----------------------------------------------------------------------------\n#node-edit {\n #edit-title {\n font-size: 1.6em;\n line-height: 1.6em;\n height: 45px;\n width: 90%;\n }\n .form-item-path-alias {\n @include clearfix;\n label, input {\n display: inline;\n }\n }\n .burr-flipped-sidebar {\n .panel-pane {\n @include well;\n padding: 10px;\n .pane-title {\n margin-top: 0;\n }\n }\n .pane-node-form-buttons {\n background: none;\n padding: inherit;\n .form-actions {\n margin: 0;\n border-top: 0;\n }\n }\n }\n .pane-node-form-buttons {\n clear: both;\n }\n}\n\n.filter-wrapper {\n @include well;\n margin-top: 10px;\n .form-item {\n margin: 0 0 10px;\n padding: 0;\n }\n .filter-guidelines {\n padding: 0;\n .tips {\n margin-left: 0;\n }\n }\n}\n\n// Field Overview\n// -----------------------------------------------------------------------------\n.page-admin {\n form {\n table {\n select,\n input.form-text {\n width: 150px;\n }\n }\n }\n}\n\n// Features\n// -----------------------------------------------------------------------------\n#features-export-form {\n .features-export-parent {\n margin: 0 0 20px;\n fieldset.collapsed {\n min-height: 43px !important;\n background: none;\n }\n .features-export-list {\n padding: 10px;\n .form-item {\n float: none !important;\n }\n }\n }\n}\n\n// Panels edit content form.\n// -----------------------------------------------------------------------------\n#panels-panel-context-edit-move,\n#panels-panel-context-edit-content {\n .container {\n width: auto;\n padding: 0;\n .row {\n margin-bottom: 20px;\n }\n }\n}\n\n// Navbar form\n// -----------------------------------------------------------------------------\n.navbar-form {\n .form-wrapper {\n padding: 0;\n }\n .form-item-keys,\n .form-item {\n margin-top: 0 !important;\n }\n .form-submit {\n display: none;\n }\n}\n\n// Search form block\n// -----------------------------------------------------------------------------\n.pane-search-box {\n form {\n .form-wrapper {\n .form-group {\n display: block;\n margin-bottom: 10px;\n }\n }\n }\n}\n\n// Draggable tables\n// -----------------------------------------------------------------------------\n.tabledrag-handle .handle {\n box-sizing: content-box;\n}\n","// Sass Mixins\n// --------------------------------------------------\n@mixin transparent($color, $alpha) {\n $rgba: rgba($color, $alpha);\n $ie-hex-str: ie-hex-str($rgba);\n background-color: transparent;\n background-color: $rgba;\n filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#{$ie-hex-str},endColorstr=#{$ie-hex-str});\n zoom: 1;\n}\n\n@mixin well() {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: $well-bg;\n border: 1px solid darken($well-bg, 7%);\n @include border-radius(4px);\n @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n@mixin btn() {\n display: inline-block;\n}\n\n// Breakpoint mixin.\n// Usage: @include breakpoint(sm) { ... }\n// -----------------------------------------------------------------------------\n@mixin breakpoint($class) {\n @if $class == xs {\n @media (max-width: $screen-xs-max) { @content; }\n }\n @else if $class == sm {\n @media (min-width: $screen-sm) { @content; }\n }\n @else if $class == md {\n @media (min-width: $screen-md) { @content; }\n }\n @else if $class == lg {\n @media (min-width: $screen-lg) { @content; }\n }\n @else {\n @warn \"Breakpoint mixin supports: xs, sm, md, lg\";\n }\n}\n\n// Font Awesome.\n// Usage: @include fa(bars) { ... }\n// -----------------------------------------------------------------------------\n@mixin fa($icon) {\n @extend .fa;\n @extend .fa-#{$icon}\n}\n","// Layout\n// --------------------------------------------------\n.container {\n .container,\n .container-fluid {\n width: auto;\n margin-left: -15px;\n margin-right: -15px;\n }\n}\n\n#footer {\n margin: 36px 0;\n}\n","// Maintenance page\n// -----------------------------------------------------------------------------\nbody.maintenance-page {\n .container {\n max-width: 970px !important;\n }\n\n .jumbotron {\n background-color: #000000;\n color: white;\n padding: 20px 0;\n h1 {\n font-size: 3.0em;\n margin-top: 0;\n }\n @include breakpoint(md) {\n padding-top: 30px;\n padding-bottom: 30px;\n }\n }\n\n .main {\n padding-top: 20px;\n padding-bottom: 50px;\n }\n\n .page-header {\n h1 {\n font-size: 24px;\n @include breakpoint(md) {\n font-size: 36px;\n }\n }\n }\n\n // Tasks.\n // --------------------------------------------------\n .tasks-list {\n > div {\n margin-bottom: 25px;\n @extend .text-muted;\n h6 {\n margin-bottom: 2px;\n font-size: 14px;\n font-weight: normal;\n }\n h4 {\n margin-top: 0;\n font-size: 14px;\n }\n &.active,\n &.done {\n color: black;\n }\n }\n }\n\n // Forms.\n // --------------------------------------------------\n .form-actions {\n .btn {\n &:first-child {\n @extend .btn-primary;\n background-color: white;\n border-color: black;\n color: black;\n &:hover, &:focus {\n background-color: black;\n border-color: white;\n }\n }\n }\n }\n\n // Progress bar\n .progress {\n .progress-bar {\n background-color: black;\n }\n }\n\n // Theme selection form.\n #panopoly-theme-selection-form {\n .form-type-radio {\n margin: 0 0 2em;\n label {\n display: block;\n }\n .form-radio {\n margin: 0;\n left: 0;\n top: 40%;\n }\n }\n }\n}","// Styles for CTools Modal\n// --------------------------------------------------\nbody.ctools-modal-open {\n overflow: hidden;\n}\n#modalContent {\n .modal-content {\n width: 100%;\n overflow: hidden;\n box-shadow: none !important;\n }\n #modal-content {\n overflow: auto;\n width: 100% !important;\n background: white;\n }\n .panels-add-content-modal {\n background: none;\n padding: 0;\n height: 100%;\n margin: -20px -20px 0;\n width: 100%;\n position: absolute;\n }\n .panels-section-columns,\n .panels-categories-description {\n border: none;\n }\n .panels-section-column-categories {\n margin-left: 0;\n border-right: 1px solid #ccc;\n height: 100%;\n background: white;\n overflow: auto;\n padding-bottom: 20px;\n .btn {\n border: 1px solid $gray-light !important;\n line-height: inherit;\n margin: 0;\n text-align: left;\n }\n }\n .panels-categories-box {\n border: 0;\n a.btn {\n padding: 5px 10px;\n }\n a.active {\n background: $gray-lighter;\n box-shadow: none;\n }\n }\n .panels-root-content-box {\n a.btn {\n padding: 5px 10px;\n }\n }\n .panels-categories-description {\n padding: 20px;\n }\n .panels-section-columns {\n padding-bottom: 20px;\n }\n fieldset.widget-preview {\n margin-top: 18px;\n margin-bottom: 0;\n position: static;\n border: 1px solid #ddd;\n .panel-heading {\n position: relative;\n .btn {\n position: absolute;\n right: 10px;\n top: 5px;\n }\n }\n }\n .ctools-auto-submit-full-form {\n fieldset {\n width: 48%;\n display: block;\n fieldset {\n width: 100%;\n }\n &.widget-preview-single {\n float: right;\n margin-left: 1em;\n margin-top: 0;\n width: 48%;\n max-width: 48% !important;\n }\n }\n .form-actions {\n float: right;\n clear: right;\n width: 48%;\n max-width: 48%;\n text-align: right;\n }\n }\n .form-item-view-settings {\n display: block;\n }\n .form-item-exposed-use-pager {\n display: block;\n }\n #panopoly-form-widget-preview {\n width: 50%;\n float: right;\n .container {\n width: auto;\n }\n }\n}\n","// Basic menu blocks\n// -----------------------------------------------------------------------------\nul.menu > li > ul.menu {\n margin-left: 1em; /* LTR */\n}\n\n// Nav\n// -----------------------------------------------------------------------------\nul.nav {\n > li {\n &.dropdown {\n &:after {\n width: 100%;\n height: 2px;\n background: none;\n position: absolute;\n bottom: -2px;\n left: 0;\n right: 0;\n content: '';\n }\n }\n }\n}\n\n// Nav expanded\n// -----------------------------------------------------------------------------\n.nav-expanded {\n .caret {\n display: none;\n }\n > li {\n > a {\n font-size: 1.2em;\n text-align: left;\n font-weight: 700;\n color: $text-color;\n &:hover, &:focus, &.active, &.active-trail {\n color: $link-hover-color;\n background: none;\n }\n }\n ul.dropdown-menu {\n background: none;\n display: block;\n border: 0;\n padding: 0;\n position: static;\n float: none;\n border-radius: 0;\n box-shadow: none;\n li {\n a {\n padding: 3px 15px;\n color: $text-color;\n &:hover, &:focus, &.active, &.active-trail {\n color: $link-hover-color;\n background: none;\n }\n }\n }\n ul {\n display: none !important;\n }\n }\n @include breakpoint(md) {\n float: none;\n margin-bottom: 18px;\n }\n &.open {\n > a {\n color: $text-color;\n background: none;\n &:hover, &:focus, &.active, &.active-trail {\n color: $link-hover-color;\n background: none;\n }\n }\n }\n }\n}\n","// Styles for Nodes\n// --------------------------------------------------\n\n// Miscellaneous\n// --------------------------------------------------\n.field-collection-container {\n border: 0;\n .field-collection-view {\n margin: 0;\n padding: 0;\n border: none;\n }\n}\n\n// Panopoly News\n// --------------------------------------------------\n.node-panopoly-page {\n // Teaser\n &.node-teaser {\n .panel-pane {\n margin: 0 0 10px 260px;\n }\n .pane-node-field-featured-image {\n float: left;\n margin-left: 0;\n }\n }\n @media (max-width: $screen-xs-max) {\n .panel-pane {\n float: none !important;\n margin: 0 0 10px !important;\n }\n }\n}\n\n// Panopoly News\n// --------------------------------------------------\n.node-panopoly-news-article {\n // Teaser\n &.node-teaser {\n .panel-pane {\n margin: 0 0 10px 260px;\n }\n .pane-node-field-featured-image {\n float: left;\n margin-left: 0;\n }\n }\n @media (max-width: $screen-xs-max) {\n .panel-pane {\n float: none !important;\n margin: 0 0 10px !important;\n }\n }\n}\n","// General\n// -----------------------------------------------------------------------------\n.panel-display {\n > .row {\n margin-bottom: 20px;\n }\n}\n.panel-flexible .panel-separator {\n display: none;\n}\n\n// Admin\n// -----------------------------------------------------------------------------\n.panels-layouts-checkboxes {\n // Undo default Radix styling so the radio button can appear above the layout.\n input[type=\"radio\"] {\n position: static;\n margin-left: 0px;\n margin-bottom: 20px;\n }\n label {\n margin-left: 0px;\n }\n .form-type-radio {\n margin: 0 !important;\n }\n}\n\n// IPE\n// -----------------------------------------------------------------------------\nbody.panels-ipe {\n margin-bottom: 55px !important;\n}\n\ndiv#panels-ipe-control-container {\n width: auto;\n left: 0;\n right: 0;\n box-shadow: none;\n .panels-ipe-button-container {\n text-align: center;\n .panels-ipe-pseudobutton-container {\n margin: 0 5px;\n a {\n padding: 0px 10px 0px 34px;\n &:hover {\n text-decoration: none;\n }\n }\n }\n }\n .panels-ipe-form-container {\n form {\n > div {\n text-align: center;\n }\n .form-submit {\n margin: 0 5px;\n padding: 0px 10px 0px 34px;\n &:hover {\n box-shadow: none;\n }\n }\n }\n }\n}\n\nul.panels-ipe-linkbar {\n list-style: none outside none;\n > li {\n display: inline-block;\n margin: 0 0 0 5px;\n a {\n margin: 0 !important;\n }\n }\n}\n","// Site name and logo\n// -----------------------------------------------------------------------------\n#logo {\n display: block;\n float: left;\n margin-right: $navbar-padding-horizontal;\n\n // Resize the logo to fit the height of the navbar (which a child theme may\n // change on the desktop).\n height: 100%;\n width: auto;\n}\n#site-name {\n float: left;\n}\n\n// Page header\n// -----------------------------------------------------------------------------\n.page-header {\n margin: 0 0 18px;\n h1 {\n margin: 0;\n }\n}\n\n// Hide the .page-header for pages with .page-title-hidden.\n.page-title-hidden {\n .page-header {\n display: none;\n }\n}\n\n// Breadcrumb\n// -----------------------------------------------------------------------------\n.breadcrumb {\n a {\n i {\n display: none;\n }\n }\n}\n\n// Tabs\n// -----------------------------------------------------------------------------\n.tabs,\n.nav-tabs {\n margin: 0 0 18px;\n}\n\n// Action Links\n// -----------------------------------------------------------------------------\n.action-links {\n list-style: none outside none;\n margin: 0 0 18px;\n padding: 0;\n @include clearfix;\n\n > li {\n float: left;\n margin: 0 10px 0 0;\n }\n}\n\n// Vertical Tabs\n// -----------------------------------------------------------------------------\ndiv.vertical-tabs {\n border: none;\n border: 1px solid #DDD;\n outline: none;\n border-radius: 4px;\n ul.vertical-tabs-list {\n border: none;\n margin-top: 20px;\n margin-bottom: 20px;\n outline: none;\n li {\n border: none;\n background: none;\n outline: none !important;\n border-radius: 4px 0 0 4px;\n border: 1px solid;\n border-color: #fff #ddd #fff #fff;\n &.selected {\n border-color: #ddd #fff #ddd #ddd;\n }\n a {\n outline: none !important;\n border-radius: 4px 0 0 4px;\n &:hover {\n color: #fff;\n background: $link-color;\n text-decoration: none;\n strong {\n text-decoration: none;\n color: #fff;\n }\n }\n }\n }\n }\n .vertical-tabs-panes {\n padding: 20px 10px;\n }\n .form-type-textfield input {\n width: 90%;\n box-sizing: content-box;\n }\n}\n\n// Tables\n// --------------------------------------------------\ntable {\n width: 100%;\n margin-bottom: $line-height-base;\n // Cells\n th,\n td {\n padding: 8px;\n line-height: $line-height-base;\n text-align: left;\n vertical-align: top;\n border-top: 1px solid $table-border-color;\n &.checkbox {\n text-align: center;\n display: table-cell;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0;\n input {\n float: none !important;\n margin-left: 0 !important;\n }\n div.checkbox {\n text-align: center;\n min-height: 0;\n margin-bottom: 0;\n padding-left: 0;\n }\n }\n }\n th {\n font-weight: bold;\n }\n // Bottom align for column headings\n thead th {\n vertical-align: bottom;\n }\n // Remove top border from thead by default\n caption + thead tr:first-child th,\n caption + thead tr:first-child td,\n colgroup + thead tr:first-child th,\n colgroup + thead tr:first-child td,\n thead:first-child tr:first-child th,\n thead:first-child tr:first-child td {\n border-top: 0;\n }\n // Account for multiple tbody instances\n tbody + tbody {\n border-top: 2px solid $table-border-color;\n }\n}\n\n// Links\n// --------------------------------------------------\nul.links {\n padding: 0;\n list-style: none outside none;\n &.inline {\n margin: 0;\n li {\n margin: 0 10px 0 0;\n padding: 0;\n }\n }\n}\n\n// Carousel\n// --------------------------------------------------\n.carousel {\n .carousel-control {\n z-index: 100;\n }\n .carousel-indicators li {\n float: none;\n margin-left: 3px;\n margin-right: 3px;\n a {\n display: none;\n }\n }\n .carousel-caption {\n h1, h2, h3, h4, h5, h6 {\n color: white;\n }\n }\n}\n\n// Pager\n// --------------------------------------------------\n.item-list {\n ul.pagination {\n margin: 20px 0;\n > li {\n margin: 0;\n display: inline-block;\n padding: 0;\n position: relative;\n > a, > span {\n padding: 6px 12px;\n border-radius: inherit;\n &.progress-disabled {\n float: left;\n }\n }\n .ajax-progress {\n float: left;\n padding: 6px 5px 6px 10px;\n }\n }\n }\n}\n\n// Misc Fixes\n// --------------------------------------------------\n.ctools-dropdown-container {\n hr {\n margin: 0;\n }\n}\n\nul.nav,\nul.navl li,\nul.dropdown-menu,\nul.dropdown-menu li {\n list-style: none outside none !important;\n}\n\n// Calendar\n// --------------------------------------------------\n.calendar-calendar {\n @extend .col-md-12;\n table.mini {\n @extend .table-bordered;\n td {\n border: 1px solid $gray-lighter !important;\n padding: 5px;\n }\n }\n}\n.view-header {\n .date-nav-wrapper {\n h3 {\n margin-top: 5px !important;\n margin-bottom: 0;\n }\n }\n}\n\n// jQuery UI tabs\n// --------------------------------------------------\n.ui-tabs .ui-tabs-nav {\n padding: 0 5px 5px 5px;\n}\n","// Styles for Views\n// --------------------------------------------------\n\n// Fixes\n// --------------------------------------------------\n.view {\n .row {\n > .list-group {\n @extend .col-md-12;\n }\n }\n}\n.views-exposed-form {\n .views-submit-button,\n .views-reset-button {\n margin-top: 3px;\n }\n}\n","// Mixins\n// -----------------------------------------------------------------------------\n@mixin blockbox {\n @include border-radius(5px);\n border: 1px solid $border;\n margin-bottom: 20px;\n padding:0px;\n .pane-content {\n background-color: transparent;\n margin: 0;\n padding: 15px;\n }\n}\n\n@mixin block-title {\n @include border-radius(3px 3px 0 0);\n border: 1px solid;\n border-bottom: none;\n font-size: 16px;\n line-height: 1.3;\n margin: 0;\n padding: 7px 10px;\n font-weight: normal;\n}\n\n@mixin searchbox {\n form {\n display:block;\n margin:8px 0;\n position:relative;\n width: 100%;\n }\n input.form-text {\n padding-right:30px;\n }\n button[type=\"submit\"],\n input[type=\"submit\"] {\n background:none !important;\n border:none;\n content:\"\\f002\";\n color: $gray;\n display: inline-block;\n font-size: 1.3em;\n font-family: $icon-fa;\n margin: 0;\n padding:0;\n position: absolute;\n right:10px;\n width:25px;\n top: 2px;\n }\n}\n@mixin h4 {\n font-size: 20px;\n font-weight: bold;\n margin-top: 2em;\n margin-bottom: .5em;\n}\n\n%button {\n // background:$brand-primary;\n // border-color:$brand-primary;\n color: white;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n white-space: nowrap;\n padding: 5px 12px;\n line-height: 1.4em;\n @include border-radius(4px);\n}\n%button:hover, \n%button:focus, \n%button:active {\n // background:$brand-secondary;\n // border-color:$brand-secondary;\n color: white;\n text-decoration: none;\n}\n%button-attached {\n @include border-radius(0 $border-radius-base $border-radius-base 0);\n padding-left: 10px;\n padding-right: 10px;\n}\n\n%screenreader {\n position: absolute;\n top:0;\n left:-9999px\n}\n\n// Force wrap content: https://perishablepress.com/wrapping-content/\n@mixin wrap {\n white-space: pre; /* CSS 2.0 */\n white-space: pre-wrap; /* CSS 2.1 */\n white-space: pre-line; /* CSS 3.0 */\n white-space: -pre-wrap; /* Opera 4-6 */\n white-space: -o-pre-wrap; /* Opera 7 */\n white-space: -moz-pre-wrap; /* Mozilla */\n white-space: -hp-pre-wrap; /* HP Printers */\n word-wrap: break-word; /* IE 5+ */ \n word-break: break-word;\n}\n\n@mixin card {\n box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.16), 0 0 10px 0 rgba(0, 0, 0, 0.12);\n margin-top: 10px;\n box-sizing: border-box;\n border-radius: 2px;\n background-clip: padding-box;\n text-align: center;\n\n img {\n display: block;\n margin: 0 auto;\n }\n\n h2 {\n margin:.75em 1em;\n text-align: center;\n }\n\n .content {\n margin-left: 1em;\n margin-right: 1em;\n }\n\n .btn-primary {\n margin: 0 auto 1.5em;\n }\n}\n\n@mixin item-list {\n a {\n border: 1px solid $border;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n &:hover {\n color: #ffffff;\n text-decoration: none;\n background: $brand-primary;\n }\n }\n &:first-of-type a {\n @include border-radius(4px 4px 0px 0px);\n }\n &:last-of-type a {\n @include border-radius(0px 0px 4px 4px);\n }\n}\n\n@mixin pointer {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 17px 0 17px 15px;\n border-color: transparent $smoke;\n display: block;\n width: 0;\n z-index: 1;\n right: -15px;\n top: 0;\n}\n\n%screenreader {\n position: absolute;\n top:0;\n left:-9999px\n}",".clearfix {\n overflow: visible;\n}\n.admin-list {\n dt, dd{\n display:inline-block;\n float:none;\n vertical-align: top;\n }\n}\n.views-edit-view {\n\t.action-list {\n\t\tinput.btn,\n\t\tinput.btn:active,\n\t\tinput.btn:focus,\n\t\tinput.btn:hover, \n\t\tinput[type=\"submit\"]:hover {\n\t\t\tbackground: inherit;\n\t\t\tborder: none;\n\t\t\tcolor: inherit;\n\t\t}\n\t}\n\t.footer {\n\t\tbackground: inherit;\n\t}\n}\n\n.modal-content {\n\t.panels-root-content-box a.btn {\n\t\twhite-space: normal;\n\t}\n\t.panel-title {\n\t\tpadding-right: 55px;\n\t}\n}\n\n.views-displays .secondary .open > a:hover {\n\tcolor: #666;\n}\n\n.media-thumbnails-select {\n\tpadding: 0 0 40px;\n}\n\n.page-admin .alert {\n margin: 10px 0;\n}\n// Admin tables.\n.page-admin {\n .container.main {\n width: 100%;\n }\n .table-bordered > thead > tr > th,\n .table-bordered > tbody > tr > th,\n .table-bordered > tbody > tr > td {\n border: none;\n }\n table thead > tr > th.checkbox, \n table.table thead > tr > th.checkbox,\n .table-bordered > tbody > tr > th.checkbox,\n .table-bordered > tbody > tr > td.checkbox,\n .table-striped > tbody > tr:nth-child(odd) > td.checkbox,\n .table-striped > tbody > tr:nth-child(odd) > th.checkbox {\n background-color: transparent;\n border: none;\n margin: 0;\n display: table-cell;\n position: relative;\n }\n .table tbody tr:hover td.checkbox, \n .table tbody tr:hover th.checkbox {\n background-color: #FFFEEE;\n }\n table th.checkbox, \n table td.checkbox {\n label {\n line-height:0;\n padding: 4px;\n vertical-align: top;\n }\n input[type=\"checkbox\"],\n input {\n float: none !important;\n margin: 0 !important;\n position: relative;\n }\n }\n}\n","// OTHER ACCESS\n.pane-dkan-sitewide-dkan-sitewide-other-access,\n#block-dkan-sitewide-dkan-sitewide-other-access {\n a.btn {\n background-image: auto;\n border:1px solid $smoke;\n padding:6px 10px 6px 36px;\n position:relative;\n i {\n background-position: 0 0;\n position:absolute;\n top:8px;\n left:5px;\n visibility:visible;\n &.ckan-icon-rdfxml {\n background-image: url(../images/rdf.png);\n }\n &.ckan-icon-json {\n background-image: url(../images/json.png);\n }\n }\n &:hover {\n background-color:$gray-lighter;\n }\n }\n .btn-group {\n margin:.6em 0;\n .btn:first-child {\n background-image: url(../images/json.png);\n background-repeat:no-repeat;\n background-position: 10px 10px;\n }\n .btn:last-child {\n background-image: url(../images/rdf.png);\n background-repeat:no-repeat;\n background-position: 10px 10px;\n }\n }\n}\n\n// DKAN FORMS\n#block-dkan-forms-dkan-forms-dataset-help h2.block-title::before{\n content: \"\\f05a\";\n font-family: $icon-fa;\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em;\n}\n\n// FACET Blocks\n.radix-layouts-sidebar {\n .ctools-collapsible-container,\n div[class*=\"pane-facetapi\"],\n .block-facetapi {\n &.pane-block,\n .pane-content {\n border: none;\n margin: 0;\n padding:0;\n @include border-radius(0);\n }\n .item-list {\n border: 1px solid $border;\n .facetapi-limit-link {\n padding: 10px 22px;\n &:before {\n top: 10px;\n right: 22px;\n }\n }\n }\n h2.pane-title {\n @include border-radius(0);\n border: none;\n color: #fff;\n font-size: 16px;\n font-weight: normal;\n position: relative;\n padding: 9px 21px 9px 12px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n &:after {\n font-family: \"fontawesome\";\n content: \"\\f077\";\n color: rgba(255, 255, 255, 0.7);\n font-size: 12px;\n font-weight: bold;\n position: absolute;\n right: 14px;\n top: 10px;\n }\n }\n &.ctools-collapsed {\n h2.pane-title:after {\n content: \"\\f078\";\n }\n }\n .ctools-toggle {\n background: none;\n }\n ul {\n margin:0;\n padding:0;\n }\n ul li.leaf {\n list-style-type:none;\n list-style-image:none;\n margin:0;\n padding:0;\n li {\n position:relative;\n a {\n padding-right:48px;\n }\n }\n &.last {\n border-bottom:none;\n }\n li:before {\n content:\"\\f178\";\n font-family:$icon-fa;\n position:absolute;\n top:4px;\n right:30px;\n }\n a {\n color:$gray-dark;\n display:block;\n padding:6px 20px 6px 10px;\n position:relative;\n line-height: 22px;\n &:focus,\n &:hover {\n color:darken($gray-dark, 10%);\n background: rgba(black, 0.03);\n text-decoration:none;\n }\n &:hover:after {\n content:\"\\f055\";\n color:$brand-success;\n font-family:$icon-fa;\n position:absolute;\n top:6px;\n right:6px;\n }\n img {\n height: 25px;\n width: 25px;\n margin: 0 16px 0 0;\n }\n }\n a.facetapi-active {\n background:$smoke;\n color:#333;\n z-index:0;\n }\n a.facetapi-active:before {\n @include pointer;\n }\n a.facetapi-active:after {\n content:\"\\f00d\";\n font-family:$icon-fa;\n position:absolute;\n top:6px;\n right:6px;\n }\n a.facetapi-active:hover:after {\n color:red;\n }\n }\n a.facetapi-limit-link {\n display:block;\n padding:5px 30px 5px 5px;\n position:relative;\n }\n a.facetapi-limit-link:before {\n content:\"\\f150\";\n font-family:$icon-fa;\n position:absolute;\n top:6px;\n right:15px;\n }\n a.facetapi-limit-link.open:before {\n content:\"\\f151\";\n }\n }\n .ctools-collapsible-container .ctools-toggle {\n width: 12px;\n }\n}\n// Date facets.\n.facetapi-facet-changed {\n li.expanded {\n a.facetapi-active {\n background: #ccc;\n border-bottom: 1px dotted #eee;\n color: #333;\n line-height: 22px;\n padding: 6px 20px 6px 10px;\n &:hover {\n background: #ccc;\n color: #333;\n text-decoration: none;\n &:after {\n color: red;\n }\n }\n &:before {\n @include pointer;\n }\n &:after {\n content: \"\\f00d\";\n font-family: \"FontAwesome\";\n position: absolute;\n top: 6px;\n right: 6px;\n }\n }\n ul.expanded li.leaf a,\n li.expanded a {\n padding: 6px 20px 6px 20px;\n }\n .item-list {\n border: none;\n }\n }\n}\n\n// Wrap long value strings.\n.facetapi-facet-field-license a {\n @include wrap;\n}\n\n// Groups\n.pane-views-group-block-block,\n#block-views-group-block-block {\n overflow:hidden;\n .views-field-title a {\n display: block;\n padding: .5em 0;\n }\n .views-field-body p {\n margin: .5em 0 1em;\n }\n .group-subscribe-message {\n @include border-bottom-radius(4px);\n background: $brand-primary;\n color: #fff;\n padding:5px;\n text-align: center;\n margin-left: -15px;\n margin-right: -15px;\n a {\n color: #fff;\n display: block;\n }\n }\n}\n\n// Dataset page Group block.\n.radix-layouts-sidebar .pane-block.pane-views-group-block-block .pane-content {\n padding: 0 15px;\n}\n\n#block-dkan-dataset-dkan-dataset-dataset-help {\n .content {\n padding: 10px;\n }\n}\n\n#block-dkan-forms-dkan-forms-dataset-help {\n h2:before {\n content: \"\\f05a\";\n font-family: $icon-fa;\n font-weight: normal;\n font-style: normal;\n display: inline-block;\n text-decoration: inherit;\n font-size: 1.2em;\n line-height: 1;\n position: relative;\n top: 1px;\n margin-right: 0.4em;\n }\n}\n\n// Front page hero blocks.\n.pane-dkan-sitewide-demo-front-dkan-demo-front,\n#block-dkan-sitewide-demo-front-dkan-demo-front {\n -webkit-box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.5);\n -moz-box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.5);\n box-shadow: 0px 0px 16px 0px rgba(0,0,0,0.5);\n //background-color: rgba($brand-primary, 0.5);\n p {\n color: #fff;\n padding: 15px;\n }\n .media-overlay {\n position: relative;\n padding: 0;\n img {\n width: 100%;\n height: auto;\n }\n }\n .media-overlay .media-heading {\n background-color: rgba(0, 0, 0, 0.8);\n bottom: 0;\n color: #FFFFFF;\n font-size: 13px;\n left: 0;\n line-height: 18px;\n margin: 0;\n padding: 12px 10px;\n position: absolute;\n right: 0;\n z-index: 1;\n }\n}\n// Sidebar Social Links.\n.radix-layouts-sidebar .pane-dkan-sitewide-dkan-sitewide-social.pane-block .pane-content {\n padding: 0;\n li.last a:hover {\n @include border-radius(0 0 3px 3px);\n }\n}\n// Additional Information block.\n.pane-dkan-sitewide-dkan-sitewide-resource-add {\n table {\n margin-top: 0;\n }\n}\n// Rounded facet corners.\n.radix-layouts-sidebar {\n .panel-panel-inner {\n .panels-ipe-portlet-wrapper:first-child,\n > div[class*=\"pane-facetapi\"]:first-child {\n h2.pane-title {\n @include border-radius(5px 5px 0 0);\n }\n }\n .panels-ipe-portlet-wrapper:last-child,\n > div[class*=\"pane-facetapi\"]:last-child {\n .ctools-collapsed,\n &.ctools-collapsed {\n h2.pane-title {\n @include border-radius(0 0 5px 5px);\n }\n }\n }\n }\n}","// Variables\n// -----------------------------------------------------------------------------\n\n// bootstrap specific variable. set to false if not using ruby + asset pipeline / compass.\n$bootstrap-sass-asset-helper: false !default;\n\n// Global values\n// -----------------------------------------------------------------------------\n\n// Grays\n// -----------------------------------------------------------------------------\n\n$gray-darker: lighten(#000, 13.5%) !default; // #222\n$gray-dark: lighten(#000, 20%) !default; // #333\n$gray: lighten(#000, 33.5%) !default; // #555\n$gray-light: lighten(#000, 60%) !default; // #999\n$gray-lighter: lighten(#000, 93.5%) !default; // #eee\n$smoke: #ccc;\n$shade: #F3F3F3;\n$border: #ddd;\n\n// Brand colors\n// -----------------------------------------------------------------------------\n\n$brand-primary: #0A77BD;\n$brand-secondary: #002245;\n$brand-success: #5cb85c !default;\n$brand-warning: #FFE285 !default;\n$brand-danger: #d9534f !default;\n$brand-info: #5bc0de !default;\n\n// Scaffolding\n// -----------------------------------------------------------------------------\n\n$body-bg: #fff !default;\n$text-color: $gray-dark !default;\n\n// Links\n// -----------------------------------------------------------------------------\n\n$link-color: $brand-primary !default;\n$link-hover-color: darken($link-color, 15%) !default;\n\n// Typography\n// -----------------------------------------------------------------------------\n\n$font-base:\t\t\t\t\t\t\t\t'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-sans-serif: 'Open Sans', \"Helvetica Neue\", Helvetica, Arial, sans-serif !default;\n$font-family-serif: Georgia, \"Times New Roman\", Times, serif !default;\n$font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace !default;\n$font-family-base: $font-base !default;\n\n$font-size-base: 16px !default;\n$font-size-large: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-small: ceil($font-size-base * 0.85) !default; // ~12px\n\n$font-size-h1: floor($font-size-base * 2.6) !default; // ~36px\n$font-size-h2: floor($font-size-base * 2.15) !default; // ~30px\n$font-size-h3: ceil($font-size-base * 1.7) !default; // ~24px\n$font-size-h4: ceil($font-size-base * 1.25) !default; // ~18px\n$font-size-h5: $font-size-base !default;\n$font-size-h6: ceil($font-size-base * 0.85) !default; // ~12px\n\n$line-height-base: 2 !default; // 20/14\n$line-height-computed: floor($font-size-base * $line-height-base) !default; // ~20px\n\n$headings-font-family: $font-family-base !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n\n// Iconography\n// -----------------------------------------------------------------------------\n\n$icon-fa: 'FontAwesome';\n\n// Components\n// -----------------------------------------------------------------------------\n// Based on 14px font-size and 1.428 line-height (~20px to start)\n\n$padding-base-vertical: 6px !default;\n$padding-base-horizontal: 12px !default;\n\n$padding-large-vertical: 10px !default;\n$padding-large-horizontal: 16px !default;\n\n$padding-small-vertical: 5px !default;\n$padding-small-horizontal: 10px !default;\n\n$padding-xs-vertical: 1px !default;\n$padding-xs-horizontal: 5px !default;\n\n$line-height-large: 1.33 !default;\n$line-height-small: 1.5 !default;\n\n$border-radius-base: 4px !default;\n$border-radius-large: 6px !default;\n$border-radius-small: 3px !default;\n\n$component-active-color: #fff !default;\n$component-active-bg: $brand-primary !default;\n\n$caret-width-base: 4px !default;\n$caret-width-large: 5px !default;\n\n// Tables\n// -----------------------------------------------------------------------------\n\n$table-cell-padding: 8px !default;\n$table-condensed-cell-padding: 5px !default;\n\n$table-bg: transparent !default; // overall background-color\n$table-bg-accent: #f9f9f9 !default; // for striping\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n$table-border-color: #ddd !default; // table and cell border\n\n\n// Buttons\n// -----------------------------------------------------------------------------\n\n$btn-font-weight: normal !default;\n\n$btn-default-color: #333 !default;\n$btn-default-bg: #fff !default;\n$btn-default-border: #ccc !default;\n\n$btn-primary-color: #fff !default;\n$btn-primary-bg: $brand-primary !default;\n$btn-primary-border: darken($btn-primary-bg, 5%) !default;\n\n$btn-success-color: #fff !default;\n$btn-success-bg: $brand-success !default;\n$btn-success-border: darken($btn-success-bg, 5%) !default;\n\n$btn-warning-color: #fff !default;\n$btn-warning-bg: $brand-warning !default;\n$btn-warning-border: darken($btn-warning-bg, 5%) !default;\n\n$btn-danger-color: #fff !default;\n$btn-danger-bg: $brand-danger !default;\n$btn-danger-border: darken($btn-danger-bg, 5%) !default;\n\n$btn-info-color: #fff !default;\n$btn-info-bg: $brand-info !default;\n$btn-info-border: darken($btn-info-bg, 5%) !default;\n\n$btn-link-disabled-color: $gray-light !default;\n\n\n// Forms\n// -----------------------------------------------------------------------------\n\n$input-bg: #fff !default;\n$input-bg-disabled: $gray-lighter !default;\n\n$input-color: $gray !default;\n$input-border: #ccc !default;\n$input-border-radius: $border-radius-base !default;\n$input-border-focus: #66afe9 !default;\n\n$input-color-placeholder: $gray-light !default;\n\n$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;\n$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;\n$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;\n\n$legend-color: $gray-dark !default;\n$legend-border-color: #e5e5e5 !default;\n\n$input-group-addon-bg: $gray-lighter !default;\n$input-group-addon-border-color: $input-border !default;\n\n\n// Dropdowns\n// -----------------------------------------------------------------------------\n\n$dropdown-bg: #fff !default;\n$dropdown-border: rgba(0,0,0,.15) !default;\n$dropdown-fallback-border: #ccc !default;\n$dropdown-divider-bg: #e5e5e5 !default;\n\n$dropdown-link-color: $gray-dark !default;\n$dropdown-link-hover-color: darken($gray-dark, 5%) !default;\n$dropdown-link-hover-bg: #f5f5f5 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-light !default;\n\n$dropdown-header-color: $gray-light !default;\n\n\n// COMPONENT VARIABLES\n// ------------------------------------------------------------------------------------------------------\n\n\n// Z-index master list\n// -----------------------------------------------------------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n\n$zindex-navbar: 1000 !default;\n$zindex-dropdown: 1000 !default;\n$zindex-popover: 1010 !default;\n$zindex-tooltip: 1030 !default;\n$zindex-navbar-fixed: 1030 !default;\n$zindex-modal-background: 1040 !default;\n$zindex-modal: 1050 !default;\n\n// Media queries breakpoints\n// ------------------------------------------------------------------------------------------------------\n\n// Extra small screen / phone\n// Note: Deprecated $screen-xs and $screen-phone as of v3.0.1\n$screen-xs: 480px !default;\n$screen-xs-min: $screen-xs !default;\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n// Note: Deprecated $screen-sm and $screen-tablet as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n// Note: Deprecated $screen-md and $screen-desktop as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n// Note: Deprecated $screen-lg and $screen-lg-desktop as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n// Grid system\n// ------------------------------------------------------------------------------------------------------\n\n// Number of columns in the grid system\n$grid-columns: 12 !default;\n// Padding, to be divided by two and applied to the left and right of all columns\n$grid-gutter-width: 30px !default;\n\n// Navbar collapse\n\n// Point at which the navbar becomes uncollapsed\n$grid-float-breakpoint: $screen-sm-min !default;\n// Point at which the navbar begins collapsing\n$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;\n\n\n// Navbar\n// -----------------------------------------------------------------------------\n\n// Basics of a navbar\n$navbar-height: 50px !default;\n$navbar-margin-bottom: $line-height-computed !default;\n$navbar-border-radius: $border-radius-base !default;\n$navbar-padding-horizontal: floor($grid-gutter-width / 2) !default;\n$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2) !default;\n\n$navbar-default-color: #777 !default;\n$navbar-default-bg: #f8f8f8 !default;\n$navbar-default-border: darken($navbar-default-bg, 6.5%) !default;\n\n// Navbar links\n$navbar-default-link-color: #777 !default;\n$navbar-default-link-hover-color: #333 !default;\n$navbar-default-link-hover-bg: transparent !default;\n$navbar-default-link-active-color: #555 !default;\n$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%) !default;\n$navbar-default-link-disabled-color: #ccc !default;\n$navbar-default-link-disabled-bg: transparent !default;\n\n// Navbar brand label\n$navbar-default-brand-color: $navbar-default-link-color !default;\n$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%) !default;\n$navbar-default-brand-hover-bg: transparent !default;\n\n// Navbar toggle\n$navbar-default-toggle-hover-bg: #ddd !default;\n$navbar-default-toggle-icon-bar-bg: #ccc !default;\n$navbar-default-toggle-border-color: #ddd !default;\n\n\n// Inverted navbar\n//\n// Reset inverted navbar basics\n$navbar-inverse-color: $gray-light !default;\n$navbar-inverse-bg: #222 !default;\n$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default;\n\n// Inverted navbar links\n$navbar-inverse-link-color: $gray-light !default;\n$navbar-inverse-link-hover-color: #fff !default;\n$navbar-inverse-link-hover-bg: transparent !default;\n$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color !default;\n$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%) !default;\n$navbar-inverse-link-disabled-color: #444 !default;\n$navbar-inverse-link-disabled-bg: transparent !default;\n\n// Inverted navbar brand label\n$navbar-inverse-brand-color: $navbar-inverse-link-color !default;\n$navbar-inverse-brand-hover-color: #fff !default;\n$navbar-inverse-brand-hover-bg: transparent !default;\n\n// Inverted navbar toggle\n$navbar-inverse-toggle-hover-bg: #333 !default;\n$navbar-inverse-toggle-icon-bar-bg: #fff !default;\n$navbar-inverse-toggle-border-color: #333 !default;\n\n\n// Navs\n// -----------------------------------------------------------------------------\n\n$nav-link-padding: 10px 15px !default;\n$nav-link-hover-bg: $gray-lighter !default;\n\n$nav-disabled-link-color: $gray-light !default;\n$nav-disabled-link-hover-color: $gray-light !default;\n\n$nav-open-link-hover-color: #fff !default;\n\n// Tabs\n$nav-tabs-border-color: #ddd !default;\n\n$nav-tabs-link-hover-border-color: $gray-lighter !default;\n\n$nav-tabs-active-link-hover-bg: $body-bg !default;\n$nav-tabs-active-link-hover-color: $gray !default;\n$nav-tabs-active-link-hover-border-color: #ddd !default;\n\n$nav-tabs-justified-link-border-color: #ddd !default;\n$nav-tabs-justified-active-link-border-color: $body-bg !default;\n\n// Pills\n$nav-pills-border-radius: $border-radius-base !default;\n$nav-pills-active-link-hover-bg: $component-active-bg !default;\n$nav-pills-active-link-hover-color: $component-active-color !default;\n\n\n// Pagination\n// -----------------------------------------------------------------------------\n\n$pagination-bg: #fff !default;\n$pagination-border: #ddd !default;\n\n$pagination-hover-bg: $gray-lighter !default;\n\n$pagination-active-bg: $brand-primary !default;\n$pagination-active-color: #fff !default;\n\n$pagination-disabled-color: $gray-light !default;\n\n\n// Pager\n// -----------------------------------------------------------------------------\n\n$pager-border-radius: 15px !default;\n$pager-disabled-color: $gray-light !default;\n\n\n// Jumbotron\n// -----------------------------------------------------------------------------\n\n$jumbotron-padding: 30px !default;\n$jumbotron-color: inherit !default;\n$jumbotron-bg: $gray-lighter !default;\n$jumbotron-heading-color: inherit !default;\n$jumbotron-font-size: ceil($font-size-base * 1.5) !default;\n\n\n// Form states and alerts\n// -----------------------------------------------------------------------------\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n\n// Tooltips\n// -----------------------------------------------------------------------------\n$tooltip-max-width: 200px !default;\n$tooltip-color: #fff !default;\n$tooltip-bg: #000 !default;\n\n$tooltip-arrow-width: 5px !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n// -----------------------------------------------------------------------------\n$popover-bg: #fff !default;\n$popover-max-width: 276px !default;\n$popover-border-color: rgba(0,0,0,.2) !default;\n$popover-fallback-border-color: #ccc !default;\n\n$popover-title-bg: darken($popover-bg, 3%) !default;\n\n$popover-arrow-width: 10px !default;\n$popover-arrow-color: #fff !default;\n\n$popover-arrow-outer-width: ($popover-arrow-width + 1) !default;\n$popover-arrow-outer-color: rgba(0,0,0,.25) !default;\n$popover-arrow-outer-fallback-color: #999 !default;\n\n\n// Labels\n// -----------------------------------------------------------------------------\n\n$label-default-bg: $gray-light !default;\n$label-primary-bg: $brand-primary !default;\n$label-success-bg: $brand-success !default;\n$label-info-bg: $brand-info !default;\n$label-warning-bg: $brand-warning !default;\n$label-danger-bg: $brand-danger !default;\n\n$label-color: #fff !default;\n$label-link-hover-color: #fff !default;\n\n\n// Modals\n// -----------------------------------------------------------------------------\n$modal-inner-padding: 20px !default;\n\n$modal-title-padding: 15px !default;\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: #fff !default;\n$modal-content-border-color: rgba(0,0,0,.2) !default;\n$modal-content-fallback-border-color: #999 !default;\n\n$modal-backdrop-bg: #000 !default;\n$modal-header-border-color: #e5e5e5 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n\n\n// Alerts\n// -----------------------------------------------------------------------------\n$alert-padding: 15px !default;\n$alert-border-radius: $border-radius-base !default;\n$alert-link-font-weight: bold !default;\n\n$alert-success-bg: $state-success-bg !default;\n$alert-success-text: $state-success-text !default;\n$alert-success-border: $state-success-border !default;\n\n$alert-info-bg: $state-info-bg !default;\n$alert-info-text: $state-info-text !default;\n$alert-info-border: $state-info-border !default;\n\n$alert-warning-bg: $state-warning-bg !default;\n$alert-warning-text: $state-warning-text !default;\n$alert-warning-border: $state-warning-border !default;\n\n$alert-danger-bg: $state-danger-bg !default;\n$alert-danger-text: $state-danger-text !default;\n$alert-danger-border: $state-danger-border !default;\n\n\n// Progress bars\n// -----------------------------------------------------------------------------\n$progress-bg: #f5f5f5 !default;\n$progress-bar-color: #fff !default;\n\n$progress-bar-bg: $brand-primary !default;\n$progress-bar-success-bg: $brand-success !default;\n$progress-bar-warning-bg: $brand-warning !default;\n$progress-bar-danger-bg: $brand-danger !default;\n$progress-bar-info-bg: $brand-info !default;\n\n\n// List group\n// -----------------------------------------------------------------------------\n$list-group-bg: #fff !default;\n$list-group-border: #ddd !default;\n$list-group-border-radius: $border-radius-base !default;\n\n$list-group-hover-bg: #f5f5f5 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border: $list-group-active-bg !default;\n\n$list-group-link-color: #555 !default;\n$list-group-link-heading-color: #333 !default;\n\n\n// Panels\n// -----------------------------------------------------------------------------\n$panel-bg: #fff !default;\n$panel-inner-border: #ddd !default;\n$panel-border-radius: $border-radius-base !default;\n$panel-footer-bg: #f5f5f5 !default;\n\n$panel-default-text: $gray-dark !default;\n$panel-default-border: #ddd !default;\n$panel-default-heading-bg: #f5f5f5 !default;\n\n$panel-primary-text: #fff !default;\n$panel-primary-border: $brand-primary !default;\n$panel-primary-heading-bg: $brand-primary !default;\n\n$panel-success-text: $state-success-text !default;\n$panel-success-border: $state-success-border !default;\n$panel-success-heading-bg: $state-success-bg !default;\n\n$panel-warning-text: $state-warning-text !default;\n$panel-warning-border: $state-warning-border !default;\n$panel-warning-heading-bg: $state-warning-bg !default;\n\n$panel-danger-text: $state-danger-text !default;\n$panel-danger-border: $state-danger-border !default;\n$panel-danger-heading-bg: $state-danger-bg !default;\n\n$panel-info-text: $state-info-text !default;\n$panel-info-border: $state-info-border !default;\n$panel-info-heading-bg: $state-info-bg !default;\n\n\n// Thumbnails\n// -----------------------------------------------------------------------------\n$thumbnail-padding: 4px !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border: #ddd !default;\n$thumbnail-border-radius: $border-radius-base !default;\n\n$thumbnail-caption-color: $text-color !default;\n$thumbnail-caption-padding: 9px !default;\n\n\n// Wells\n// -----------------------------------------------------------------------------\n$well-bg: #f5f5f5 !default;\n\n\n// Badges\n// -----------------------------------------------------------------------------\n$badge-color: #fff !default;\n$badge-link-hover-color: #fff !default;\n$badge-bg: $gray-light !default;\n\n$badge-active-color: $link-color !default;\n$badge-active-bg: #fff !default;\n\n$badge-font-weight: bold !default;\n$badge-line-height: 1 !default;\n$badge-border-radius: 10px !default;\n\n\n// Breadcrumbs\n// -----------------------------------------------------------------------------\n$breadcrumb-bg: #f5f5f5 !default;\n$breadcrumb-color: #ccc !default;\n$breadcrumb-active-color: $gray-light !default;\n$breadcrumb-separator: \"/\" !default;\n\n\n// Carousel\n// ------------------------\n\n$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6) !default;\n\n$carousel-control-color: #fff !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-font-size: 20px !default;\n\n$carousel-indicator-active-bg: #fff !default;\n$carousel-indicator-border-color: #fff !default;\n\n$carousel-caption-color: #fff !default;\n\n\n// Close\n// ------------------------\n$close-font-weight: bold !default;\n$close-color: #000 !default;\n$close-text-shadow: 0 1px 0 #fff !default;\n\n\n// Code\n// ------------------------\n$code-color: #c7254e !default;\n$code-bg: #f9f2f4 !default;\n\n$pre-bg: #f5f5f5 !default;\n$pre-color: $gray-dark !default;\n$pre-border-color: #ccc !default;\n$pre-scrollable-max-height: 340px !default;\n\n// Type\n// ------------------------\n$text-muted: $gray-light !default;\n$abbr-border-color: $gray-light !default;\n$headings-small-color: $gray-light !default;\n$blockquote-small-color: $gray-light !default;\n$blockquote-border-color: $gray-lighter !default;\n$page-header-border-color: $gray-lighter !default;\n\n// Miscellaneous\n// -----------------------------------------------------------------------------\n\n// Hr border color\n$hr-border: $gray-lighter !default;\n\n// Horizontal forms & lists\n$component-offset-horizontal: 180px !default;\n\n\n// Container sizes\n// ------------------------------------------------------------------------------------------------------\n\n// Small screen / tablet\n$container-tablet: ((720px + $grid-gutter-width)) !default;\n$container-sm: $container-tablet !default;\n\n// Medium screen / desktop\n$container-desktop: ((940px + $grid-gutter-width)) !default;\n$container-md: $container-desktop !default;\n\n// Large screen / wide desktop\n$container-large-desktop: ((1140px + $grid-gutter-width)) !default;\n$container-lg: $container-large-desktop !default;\n","@media all and (max-width:768px) {\n .node-dataset .resource-list li {\n padding-right: 0;\n span.links {\n position: relative;\n top: auto;\n right: auto;\n margin: 10px 0;\n display: block;\n padding: 0;\n }\n a.btn {\n margin: 0 5px 10px 0;\n }\n }\n}\n\n.resource-list a.label {\n display: inline-block;\n overflow-wrap: break-word;\n}\n.stages {\n margin: 0 0 20px;\n li {\n font-size: 14px;\n &.first,\n &.first .highlight {\n @include border-radius(5px 0 0 5px);\n }\n &.last,\n &.last .highlight {\n @include border-radius(0 5px 5px 0);\n }\n }\n}\n.node-type-resource .item-list .list-group li {\n margin: 0;\n}\n.node-type-dataset {\n .field-name-field-tags,\n .field-name-field-topic,\n .field-name-field-preview-thumbail {\n .field-label {\n @include h4;\n }\n }\n}\n.field-name-field-topic .field-item {\n display: inline-block;\n}\n\n#edit-path-alias {\n height: 34px;\n}\n\n// Move this to dkan_dataset.css.\n.node-dataset .resource-list li {\n padding: 0 260px 0 45px;\n}\n// Move this to dkan_sitewide_profile_page.css.\np.dkan-profile-page-user-name {\n display: inline-block;\n} ","//\n// Styles for Forms\n// --------------------------------------------------\n\ninput[type=\"submit\"],\n.btn-primary,\n.btn.btn-primary {\n @extend %button;\n}\ninput.use-ajax-submit {\n margin-right: 10px;\n}\nbutton.btn,\n.btn.btn-default,\n.btn.btn-primary,\n.tabs--primary.nav-pills li a,\n.form-control {\n line-height: 1.5em;\n}\n.btn, .btn-sm {\n font-size: 14px;\n}\n\nselect.form-control {\n min-height: 36px;\n &[multiple=\"multiple\"] {\n height: auto;\n }\n}\n.form-control,\ndiv.autocomplete-deluxe-multiple {\n padding: 0 12px;\n}\n.ctools-dropbutton {\n .ctools-content a,\n input.btn,\n input[type=\"submit\"] {\n color: #666;\n &:hover,\n &:focus,\n &:active {\n border:none;\n color: $brand-primary;\n }\n }\n}\n.field-type-file input[type=\"submit\"],\n.input-group-addon,\n.input-group-btn {\n width: auto;\n}\n\n// Colorizer.\n.colorizer-form {\n .form-control {\n width: 50%;\n }\n label {\n float:none;\n display: block;\n }\n #palette {\n clear: both;\n .item-selected {\n background-color: transparent;\n }\n }\n}\n// BuEditor.\n.bue-popup {\n z-index: 999;\n}\n.bue-ui.editor-container {\n background-color: #ffffff;\n padding: 0 4px;\n border: 1px solid $border;\n @include border-radius(4px 4px 0 0);\n}\n.form-control.form-textarea {\n @include border-radius(0);\n}\n// Chosen.\n.form-control.chosen-processed {\n line-height: 34px;\n height: auto;\n padding: 0;\n border: none;\n max-width: 100% !important;\n .chosen-choices {\n @include border-radius(4px);\n border-color: #ccc;\n }\n}\n.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {\n background-position: -42px 2px;\n}\n.chzn-container-single {\n max-width: 100%;\n}\ndiv.autocomplete-deluxe-multiple,\n.chzn-container-multi {\n width: 100% !important;\n}\n.chzn-container-multi .chzn-choices .search-field input {\n height: auto;\n}\n#context-blockform td.blocks .label {\n background-color: $gray;\n}\n.tabledrag-hide .chzn-container-single {\n width: 20px !important;\n}\n\ndiv.autocomplete-deluxe-container input.autocomplete-deluxe-form-single {\n float: left;\n}\n\nfieldset fieldset {\n position: relative;\n}\nfieldset.collapsible {\n padding-top: 0;\n}\n#og-group-ref-add-more-wrapper fieldset,\nfieldset.group-primary {\n padding-top: 0;\n legend {\n display: none;\n }\n}\n\n.horizontal-tabs fieldset.horizontal-tabs-pane {\n padding: 0;\n}\ndiv.horizontal-tabs {\n border: none;\n}\n\n.form-managed-file {\n span.file {\n border: 1px solid $border;\n padding: 0 15px;\n line-height: 34px;\n display: inline-block;\n vertical-align: top;\n border-radius: 5px 0 0 5px;\n margin-right: 0;\n }\n input {\n @include border-radius($border-radius-base 0 0 $border-radius-base);\n border: 1px solid $border;\n padding: 5px;\n margin: 0 0 10px 0;\n height: 36px;\n vertical-align: top;\n }\n input.form-submit {\n @extend %button-attached;\n margin: 0 0 10px 0;\n }\n .input-group-btn {\n display: inline-block;\n vertical-align: top;\n }\n}\n.image-widget-data input.btn {\n //@extend %button-attached;\n}\n\n.path-form.panel-default {\n border-color: transparent;\n .panel-body {\n padding:0;\n }\n}\n\n// OG.\n.list-group-item {\n background-color: transparent;\n border: none;\n color: $text-color;\n padding: 0;\n}\n\n.filter-wrapper {\n padding: 10px;\n}\n\n#body-add-more-wrapper {\n .panel-body {\n padding: 0;\n }\n}\n\n// file_resup tweaks to display on top of recline\n.node-resource-form .field-name-field-upload {\n .form-type-managed-file {\n display: table;\n .file-widget {\n display: table-footer-group;\n }\n .file-resup-wrapper {\n display: table-header-group;\n }\n }\n}\n\n#search-api-admin-index-status-form {\n input {\n margin-bottom: 1em;\n }\n}\n.page-admin form {\n input[type=submit] {\n margin-right: 1em;\n }\n}","//\n// Styles for main layout\n// --------------------------------------------------\n.container,\n.container-fluid,\n.row {\n // Override Radix container and row overflow\n overflow: visible;\n}\n\naside.col-sm-3 {\n padding-left:0;\n}\nsection.col-sm-9 {\n padding-right: 0;\n}\n\n#featured,\n.panel-top {\n background-position:50% 50%;\n background-size:cover !important;\n overflow:hidden;\n position: relative;\n z-index: 0;\n .tint {\n // Let colorizer supply the background color.\n //background-color:rgba(10 , 119 , 189, .45);\n position:absolute;\n height: 900px;\n width:100%;\n z-index: -1;\n }\n .pane-dkan-sitewide-demo-front-dkan-demo-front .pane-title,\n .pane-views-popular-tags-block .pane-title,\n .pane-dkan-sitewide-demo-front-dkan-add-front .pane-title {\n display:none;\n }\n .container {\n padding: 30px 0;\n position: relative;\n z-index: 5;\n }\n .pane-block,\n .panel-pane,\n .block-content {\n color:#fff;\n line-height: 1.33em;\n margin:0 15px;\n }\n a {\n color:#fff;\n }\n}\n.page-admin .panel-top {\n background-image: none !important;\n background-color: none;\n overflow: visible;\n .tint {\n display:none;\n }\n}\n#top-content {\n margin:20px;\n .block {\n padding:10px;\n text-align:center;\n h2.block-title {\n border:none;\n color:$gray-dark;\n font-size:1.6em;\n }\n }\n [class*=\"col-\"]{\n background-color: $smoke;\n border-left:4px solid $body-bg;\n border-right:4px solid $body-bg;\n margin-bottom: -99999px;\n padding-bottom: 99999px;\n }\n\n .row {\n overflow: hidden;\n }\n}\n@media all and (max-width:767px) {\n .branding.container {\n padding-left: 15px;\n padding-right: 15px;\n }\n}","// Menu\n// Styles for Menus and Navs\n// --------------------------------------------------\n.navigation-wrapper .container {\n overflow: visible;\n .navbar-collapse {\n overflow: visible;\n }\n}\n\n.container > .navbar-header, .container > .navbar-collapse {\n margin-left: 10px;\n margin-right: 10px;\n}\n.navbar-default .navbar-collapse, \n.navbar-default .navbar-form {\n padding: 0;\n vertical-align: top;\n}\n\n.navbar-header {\n position:relative;\n z-index:3;\n}\n\n.navbar-default {\n background:transparent;\n border:none;\n margin: 0;\n overflow: visible !important;\n position:relative;\n z-index:3;\n\n .navbar-nav,\n .user-menu {\n margin:0;\n overflow: visible;\n position:relative;\n z-index:3;\n a.dropdown-toggle {\n color: #FFFFFF;\n }\n .open > a,\n li > a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding:15px;\n &.dropdown-toggle:hover,\n &:active,\n &:hover,\n &:focus {\n background: $brand-secondary;\n color: #FFFFFF;\n text-decoration:none;\n }\n &.dropdown-toggle:focus,\n &.dropdown-toggle:active {\n background-color: transparent;\n }\n &.dropdown-toggle:hover {\n background: $brand-secondary;\n }\n }\n .dropdown-menu {\n background: $brand-primary;\n padding: 0;\n li {\n display: block;\n a {\n display: block;\n color: #ffffff;\n }\n }\n }\n }\n .navbar-toggle {\n border-color: #ffffff;\n &:hover,\n &:focus {\n background-color: rgba(0, 0, 0, .25);\n }\n .icon-bar {\n background-color: #ffffff;\n }\n }\n\n @media all and (min-width:768px) {\n .user-menu {\n float: right;\n }\n .navbar-nav li,\n .user-menu li {\n display: inline-block;\n a {\n display: inline-block;\n }\n .dropdown-menu li,\n .dropdown-menu li a {\n display: block;\n }\n }\n }\n .navbar-nav.secondary li {\n float:none;\n a {\n font-size:.7em;\n line-height:1.5em;\n padding:4px;\n }\n }\n}\n\n@media all and (max-width:767px) {\n .nav > li {\n clear: both;\n }\n .navbar-default .navbar-nav .open .dropdown-menu,\n .navbar-default .navbar-nav .dropdown-menu {\n @include box-shadow(none);\n border: none;\n display: block;\n width: 100%;\n position: relative;\n li > a {\n color: #ffffff;\n display: block;\n padding:15px 10px 15px 35px;\n &:hover,\n &:focus,\n &:active {\n background: $brand-secondary;\n color: #ffffff;\n clear: both;\n }\n }\n }\n}\n\n#block-dkan-sitewide-dkan-sitewide-user-menu {\n .links a {\n color: #FFFFFF;\n display: block;\n line-height: 20px;\n padding:15px;\n &:hover,\n &:focus {\n background: $brand-secondary;\n color: #FFFFFF;\n text-decoration:none;\n }\n }\n img {\n margin: 10px;\n }\n @media all and (min-width:768px) {\n float: right;\n .links a {\n display: inline-block;\n }\n }\n}\n\n//override bootstrap\n.navbar .nav > li > a {\n text-shadow:none;\n}\n\n// Large screen.\n@media(min-width:768px) {\n .navbar {\n @include border-radius(0);\n }\n .container > .navbar-header {\n margin-left:0;\n }\n #nav-wrapper .navbar-default .logo {\n padding:10px 10px 0 0;\n }\n}\n\n.tabs--primary {\n margin: 10px 0;\n li {\n margin:1px;\n }\n li a {\n background: #fff;\n border:1px solid #fff;\n padding:6px 15px;\n &:hover {\n border:1px solid $brand-secondary;\n background:$brand-secondary;\n color:#fff;\n }\n &.active {\n border:1px solid $brand-primary;\n background:$brand-primary;\n color:#fff;\n }\n }\n}\n\n.nav-tabs {\n li a {\n color:$brand-primary;\n }\n}\n\n.front .tabs--primary {\n display: none;\n}\n.tabs--primary {\n .nav-pills li a.active,\n .nav-pills li.active a:hover,\n .nav-pills li.active a:focus {\n border:1px solid $brand-primary;\n background: $brand-primary;\n color:#ffffff;\n }\n}\n.btn-primary {\n background:$brand-primary;\n border-color:$brand-primary;\n}\n.btn-primary:hover, \n.btn-primary:focus, \n.btn-primary:active, \n.btn-primary.active {\n background:$brand-secondary;\n border-color:$brand-secondary;\n}\n\n.form-actions #edit-submit {\n background: $brand-success;\n border-color: $brand-success;\n}\n.form-actions #edit-submit:hover,\n.form-actions #edit-submit:focus,\n.form-actions #edit-submit:active {\n background: darken($brand-success,10%);\n border-color: darken($brand-success,10%);\n color: #fff;\n}\n\na.embed-link {\n @include border-radius(4px);\n //background:$brand-primary;\n color: #fff;\n display: inline-block;\n padding:5px 15px 5px 35px;\n position:relative;\n margin:1em 0;\n text-decoration: none;\n}\na.embed-link:hover, \na.embed-link:focus, \na.embed-link:active {\n //background:$brand-secondary;\n color:#fff;\n text-decoration:none;\n}\na.embed-link:before {\n content:'\\f121';\n color: #fff;\n font-family: $icon-fa;\n font-size: 1.3em;\n position: absolute;\n top:5px;\n left:10px;\n}\ntextarea.embed-code {\n width: 100%;\n margin-bottom:1em;\n}\n\nul.action-links {\n margin:1em 15px;\n li {\n float: none;\n display:inline-block;\n }\n}\n\n.btn:active, \n.btn.active {\n @include box-shadow(none);\n}\n\n.radix-layouts-sidebar {\n ul.menu > li > ul.menu {\n margin-left: 0;\n li a {\n padding: 10px 15px 10px 30px;\n }\n }\n}\n","//\n// Styles for Nodes\n// --------------------------------------------------\n.node-type-dataset {\n .field-name-field-tags {\n margin: 1em 0;\n }\n .field-name-field-topic {\n margin: -20px 0 15px 0;\n }\n // Dataset field labels.\n h4 {\n @include h4;\n }\n .field-name-field-related-content,\n .field-name-field-topic,\n .field-name-field-tags,\n .field-name-field-topic,\n .field-name-field-preview-thumbail {\n .field-label {\n @include h4;\n }\n }\n}\n\n/** UI Tabs **/\n.node-resource-form .horizontal-tabs {\n border:none;\n ul.horizontal-tabs-list {\n background-color: transparent;\n border: 0;\n padding-top: 10px;\n li,\n li.selected {\n border: 0;\n background-color: transparent;\n min-width: 4em;\n a:hover {\n background:transparent;\n }\n #active-horizontal-tab {\n background: url(../images/sprite-ckan-icons.png) no-repeat -193px 2px;\n display: block;\n text-indent: -9999px;\n width: 16px;\n height: 16px;\n left: 50%;\n clip: auto;\n }\n &.horizontal-tab-button-1 .summary,\n &.horizontal-tab-button-2 .summary {\n background: url(../images/sprite-ckan-icons.png) no-repeat -160px 0;\n }\n .summary{\n background: url(../images/sprite-ckan-icons.png) no-repeat -144px 0;\n width: 16px;\n height: 16px;\n position: absolute;\n top:5px;\n left:10px;\n }\n a {\n font-size: 1.1em;\n position: relative;\n padding: 5px 15px 5px 30px;\n }\n }\n }\n .horizontal-tabs-panes {\n @include border-radius($border-radius-base);\n border:1px solid $border;\n padding: 8px;\n fieldset.htab_link_upload,\n fieldset.htab_link_api,\n fieldset.htab_link_file {\n legend.panel-heading {\n display: none;\n }\n .field-widget-recline-widget legend.panel-heading {\n border:none;\n border-bottom: 1px solid $border;\n display: block;\n background:transparent;\n color: $gray;\n padding: 5px 0;\n //margin-top:10px;\n }\n }\n .form-type-checkbox label,\n .form-type-select label {\n display: block;\n line-height: 36px;\n padding-top:2px;\n }\n .filefield-source-remotefile {\n input {\n margin-right: 0;\n }\n input.btn {\n @include border-radius(0 $border-radius-base $border-radius-base 0);\n margin-left: -1px;\n }\n }\n .form-item-field-upload-und-0-embed {\n clear: both;\n }\n }\n}\n.page-node-add-resource {\n .field-group-htabs.group-data div.horizontal-tabs {\n border: 0;\n }\n .form-item {\n margin: 0;\n }\n}\n\n#action-info {\n color: $brand-danger;\n margin: 1em 0;\n &:before {\n color: $brand-danger;\n content: \"\\f071\";\n font-family: \"FontAwesome\";\n font-size: 1.5em;\n font-style: normal;\n margin-right: 5px;\n vertical-align: middle;\n }\n}\n.field-name-body {\n a {\n overflow-wrap: break-word;\n }\n ul {\n list-style-type:disc;\n margin:10px 20px;\n li {\n margin:6px 10px;\n }\n }\n}\n.field-group-table-description {\n color:$gray;\n display:block;\n padding:8px 10px 8px 40px;\n position:relative;\n .icon-info-sign:before {\n color:$gray-light;\n content:\"\\f05a\";\n font-family:$icon-fa;\n font-size:2.5em;\n font-style: normal;\n height:30px;\n left:0;\n margin:10px 15px 0 0;\n padding:6px 0;\n position:absolute;\n top:-6px;\n width:30px;\n }\n}\n\n.node-type-group {\n .horizontal-tabs {\n margin: 0;\n #edit-field-image-und-0-remove-button {\n @include border-radius($border-radius-base);\n margin-left: 5px;\n }\n }\n}\n\n.group-owner-message {\n margin-bottom:20px;\n}\n\n.field-type-text-with-summary {\n padding: 0;\n}\n.field-name-field-additional-info {\n margin-top: 2em;\n}\n.field-name-field-related-content .field-item {\n @include item-list;\n}","//\n// Styles for individual pages\n// --------------------------------------------------\n.main {\n padding-top:20px;\n padding-bottom: 20px;\n}\n.front .main {\n padding: 0;\n}\n.page-admin {\n .main {\n padding: 20px 15px;\n }\n .region-content {\n margin: 0;\n }\n .breadcrumb,\n .alert,\n .tabs--primary,\n .page-header {\n margin: 0 0 15px;\n }\n}\n","//\n// Styles for panels and panes.\n// --------------------------------------------------\n\n.panel-body {\n\toverflow: visible;\n}\n.pane-content {\n .field-name-body {\n line-height: 2em;\n }\n}\n.main .panel-pane {\n\tmargin-bottom: 0em;\n}\nh2.pane-title {\n\tborder-bottom: 1px solid $border;\n\tpadding-bottom: 10px;\n}\n\n#panels-choose-layout .form-type-radio input,\n.panels-choose-layout .form-type-radio input {\n\twidth: 15px;\n}\n\n.radix-layouts-sidebar {\n\t.pane-title {\n\t\t@include block-title;\n\t}\n\t.pane-block {\n\t\t@include blockbox;\n\t}\n}\n.page-user {\n\t.radix-layouts-content .pane-content {\n \tpadding: 0;\n\t .profile {\n\t \tmargin-top: 0;\n\t }\n\t}\n}\n.radix-layouts-content {\n\t.pane-title {\n\t\tfont-size: 36px;\n \tline-height: 42px;\n\t\tmargin:0 0 15px 0;\n\t}\n\t.pane-content {\n\t\tpadding: 20px 0;\n\t\tmargin-bottom: 0em;\n\t}\n\t.pane-node-field-topic .pane-content {\n\t\tpadding: 0\n\t}\n\t.pane-page-breadcrumb {\n\t\t.breadcrumb {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 0 15px 0;\n\t\t}\n\t}\n}\n.node-type-group .radix-layouts-content {\n\t@media (max-width: 991px) {\n\t\t.pane-title {\n\t\t\tmargin-top: 2em;\n\t\t}\n\t}\n\t.pane-content {\n\t\tpadding: 20px 0 0;\n\t\tmargin-bottom: 0;\n\t}\n}\n\n.page-manager-wrapper .panel-region {\n\t.pane-title {\n\t\tbackground-image: none;\n\t\tborder: none;\n\t\tfont-size: 1em;\n\t\tline-height: normal;\n\t}\n\t.panel-pane-collapsible {\n\t\t.pane-content {\n\t\t\tpadding: 10px 15px;\n\t\t}\n\t}\n}\n\n#panelizer-edit-content-form input {\n\tmargin-right: 1em;\n}\n\n.panel-full-width .panel-top {\n\tmargin-bottom: 15px;\n}\n@media (max-width: 768px) {\n\t.panel-full-width .panel-bottom {\n\t\t.panel-col-first,\n\t\t.panel-col-second,\n\t\t.panel-col-third {\n\t\t\tfloat: none;\n\t\t\twidth: 100%;\n\t\t}\n\t}\n}\n","// Recline css overrides.\n.recline-pager .pagination {\n li {\n vertical-align: middle;\n a {\n line-height: 1em;\n padding: 0 10px;\n &.btn {\n line-height: 32px;\n }\n }\n }\n input {\n\t height: 20px;\n\t font-size: .8em;\n }\n}\n.recline-data-explorer {\n .form-control {\n border-color: #ccc;\n }\n .btn {\n \tborder:1px solid $smoke;\n \tfont-size: 14px;\n \tpadding: 0px 12px;\n line-height: 32px;\n }\n}\n.dropdown-menu.slick-contextmenu {\n background: #fff;\n li {\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n","@media all and (max-width:767px) {\n\taside[class|='col'],\n\tsection[class|='col'] {\n\t\tpadding: 0;\n\t}\n\t.container {\n\t\twidth: 100%;\n\t}\n\t// Adjust custom full width panels.\n\t.panel-full-width .panel-top .panel-col-first,\n\t.panel-full-width .panel-top .panel-col-second,\n\t.panel-full-width .panel-bottom .panel-col-first,\n\t.panel-full-width .panel-bottom .panel-col-second,\n\t.panel-full-width .panel-bottom .panel-col-third {\n\t width: 100%;\n\t float: none;\n\t .inside {\n\t \tmargin: 20px 15px;\n\t }\n\t}\n\t\n}\n\n","#views-exposed-form-dkan-datasets-panel-pane-1 {\n .views-exposed-form .views-widget-filter-search_api_views_fulltext {\n max-width: 320px;\n }\n}\n\n#dkan-sitewide-dataset-search-form,\n#dkan-sitewide-dataset-search-form--2 {\n @include searchbox;\n position: relative;\n}\n#dkan-sitewide-dataset-search-form,\n#dkan-sitewide-dataset-search-form--2 {\n label {\n @extend %screenreader;\n }\n}\n\n#region-branding #block-dkan-sitewide-dkan-sitewide-search-bar label {\n @extend %screenreader;\n}\n\n#block-dkan-sitewide-dkan-sitewide-search-bar {\n @media all and (min-width:768px) {\n position: absolute;\n top: 10px;\n right: 15px;\n width:172px;\n form {\n width:172px;\n }\n input.form-control {\n width:170px;\n height: 36px;\n margin: 0;\n }\n }\n @include searchbox;\n clear: both;\n .views-exposed-form .form-submit {\n margin:22px 0 0;\n text-shadow: none;\n }\n}\n\n.facetapi-terms span[class*=font-icon-select]:before,\n.icon-dkan.facet-icon:before {\n font-family: 'DKAN-Topics';\n font-size: 24px;\n padding-right: .3em;\n vertical-align: middle;\n}\n\n.node-search-result {\n .icon-dkan.facet-icon:before {\n font-size: 42px;\n margin-top: 0.7em;\n display: block;\n }\n .resource-list li {\n display: inline-block;\n }\n .icon-container {\n text-align: center;\n }\n}\n\n.search-result {\n ul.resource-list {\n margin-top: 0.9em;\n\n li {\n display: inline-block;\n a,\n &:first-child {\n margin-left: 0px;\n }\n }\n }\n .dataset-list {\n list-style: none;\n margin: 0;\n padding: 0;\n li {\n list-style: none;\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em;\n &:before {\n content: \"\\e97e\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em;\n }\n }\n }\n .group-membership {\n font-size: 0.9em;\n font-style: italic;\n color: #999;\n margin-bottom: 0.5em;\n &:before {\n content: \"\\e981\";\n font-family: 'DKAN-Topics';\n font-style: normal;\n margin-right: .5em;\n }\n }\n &.search-result-group .group-membership {\n display: none;\n }\n p {\n margin-bottom: 0px;\n }\n}\n\n.node-search-result {\n h2.node-title {\n margin: 1.5em 0 .5em 0;\n }\n}","//\n// Styles for Tabs, Messages, ..etc\n// --------------------------------------------------\nbody {\n font-family:$font-base;\n font-size:16px;\n line-height:1.35em;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\nbody.modal-open {\n overflow: visible !important;\n}\n.branding {\n position: relative;\n .logo {\n margin: 20px 20px 15px 0;\n }\n}\n@media (max-width: 768px) {\n .logo img {\n max-width: 100%;\n }\n}\n\n.site-name {\n display: block;\n font-size: 2em;\n line-height: 1.15em;\n margin: 50px 20px 0;\n @media(max-width:460px) {\n clear: left;\n float: none;\n margin: 10px 20px 5px 0;\n }\n &:hover {\n text-decoration: none;\n }\n}\n.site-slogan {\n margin-bottom: 20px;\n}\nh1 {\n font-size: 30px;\n line-height: 36px;\n margin-bottom: 15px;\n}\nh1,h2,h3,h4 {\n color:$gray-dark;\n font-weight:300;\n}\nh3.media-heading {\n margin:.5em 0;\n}\nh4 {\n margin-top: 2em;\n margin-bottom: .5em;\n}\n\na {\n color:$brand-primary;\n &:hover {\n color:$brand-secondary;\n }\n}\np,\np:last-child {\n margin: 0 0 1.25em 0;\n}\n\n.breadcrumb {\n background: none;\n border: none;\n font-size: 1em;\n list-style: none;\n padding: 0;\n position: relative;\n li {\n float:none;\n a {\n span {\n display:none;\n }\n }\n &.home-link a {\n font-size:1.3em;\n i {\n display: block;\n }\n }\n }\n}\n\n.alert {\n border: none;\n padding: 15px 35px;\n position: relative;\n .close {\n line-height: 18px;\n position: absolute;\n right: 10px;\n top: 5px;\n }\n &.alert-warning {\n background: #FFE285;//$brand-warning;\n }\n &:before {\n font-family: $icon-fa;\n font-size: 1.5em;\n position: absolute;\n top: 15px;\n left: 10px;\n }\n &.alert-danger:before {\n content: '\\f06a';\n color: $brand-danger;\n }\n &.alert-warning:before {\n content: '\\f05a';\n color: #8a6d3b;\n }\n &.alert-success:before {\n content: '\\f058';\n color: $brand-success;\n }\n}\n.page-admin .alert {\n margin: 10px 0;\n}\n// Tables\ntable,\ntable.group_additional {\n border-collapse:collapse;\n margin:1em 0;\n width:100%;\n thead > tr > th {\n //@include background-image(linear-gradient(#F5F5F5, #F0F0F0));\n background-color: lighten($border, 4%);\n border: 1px solid $border !important;\n padding: 4px 8px;\n font-weight: bold;\n }\n thead th:first-child {\n //@inlclude border-top-left-radius(4px);\n }\n thead th:last-child,\n thead th:last-child {\n //@include border-top-right-radius(4px);\n }\n tbody th,\n td {\n border:1px solid $border;\n padding:4px 8px;\n vertical-align:top;\n }\n tr:hover {\n background:#FFFEEE;\n }\n}\n\n@media screen and (max-width: 1024px) {\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > tfoot > tr > td {\n white-space: normal;\n }\n}\n.field-name-field-additional-info .field-label {\n margin-bottom: 1em;\n}\n.group_additional,\n.field-name-field-additional-info table,\n.field-name-field-additional-info .table-responsive {\n margin: 0;\n td,\n th {\n white-space: normal;\n width: auto;\n }\n td:nth-of-type(2n) {\n @include wrap;\n }\n @media all and (min-width:768px) {\n th:nth-of-type(1n),\n td:nth-of-type(1n),\n th:nth-of-type(4n),\n td:nth-of-type(4n) {\n width: 5%;\n border-right: 1px solid $border;\n }\n th:nth-of-type(2n),\n td:nth-of-type(2n) {\n width: 90%;\n .form-control {\n min-width: 40%;\n }\n }\n }\n}\n\ntable.group_additional,\n.field-name-field-additional-info table {\n th,\n td,\n th:nth-of-type(1n),\n td:nth-of-type(1n),\n th:nth-of-type(2n),\n td:nth-of-type(2n) {\n width: auto;\n .form-control {\n display: inline-block;\n width: auto;\n vertical-align: top\n }\n }\n margin-top: 0;\n}\n.table > thead:first-child > tr:first-child > th,\ntable thead:first-child tr:first-child th {\n border: 1px solid $border;\n}\n.table-bordered > thead > tr > th,\ntable thead > tr > th {\n background-color: lighten($border, 4%);\n border: 1px solid $border;\n padding:4px 8px;\n}\n\n// Striped tables.\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9;\n}\n.table tbody tr:hover td, \n.table tbody tr:hover th,\n.table-striped > tbody > tr:nth-child(odd):hover {\n background-color: #FFFEEE;\n}\n\n\ndl {\n margin:0;\n padding:0;\n clear:both;\n overflow:hidden;\n}\ndt {\n clear: both;\n margin:0;\n padding:8px 5px;\n float:left;\n width:28%;\n}\ndd {\n margin:0;\n padding:8px 5px;\n float:right;\n width:72%;\n}\ndt,\ndd {\n border-top: 1px solid $border;\n}\n\n.item-list .pagination {\n li:first-child > span,\n li:first-child > a {\n @include border-radius(4px 0 0 4px);\n }\n li:last-child > span,\n li:last-child > a {\n @include border-radius(0 4px 4px 0);\n }\n}\n\n.radix-layouts-sidebar .item-list ul,\n.nav-simple {\n margin: 0;\n list-style: none;\n padding: 0;\n li {\n margin:0;\n line-height: 1.1666666666666667em;\n padding: 0;\n border-bottom: 1px dotted #CCC;\n position:relative;\n a {\n display: block;\n margin:0;\n }\n a:hover {\n background:#FFFEEE;\n }\n &.last {\n border-bottom: none;\n }\n }\n}\n\n// Keep images inside their containers.\nimg {\n max-width: 100%;\n height: auto;\n}\n// Bootstrap/Radix Overrides.\n.thumbnail {\n padding: 0;\n margin: 0;\n background-color: transparent;\n border: none;\n border-radius: 0;\n}\n\n.screenreader {\n @extend %screenreader;\n}\n","//\n// Styles for Taxonomy\n// --------------------------------------------------\n\n.field-name-field-tags .field-item {\n display:inline-block;\n}\n.field-name-field-tags {\n label {\n display: block;\n }\n input.form-control {\n height: auto;\n }\n .field-item {\n a {\n display: inline-block;\n padding:2px 10px 2px;\n font-size:12px;\n line-height: 20px;\n @include border-radius(0 5px 5px 0);\n background-color: $shade;\n margin:3px 5px 3px 20px;\n position:relative;\n color:$gray-dark;\n border:1px solid $border;\n border-left:0;\n z-index:2;\n &:after {\n content:\"\";\n width: 20px;\n height: 20px;\n background-color: $shade;\n @include rotate(45deg);\n @include border-radius(2px);\n position:absolute;\n top:2px;\n left:-9px;\n z-index:-1;\n border:1px solid $border;\n border-top:none;\n border-right:none;\n }\n &:before {\n content:\"\";\n width:2px;\n height:2px;\n background:$gray-light;\n position:absolute;\n top:11px;\n left:-5px;\n @include border-radius(0);\n }\n }\n a:hover,\n a:hover:after {\n background: #fff;\n color:#000;\n text-decoration:none;\n }\n }\n}\n\n.field-name-field-topic {\n .field-item { \n margin: 0 1.5em .5em 0;\n .field-item {\n margin: 0;\n }\n }\n}\n.field-name-field-topic-icon span::before, \n.view-dkan-datasets .field-name-field-topic-icon span::before {\n font-size: 18px;\n}\n.font_icon_select_options .label {\n color: #333;\n}","//\n// Styles for Views\n// --------------------------------------------------\n.front .view-popular-tags {\n margin-top:20px;\n}\n.view-popular-tags {\n margin: 15px 0;\n ul.tag-list {\n margin: 0;\n padding: 0;\n li {\n display:inline-block;\n margin-right:2em;\n a {\n color:#fff;\n }\n }\n }\n}\n.view-content h2 {\n font-size: 1.5em;\n margin:1em 0 .5em;\n}\n.view-groups-search .views-row {\n border-bottom:1px dotted $smoke;\n padding:1em 0;\n}\n\n// .views-field-field-image img {\n// display:block;\n// height:auto;\n// margin:0 auto 5px;\n// max-width:220px;\n// width:100%;\n// }\n.view-front-page-group-list {\n .views-row {\n position: relative;\n padding-left: 120px;\n min-height: 110px;\n img {\n position: absolute;\n top: 0;\n left: 0;\n }\n }\n}\n\n.view-user-profile-fields img {\n height:auto;\n margin:0 auto;\n max-width:190px;\n width:100%; \n}\n\n.view-front-page-group-grid {\n .row {\n span {\n display:block;\n margin:15px 0;\n .media-content {\n padding:0 10px 10px 120px;\n }\n .media-image {\n float:left;\n margin:0;\n padding:0;\n img {\n margin:5px 10px 5px 0;\n }\n }\n h3.media-heading {\n font-size:1.3em;\n margin:.5em 0;\n padding:0;\n }\n }\n }\n @media(min-width:768px) {\n .span6,\n .col-lg-6 {\n float:left;\n margin:0;\n width:50%;\n }\n }\n}\n\n.view-dkan-groups {\n .node-teaser {\n min-height: 365px;\n margin-bottom: 20px;\n h2.node-title {\n margin: .75em 0;\n }\n .btn-primary {\n margin: 0 auto 1.5em;\n }\n .field-name-field-image {\n text-align: center;\n }\n }\n}\n.view-groups-page {\n .views-column {\n float:left;\n margin:0;\n width:50%;\n }\n}\n.view-group-block {\n .views-field-title {\n font-size:1.2em;\n }\n .views-field-field-image {\n text-align: center;\n }\n .views-field-nid a {\n background: $brand-primary;\n color:#fff;\n display: block;\n margin:1em 0 0 0;\n padding:5px 8px;\n text-align: center;\n }\n}\n.view-dataset {\n form {\n margin: 0;\n position: relative;\n }\n .views-row {\n margin:1.5em 0;\n }\n}\n.views-exposed-form {\n position:relative;\n .views-exposed-widget {\n display: inline;\n padding: .5em .5em 0 0;\n .views-widget-filter-search_api_views_fulltext,\n .views-widget-sort-by,\n .views-widget-sort-order,\n .views-submit-button,\n .form-submit {\n display: inline;\n float:none;\n margin: 0;\n position:relative;\n }\n &.views-reset-button,\n &.views-submit-button {\n margin: 0;\n padding: 2.1em .5em 0 0;\n }\n }\n .description {\n @include text-shadow(none);\n position:absolute;\n color: #999999;\n font-size:12px;\n left: 7px;\n top: 10px;\n }\n}\n\n#views-exposed-form-dkan-datasets-panel-pane-1 .views-exposed-form .description { display: none;}\n\n.view-dkan-groups-featured,\n.pane-dkan-groups-featured {\n .row {\n text-align: center;\n div[class*='views-column'] {\n margin-bottom: 1.25em;\n }\n }\n}\n\n.view-admin-content table {\n margin-top: 0;\n}","@import \"shared\";\n\n// These defaults make the arguments optional for this mixin\n// If you like, set different defaults in your project\n\n$default-text-shadow-color: #aaa !default;\n$default-text-shadow-h-offset: 0px !default;\n$default-text-shadow-v-offset: 0px !default;\n$default-text-shadow-blur: 1px !default;\n$default-text-shadow-spread: false !default;\n\n// Provides cross-browser text shadows when one or more shadows are needed.\n// Each shadow argument should adhere to the standard css3 syntax for the\n// text-shadow property.\n//\n// Note: if any shadow has a spread parameter, this will cause the mixin\n// to emit the shadow declaration twice, first without the spread,\n// then with the spread included. This allows you to progressively\n// enhance the browsers that do support the spread parameter.\n@mixin text-shadow(\n $shadow-1 : default,\n $shadow-2 : false,\n $shadow-3 : false,\n $shadow-4 : false,\n $shadow-5 : false,\n $shadow-6 : false,\n $shadow-7 : false,\n $shadow-8 : false,\n $shadow-9 : false,\n $shadow-10: false\n) {\n @if $shadow-1 == default {\n $shadow-1: compact($default-text-shadow-h-offset $default-text-shadow-v-offset $default-text-shadow-blur $default-text-shadow-spread $default-text-shadow-color);\n }\n $shadows-without-spread: join((),(),comma);\n $shadows: join((),(),comma);\n $has-spread: false;\n @each $shadow in compact($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5,\n $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10) {\n @if length($shadow) > 4 {\n $has-spread: true;\n $shadows-without-spread: append($shadows-without-spread, nth($shadow,1) nth($shadow,2) nth($shadow,3) nth($shadow,5));\n $shadows: append($shadows, $shadow);\n } else {\n $shadows-without-spread: append($shadows-without-spread, $shadow);\n $shadows: append($shadows, $shadow);\n }\n }\n @if $has-spread {\n text-shadow: $shadows-without-spread;\n }\n text-shadow: $shadows;\n}\n\n// Provides a single cross-browser CSS text shadow.\n//\n// Provides sensible defaults for the color, horizontal offset, vertical offset, blur, and spread\n// according to the configuration defaults above.\n@mixin single-text-shadow(\n $hoff: false,\n $voff: false,\n $blur: false,\n $spread: false,\n $color: false\n) {\n // A lot of people think the color comes first. It doesn't.\n @if type-of($hoff) == color {\n $temp-color: $hoff;\n $hoff: $voff;\n $voff: $blur;\n $blur: $spread;\n $spread: $color;\n $color: $temp-color;\n }\n // Can't rely on default assignment with multiple supported argument orders.\n $hoff: if($hoff, $hoff, $default-text-shadow-h-offset);\n $voff: if($voff, $voff, $default-text-shadow-v-offset);\n $blur: if($blur, $blur, $default-text-shadow-blur );\n $spread: if($spread, $spread, $default-text-shadow-spread );\n $color: if($color, $color, $default-text-shadow-color );\n // We don't need experimental support for this property.\n @if $color == none or $hoff == none {\n @include text-shadow(none);\n } @else {\n @include text-shadow(compact($hoff $voff $blur $spread $color));\n }\n}\n"]} \ No newline at end of file diff --git a/dkan/themes/contrib/nuboot_radix/assets/css/print.css.map b/dkan/themes/contrib/nuboot_radix/assets/css/print.css.map index d1c550c86..a0c1bdb34 100644 --- a/dkan/themes/contrib/nuboot_radix/assets/css/print.css.map +++ b/dkan/themes/contrib/nuboot_radix/assets/css/print.css.map @@ -1 +1 @@ -{"version":3,"sources":[],"names":[],"mappings":"","file":"print.css","sourceRoot":"/source/","sourcesContent":[]} \ No newline at end of file +{"version":3,"sources":[],"names":[],"mappings":"","file":"print.css","sourcesContent":[]} \ No newline at end of file diff --git a/dkan/themes/contrib/nuboot_radix/assets/js/nuboot_radix.script.js b/dkan/themes/contrib/nuboot_radix/assets/js/nuboot_radix.script.js index e09eafdb3..c1d2b8103 100644 --- a/dkan/themes/contrib/nuboot_radix/assets/js/nuboot_radix.script.js +++ b/dkan/themes/contrib/nuboot_radix/assets/js/nuboot_radix.script.js @@ -1,2 +1,2 @@ -!function(e){}(jQuery),!function(e){"use strict";e.matchMedia=e.matchMedia||function(e){var t,i=e.documentElement,s=i.firstElementChild||i.firstChild,n=e.createElement("body"),a=e.createElement("div");return a.id="mq-test-1",a.style.cssText="position:absolute;top:-100em",n.style.background="none",n.appendChild(a),function(e){return a.innerHTML='­',i.insertBefore(n,s),t=42===a.offsetWidth,i.removeChild(n),{matches:t,media:e}}}(e.document)}(this),function(e){"use strict";function t(){E(!0)}var i={};e.respond=i,i.update=function(){};var s=[],n=function(){var t=!1;try{t=new e.XMLHttpRequest}catch(i){t=new e.ActiveXObject("Microsoft.XMLHTTP")}return function(){return t}}(),a=function(e,t){var i=n();i&&(i.open("GET",e,!0),i.onreadystatechange=function(){4!==i.readyState||200!==i.status&&304!==i.status||t(i.responseText)},4!==i.readyState&&i.send(null))},r=function(e){return e.replace(i.regex.minmaxwh,"").match(i.regex.other)};if(i.ajax=a,i.queue=s,i.unsupportedmq=r,i.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},i.mediaQueriesSupported=e.matchMedia&&null!==e.matchMedia("only all")&&e.matchMedia("only all").matches,!i.mediaQueriesSupported){var o,l,d,c=e.document,u=c.documentElement,m=[],h=[],f=[],p={},g=30,v=c.getElementsByTagName("head")[0]||u,x=c.getElementsByTagName("base")[0],y=v.getElementsByTagName("link"),w=function(){var e,t=c.createElement("div"),i=c.body,s=u.style.fontSize,n=i&&i.style.fontSize,a=!1;return t.style.cssText="position:absolute;font-size:1em;width:1em",i||(i=a=c.createElement("body"),i.style.background="none"),u.style.fontSize="100%",i.style.fontSize="100%",i.appendChild(t),a&&u.insertBefore(i,u.firstChild),e=t.offsetWidth,a?u.removeChild(i):i.removeChild(t),u.style.fontSize=s,n&&(i.style.fontSize=n),e=d=parseFloat(e)},E=function(t){var i="clientWidth",s=u[i],n="CSS1Compat"===c.compatMode&&s||c.body[i]||s,a={},r=y[y.length-1],p=(new Date).getTime();if(t&&o&&g>p-o)return e.clearTimeout(l),void(l=e.setTimeout(E,g));o=p;for(var x in m)if(m.hasOwnProperty(x)){var S=m[x],b=S.minw,C=S.maxw,k=null===b,T=null===C,z="em";b&&(b=parseFloat(b)*(b.indexOf(z)>-1?d||w():1)),C&&(C=parseFloat(C)*(C.indexOf(z)>-1?d||w():1)),S.hasquery&&(k&&T||!(k||n>=b)||!(T||C>=n))||(a[S.media]||(a[S.media]=[]),a[S.media].push(h[S.rules]))}for(var $ in f)f.hasOwnProperty($)&&f[$]&&f[$].parentNode===v&&v.removeChild(f[$]);f.length=0;for(var F in a)if(a.hasOwnProperty(F)){var L=c.createElement("style"),R=a[F].join("\n");L.type="text/css",L.media=F,v.insertBefore(L,r.nextSibling),L.styleSheet?L.styleSheet.cssText=R:L.appendChild(c.createTextNode(R)),f.push(L)}},S=function(e,t,s){var n=e.replace(i.regex.comments,"").replace(i.regex.keyframes,"").match(i.regex.media),a=n&&n.length||0;t=t.substring(0,t.lastIndexOf("/"));var o=function(e){return e.replace(i.regex.urls,"$1"+t+"$2$3")},l=!a&&s;t.length&&(t+="/"),l&&(a=1);for(var d=0;a>d;d++){var c,u,f,p;l?(c=s,h.push(o(e))):(c=n[d].match(i.regex.findStyles)&&RegExp.$1,h.push(RegExp.$2&&o(RegExp.$2))),f=c.split(","),p=f.length;for(var g=0;p>g;g++)u=f[g],r(u)||m.push({media:u.split("(")[0].match(i.regex.only)&&RegExp.$2||"all",rules:h.length-1,hasquery:u.indexOf("(")>-1,minw:u.match(i.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:u.match(i.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}E()},b=function(){if(s.length){var t=s.shift();a(t.href,function(i){S(i,t.href,t.media),p[t.href]=!0,e.setTimeout(function(){b()},0)})}},C=function(){for(var t=0;t'+Drupal.t("Toggle text format")+""),e(".filter-guidelines-processed").hide(),e(".text-help-toggle").click(function(t){t.preventDefault(),e(".form-type-select").toggle(),e(".filter-guidelines-processed").toggle()})}}}(jQuery),window.svgeezy=function(){return{init:function(e,t){this.avoid=e||!1,this.filetype=t||"png",this.svgSupport=this.supportsSvg(),this.svgSupport||(this.images=document.getElementsByTagName("img"),this.imgL=this.images.length,this.fallbacks())},fallbacks:function(){for(;this.imgL--;)if(!this.hasClass(this.images[this.imgL],this.avoid)||!this.avoid){var e=this.images[this.imgL].getAttribute("src");if(null===e)continue;if("svg"==this.getFileExt(e)){var t=e.replace(".svg","."+this.filetype);this.images[this.imgL].setAttribute("src",t)}}},getFileExt:function(e){var t=e.split(".").pop();return t.indexOf("?")!==-1&&(t=t.split("?")[0]),t},hasClass:function(e,t){return(" "+e.className+" ").indexOf(" "+t+" ")>-1},supportsSvg:function(){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")}}}(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm51Ym9vdF9yYWRpeC5zY3JpcHQuanMiLCJyZXNwb25kLm1pbi5qcyIsInNpdGV3aWRlLmpzIiwic3ZnZWV6eS5taW4uanMiXSwibmFtZXMiOlsiJCIsImpRdWVyeSIsImEiLCJtYXRjaE1lZGlhIiwiYiIsImMiLCJkb2N1bWVudEVsZW1lbnQiLCJkIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJmaXJzdENoaWxkIiwiZSIsImNyZWF0ZUVsZW1lbnQiLCJmIiwiaWQiLCJzdHlsZSIsImNzc1RleHQiLCJiYWNrZ3JvdW5kIiwiYXBwZW5kQ2hpbGQiLCJpbm5lckhUTUwiLCJpbnNlcnRCZWZvcmUiLCJvZmZzZXRXaWR0aCIsInJlbW92ZUNoaWxkIiwibWF0Y2hlcyIsIm1lZGlhIiwiZG9jdW1lbnQiLCJ0aGlzIiwidiIsInJlc3BvbmQiLCJ1cGRhdGUiLCJYTUxIdHRwUmVxdWVzdCIsIkFjdGl2ZVhPYmplY3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsInN0YXR1cyIsInJlc3BvbnNlVGV4dCIsInNlbmQiLCJnIiwicmVwbGFjZSIsInJlZ2V4IiwibWlubWF4d2giLCJtYXRjaCIsIm90aGVyIiwiYWpheCIsInF1ZXVlIiwidW5zdXBwb3J0ZWRtcSIsImtleWZyYW1lcyIsImNvbW1lbnRzIiwidXJscyIsImZpbmRTdHlsZXMiLCJvbmx5IiwibWludyIsIm1heHciLCJtZWRpYVF1ZXJpZXNTdXBwb3J0ZWQiLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwicyIsInQiLCJ1IiwiYm9keSIsImZvbnRTaXplIiwicGFyc2VGbG9hdCIsImNvbXBhdE1vZGUiLCJsZW5ndGgiLCJEYXRlIiwiZ2V0VGltZSIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJoYXNPd25Qcm9wZXJ0eSIsInciLCJ4IiwieSIsInoiLCJBIiwiQiIsImluZGV4T2YiLCJoYXNxdWVyeSIsInB1c2giLCJydWxlcyIsIkMiLCJwYXJlbnROb2RlIiwiRCIsIkUiLCJGIiwiam9pbiIsInR5cGUiLCJuZXh0U2libGluZyIsInN0eWxlU2hlZXQiLCJjcmVhdGVUZXh0Tm9kZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiUmVnRXhwIiwiJDEiLCIkMiIsInNwbGl0Iiwic2hpZnQiLCJocmVmIiwicmVsIiwidG9Mb3dlckNhc2UiLCJyYXdDc3NUZXh0IiwidGVzdCIsImxvY2F0aW9uIiwiaG9zdCIsInByb3RvY29sIiwiZ2V0RW1WYWx1ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJhdHRhY2hFdmVudCIsImZuIiwiZGthbkZvcm1zSGlkZSIsImVhY2giLCJhZGRDbGFzcyIsImRlc2MiLCJmaW5kIiwiaW5wdXQiLCJjbGljayIsImZvY3VzIiwiaHRtbCIsImJsdXIiLCJ2YWwiLCJmYWRlSW4iLCJrZXl1cCIsImhpZGUiLCJjc3MiLCJka2FuRm9ybXNBdXRvRGVsdXhlSGlkZSIsIkRydXBhbCIsImJlaGF2aW9ycyIsImRrYW5TaXRlIiwiYXR0YWNoIiwiY29udGV4dCIsInNldHRpbmdzIiwiZWxlbWVudHMiLCJhdXRvRGVsdXhlRWxlbWVudHMiLCJhcHBlbmQiLCJwcmV2ZW50RGVmYXVsdCIsInRvZ2dsZSIsIndpbmRvdyIsInN2Z2VlenkiLCJpbml0IiwiYXZvaWQiLCJmaWxldHlwZSIsInN2Z1N1cHBvcnQiLCJzdXBwb3J0c1N2ZyIsImltYWdlcyIsImltZ0wiLCJmYWxsYmFja3MiLCJoYXNDbGFzcyIsImdldEF0dHJpYnV0ZSIsImdldEZpbGVFeHQiLCJzZXRBdHRyaWJ1dGUiLCJwb3AiLCJjbGFzc05hbWUiLCJpbXBsZW1lbnRhdGlvbiIsImhhc0ZlYXR1cmUiXSwibWFwcGluZ3MiOiJDQUlBLFNBQUFBLEtBRUFDLFNDREEsU0FBQUMsR0FBQSxZQUFBQSxHQUFBQyxXQUFBRCxFQUFBQyxZQUFBLFNBQUFELEdBQUEsR0FBQUUsR0FBQUMsRUFBQUgsRUFBQUksZ0JBQUFDLEVBQUFGLEVBQUFHLG1C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QSxPQUFBLElBQUFiLEtBQUE0SCxTQUFBNUgsTUFBQStILE9BQUEvSCxLQUFBZ0ksTUFBQUssYUFBQSxNQUFBdkcsTUFBQXNHLFdBQUEsU0FBQTFGLEdBQUEsR0FBQVosR0FBQVksRUFBQXFDLE1BQUEsS0FBQXVELEtBQUEsT0FBQXhHLEdBQUE4QixRQUFBLFlBQUE5QixFQUFBQSxFQUFBaUQsTUFBQSxLQUFBLElBQUFqRCxHQUFBb0csU0FBQSxTQUFBeEYsRUFBQVosR0FBQSxPQUFBLElBQUFZLEVBQUE2RixVQUFBLEtBQUEzRSxRQUFBLElBQUE5QixFQUFBLFNBQUFnRyxZQUFBLFdBQUEsTUFBQS9ILFVBQUF5SSxlQUFBQyxXQUFBLDJDQUFBIiwiZmlsZSI6Im51Ym9vdF9yYWRpeC5zY3JpcHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKiBDdXN0b20gc2NyaXB0cyBmb3IgdGhlbWUuXG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICAvLyBjb2RlIGhlcmVcbn0pKGpRdWVyeSk7XG4iLCIvKiEgUmVzcG9uZC5qcyB2MS40LjI6IG1pbi9tYXgtd2lkdGggbWVkaWEgcXVlcnkgcG9seWZpbGxcbiAqIENvcHlyaWdodCAyMDE0IFNjb3R0IEplaGxcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVFxuICogaHR0cDovL2oubXAvcmVzcG9uZGpzICovXG5cbiFmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjthLm1hdGNoTWVkaWE9YS5tYXRjaE1lZGlhfHxmdW5jdGlvbihhKXt2YXIgYixjPWEuZG9jdW1lbnRFbGVtZW50LGQ9Yy5maXJzdEVsZW1lbnRDaGlsZHx8Yy5maXJzdENoaWxkLGU9YS5jcmVhdGVFbGVtZW50KFwiYm9keVwiKSxmPWEuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gZi5pZD1cIm1xLXRlc3QtMVwiLGYuc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOmFic29sdXRlO3RvcDotMTAwZW1cIixlLnN0eWxlLmJhY2tncm91bmQ9XCJub25lXCIsZS5hcHBlbmRDaGlsZChmKSxmdW5jdGlvbihhKXtyZXR1cm4gZi5pbm5lckhUTUw9JyZzaHk7PHN0eWxlIG1lZGlhPVwiJythKydcIj4gI21xLXRlc3QtMSB7IHdpZHRoOiA0MnB4OyB9PC9zdHlsZT4nLGMuaW5zZXJ0QmVmb3JlKGUsZCksYj00Mj09PWYub2Zmc2V0V2lkdGgsYy5yZW1vdmVDaGlsZChlKSx7bWF0Y2hlczpiLG1lZGlhOmF9fX0oYS5kb2N1bWVudCl9KHRoaXMpLGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoKXt2KCEwKX12YXIgYz17fTthLnJlc3BvbmQ9YyxjLnVwZGF0ZT1mdW5jdGlvbigpe307dmFyIGQ9W10sZT1mdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPW5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGMpe2I9bmV3IGEuQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBifX0oKSxmPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZSgpO2MmJihjLm9wZW4oXCJHRVRcIixhLCEwKSxjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQhPT1jLnJlYWR5U3RhdGV8fDIwMCE9PWMuc3RhdHVzJiYzMDQhPT1jLnN0YXR1c3x8YihjLnJlc3BvbnNlVGV4dCl9LDQhPT1jLnJlYWR5U3RhdGUmJmMuc2VuZChudWxsKSl9LGc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShjLnJlZ2V4Lm1pbm1heHdoLFwiXCIpLm1hdGNoKGMucmVnZXgub3RoZXIpfTtpZihjLmFqYXg9ZixjLnF1ZXVlPWQsYy51bnN1cHBvcnRlZG1xPWcsYy5yZWdleD17bWVkaWE6L0BtZWRpYVteXFx7XStcXHsoW15cXHtcXH1dKlxce1teXFx9XFx7XSpcXH0pKy9naSxrZXlmcmFtZXM6L0AoPzpcXC0oPzpvfG1venx3ZWJraXQpXFwtKT9rZXlmcmFtZXNbXlxce10rXFx7KD86W15cXHtcXH1dKlxce1teXFx9XFx7XSpcXH0pK1teXFx9XSpcXH0vZ2ksY29tbWVudHM6L1xcL1xcKlteKl0qXFwqKyhbXi9dW14qXSpcXCorKSpcXC8vZ2ksdXJsczovKHVybFxcKClbJ1wiXT8oW15cXC9cXCknXCJdW146XFwpJ1wiXSspWydcIl0/KFxcKSkvZyxmaW5kU3R5bGVzOi9AbWVkaWEgKihbXlxce10rKVxceyhbXFxTXFxzXSs/KSQvLG9ubHk6Lyhvbmx5XFxzKyk/KFthLXpBLVpdKylcXHM/LyxtaW53Oi9cXChcXHMqbWluXFwtd2lkdGhcXHMqOlxccyooXFxzKlswLTlcXC5dKykocHh8ZW0pXFxzKlxcKS8sbWF4dzovXFwoXFxzKm1heFxcLXdpZHRoXFxzKjpcXHMqKFxccypbMC05XFwuXSspKHB4fGVtKVxccypcXCkvLG1pbm1heHdoOi9cXChcXHMqbShpbnxheClcXC0oaGVpZ2h0fHdpZHRoKVxccyo6XFxzKihcXHMqWzAtOVxcLl0rKShweHxlbSlcXHMqXFwpL2dpLG90aGVyOi9cXChbXlxcKV0qXFwpL2d9LGMubWVkaWFRdWVyaWVzU3VwcG9ydGVkPWEubWF0Y2hNZWRpYSYmbnVsbCE9PWEubWF0Y2hNZWRpYShcIm9ubHkgYWxsXCIpJiZhLm1hdGNoTWVkaWEoXCJvbmx5IGFsbFwiKS5tYXRjaGVzLCFjLm1lZGlhUXVlcmllc1N1cHBvcnRlZCl7dmFyIGgsaSxqLGs9YS5kb2N1bWVudCxsPWsuZG9jdW1lbnRFbGVtZW50LG09W10sbj1bXSxvPVtdLHA9e30scT0zMCxyPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdfHxsLHM9ay5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJhc2VcIilbMF0sdD1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibGlua1wiKSx1PWZ1bmN0aW9uKCl7dmFyIGEsYj1rLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYz1rLmJvZHksZD1sLnN0eWxlLmZvbnRTaXplLGU9YyYmYy5zdHlsZS5mb250U2l6ZSxmPSExO3JldHVybiBiLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6MWVtO3dpZHRoOjFlbVwiLGN8fChjPWY9ay5jcmVhdGVFbGVtZW50KFwiYm9keVwiKSxjLnN0eWxlLmJhY2tncm91bmQ9XCJub25lXCIpLGwuc3R5bGUuZm9udFNpemU9XCIxMDAlXCIsYy5zdHlsZS5mb250U2l6ZT1cIjEwMCVcIixjLmFwcGVuZENoaWxkKGIpLGYmJmwuaW5zZXJ0QmVmb3JlKGMsbC5maXJzdENoaWxkKSxhPWIub2Zmc2V0V2lkdGgsZj9sLnJlbW92ZUNoaWxkKGMpOmMucmVtb3ZlQ2hpbGQoYiksbC5zdHlsZS5mb250U2l6ZT1kLGUmJihjLnN0eWxlLmZvbnRTaXplPWUpLGE9aj1wYXJzZUZsb2F0KGEpfSx2PWZ1bmN0aW9uKGIpe3ZhciBjPVwiY2xpZW50V2lkdGhcIixkPWxbY10sZT1cIkNTUzFDb21wYXRcIj09PWsuY29tcGF0TW9kZSYmZHx8ay5ib2R5W2NdfHxkLGY9e30sZz10W3QubGVuZ3RoLTFdLHA9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYoYiYmaCYmcT5wLWgpcmV0dXJuIGEuY2xlYXJUaW1lb3V0KGkpLGk9YS5zZXRUaW1lb3V0KHYscSksdm9pZCAwO2g9cDtmb3IodmFyIHMgaW4gbSlpZihtLmhhc093blByb3BlcnR5KHMpKXt2YXIgdz1tW3NdLHg9dy5taW53LHk9dy5tYXh3LHo9bnVsbD09PXgsQT1udWxsPT09eSxCPVwiZW1cIjt4JiYoeD1wYXJzZUZsb2F0KHgpKih4LmluZGV4T2YoQik+LTE/anx8dSgpOjEpKSx5JiYoeT1wYXJzZUZsb2F0KHkpKih5LmluZGV4T2YoQik+LTE/anx8dSgpOjEpKSx3Lmhhc3F1ZXJ5JiYoeiYmQXx8ISh6fHxlPj14KXx8IShBfHx5Pj1lKSl8fChmW3cubWVkaWFdfHwoZlt3Lm1lZGlhXT1bXSksZlt3Lm1lZGlhXS5wdXNoKG5bdy5ydWxlc10pKX1mb3IodmFyIEMgaW4gbylvLmhhc093blByb3BlcnR5KEMpJiZvW0NdJiZvW0NdLnBhcmVudE5vZGU9PT1yJiZyLnJlbW92ZUNoaWxkKG9bQ10pO28ubGVuZ3RoPTA7Zm9yKHZhciBEIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShEKSl7dmFyIEU9ay5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksRj1mW0RdLmpvaW4oXCJcXG5cIik7RS50eXBlPVwidGV4dC9jc3NcIixFLm1lZGlhPUQsci5pbnNlcnRCZWZvcmUoRSxnLm5leHRTaWJsaW5nKSxFLnN0eWxlU2hlZXQ/RS5zdHlsZVNoZWV0LmNzc1RleHQ9RjpFLmFwcGVuZENoaWxkKGsuY3JlYXRlVGV4dE5vZGUoRikpLG8ucHVzaChFKX19LHc9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEucmVwbGFjZShjLnJlZ2V4LmNvbW1lbnRzLFwiXCIpLnJlcGxhY2UoYy5yZWdleC5rZXlmcmFtZXMsXCJcIikubWF0Y2goYy5yZWdleC5tZWRpYSksZj1lJiZlLmxlbmd0aHx8MDtiPWIuc3Vic3RyaW5nKDAsYi5sYXN0SW5kZXhPZihcIi9cIikpO3ZhciBoPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoYy5yZWdleC51cmxzLFwiJDFcIitiK1wiJDIkM1wiKX0saT0hZiYmZDtiLmxlbmd0aCYmKGIrPVwiL1wiKSxpJiYoZj0xKTtmb3IodmFyIGo9MDtmPmo7aisrKXt2YXIgayxsLG8scDtpPyhrPWQsbi5wdXNoKGgoYSkpKTooaz1lW2pdLm1hdGNoKGMucmVnZXguZmluZFN0eWxlcykmJlJlZ0V4cC4kMSxuLnB1c2goUmVnRXhwLiQyJiZoKFJlZ0V4cC4kMikpKSxvPWsuc3BsaXQoXCIsXCIpLHA9by5sZW5ndGg7Zm9yKHZhciBxPTA7cD5xO3ErKylsPW9bcV0sZyhsKXx8bS5wdXNoKHttZWRpYTpsLnNwbGl0KFwiKFwiKVswXS5tYXRjaChjLnJlZ2V4Lm9ubHkpJiZSZWdFeHAuJDJ8fFwiYWxsXCIscnVsZXM6bi5sZW5ndGgtMSxoYXNxdWVyeTpsLmluZGV4T2YoXCIoXCIpPi0xLG1pbnc6bC5tYXRjaChjLnJlZ2V4Lm1pbncpJiZwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrKFJlZ0V4cC4kMnx8XCJcIiksbWF4dzpsLm1hdGNoKGMucmVnZXgubWF4dykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHxcIlwiKX0pfXYoKX0seD1mdW5jdGlvbigpe2lmKGQubGVuZ3RoKXt2YXIgYj1kLnNoaWZ0KCk7ZihiLmhyZWYsZnVuY3Rpb24oYyl7dyhjLGIuaHJlZixiLm1lZGlhKSxwW2IuaHJlZl09ITAsYS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eCgpfSwwKX0pfX0seT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8dC5sZW5ndGg7YisrKXt2YXIgYz10W2JdLGU9Yy5ocmVmLGY9Yy5tZWRpYSxnPWMucmVsJiZcInN0eWxlc2hlZXRcIj09PWMucmVsLnRvTG93ZXJDYXNlKCk7ZSYmZyYmIXBbZV0mJihjLnN0eWxlU2hlZXQmJmMuc3R5bGVTaGVldC5yYXdDc3NUZXh0Pyh3KGMuc3R5bGVTaGVldC5yYXdDc3NUZXh0LGUsZikscFtlXT0hMCk6KCEvXihbYS16QS1aOl0qXFwvXFwvKS8udGVzdChlKSYmIXN8fGUucmVwbGFjZShSZWdFeHAuJDEsXCJcIikuc3BsaXQoXCIvXCIpWzBdPT09YS5sb2NhdGlvbi5ob3N0KSYmKFwiLy9cIj09PWUuc3Vic3RyaW5nKDAsMikmJihlPWEubG9jYXRpb24ucHJvdG9jb2wrZSksZC5wdXNoKHtocmVmOmUsbWVkaWE6Zn0pKSl9eCgpfTt5KCksYy51cGRhdGU9eSxjLmdldEVtVmFsdWU9dSxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsYiwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudChcIm9ucmVzaXplXCIsYil9fSh0aGlzKTtcbiIsIi8qKlxuICogQGZpbGVcbiAqIEpTIGZvciBES0FOIHNpdGUuXG4gKi9cbihmdW5jdGlvbiAoJCkge1xuXG4gIC8qKlxuICAgKiBTaG93cyBhbmQgaGlkZXMgYSBkZXNjcmlwdGlvbiBmb3IgRHJ1cGFsIGZvcm0gZWxlbWVudHMuXG4gICAqL1xuICAkLmZuLmRrYW5Gb3Jtc0hpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2NvbXBhY3QtZm9ybS13cmFwcGVyJyk7XG4gICAgICB2YXIgZGVzYyA9ICQodGhpcykuZmluZCgnLmRlc2NyaXB0aW9uJykuYWRkQ2xhc3MoJ2NvbXBhY3QtZm9ybS1kZXNjcmlwdGlvbicpO1xuICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKS5maW5kKCdpbnB1dCcpO1xuICAgICAgZGVzYy5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICB9KTtcbiAgICAgIGlmICgkKGlucHV0KS5odG1sKCkgPT0gJycpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKS5maW5kKCd0ZXh0YXJlYScpO1xuICAgICAgfVxuICAgICAgaWYgKCQoaW5wdXQpLmh0bWwoKSA9PSBudWxsKSB7XG4gICAgICAgIHZhciBpbnB1dCA9ICQodGhpcykuZmluZCgnaW5wdXQnKTtcbiAgICAgIH1cbiAgICAgIGlucHV0LmFkZENsYXNzKCdjb21wYWN0LWZvcm0taW5wdXQnKVxuICAgICAgaW5wdXQuYmx1cihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpbnB1dC52YWwoKSA9PT0gJycpIHtcbiAgICAgICAgICBkZXNjLmZhZGVJbignZmFzdCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlucHV0LmtleXVwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlucHV0LnZhbCgpICE9ICcnKSB7XG4gICAgICAgICAgZGVzYy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGlucHV0LnZhbCgpICE9ICcnKSB7XG4gICAgICAgIGRlc2MuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhbmQgaGlkZXMgYSBkZXNjcmlwdGlvbiBmb3IgQXV0b2NvbXBsZXRlIERlbHV4ZSBmb3JtIGVsZW1lbnRzLlxuICAgKi9cbiAgJC5mbi5ka2FuRm9ybXNBdXRvRGVsdXhlSGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzKS5hZGRDbGFzcygnY29tcGFjdC1mb3JtLXdyYXBwZXInKTtcbiAgICAgIHZhciBkZXNjID0gJCh0aGlzKS5maW5kKCcuZGVzY3JpcHRpb24nKS5hZGRDbGFzcygnY29tcGFjdC1mb3JtLWRlc2NyaXB0aW9uJyk7XG4gICAgICB2YXIgaW5wdXQgPSAkKHRoaXMpLmZpbmQoJyNhdXRvY29tcGxldGUtZGVsdXhlLWlucHV0Jyk7XG4gICAgICBkZXNjLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgIH0pO1xuICAgICAgaW5wdXQuZm9jdXMoZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjLmhpZGUoKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCQoJyNhdXRvY29tcGxldGUtZGVsdXhlLWl0ZW0nKS5odG1sKCkgIT0gbnVsbCkge1xuICAgICAgICBkZXNjLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgICBpZiAoJCh0aGlzKS5maW5kKCdpbnB1dCcpLnZhbCgpICE9ICcnKSB7XG4gICAgICAgIGRlc2MuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIERydXBhbC5iZWhhdmlvcnMuZGthblNpdGUgPSB7XG4gICAgYXR0YWNoOiBmdW5jdGlvbiAoY29udGV4dCwgc2V0dGluZ3MpIHtcbiAgICAgIC8vIEF1dG9oaWRlIHNlbGVjdGVkIGVsZW1lbnRzLlxuICAgICAgdmFyIGVsZW1lbnRzID0gXCIjdmlld3MtZXhwb3NlZC1mb3JtLWRhdGFzZXQtcGFnZSwjYmxvY2stZGthbi1zaXRld2lkZS1ka2FuLXNpdGV3aWRlLXNlYXJjaC1iYXIsI3ZpZXdzLWV4cG9zZWQtZm9ybS1ncm91cHMtc2VhcmNoLWVudGl0eS12aWV3LTEsI3ZpZXdzLWV4cG9zZWQtZm9ybS11c2VyLXByb2ZpbGUtc2VhcmNoLWVudGl0eS12aWV3LTFcIjtcbiAgICAgICQoZWxlbWVudHMsIGNvbnRleHQpLmRrYW5Gb3Jtc0hpZGUoKTtcbiAgICAgIHZhciBhdXRvRGVsdXhlRWxlbWVudHMgPSBcIi5maWVsZC1uYW1lLWZpZWxkLXRhZ3NcIjtcbiAgICAgICQoYXV0b0RlbHV4ZUVsZW1lbnRzLCBjb250ZXh0KS5ka2FuRm9ybXNBdXRvRGVsdXhlSGlkZSgpO1xuXG4gICAgICAvLyBUb2dnbGUgYnV0dG9uIGZvciB0ZXh0LWZvcm1hdC5cbiAgICAgICQoJy5maWx0ZXItaGVscC5mb3JtLWdyb3VwIHAnKS5hcHBlbmQoJyB8ICcgKyAnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInRleHQtaGVscC10b2dnbGVcIj4nICsgRHJ1cGFsLnQoJ1RvZ2dsZSB0ZXh0IGZvcm1hdCcpICsgJzwvYT4nKTtcbiAgICAgIC8vJCgnLmZvcm0tdHlwZS1zZWxlY3QnKS5oaWRlKCk7XG4gICAgICAkKCcuZmlsdGVyLWd1aWRlbGluZXMtcHJvY2Vzc2VkJykuaGlkZSgpO1xuICAgICAgJCgnLnRleHQtaGVscC10b2dnbGUnKS5jbGljayhmdW5jdGlvbihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJCgnLmZvcm0tdHlwZS1zZWxlY3QnKS50b2dnbGUoKTtcbiAgICAgICAgJCgnLmZpbHRlci1ndWlkZWxpbmVzLXByb2Nlc3NlZCcpLnRvZ2dsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbn0pKGpRdWVyeSk7XG4iLCIvKlxuICogU1ZHZWV6eS5qcyAxLjBcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMiwgQmVuIEhvd2RsZSBodHRwOi8vdHdvc3RlcG1lZGlhLmNvLnVrXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgV1RGUEwgbGljZW5zZVxuICogaHR0cDovL3NhbS56b3kub3JnL3d0ZnBsL1xuICpcbiAqIERhdGU6IFN1biBBdWcgMjYgMjA6MzggMjAxMiBHTVRcbiAqL1xuLypcblx0Ly9jYWxsIGxpa2Ugc28sIHBhc3MgaW4gYSBjbGFzcyBuYW1lIHRoYXQgeW91IGRvbid0IHdhbnQgaXQgdG8gY2hlY2sgYW5kIGEgZmlsZXR5cGUgdG8gcmVwbGFjZSAuc3ZnIHdpdGhcblx0c3ZnZWV6eS5pbml0KCdub2NoZWNrJywgJ3BuZycpO1xuKi9cbndpbmRvdy5zdmdlZXp5PWZ1bmN0aW9uKCl7cmV0dXJue2luaXQ6ZnVuY3Rpb24odCxpKXt0aGlzLmF2b2lkPXR8fGZhbHNlO3RoaXMuZmlsZXR5cGU9aXx8XCJwbmdcIjt0aGlzLnN2Z1N1cHBvcnQ9dGhpcy5zdXBwb3J0c1N2ZygpO2lmKCF0aGlzLnN2Z1N1cHBvcnQpe3RoaXMuaW1hZ2VzPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW1nXCIpO3RoaXMuaW1nTD10aGlzLmltYWdlcy5sZW5ndGg7dGhpcy5mYWxsYmFja3MoKX19LGZhbGxiYWNrczpmdW5jdGlvbigpe3doaWxlKHRoaXMuaW1nTC0tKXtpZighdGhpcy5oYXNDbGFzcyh0aGlzLmltYWdlc1t0aGlzLmltZ0xdLHRoaXMuYXZvaWQpfHwhdGhpcy5hdm9pZCl7dmFyIHQ9dGhpcy5pbWFnZXNbdGhpcy5pbWdMXS5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7aWYodD09PW51bGwpe2NvbnRpbnVlfWlmKHRoaXMuZ2V0RmlsZUV4dCh0KT09XCJzdmdcIil7dmFyIGk9dC5yZXBsYWNlKFwiLnN2Z1wiLFwiLlwiK3RoaXMuZmlsZXR5cGUpO3RoaXMuaW1hZ2VzW3RoaXMuaW1nTF0uc2V0QXR0cmlidXRlKFwic3JjXCIsaSl9fX19LGdldEZpbGVFeHQ6ZnVuY3Rpb24odCl7dmFyIGk9dC5zcGxpdChcIi5cIikucG9wKCk7aWYoaS5pbmRleE9mKFwiP1wiKSE9PS0xKXtpPWkuc3BsaXQoXCI/XCIpWzBdfXJldHVybiBpfSxoYXNDbGFzczpmdW5jdGlvbih0LGkpe3JldHVybihcIiBcIit0LmNsYXNzTmFtZStcIiBcIikuaW5kZXhPZihcIiBcIitpK1wiIFwiKT4tMX0sc3VwcG9ydHNTdmc6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZShcImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjSW1hZ2VcIixcIjEuMVwiKX19fSgpOyJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ== +!function(e){}(jQuery),!function(e){"use strict";e.matchMedia=e.matchMedia||function(e){var t,i=e.documentElement,s=i.firstElementChild||i.firstChild,n=e.createElement("body"),a=e.createElement("div");return a.id="mq-test-1",a.style.cssText="position:absolute;top:-100em",n.style.background="none",n.appendChild(a),function(e){return a.innerHTML='­',i.insertBefore(n,s),t=42===a.offsetWidth,i.removeChild(n),{matches:t,media:e}}}(e.document)}(this),function(e){"use strict";function t(){E(!0)}var i={};e.respond=i,i.update=function(){};var s=[],n=function(){var t=!1;try{t=new e.XMLHttpRequest}catch(i){t=new e.ActiveXObject("Microsoft.XMLHTTP")}return function(){return t}}(),a=function(e,t){var i=n();i&&(i.open("GET",e,!0),i.onreadystatechange=function(){4!==i.readyState||200!==i.status&&304!==i.status||t(i.responseText)},4!==i.readyState&&i.send(null))},r=function(e){return e.replace(i.regex.minmaxwh,"").match(i.regex.other)};if(i.ajax=a,i.queue=s,i.unsupportedmq=r,i.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^\/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},i.mediaQueriesSupported=e.matchMedia&&null!==e.matchMedia("only all")&&e.matchMedia("only all").matches,!i.mediaQueriesSupported){var o,l,d,c=e.document,u=c.documentElement,m=[],h=[],f=[],p={},g=30,v=c.getElementsByTagName("head")[0]||u,x=c.getElementsByTagName("base")[0],y=v.getElementsByTagName("link"),w=function(){var e,t=c.createElement("div"),i=c.body,s=u.style.fontSize,n=i&&i.style.fontSize,a=!1;return t.style.cssText="position:absolute;font-size:1em;width:1em",i||(i=a=c.createElement("body"),i.style.background="none"),u.style.fontSize="100%",i.style.fontSize="100%",i.appendChild(t),a&&u.insertBefore(i,u.firstChild),e=t.offsetWidth,a?u.removeChild(i):i.removeChild(t),u.style.fontSize=s,n&&(i.style.fontSize=n),e=d=parseFloat(e)},E=function(t){var i="clientWidth",s=u[i],n="CSS1Compat"===c.compatMode&&s||c.body[i]||s,a={},r=y[y.length-1],p=(new Date).getTime();if(t&&o&&g>p-o)return e.clearTimeout(l),void(l=e.setTimeout(E,g));o=p;for(var x in m)if(m.hasOwnProperty(x)){var S=m[x],b=S.minw,C=S.maxw,k=null===b,T=null===C,z="em";b&&(b=parseFloat(b)*(b.indexOf(z)>-1?d||w():1)),C&&(C=parseFloat(C)*(C.indexOf(z)>-1?d||w():1)),S.hasquery&&(k&&T||!(k||n>=b)||!(T||C>=n))||(a[S.media]||(a[S.media]=[]),a[S.media].push(h[S.rules]))}for(var $ in f)f.hasOwnProperty($)&&f[$]&&f[$].parentNode===v&&v.removeChild(f[$]);f.length=0;for(var F in a)if(a.hasOwnProperty(F)){var L=c.createElement("style"),R=a[F].join("\n");L.type="text/css",L.media=F,v.insertBefore(L,r.nextSibling),L.styleSheet?L.styleSheet.cssText=R:L.appendChild(c.createTextNode(R)),f.push(L)}},S=function(e,t,s){var n=e.replace(i.regex.comments,"").replace(i.regex.keyframes,"").match(i.regex.media),a=n&&n.length||0;t=t.substring(0,t.lastIndexOf("/"));var o=function(e){return e.replace(i.regex.urls,"$1"+t+"$2$3")},l=!a&&s;t.length&&(t+="/"),l&&(a=1);for(var d=0;a>d;d++){var c,u,f,p;l?(c=s,h.push(o(e))):(c=n[d].match(i.regex.findStyles)&&RegExp.$1,h.push(RegExp.$2&&o(RegExp.$2))),f=c.split(","),p=f.length;for(var g=0;p>g;g++)u=f[g],r(u)||m.push({media:u.split("(")[0].match(i.regex.only)&&RegExp.$2||"all",rules:h.length-1,hasquery:u.indexOf("(")>-1,minw:u.match(i.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:u.match(i.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}E()},b=function(){if(s.length){var t=s.shift();a(t.href,function(i){S(i,t.href,t.media),p[t.href]=!0,e.setTimeout(function(){b()},0)})}},C=function(){for(var t=0;t'+Drupal.t("Toggle text format")+""),e(".filter-guidelines-processed").hide(),e(".text-help-toggle").click(function(t){t.preventDefault(),e(".form-type-select").toggle(),e(".filter-guidelines-processed").toggle()})}}}(jQuery),window.svgeezy=function(){return{init:function(e,t){this.avoid=e||!1,this.filetype=t||"png",this.svgSupport=this.supportsSvg(),this.svgSupport||(this.images=document.getElementsByTagName("img"),this.imgL=this.images.length,this.fallbacks())},fallbacks:function(){for(;this.imgL--;)if(!this.hasClass(this.images[this.imgL],this.avoid)||!this.avoid){var e=this.images[this.imgL].getAttribute("src");if(null===e)continue;if("svg"==this.getFileExt(e)){var t=e.replace(".svg","."+this.filetype);this.images[this.imgL].setAttribute("src",t)}}},getFileExt:function(e){var t=e.split(".").pop();return t.indexOf("?")!==-1&&(t=t.split("?")[0]),t},hasClass:function(e,t){return(" "+e.className+" ").indexOf(" "+t+" ")>-1},supportsSvg:function(){return document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")}}}(); +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm51Ym9vdF9yYWRpeC5zY3JpcHQuanMiLCJyZXNwb25kLm1pbi5qcyIsInNpdGV3aWRlLmpzIiwic3ZnZWV6eS5taW4uanMiXSwibmFtZXMiOlsiJCIsImpRdWVyeSIsImEiLCJtYXRjaE1lZGlhIiwiYiIsImMiLCJkb2N1bWVudEVsZW1lbnQiLCJkIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJmaXJzdENoaWxkIiwiZSIsImNyZWF0ZUVsZW1lbnQiLCJmIiwiaWQiLCJzdHlsZSIsImNzc1RleHQiLCJiYWNrZ3JvdW5kIiwiYXBwZW5kQ2hpbGQiLCJpbm5lckhUTUwiLCJpbnNlcnRCZWZvcmUiLCJvZmZzZXRXaWR0aCIsInJlbW92ZUNoaWxkIiwibWF0Y2hlcyIsIm1lZGlhIiwiZG9jdW1lbnQiLCJ0aGlzIiwidiIsInJlc3BvbmQiLCJ1cGRhdGUiLCJYTUxIdHRwUmVxdWVzdCIsIkFjdGl2ZVhPYmplY3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsInN0YXR1cyIsInJlc3BvbnNlVGV4dCIsInNlbmQiLCJnIiwicmVwbGFjZSIsInJlZ2V4IiwibWlubWF4d2giLCJtYXRjaCIsIm90aGVyIiwiYWpheCIsInF1ZXVlIiwidW5zdXBwb3J0ZWRtcSIsImtleWZyYW1lcyIsImNvbW1lbnRzIiwidXJscyIsImZpbmRTdHlsZXMiLCJvbmx5IiwibWludyIsIm1heHciLCJtZWRpYVF1ZXJpZXNTdXBwb3J0ZWQiLCJoIiwiaSIsImoiLCJrIiwibCIsIm0iLCJuIiwibyIsInAiLCJxIiwiciIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwicyIsInQiLCJ1IiwiYm9keSIsImZvbnRTaXplIiwicGFyc2VGbG9hdCIsImNvbXBhdE1vZGUiLCJsZW5ndGgiLCJEYXRlIiwiZ2V0VGltZSIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJoYXNPd25Qcm9wZXJ0eSIsInciLCJ4IiwieSIsInoiLCJBIiwiQiIsImluZGV4T2YiLCJoYXNxdWVyeSIsInB1c2giLCJydWxlcyIsIkMiLCJwYXJlbnROb2RlIiwiRCIsIkUiLCJGIiwiam9pbiIsInR5cGUiLCJuZXh0U2libGluZyIsInN0eWxlU2hlZXQiLCJjcmVhdGVUZXh0Tm9kZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiUmVnRXhwIiwiJDEiLCIkMiIsInNwbGl0Iiwic2hpZnQiLCJocmVmIiwicmVsIiwidG9Mb3dlckNhc2UiLCJyYXdDc3NUZXh0IiwidGVzdCIsImxvY2F0aW9uIiwiaG9zdCIsInByb3RvY29sIiwiZ2V0RW1WYWx1ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJhdHRhY2hFdmVudCIsImZuIiwiZGthbkZvcm1zSGlkZSIsImVhY2giLCJhZGRDbGFzcyIsImRlc2MiLCJmaW5kIiwiaW5wdXQiLCJjbGljayIsImZvY3VzIiwiaHRtbCIsImJsdXIiLCJ2YWwiLCJmYWRlSW4iLCJrZXl1cCIsImhpZGUiLCJjc3MiLCJka2FuRm9ybXNBdXRvRGVsdXhlSGlkZSIsIkRydXBhbCIsImJlaGF2aW9ycyIsImRrYW5TaXRlIiwiYXR0YWNoIiwiY29udGV4dCIsInNldHRpbmdzIiwiZWxlbWVudHMiLCJhdXRvRGVsdXhlRWxlbWVudHMiLCJhcHBlbmQiLCJwcmV2ZW50RGVmYXVsdCIsInRvZ2dsZSIsIndpbmRvdyIsInN2Z2VlenkiLCJpbml0IiwiYXZvaWQiLCJmaWxldHlwZSIsInN2Z1N1cHBvcnQiLCJzdXBwb3J0c1N2ZyIsImltYWdlcyIsImltZ0wiLCJmYWxsYmFja3MiLCJoYXNDbGFzcyIsImdldEF0dHJpYnV0ZSIsImdldEZpbGVFeHQiLCJzZXRBdHRyaWJ1dGUiLCJwb3AiLCJjbGFzc05hbWUiLCJpbXBsZW1lbnRhdGlvbiIsImhhc0ZlYXR1cmUiXSwibWFwcGluZ3MiOiJDQUlBLFNBQUFBLEtBRUFDLFNDREEsU0FBQUMsR0FBQSxZQUFBQSxHQUFBQyxXQUFBRCxFQUFBQyxZQUFBLFNBQUFELEdBQUEsR0FBQUUsR0FBQUMsRUFBQUgsRUFBQUksZ0JBQUFDLEVBQUFGLEVBQUFHLG1C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QSxPQUFBLElBQUFiLEtBQUE0SCxTQUFBNUgsTUFBQStILE9BQUEvSCxLQUFBZ0ksTUFBQUssYUFBQSxNQUFBdkcsTUFBQXNHLFdBQUEsU0FBQTFGLEdBQUEsR0FBQVosR0FBQVksRUFBQXFDLE1BQUEsS0FBQXVELEtBQUEsT0FBQXhHLEdBQUE4QixRQUFBLFlBQUE5QixFQUFBQSxFQUFBaUQsTUFBQSxLQUFBLElBQUFqRCxHQUFBb0csU0FBQSxTQUFBeEYsRUFBQVosR0FBQSxPQUFBLElBQUFZLEVBQUE2RixVQUFBLEtBQUEzRSxRQUFBLElBQUE5QixFQUFBLFNBQUFnRyxZQUFBLFdBQUEsTUFBQS9ILFVBQUF5SSxlQUFBQyxXQUFBLDJDQUFBIiwiZmlsZSI6Im51Ym9vdF9yYWRpeC5zY3JpcHQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKiBDdXN0b20gc2NyaXB0cyBmb3IgdGhlbWUuXG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICAvLyBjb2RlIGhlcmVcbn0pKGpRdWVyeSk7XG4iLCIvKiEgUmVzcG9uZC5qcyB2MS40LjI6IG1pbi9tYXgtd2lkdGggbWVkaWEgcXVlcnkgcG9seWZpbGxcbiAqIENvcHlyaWdodCAyMDE0IFNjb3R0IEplaGxcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVFxuICogaHR0cDovL2oubXAvcmVzcG9uZGpzICovXG5cbiFmdW5jdGlvbihhKXtcInVzZSBzdHJpY3RcIjthLm1hdGNoTWVkaWE9YS5tYXRjaE1lZGlhfHxmdW5jdGlvbihhKXt2YXIgYixjPWEuZG9jdW1lbnRFbGVtZW50LGQ9Yy5maXJzdEVsZW1lbnRDaGlsZHx8Yy5maXJzdENoaWxkLGU9YS5jcmVhdGVFbGVtZW50KFwiYm9keVwiKSxmPWEuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gZi5pZD1cIm1xLXRlc3QtMVwiLGYuc3R5bGUuY3NzVGV4dD1cInBvc2l0aW9uOmFic29sdXRlO3RvcDotMTAwZW1cIixlLnN0eWxlLmJhY2tncm91bmQ9XCJub25lXCIsZS5hcHBlbmRDaGlsZChmKSxmdW5jdGlvbihhKXtyZXR1cm4gZi5pbm5lckhUTUw9JyZzaHk7PHN0eWxlIG1lZGlhPVwiJythKydcIj4gI21xLXRlc3QtMSB7IHdpZHRoOiA0MnB4OyB9PC9zdHlsZT4nLGMuaW5zZXJ0QmVmb3JlKGUsZCksYj00Mj09PWYub2Zmc2V0V2lkdGgsYy5yZW1vdmVDaGlsZChlKSx7bWF0Y2hlczpiLG1lZGlhOmF9fX0oYS5kb2N1bWVudCl9KHRoaXMpLGZ1bmN0aW9uKGEpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGIoKXt2KCEwKX12YXIgYz17fTthLnJlc3BvbmQ9YyxjLnVwZGF0ZT1mdW5jdGlvbigpe307dmFyIGQ9W10sZT1mdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPW5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGMpe2I9bmV3IGEuQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBifX0oKSxmPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZSgpO2MmJihjLm9wZW4oXCJHRVRcIixhLCEwKSxjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQhPT1jLnJlYWR5U3RhdGV8fDIwMCE9PWMuc3RhdHVzJiYzMDQhPT1jLnN0YXR1c3x8YihjLnJlc3BvbnNlVGV4dCl9LDQhPT1jLnJlYWR5U3RhdGUmJmMuc2VuZChudWxsKSl9LGc9ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShjLnJlZ2V4Lm1pbm1heHdoLFwiXCIpLm1hdGNoKGMucmVnZXgub3RoZXIpfTtpZihjLmFqYXg9ZixjLnF1ZXVlPWQsYy51bnN1cHBvcnRlZG1xPWcsYy5yZWdleD17bWVkaWE6L0BtZWRpYVteXFx7XStcXHsoW15cXHtcXH1dKlxce1teXFx9XFx7XSpcXH0pKy9naSxrZXlmcmFtZXM6L0AoPzpcXC0oPzpvfG1venx3ZWJraXQpXFwtKT9rZXlmcmFtZXNbXlxce10rXFx7KD86W15cXHtcXH1dKlxce1teXFx9XFx7XSpcXH0pK1teXFx9XSpcXH0vZ2ksY29tbWVudHM6L1xcL1xcKlteKl0qXFwqKyhbXi9dW14qXSpcXCorKSpcXC8vZ2ksdXJsczovKHVybFxcKClbJ1wiXT8oW15cXC9cXCknXCJdW146XFwpJ1wiXSspWydcIl0/KFxcKSkvZyxmaW5kU3R5bGVzOi9AbWVkaWEgKihbXlxce10rKVxceyhbXFxTXFxzXSs/KSQvLG9ubHk6Lyhvbmx5XFxzKyk/KFthLXpBLVpdKylcXHM/LyxtaW53Oi9cXChcXHMqbWluXFwtd2lkdGhcXHMqOlxccyooXFxzKlswLTlcXC5dKykocHh8ZW0pXFxzKlxcKS8sbWF4dzovXFwoXFxzKm1heFxcLXdpZHRoXFxzKjpcXHMqKFxccypbMC05XFwuXSspKHB4fGVtKVxccypcXCkvLG1pbm1heHdoOi9cXChcXHMqbShpbnxheClcXC0oaGVpZ2h0fHdpZHRoKVxccyo6XFxzKihcXHMqWzAtOVxcLl0rKShweHxlbSlcXHMqXFwpL2dpLG90aGVyOi9cXChbXlxcKV0qXFwpL2d9LGMubWVkaWFRdWVyaWVzU3VwcG9ydGVkPWEubWF0Y2hNZWRpYSYmbnVsbCE9PWEubWF0Y2hNZWRpYShcIm9ubHkgYWxsXCIpJiZhLm1hdGNoTWVkaWEoXCJvbmx5IGFsbFwiKS5tYXRjaGVzLCFjLm1lZGlhUXVlcmllc1N1cHBvcnRlZCl7dmFyIGgsaSxqLGs9YS5kb2N1bWVudCxsPWsuZG9jdW1lbnRFbGVtZW50LG09W10sbj1bXSxvPVtdLHA9e30scT0zMCxyPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdfHxsLHM9ay5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJhc2VcIilbMF0sdD1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibGlua1wiKSx1PWZ1bmN0aW9uKCl7dmFyIGEsYj1rLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYz1rLmJvZHksZD1sLnN0eWxlLmZvbnRTaXplLGU9YyYmYy5zdHlsZS5mb250U2l6ZSxmPSExO3JldHVybiBiLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6MWVtO3dpZHRoOjFlbVwiLGN8fChjPWY9ay5jcmVhdGVFbGVtZW50KFwiYm9keVwiKSxjLnN0eWxlLmJhY2tncm91bmQ9XCJub25lXCIpLGwuc3R5bGUuZm9udFNpemU9XCIxMDAlXCIsYy5zdHlsZS5mb250U2l6ZT1cIjEwMCVcIixjLmFwcGVuZENoaWxkKGIpLGYmJmwuaW5zZXJ0QmVmb3JlKGMsbC5maXJzdENoaWxkKSxhPWIub2Zmc2V0V2lkdGgsZj9sLnJlbW92ZUNoaWxkKGMpOmMucmVtb3ZlQ2hpbGQoYiksbC5zdHlsZS5mb250U2l6ZT1kLGUmJihjLnN0eWxlLmZvbnRTaXplPWUpLGE9aj1wYXJzZUZsb2F0KGEpfSx2PWZ1bmN0aW9uKGIpe3ZhciBjPVwiY2xpZW50V2lkdGhcIixkPWxbY10sZT1cIkNTUzFDb21wYXRcIj09PWsuY29tcGF0TW9kZSYmZHx8ay5ib2R5W2NdfHxkLGY9e30sZz10W3QubGVuZ3RoLTFdLHA9KG5ldyBEYXRlKS5nZXRUaW1lKCk7aWYoYiYmaCYmcT5wLWgpcmV0dXJuIGEuY2xlYXJUaW1lb3V0KGkpLGk9YS5zZXRUaW1lb3V0KHYscSksdm9pZCAwO2g9cDtmb3IodmFyIHMgaW4gbSlpZihtLmhhc093blByb3BlcnR5KHMpKXt2YXIgdz1tW3NdLHg9dy5taW53LHk9dy5tYXh3LHo9bnVsbD09PXgsQT1udWxsPT09eSxCPVwiZW1cIjt4JiYoeD1wYXJzZUZsb2F0KHgpKih4LmluZGV4T2YoQik+LTE/anx8dSgpOjEpKSx5JiYoeT1wYXJzZUZsb2F0KHkpKih5LmluZGV4T2YoQik+LTE/anx8dSgpOjEpKSx3Lmhhc3F1ZXJ5JiYoeiYmQXx8ISh6fHxlPj14KXx8IShBfHx5Pj1lKSl8fChmW3cubWVkaWFdfHwoZlt3Lm1lZGlhXT1bXSksZlt3Lm1lZGlhXS5wdXNoKG5bdy5ydWxlc10pKX1mb3IodmFyIEMgaW4gbylvLmhhc093blByb3BlcnR5KEMpJiZvW0NdJiZvW0NdLnBhcmVudE5vZGU9PT1yJiZyLnJlbW92ZUNoaWxkKG9bQ10pO28ubGVuZ3RoPTA7Zm9yKHZhciBEIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShEKSl7dmFyIEU9ay5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksRj1mW0RdLmpvaW4oXCJcXG5cIik7RS50eXBlPVwidGV4dC9jc3NcIixFLm1lZGlhPUQsci5pbnNlcnRCZWZvcmUoRSxnLm5leHRTaWJsaW5nKSxFLnN0eWxlU2hlZXQ/RS5zdHlsZVNoZWV0LmNzc1RleHQ9RjpFLmFwcGVuZENoaWxkKGsuY3JlYXRlVGV4dE5vZGUoRikpLG8ucHVzaChFKX19LHc9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEucmVwbGFjZShjLnJlZ2V4LmNvbW1lbnRzLFwiXCIpLnJlcGxhY2UoYy5yZWdleC5rZXlmcmFtZXMsXCJcIikubWF0Y2goYy5yZWdleC5tZWRpYSksZj1lJiZlLmxlbmd0aHx8MDtiPWIuc3Vic3RyaW5nKDAsYi5sYXN0SW5kZXhPZihcIi9cIikpO3ZhciBoPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoYy5yZWdleC51cmxzLFwiJDFcIitiK1wiJDIkM1wiKX0saT0hZiYmZDtiLmxlbmd0aCYmKGIrPVwiL1wiKSxpJiYoZj0xKTtmb3IodmFyIGo9MDtmPmo7aisrKXt2YXIgayxsLG8scDtpPyhrPWQsbi5wdXNoKGgoYSkpKTooaz1lW2pdLm1hdGNoKGMucmVnZXguZmluZFN0eWxlcykmJlJlZ0V4cC4kMSxuLnB1c2goUmVnRXhwLiQyJiZoKFJlZ0V4cC4kMikpKSxvPWsuc3BsaXQoXCIsXCIpLHA9by5sZW5ndGg7Zm9yKHZhciBxPTA7cD5xO3ErKylsPW9bcV0sZyhsKXx8bS5wdXNoKHttZWRpYTpsLnNwbGl0KFwiKFwiKVswXS5tYXRjaChjLnJlZ2V4Lm9ubHkpJiZSZWdFeHAuJDJ8fFwiYWxsXCIscnVsZXM6bi5sZW5ndGgtMSxoYXNxdWVyeTpsLmluZGV4T2YoXCIoXCIpPi0xLG1pbnc6bC5tYXRjaChjLnJlZ2V4Lm1pbncpJiZwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrKFJlZ0V4cC4kMnx8XCJcIiksbWF4dzpsLm1hdGNoKGMucmVnZXgubWF4dykmJnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsoUmVnRXhwLiQyfHxcIlwiKX0pfXYoKX0seD1mdW5jdGlvbigpe2lmKGQubGVuZ3RoKXt2YXIgYj1kLnNoaWZ0KCk7ZihiLmhyZWYsZnVuY3Rpb24oYyl7dyhjLGIuaHJlZixiLm1lZGlhKSxwW2IuaHJlZl09ITAsYS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eCgpfSwwKX0pfX0seT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8dC5sZW5ndGg7YisrKXt2YXIgYz10W2JdLGU9Yy5ocmVmLGY9Yy5tZWRpYSxnPWMucmVsJiZcInN0eWxlc2hlZXRcIj09PWMucmVsLnRvTG93ZXJDYXNlKCk7ZSYmZyYmIXBbZV0mJihjLnN0eWxlU2hlZXQmJmMuc3R5bGVTaGVldC5yYXdDc3NUZXh0Pyh3KGMuc3R5bGVTaGVldC5yYXdDc3NUZXh0LGUsZikscFtlXT0hMCk6KCEvXihbYS16QS1aOl0qXFwvXFwvKS8udGVzdChlKSYmIXN8fGUucmVwbGFjZShSZWdFeHAuJDEsXCJcIikuc3BsaXQoXCIvXCIpWzBdPT09YS5sb2NhdGlvbi5ob3N0KSYmKFwiLy9cIj09PWUuc3Vic3RyaW5nKDAsMikmJihlPWEubG9jYXRpb24ucHJvdG9jb2wrZSksZC5wdXNoKHtocmVmOmUsbWVkaWE6Zn0pKSl9eCgpfTt5KCksYy51cGRhdGU9eSxjLmdldEVtVmFsdWU9dSxhLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsYiwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudChcIm9ucmVzaXplXCIsYil9fSh0aGlzKTtcbiIsIi8qKlxuICogQGZpbGVcbiAqIEpTIGZvciBES0FOIHNpdGUuXG4gKi9cbihmdW5jdGlvbiAoJCkge1xuXG4gIC8qKlxuICAgKiBTaG93cyBhbmQgaGlkZXMgYSBkZXNjcmlwdGlvbiBmb3IgRHJ1cGFsIGZvcm0gZWxlbWVudHMuXG4gICAqL1xuICAkLmZuLmRrYW5Gb3Jtc0hpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2NvbXBhY3QtZm9ybS13cmFwcGVyJyk7XG4gICAgICB2YXIgZGVzYyA9ICQodGhpcykuZmluZCgnLmRlc2NyaXB0aW9uJykuYWRkQ2xhc3MoJ2NvbXBhY3QtZm9ybS1kZXNjcmlwdGlvbicpO1xuICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKS5maW5kKCdpbnB1dCcpO1xuICAgICAgZGVzYy5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICB9KTtcbiAgICAgIGlmICgkKGlucHV0KS5odG1sKCkgPT0gJycpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKS5maW5kKCd0ZXh0YXJlYScpO1xuICAgICAgfVxuICAgICAgaWYgKCQoaW5wdXQpLmh0bWwoKSA9PSBudWxsKSB7XG4gICAgICAgIHZhciBpbnB1dCA9ICQodGhpcykuZmluZCgnaW5wdXQnKTtcbiAgICAgIH1cbiAgICAgIGlucHV0LmFkZENsYXNzKCdjb21wYWN0LWZvcm0taW5wdXQnKVxuICAgICAgaW5wdXQuYmx1cihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpbnB1dC52YWwoKSA9PT0gJycpIHtcbiAgICAgICAgICBkZXNjLmZhZGVJbignZmFzdCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlucHV0LmtleXVwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlucHV0LnZhbCgpICE9ICcnKSB7XG4gICAgICAgICAgZGVzYy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGlucHV0LnZhbCgpICE9ICcnKSB7XG4gICAgICAgIGRlc2MuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhbmQgaGlkZXMgYSBkZXNjcmlwdGlvbiBmb3IgQXV0b2NvbXBsZXRlIERlbHV4ZSBmb3JtIGVsZW1lbnRzLlxuICAgKi9cbiAgJC5mbi5ka2FuRm9ybXNBdXRvRGVsdXhlSGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgJCh0aGlzKS5hZGRDbGFzcygnY29tcGFjdC1mb3JtLXdyYXBwZXInKTtcbiAgICAgIHZhciBkZXNjID0gJCh0aGlzKS5maW5kKCcuZGVzY3JpcHRpb24nKS5hZGRDbGFzcygnY29tcGFjdC1mb3JtLWRlc2NyaXB0aW9uJyk7XG4gICAgICB2YXIgaW5wdXQgPSAkKHRoaXMpLmZpbmQoJyNhdXRvY29tcGxldGUtZGVsdXhlLWlucHV0Jyk7XG4gICAgICBkZXNjLmNsaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgIH0pO1xuICAgICAgaW5wdXQuZm9jdXMoZnVuY3Rpb24gKCkge1xuICAgICAgICBkZXNjLmhpZGUoKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCQoJyNhdXRvY29tcGxldGUtZGVsdXhlLWl0ZW0nKS5odG1sKCkgIT0gbnVsbCkge1xuICAgICAgICBkZXNjLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICB9XG4gICAgICBpZiAoJCh0aGlzKS5maW5kKCdpbnB1dCcpLnZhbCgpICE9ICcnKSB7XG4gICAgICAgIGRlc2MuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIERydXBhbC5iZWhhdmlvcnMuZGthblNpdGUgPSB7XG4gICAgYXR0YWNoOiBmdW5jdGlvbiAoY29udGV4dCwgc2V0dGluZ3MpIHtcbiAgICAgIC8vIEF1dG9oaWRlIHNlbGVjdGVkIGVsZW1lbnRzLlxuICAgICAgdmFyIGVsZW1lbnRzID0gXCIjdmlld3MtZXhwb3NlZC1mb3JtLWRhdGFzZXQtcGFnZSwjYmxvY2stZGthbi1zaXRld2lkZS1ka2FuLXNpdGV3aWRlLXNlYXJjaC1iYXIsI3ZpZXdzLWV4cG9zZWQtZm9ybS1ncm91cHMtc2VhcmNoLWVudGl0eS12aWV3LTEsI3ZpZXdzLWV4cG9zZWQtZm9ybS11c2VyLXByb2ZpbGUtc2VhcmNoLWVudGl0eS12aWV3LTFcIjtcbiAgICAgICQoZWxlbWVudHMsIGNvbnRleHQpLmRrYW5Gb3Jtc0hpZGUoKTtcbiAgICAgIHZhciBhdXRvRGVsdXhlRWxlbWVudHMgPSBcIi5maWVsZC1uYW1lLWZpZWxkLXRhZ3NcIjtcbiAgICAgICQoYXV0b0RlbHV4ZUVsZW1lbnRzLCBjb250ZXh0KS5ka2FuRm9ybXNBdXRvRGVsdXhlSGlkZSgpO1xuXG4gICAgICAvLyBUb2dnbGUgYnV0dG9uIGZvciB0ZXh0LWZvcm1hdC5cbiAgICAgICQoJy5maWx0ZXItaGVscC5mb3JtLWdyb3VwIHAnKS5hcHBlbmQoJyB8ICcgKyAnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInRleHQtaGVscC10b2dnbGVcIj4nICsgRHJ1cGFsLnQoJ1RvZ2dsZSB0ZXh0IGZvcm1hdCcpICsgJzwvYT4nKTtcbiAgICAgIC8vJCgnLmZvcm0tdHlwZS1zZWxlY3QnKS5oaWRlKCk7XG4gICAgICAkKCcuZmlsdGVyLWd1aWRlbGluZXMtcHJvY2Vzc2VkJykuaGlkZSgpO1xuICAgICAgJCgnLnRleHQtaGVscC10b2dnbGUnKS5jbGljayhmdW5jdGlvbihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJCgnLmZvcm0tdHlwZS1zZWxlY3QnKS50b2dnbGUoKTtcbiAgICAgICAgJCgnLmZpbHRlci1ndWlkZWxpbmVzLXByb2Nlc3NlZCcpLnRvZ2dsZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbn0pKGpRdWVyeSk7XG4iLCIvKlxuICogU1ZHZWV6eS5qcyAxLjBcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMiwgQmVuIEhvd2RsZSBodHRwOi8vdHdvc3RlcG1lZGlhLmNvLnVrXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgV1RGUEwgbGljZW5zZVxuICogaHR0cDovL3NhbS56b3kub3JnL3d0ZnBsL1xuICpcbiAqIERhdGU6IFN1biBBdWcgMjYgMjA6MzggMjAxMiBHTVRcbiAqL1xuLypcblx0Ly9jYWxsIGxpa2Ugc28sIHBhc3MgaW4gYSBjbGFzcyBuYW1lIHRoYXQgeW91IGRvbid0IHdhbnQgaXQgdG8gY2hlY2sgYW5kIGEgZmlsZXR5cGUgdG8gcmVwbGFjZSAuc3ZnIHdpdGhcblx0c3ZnZWV6eS5pbml0KCdub2NoZWNrJywgJ3BuZycpO1xuKi9cbndpbmRvdy5zdmdlZXp5PWZ1bmN0aW9uKCl7cmV0dXJue2luaXQ6ZnVuY3Rpb24odCxpKXt0aGlzLmF2b2lkPXR8fGZhbHNlO3RoaXMuZmlsZXR5cGU9aXx8XCJwbmdcIjt0aGlzLnN2Z1N1cHBvcnQ9dGhpcy5zdXBwb3J0c1N2ZygpO2lmKCF0aGlzLnN2Z1N1cHBvcnQpe3RoaXMuaW1hZ2VzPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW1nXCIpO3RoaXMuaW1nTD10aGlzLmltYWdlcy5sZW5ndGg7dGhpcy5mYWxsYmFja3MoKX19LGZhbGxiYWNrczpmdW5jdGlvbigpe3doaWxlKHRoaXMuaW1nTC0tKXtpZighdGhpcy5oYXNDbGFzcyh0aGlzLmltYWdlc1t0aGlzLmltZ0xdLHRoaXMuYXZvaWQpfHwhdGhpcy5hdm9pZCl7dmFyIHQ9dGhpcy5pbWFnZXNbdGhpcy5pbWdMXS5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7aWYodD09PW51bGwpe2NvbnRpbnVlfWlmKHRoaXMuZ2V0RmlsZUV4dCh0KT09XCJzdmdcIil7dmFyIGk9dC5yZXBsYWNlKFwiLnN2Z1wiLFwiLlwiK3RoaXMuZmlsZXR5cGUpO3RoaXMuaW1hZ2VzW3RoaXMuaW1nTF0uc2V0QXR0cmlidXRlKFwic3JjXCIsaSl9fX19LGdldEZpbGVFeHQ6ZnVuY3Rpb24odCl7dmFyIGk9dC5zcGxpdChcIi5cIikucG9wKCk7aWYoaS5pbmRleE9mKFwiP1wiKSE9PS0xKXtpPWkuc3BsaXQoXCI/XCIpWzBdfXJldHVybiBpfSxoYXNDbGFzczpmdW5jdGlvbih0LGkpe3JldHVybihcIiBcIit0LmNsYXNzTmFtZStcIiBcIikuaW5kZXhPZihcIiBcIitpK1wiIFwiKT4tMX0sc3VwcG9ydHNTdmc6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZShcImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjSW1hZ2VcIixcIjEuMVwiKX19fSgpOyJdfQ== diff --git a/dkan/themes/contrib/nuboot_radix/dkan-module-init.sh b/dkan/themes/contrib/nuboot_radix/dkan-module-init.sh index 7bf84ba6e..ee2ddd167 100644 --- a/dkan/themes/contrib/nuboot_radix/dkan-module-init.sh +++ b/dkan/themes/contrib/nuboot_radix/dkan-module-init.sh @@ -3,7 +3,7 @@ DKAN_MODULE="nuboot_radix" # DKAN branch to use -DKAN_BRANCH="7.x-1.x" +DKAN_BRANCH="release-1-12" COMPOSER_PATH=".composer/vendor/bin" diff --git a/dkan/themes/contrib/nuboot_radix/nuboot_radix.info b/dkan/themes/contrib/nuboot_radix/nuboot_radix.info index 00feee30e..2c696506c 100644 --- a/dkan/themes/contrib/nuboot_radix/nuboot_radix.info +++ b/dkan/themes/contrib/nuboot_radix/nuboot_radix.info @@ -2,6 +2,7 @@ name = NuBoot Radix description = A Radix based subtheme built for DKAN. screenshot = screenshot.png core = 7.x +version = 7.x-1.12.x ; Base - Radix base theme = radix diff --git a/dkan/themes/contrib/nuboot_radix/scss/base/_mixins.scss b/dkan/themes/contrib/nuboot_radix/scss/base/_mixins.scss index 862c18a4e..c9bbe2f72 100644 --- a/dkan/themes/contrib/nuboot_radix/scss/base/_mixins.scss +++ b/dkan/themes/contrib/nuboot_radix/scss/base/_mixins.scss @@ -162,4 +162,10 @@ z-index: 1; right: -15px; top: 0; +} + +%screenreader { + position: absolute; + top:0; + left:-9999px } \ No newline at end of file diff --git a/dkan/themes/contrib/nuboot_radix/scss/components/_panel.scss b/dkan/themes/contrib/nuboot_radix/scss/components/_panel.scss index 38b7446b3..dd1110526 100644 --- a/dkan/themes/contrib/nuboot_radix/scss/components/_panel.scss +++ b/dkan/themes/contrib/nuboot_radix/scss/components/_panel.scss @@ -11,7 +11,7 @@ } } .main .panel-pane { - margin-bottom: 3em; + margin-bottom: 0em; } h2.pane-title { border-bottom: 1px solid $border; @@ -47,7 +47,7 @@ h2.pane-title { } .pane-content { padding: 20px 0; - margin-bottom: 1em; + margin-bottom: 0em; } .pane-node-field-topic .pane-content { padding: 0 diff --git a/dkan/themes/contrib/nuboot_radix/scss/components/_structure.scss b/dkan/themes/contrib/nuboot_radix/scss/components/_structure.scss index e5a53afbb..b1cc8a924 100644 --- a/dkan/themes/contrib/nuboot_radix/scss/components/_structure.scss +++ b/dkan/themes/contrib/nuboot_radix/scss/components/_structure.scss @@ -311,4 +311,8 @@ img { background-color: transparent; border: none; border-radius: 0; -} \ No newline at end of file +} + +.screenreader { + @extend %screenreader; +} diff --git a/dkan/themes/contrib/nuboot_radix/scss/components/_view.scss b/dkan/themes/contrib/nuboot_radix/scss/components/_view.scss index e2090fe37..ef8e830e5 100644 --- a/dkan/themes/contrib/nuboot_radix/scss/components/_view.scss +++ b/dkan/themes/contrib/nuboot_radix/scss/components/_view.scss @@ -97,6 +97,9 @@ .btn-primary { margin: 0 auto 1.5em; } + .field-name-field-image { + text-align: center; + } } } .view-groups-page { @@ -110,6 +113,9 @@ .views-field-title { font-size:1.2em; } + .views-field-field-image { + text-align: center; + } .views-field-nid a { background: $brand-primary; color:#fff; diff --git a/docroot/sites/all/modules/contrib/dkan_harvest/README.md b/docroot/sites/all/modules/contrib/dkan_harvest/README.md index d1eb8e892..b70334b50 100644 --- a/docroot/sites/all/modules/contrib/dkan_harvest/README.md +++ b/docroot/sites/all/modules/contrib/dkan_harvest/README.md @@ -1,4 +1,9 @@ [![Build Status](https://travis-ci.org/NuCivic/dkan_harvest.svg?branch=7.x-1.x)](https://travis-ci.org/NuCivic/dkan_harvest) + +**DEPRECATED:** This module has been moved into [DKAN core](https://github.com/NuCivic/dkan) for release 7.x-1.13. To maintain backward compatibility with DKAN 7.x-1.12 and subsequent patch releases this project will remain on Github but new features will be applied directly to the DKAN core folder `modules/dkan/dkan_harvest`. + +If you want to try this module on DKAN < 1.13, do NOT use the `7.x-1.x` branch, which is significantly lacking in features. Latest development has happened on branch `harvest_dkan_integration`. Again, the current `7.x-1.x` branch of [DKAN core](https://github.com/NuCivic/dkan) includes the most stable version of DKAN harvest. Using the bleeding-edge `7.x-1.x` or Waiting for the stable release of DKAN 1.13 is the recommended path for trying DKAN Harvest. + ## What is DKAN Harvest? DKAN Harvest is a module that can be used to regulary harvest open data from open `APIs` **(Only project open data data.json endpoints for now)**. diff --git a/docroot/sites/all/modules/contrib/dkan_migrate_base/.probo.yml b/docroot/sites/all/modules/contrib/dkan_migrate_base/.probo.yml index ffd797038..af3337ccf 100644 --- a/docroot/sites/all/modules/contrib/dkan_migrate_base/.probo.yml +++ b/docroot/sites/all/modules/contrib/dkan_migrate_base/.probo.yml @@ -21,13 +21,12 @@ steps: echo "" echo "" - echo "-------> Run 'bash dkan-init.sh':" + echo "-------> Run 'bash dkan-module-init.sh':" echo "" # Create the proper folder structure export DATABASE_URL="mysql://root:strongpassword@127.0.0.1/dkan" time bash dkan-module-init.sh --deps --build=$DATABASE_URL #Set a symlink so that probo can serve the site. - echo "" echo "-------> Symlink ./docroot to var/www/html:" echo "" diff --git a/docroot/sites/all/modules/contrib/dkan_migrate_base/README.md b/docroot/sites/all/modules/contrib/dkan_migrate_base/README.md index 3175adff3..ded7f04fd 100644 --- a/docroot/sites/all/modules/contrib/dkan_migrate_base/README.md +++ b/docroot/sites/all/modules/contrib/dkan_migrate_base/README.md @@ -1,5 +1,7 @@ [![Build Status](https://circleci.com/gh/NuCivic/dkan_migrate_base.svg?branch=7.x-1.x&style=svg)](https://circleci.com/gh/NuCivic/dkan_migrate_base) +**DEPRECATED:** This module has been moved into [DKAN core](https://github.com/NuCivic/dkan) for release 7.x-1.13. To maintain backward compatibility with DKAN 7.x-1.12 and subsequent patch releases this project will remain on Github but new features will be applied directly to the DKAN core folder `modules/dkan/dkan_migrate_base`. + DKAN "Harvester" using Migrate module ================= This provides base classes for common DKAN migrations (ie imports or harvests). diff --git a/docroot/sites/all/modules/contrib/dkan_migrate_base/circle.yml b/docroot/sites/all/modules/contrib/dkan_migrate_base/circle.yml index aa871bae2..30b472bc7 100644 --- a/docroot/sites/all/modules/contrib/dkan_migrate_base/circle.yml +++ b/docroot/sites/all/modules/contrib/dkan_migrate_base/circle.yml @@ -53,4 +53,4 @@ test: - dkan_migrate_base/bin/phpunit --configuration dkan_migrate_base/tests post: - echo $CIRCLE_ARTIFACTS; cp -av dkan/test/assets $CIRCLE_ARTIFACTS: - parallel: true + parallel: true \ No newline at end of file diff --git a/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base.make b/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base.make index f83e1bd5f..296d59983 100644 --- a/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base.make +++ b/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base.make @@ -1,6 +1,9 @@ -core = 7.x -api = 2 - -projects[migrate][version] = 2.x -projects[migrate][subdir] = contrib - +api: 2 +core: 7.x +projects: + migrate: ~ + open_data_federal_extras: + download: + type: git + url: 'https://github.com/NuCivic/open_data_federal_extras.git' + branch: master \ No newline at end of file diff --git a/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base_data_json.inc b/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base_data_json.inc index 0b3133bd3..0344c6422 100644 --- a/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base_data_json.inc +++ b/docroot/sites/all/modules/contrib/dkan_migrate_base/dkan_migrate_base_data_json.inc @@ -259,6 +259,7 @@ class MigrateDataJsonDatasetBase extends MigrateDKAN { $row->publisher = (object) $row->publisher; } if (isset($row->publisher->name) && !$row->group_id = $this->getGroupNidByTitle($row->publisher->name)) { + if ($row->publisher->name) { $group = new stdClass; $group->title = $row->publisher->name; @@ -267,7 +268,7 @@ class MigrateDataJsonDatasetBase extends MigrateDKAN { $row->group_id = $group->nid; } } - + $row->group_id = (int) $row->group_id; if (is_array($row->contactPoint)) { $row->contactPoint = (object) $row->contactPoint; } @@ -467,7 +468,6 @@ class MigrateDataJsonDatasetBase extends MigrateDKAN { 'modified' =>$modified,)) ->execute(); } - db_update($table) ->condition('sourceid1', $identifier, "=") ->fields(array( @@ -516,8 +516,8 @@ class MigrateDataJsonDatasetBase extends MigrateDKAN { /** * Implements prepareRow. */ - public function prepare($entity, $row) { - + public function prepare(&$entity, $row) { + global $user; // Remove empy additional fields. if (isset($entity->field_additional_info['und'][0]) && $entity->field_additional_info['und'][0]['first'] == NULL) { unset($entity->field_additional_info); @@ -528,6 +528,16 @@ class MigrateDataJsonDatasetBase extends MigrateDKAN { $entity->status = 1; $entity->vid = isset($entity->vid) ? $entity->vid : ''; + // If the migration is running under a user that doesn't belong + // to a specific group, the same user can't create og references. + // This solves it by attaching field_mode admin to the ref field + if (isset($entity->nid) && (int) $user->uid == 0) { + if (!empty($entity->og_group_ref[LANGUAGE_NONE])) { + foreach($entity->og_group_ref[LANGUAGE_NONE] as $delta => $value) { + $entity->og_group_ref[LANGUAGE_NONE][$delta]['field_mode'] = 'admin'; + } + } + } } } diff --git a/docroot/sites/all/modules/contrib/dkan_migrate_base/modules/dkan_migrate_base_example/dkan_migrate_base_example.info b/docroot/sites/all/modules/contrib/dkan_migrate_base/modules/dkan_migrate_base_example/dkan_migrate_base_example.info index a9b9c7581..53e17ee0c 100644 --- a/docroot/sites/all/modules/contrib/dkan_migrate_base/modules/dkan_migrate_base_example/dkan_migrate_base_example.info +++ b/docroot/sites/all/modules/contrib/dkan_migrate_base/modules/dkan_migrate_base_example/dkan_migrate_base_example.info @@ -3,4 +3,5 @@ description = "DKAN migration base example." package = "DKAN" core = 7.x dependencies[] = dkan_migrate_base +dependencies[] = open_data_federal_extras files[] = dkan_migrate_base_example.migrate.inc diff --git a/docroot/sites/all/modules/contrib/dkan_migrate_base/tests/DKANMigrateBaseTest.php b/docroot/sites/all/modules/contrib/dkan_migrate_base/tests/DKANMigrateBaseTest.php index fe37b4a84..1c4e7f642 100644 --- a/docroot/sites/all/modules/contrib/dkan_migrate_base/tests/DKANMigrateBaseTest.php +++ b/docroot/sites/all/modules/contrib/dkan_migrate_base/tests/DKANMigrateBaseTest.php @@ -16,10 +16,11 @@ class DKANMigrateBaseTest extends PHPUnit_Framework_TestCase { public static function setUpBeforeClass() { - $setup = new DKANMigrateBaseTestSetup(); - $setup->unpublishNodes('dataset'); - migrate_static_registration(); - self::setMigrationEndpointName('data_json_1_1', 'json'); + // module_enable(array('dkan_migrate_base_example'), TRUE); + $setup = new DKANMigrateBaseTestSetup(); + $setup->unpublishNodes('dataset'); + migrate_static_registration(); + self::setMigrationEndpointName('data_json_1_1', 'json'); } public function setup() { @@ -111,11 +112,11 @@ public function migrate($migrationName) ); $table = $map->getMapTable(); dkan_migrate_base_add_modified_column($table); - $result = $migration->processImport(); $this->assertNotEquals($result, Migration::RESULT_FAILED); $this->assertEquals(0, $migration->errorCount()); + return $migration; } public function testCKANResourceImport() @@ -320,11 +321,62 @@ public function testDataJsonEndpoint() { $this->nodeAssert($expect, $dataset); } + public function testDataJsonHighwater() { + $this->rollback('dkan_migrate_base_example_data_json11'); + // First run should create some elements and update 0. + $migration = $this->migrate('dkan_migrate_base_example_data_json11'); + $this->assertGreaterThan(0, $migration->getDestination()->getCreated()); + $this->assertEquals(0, $migration->getDestination()->getUpdated()); + // Second run should create 0 and update 0. + $migration->getDestination()->resetStats(); + $migration->prepareUpdate(); + $migration = $this->migrate('dkan_migrate_base_example_data_json11'); + $this->assertEquals(0, $migration->errorCount()); + $this->assertEquals(0, $migration->getDestination()->getCreated()); + $this->assertEquals(0, $migration->getDestination()->getUpdated()); + // Tamper source data. + $data_folder = implode( + '/', + array( + DRUPAL_ROOT, + drupal_get_path('module', 'dkan_migrate_base_example'), + 'data', + ) + ); + // Prepare files + $original_file = implode('/', array($data_folder, 'data11.json')); + $backup_file = implode('/', array($data_folder, 'data11.json.backup')); + // Tamper original file + shell_exec('rm -rf ' . $backup_file); + shell_exec('cp ' . $original_file . ' ' . $backup_file); + $file = file_get_contents($original_file); + $file = str_replace('2014-', '2016-', $file); + file_unmanaged_save_data($file, $original_file, FILE_EXISTS_REPLACE); + // Run migration again + drupal_static_reset('getInstance'); + $migration = $this->migrate('dkan_migrate_base_example_data_json11'); + $this->assertEquals(0, $migration->errorCount()); + $this->assertEquals(0, $migration->getDestination()->getCreated()); + $this->assertGreaterThan(0, $migration->getDestination()->getUpdated()); + // Run Migration for the fourth time. + $migration->getDestination()->resetStats(); + $migration->prepareUpdate(); + $migration = $this->migrate('dkan_migrate_base_example_data_json11'); + $this->assertEquals(0, $migration->errorCount()); + $this->assertEquals(0, $migration->getDestination()->getCreated()); + $this->assertEquals(0, $migration->getDestination()->getUpdated()); + // Put everything as it was + shell_exec('rm ' . $original_file); + shell_exec('mv ' . $backup_file . ' ' . $original_file); + $this->rollback('dkan_migrate_base_example_data_json11'); + } + public function tearDown(){ $this->rollback('dkan_migrate_base_example_data_json11'); } public static function tearDownAfterClass() { + // module_disable(array('dkan_migrate_base_example')); self::setMigrationEndpointName('data_json_1_1', 'data.json'); } } diff --git a/docroot/sites/all/modules/dkan_overrides b/docroot/sites/all/modules/dkan_overrides deleted file mode 120000 index beff79341..000000000 --- a/docroot/sites/all/modules/dkan_overrides +++ /dev/null @@ -1 +0,0 @@ -../../../../config/modules/dkan_overrides \ No newline at end of file