diff --git a/community_server/.gitignore b/community_server/.gitignore
new file mode 100644
index 000000000..4a3ce5c25
--- /dev/null
+++ b/community_server/.gitignore
@@ -0,0 +1,11 @@
+config/app.php
+logs/
+src/GPBMetadata/
+tmp/
+vendor/
+composer.lock
+websrc/node_modules/
+websrc/package-lock.json
+mithril_client/
+websrc/src/less-files.css
+
diff --git a/community_server/.gitmodules b/community_server/.gitmodules
new file mode 100644
index 000000000..ed2d79ec1
--- /dev/null
+++ b/community_server/.gitmodules
@@ -0,0 +1,6 @@
+[submodule "mithril_client"]
+ path = mithril_client
+ url = git@github.com:gradido/gradido_mithrilJS_client.git
+[submodule "src/protobuf"]
+ path = src/protobuf
+ url = git@github.com:gradido/gradido_protocol.git
\ No newline at end of file
diff --git a/community_server/Dockerfile b/community_server/Dockerfile
new file mode 100644
index 000000000..2f3c0412a
--- /dev/null
+++ b/community_server/Dockerfile
@@ -0,0 +1,13 @@
+FROM phpdockerio/php74-fpm
+
+# install php fpm
+RUN apt-get update \
+ && apt-get -y --no-install-recommends install curl unzip php7.4-curl php7.4-fpm php7.4-mbstring php7.4-intl php7.4-xml php7.4-pdo php7.4-mysql \
+ && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
+
+WORKDIR /var/www/cakephp
+RUN mkdir logs && mkdir tmp && chmod 777 logs && chmod 777 tmp
+COPY ./community_server/ .
+COPY ./configs/community_server/app.php ./config/
+RUN composer update
+
diff --git a/community_server/README.md b/community_server/README.md
new file mode 100644
index 000000000..61f89d306
--- /dev/null
+++ b/community_server/README.md
@@ -0,0 +1,51 @@
+# CakePHP Application Skeleton
+
+[](https://travis-ci.org/cakephp/app)
+[](https://packagist.org/packages/cakephp/app)
+
+A skeleton for creating applications with [CakePHP](https://cakephp.org) 3.x.
+
+The framework source code can be found here: [cakephp/cakephp](https://github.com/cakephp/cakephp).
+
+## Installation
+
+1. Download [Composer](https://getcomposer.org/doc/00-intro.md) or update `composer self-update`.
+2. Run `php composer.phar create-project --prefer-dist cakephp/app [app_name]`.
+
+If Composer is installed globally, run
+
+```bash
+composer create-project --prefer-dist cakephp/app
+```
+
+In case you want to use a custom app dir name (e.g. `/myapp/`):
+
+```bash
+composer create-project --prefer-dist cakephp/app myapp
+```
+
+You can now either use your machine's webserver to view the default home page, or start
+up the built-in webserver with:
+
+```bash
+bin/cake server -p 8765
+```
+
+Then visit `http://localhost:8765` to see the welcome page.
+
+## Update
+
+Since this skeleton is a starting point for your application and various files
+would have been modified as per your needs, there isn't a way to provide
+automated upgrades, so you have to do any updates manually.
+
+## Configuration
+
+Read and edit `config/app.php` and setup the `'Datasources'` and any other
+configuration relevant for your application.
+
+## Layout
+
+The app skeleton uses a subset of [Foundation](http://foundation.zurb.com/) (v5) CSS
+framework by default. You can, however, replace it with any other library or
+custom styles.
diff --git a/community_server/bin/cake b/community_server/bin/cake
new file mode 100755
index 000000000..4b696c883
--- /dev/null
+++ b/community_server/bin/cake
@@ -0,0 +1,75 @@
+#!/usr/bin/env sh
+################################################################################
+#
+# Cake is a shell script for invoking CakePHP shell commands
+#
+# CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+#
+# @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+# @link https://cakephp.org CakePHP(tm) Project
+# @since 1.2.0
+# @license https://opensource.org/licenses/mit-license.php MIT License
+#
+################################################################################
+
+# Canonicalize by following every symlink of the given name recursively
+canonicalize() {
+ NAME="$1"
+ if [ -f "$NAME" ]
+ then
+ DIR=$(dirname -- "$NAME")
+ NAME=$(cd -P "$DIR" > /dev/null && pwd -P)/$(basename -- "$NAME")
+ fi
+ while [ -h "$NAME" ]; do
+ DIR=$(dirname -- "$NAME")
+ SYM=$(readlink "$NAME")
+ NAME=$(cd "$DIR" > /dev/null && cd "$(dirname -- "$SYM")" > /dev/null && pwd)/$(basename -- "$SYM")
+ done
+ echo "$NAME"
+}
+
+# Find a CLI version of PHP
+findCliPhp() {
+ for TESTEXEC in php php-cli /usr/local/bin/php
+ do
+ SAPI=$(echo "= PHP_SAPI ?>" | $TESTEXEC 2>/dev/null)
+ if [ "$SAPI" = "cli" ]
+ then
+ echo $TESTEXEC
+ return
+ fi
+ done
+ echo "Failed to find a CLI version of PHP; falling back to system standard php executable" >&2
+ echo "php";
+}
+
+# If current path is a symlink, resolve to real path
+realname="$0"
+if [ -L "$realname" ]
+then
+ realname=$(readlink -f "$0")
+fi
+
+CONSOLE=$(dirname -- "$(canonicalize "$realname")")
+APP=$(dirname "$CONSOLE")
+
+# If your CLI PHP is somewhere that this doesn't find, you can define a PHP environment
+# variable with the correct path in it.
+if [ -z "$PHP" ]
+then
+ PHP=$(findCliPhp)
+fi
+
+if [ "$(basename "$realname")" != 'cake' ]
+then
+ exec "$PHP" "$CONSOLE"/cake.php "$(basename "$realname")" "$@"
+else
+ exec "$PHP" "$CONSOLE"/cake.php "$@"
+fi
+
+exit
diff --git a/community_server/bin/cake.bat b/community_server/bin/cake.bat
new file mode 100644
index 000000000..ad1378229
--- /dev/null
+++ b/community_server/bin/cake.bat
@@ -0,0 +1,27 @@
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Cake is a Windows batch script for invoking CakePHP shell commands
+::
+:: CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
+:: Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+::
+:: Licensed under The MIT License
+:: Redistributions of files must retain the above copyright notice.
+::
+:: @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+:: @link https://cakephp.org CakePHP(tm) Project
+:: @since 2.0.0
+:: @license https://opensource.org/licenses/mit-license.php MIT License
+::
+::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+@echo off
+
+SET app=%0
+SET lib=%~dp0
+
+php "%lib%cake.php" %*
+
+echo.
+
+exit /B %ERRORLEVEL%
diff --git a/community_server/bin/cake.php b/community_server/bin/cake.php
new file mode 100644
index 000000000..320ee3643
--- /dev/null
+++ b/community_server/bin/cake.php
@@ -0,0 +1,12 @@
+#!/usr/bin/php -q
+run($argv));
diff --git a/community_server/composer.json b/community_server/composer.json
new file mode 100644
index 000000000..7eeb26887
--- /dev/null
+++ b/community_server/composer.json
@@ -0,0 +1,57 @@
+{
+ "name": "cakephp/app",
+ "description": "CakePHP skeleton app",
+ "homepage": "https://cakephp.org",
+ "type": "project",
+ "license": "MIT",
+ "require": {
+ "php": ">=5.6",
+ "cakephp/cakephp": "3.8.*",
+ "cakephp/migrations": "^2.0.0",
+ "cakephp/plugin-installer": "^1.0",
+ "datto/json-rpc": "^6.0",
+ "google/protobuf": "v3.10.*",
+ "mobiledetect/mobiledetectlib": "2.*",
+ "paragonie/sodium_compat": "^1.11",
+ "tuupola/base58": "^2.0"
+ },
+ "require-dev": {
+ "cakephp/bake": "^1.9.0",
+ "cakephp/cakephp-codesniffer": "^3.0",
+ "cakephp/debug_kit": "^3.17.0",
+ "josegonzalez/dotenv": "3.*",
+ "phpunit/phpunit": "^5.7|^6.0",
+ "psy/psysh": "@stable"
+ },
+ "suggest": {
+ "markstory/asset_compress": "An asset compression plugin which provides file concatenation and a flexible filter system for preprocessing and minification.",
+ "dereuromark/cakephp-ide-helper": "After baking your code, this keeps your annotations in sync with the code evolving from there on for maximum IDE and PHPStan compatibility."
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "src/",
+ "" : "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "App\\Test\\": "tests/",
+ "Cake\\Test\\": "vendor/cakephp/cakephp/tests/"
+ }
+ },
+ "scripts": {
+ "post-install-cmd": "App\\Console\\Installer::postInstall",
+ "post-create-project-cmd": "App\\Console\\Installer::postInstall",
+ "check": [
+ "@test",
+ "@cs-check"
+ ],
+ "cs-check": "phpcs --colors -p --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/",
+ "cs-fix": "phpcbf --colors --standard=vendor/cakephp/cakephp-codesniffer/CakePHP src/ tests/",
+ "test": "phpunit --colors=always"
+ },
+ "prefer-stable": true,
+ "config": {
+ "sort-packages": true
+ }
+}
diff --git a/community_server/config/app.default.php b/community_server/config/app.default.php
new file mode 100644
index 000000000..04c8cede2
--- /dev/null
+++ b/community_server/config/app.default.php
@@ -0,0 +1,407 @@
+ filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN),
+
+ /**
+ * Configure basic information about the application.
+ *
+ * - namespace - The namespace to find app classes under.
+ * - defaultLocale - The default locale for translation, formatting currencies and numbers, date and time.
+ * - encoding - The encoding used for HTML + database connections.
+ * - base - The base directory the app resides in. If false this
+ * will be auto detected.
+ * - dir - Name of app directory.
+ * - webroot - The webroot directory.
+ * - wwwRoot - The file path to webroot.
+ * - baseUrl - To configure CakePHP to *not* use mod_rewrite and to
+ * use CakePHP pretty URLs, remove these .htaccess
+ * files:
+ * /.htaccess
+ * /webroot/.htaccess
+ * And uncomment the baseUrl key below.
+ * - fullBaseUrl - A base URL to use for absolute links. When set to false (default)
+ * CakePHP generates required value based on `HTTP_HOST` environment variable.
+ * However, you can define it manually to optimize performance or if you
+ * are concerned about people manipulating the `Host` header.
+ * - imageBaseUrl - Web path to the public images directory under webroot.
+ * - cssBaseUrl - Web path to the public css directory under webroot.
+ * - jsBaseUrl - Web path to the public js directory under webroot.
+ * - paths - Configure paths for non class based resources. Supports the
+ * `plugins`, `templates`, `locales` subkeys, which allow the definition of
+ * paths for plugins, view templates and locale files respectively.
+ */
+ 'App' => [
+ 'namespace' => 'App',
+ 'encoding' => env('APP_ENCODING', 'UTF-8'),
+ 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'),
+ 'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'),
+ 'base' => false,
+ 'dir' => 'src',
+ 'webroot' => 'webroot',
+ 'wwwRoot' => WWW_ROOT,
+ //'baseUrl' => env('SCRIPT_NAME'),
+ 'fullBaseUrl' => false,
+ 'imageBaseUrl' => 'img/',
+ 'cssBaseUrl' => 'css/',
+ 'jsBaseUrl' => 'js/',
+ 'paths' => [
+ 'plugins' => [ROOT . DS . 'plugins' . DS],
+ 'templates' => [APP . 'Template' . DS],
+ 'locales' => [APP . 'Locale' . DS],
+ ],
+ ],
+
+ /**
+ * Security and encryption configuration
+ *
+ * - salt - A random string used in security hashing methods.
+ * The salt value is also used as the encryption key.
+ * You should treat it as extremely sensitive data.
+ */
+ 'Security' => [
+ 'salt' => env('SECURITY_SALT', '__SALT__'),
+ ],
+
+ /**
+ * Apply timestamps with the last modified time to static assets (js, css, images).
+ * Will append a querystring parameter containing the time the file was modified.
+ * This is useful for busting browser caches.
+ *
+ * Set to true to apply timestamps when debug is true. Set to 'force' to always
+ * enable timestamping regardless of debug value.
+ */
+ 'Asset' => [
+ //'timestamp' => true,
+ // 'cacheTime' => '+1 year'
+ ],
+
+ /**
+ * Configure the cache adapters.
+ */
+ 'Cache' => [
+ 'default' => [
+ 'className' => FileEngine::class,
+ 'path' => CACHE,
+ 'url' => env('CACHE_DEFAULT_URL', null),
+ ],
+
+ /**
+ * Configure the cache used for general framework caching.
+ * Translation cache files are stored with this configuration.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ * If you set 'className' => 'Null' core cache will be disabled.
+ */
+ '_cake_core_' => [
+ 'className' => FileEngine::class,
+ 'prefix' => 'myapp_cake_core_',
+ 'path' => CACHE . 'persistent/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKECORE_URL', null),
+ ],
+
+ /**
+ * Configure the cache for model and datasource caches. This cache
+ * configuration is used to store schema descriptions, and table listings
+ * in connections.
+ * Duration will be set to '+2 minutes' in bootstrap.php when debug = true
+ */
+ '_cake_model_' => [
+ 'className' => FileEngine::class,
+ 'prefix' => 'myapp_cake_model_',
+ 'path' => CACHE . 'models/',
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKEMODEL_URL', null),
+ ],
+
+ /**
+ * Configure the cache for routes. The cached routes collection is built the
+ * first time the routes are processed via `config/routes.php`.
+ * Duration will be set to '+2 seconds' in bootstrap.php when debug = true
+ */
+ '_cake_routes_' => [
+ 'className' => FileEngine::class,
+ 'prefix' => 'myapp_cake_routes_',
+ 'path' => CACHE,
+ 'serialize' => true,
+ 'duration' => '+1 years',
+ 'url' => env('CACHE_CAKEROUTES_URL', null),
+ ],
+ ],
+
+ /**
+ * Configure the Error and Exception handlers used by your application.
+ *
+ * By default errors are displayed using Debugger, when debug is true and logged
+ * by Cake\Log\Log when debug is false.
+ *
+ * In CLI environments exceptions will be printed to stderr with a backtrace.
+ * In web environments an HTML page will be displayed for the exception.
+ * With debug true, framework errors like Missing Controller will be displayed.
+ * When debug is false, framework errors will be coerced into generic HTTP errors.
+ *
+ * Options:
+ *
+ * - `errorLevel` - int - The level of errors you are interested in capturing.
+ * - `trace` - boolean - Whether or not backtraces should be included in
+ * logged errors/exceptions.
+ * - `log` - boolean - Whether or not you want exceptions logged.
+ * - `exceptionRenderer` - string - The class responsible for rendering
+ * uncaught exceptions. If you choose a custom class you should place
+ * the file for that class in src/Error. This class needs to implement a
+ * render method.
+ * - `skipLog` - array - List of exceptions to skip for logging. Exceptions that
+ * extend one of the listed exceptions will also be skipped for logging.
+ * E.g.:
+ * `'skipLog' => ['Cake\Http\Exception\NotFoundException', 'Cake\Http\Exception\UnauthorizedException']`
+ * - `extraFatalErrorMemory` - int - The number of megabytes to increase
+ * the memory limit by when a fatal error is encountered. This allows
+ * breathing room to complete logging or error handling.
+ */
+ 'Error' => [
+ 'errorLevel' => E_ALL,
+ 'exceptionRenderer' => ExceptionRenderer::class,
+ 'skipLog' => [],
+ 'log' => true,
+ 'trace' => true,
+ ],
+
+ /**
+ * Email configuration.
+ *
+ * By defining transports separately from delivery profiles you can easily
+ * re-use transport configuration across multiple profiles.
+ *
+ * You can specify multiple configurations for production, development and
+ * testing.
+ *
+ * Each transport needs a `className`. Valid options are as follows:
+ *
+ * Mail - Send using PHP mail function
+ * Smtp - Send using SMTP
+ * Debug - Do not send the email, just return the result
+ *
+ * You can add custom transports (or override existing transports) by adding the
+ * appropriate file to src/Mailer/Transport. Transports should be named
+ * 'YourTransport.php', where 'Your' is the name of the transport.
+ */
+ 'EmailTransport' => [
+ 'default' => [
+ 'className' => MailTransport::class,
+ /*
+ * The following keys are used in SMTP transports:
+ */
+ 'host' => 'localhost',
+ 'port' => 25,
+ 'timeout' => 30,
+ 'username' => null,
+ 'password' => null,
+ 'client' => null,
+ 'tls' => null,
+ 'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
+ ],
+ ],
+
+ /**
+ * Email delivery profiles
+ *
+ * Delivery profiles allow you to predefine various properties about email
+ * messages from your application and give the settings a name. This saves
+ * duplication across your application and makes maintenance and development
+ * easier. Each profile accepts a number of keys. See `Cake\Mailer\Email`
+ * for more information.
+ */
+ 'Email' => [
+ 'default' => [
+ 'transport' => 'default',
+ 'from' => 'you@localhost',
+ //'charset' => 'utf-8',
+ //'headerCharset' => 'utf-8',
+ ],
+ ],
+
+ /**
+ * Connection information used by the ORM to connect
+ * to your application's datastores.
+ *
+ * ### Notes
+ * - Drivers include Mysql Postgres Sqlite Sqlserver
+ * See vendor\cakephp\cakephp\src\Database\Driver for complete list
+ * - Do not use periods in database name - it may lead to error.
+ * See https://github.com/cakephp/cakephp/issues/6471 for details.
+ * - 'encoding' is recommended to be set to full UTF-8 4-Byte support.
+ * E.g set it to 'utf8mb4' in MariaDB and MySQL and 'utf8' for any
+ * other RDBMS.
+ */
+ 'Datasources' => [
+ 'default' => [
+ 'className' => Connection::class,
+ 'driver' => Mysql::class,
+ 'persistent' => false,
+ 'host' => 'localhost',
+ /*
+ * CakePHP will use the default DB port based on the driver selected
+ * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
+ * the following line and set the port accordingly
+ */
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'my_app',
+ /*
+ * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6).
+ */
+ //'encoding' => 'utf8mb4',
+ 'timezone' => 'UTC',
+ 'flags' => [],
+ 'cacheMetadata' => true,
+ 'log' => false,
+
+ /**
+ * Set identifier quoting to true if you are using reserved words or
+ * special characters in your table or column names. Enabling this
+ * setting will result in queries built using the Query Builder having
+ * identifiers quoted when creating SQL. It should be noted that this
+ * decreases performance because each query needs to be traversed and
+ * manipulated before being executed.
+ */
+ 'quoteIdentifiers' => false,
+
+ /**
+ * During development, if using MySQL < 5.6, uncommenting the
+ * following line could boost the speed at which schema metadata is
+ * fetched from the database. It can also be set directly with the
+ * mysql configuration directive 'innodb_stats_on_metadata = 0'
+ * which is the recommended value in production environments
+ */
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+
+ 'url' => env('DATABASE_URL', null),
+ ],
+
+ /**
+ * The test connection is used during the test suite.
+ */
+ 'test' => [
+ 'className' => Connection::class,
+ 'driver' => Mysql::class,
+ 'persistent' => false,
+ 'host' => 'localhost',
+ //'port' => 'non_standard_port_number',
+ 'username' => 'my_app',
+ 'password' => 'secret',
+ 'database' => 'test_myapp',
+ //'encoding' => 'utf8mb4',
+ 'timezone' => 'UTC',
+ 'cacheMetadata' => true,
+ 'quoteIdentifiers' => false,
+ 'log' => false,
+ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
+ 'url' => env('DATABASE_TEST_URL', null),
+ ],
+ ],
+
+ /**
+ * Configures logging options
+ */
+ 'Log' => [
+ 'debug' => [
+ 'className' => FileLog::class,
+ 'path' => LOGS,
+ 'file' => 'debug',
+ 'url' => env('LOG_DEBUG_URL', null),
+ 'scopes' => false,
+ 'levels' => ['notice', 'info', 'debug'],
+ ],
+ 'error' => [
+ 'className' => FileLog::class,
+ 'path' => LOGS,
+ 'file' => 'error',
+ 'url' => env('LOG_ERROR_URL', null),
+ 'scopes' => false,
+ 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
+ ],
+ // To enable this dedicated query log, you need set your datasource's log flag to true
+ 'queries' => [
+ 'className' => FileLog::class,
+ 'path' => LOGS,
+ 'file' => 'queries',
+ 'url' => env('LOG_QUERIES_URL', null),
+ 'scopes' => ['queriesLog'],
+ ],
+ ],
+
+ /**
+ * Session configuration.
+ *
+ * Contains an array of settings to use for session configuration. The
+ * `defaults` key is used to define a default preset to use for sessions, any
+ * settings declared here will override the settings of the default config.
+ *
+ * ## Options
+ *
+ * - `cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'. Avoid using `.` in cookie names,
+ * as PHP will drop sessions from cookies with `.` in the name.
+ * - `cookiePath` - The url path for which session cookie is set. Maps to the
+ * `session.cookie_path` php.ini config. Defaults to base path of app.
+ * - `timeout` - The time in minutes the session should be valid for.
+ * Pass 0 to disable checking timeout.
+ * Please note that php.ini's session.gc_maxlifetime must be equal to or greater
+ * than the largest Session['timeout'] in all served websites for it to have the
+ * desired effect.
+ * - `defaults` - The default configuration set to use as a basis for your session.
+ * There are four built-in options: php, cake, cache, database.
+ * - `handler` - Can be used to enable a custom session handler. Expects an
+ * array with at least the `engine` key, being the name of the Session engine
+ * class to use for managing the session. CakePHP bundles the `CacheSession`
+ * and `DatabaseSession` engines.
+ * - `ini` - An associative array of additional ini values to set.
+ *
+ * The built-in `defaults` options are:
+ *
+ * - 'php' - Uses settings defined in your php.ini.
+ * - 'cake' - Saves session files in CakePHP's /tmp directory.
+ * - 'database' - Uses CakePHP's database sessions.
+ * - 'cache' - Use the Cache class to save sessions.
+ *
+ * To define a custom session handler, save it at src/Network/Session/.php.
+ * Make sure the class implements PHP's `SessionHandlerInterface` and set
+ * Session.handler to
+ *
+ * To use database sessions, load the SQL file located at config/schema/sessions.sql
+ */
+ 'Session' => [
+ 'defaults' => 'php',
+ ],
+ // Gradido specific configuration
+ // Login Server ip and port
+ 'LoginServer' => [
+ 'host' => 'http://127.0.0.1',
+ 'port' => 1201
+ ],
+ 'API' => [
+ 'allowedCaller' => [''] // insert domains or ips from login-server and gdt if they not at localhost
+ ],
+ 'ServerAdminEmail' => 'info@gradido.net', // email 'from' field for transfer notification emails
+ 'noReplyEmail' => 'no-replay@gradido.net', // email sender for creation notification emails to user
+
+ 'GroupNode' => false
+];
diff --git a/community_server/config/bootstrap.php b/community_server/config/bootstrap.php
new file mode 100644
index 000000000..c57f81374
--- /dev/null
+++ b/community_server/config/bootstrap.php
@@ -0,0 +1,205 @@
+parse()
+// ->putenv()
+// ->toEnv()
+// ->toServer();
+// }
+
+/*
+ * Read configuration file and inject configuration into various
+ * CakePHP classes.
+ *
+ * By default there is only one configuration file. It is often a good
+ * idea to create multiple configuration files, and separate the configuration
+ * that changes from configuration that does not. This makes deployment simpler.
+ */
+try {
+ Configure::config('default', new PhpConfig());
+ Configure::load('app', 'default', false);
+} catch (\Exception $e) {
+ exit($e->getMessage() . "\n");
+}
+
+/*
+ * Load an environment local configuration file.
+ * You can use a file like app_local.php to provide local overrides to your
+ * shared configuration.
+ */
+//Configure::load('app_local', 'default');
+
+/*
+ * When debug = true the metadata cache should only last
+ * for a short time.
+ */
+if (Configure::read('debug')) {
+ Configure::write('Cache._cake_model_.duration', '+2 minutes');
+ Configure::write('Cache._cake_core_.duration', '+2 minutes');
+ // disable router cache during development
+ Configure::write('Cache._cake_routes_.duration', '+2 seconds');
+}
+
+/*
+ * Set the default server timezone. Using UTC makes time calculations / conversions easier.
+ * Check http://php.net/manual/en/timezones.php for list of valid timezone strings.
+ */
+date_default_timezone_set(Configure::read('App.defaultTimezone'));
+
+/*
+ * Configure the mbstring extension to use the correct encoding.
+ */
+mb_internal_encoding(Configure::read('App.encoding'));
+
+/*
+ * Set the default locale. This controls how dates, number and currency is
+ * formatted and sets the default language to use for translations.
+ */
+ini_set('intl.default_locale', Configure::read('App.defaultLocale'));
+
+/*
+ * Register application error and exception handlers.
+ */
+
+$isCli = PHP_SAPI === 'cli';
+
+if ($isCli) {
+ (new ConsoleErrorHandler(Configure::read('Error')))->register();
+} else {
+ (new ErrorHandler(Configure::read('Error')))->register();
+}
+
+/*
+ * Include the CLI bootstrap overrides.
+ */
+if ($isCli) {
+ require __DIR__ . '/bootstrap_cli.php';
+}
+
+/*
+ * Set the full base URL.
+ * This URL is used as the base of all absolute links.
+ *
+ * If you define fullBaseUrl in your config file you can remove this.
+ */
+if (!Configure::read('App.fullBaseUrl')) {
+ $s = null;
+ if (env('HTTPS')) {
+ $s = 's';
+ }
+
+ $httpHost = env('HTTP_HOST');
+ if (isset($httpHost)) {
+ Configure::write('App.fullBaseUrl', 'http' . $s . '://' . $httpHost);
+ }
+ unset($httpHost, $s);
+}
+
+Cache::setConfig(Configure::consume('Cache'));
+ConnectionManager::setConfig(Configure::consume('Datasources'));
+TransportFactory::setConfig(Configure::consume('EmailTransport'));
+Email::setConfig(Configure::consume('Email'));
+Log::setConfig(Configure::consume('Log'));
+Security::setSalt(Configure::consume('Security.salt'));
+
+/*
+ * The default crypto extension in 3.0 is OpenSSL.
+ * If you are migrating from 2.x uncomment this code to
+ * use a more compatible Mcrypt based implementation
+ */
+//Security::engine(new \Cake\Utility\Crypto\Mcrypt());
+
+/*
+ * Setup detectors for mobile and tablet.
+ */
+ServerRequest::addDetector('mobile', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isMobile();
+});
+ServerRequest::addDetector('tablet', function ($request) {
+ $detector = new \Detection\MobileDetect();
+
+ return $detector->isTablet();
+});
+
+/*
+ * Enable immutable time objects in the ORM.
+ *
+ * You can enable default locale format parsing by adding calls
+ * to `useLocaleParser()`. This enables the automatic conversion of
+ * locale specific date formats. For details see
+ * @link https://book.cakephp.org/3.0/en/core-libraries/internationalization-and-localization.html#parsing-localized-datetime-data
+ */
+Type::build('time')
+ ->useImmutable();
+Type::build('date')
+ ->useImmutable();
+Type::build('datetime')
+ ->useImmutable();
+Type::build('timestamp')
+ ->useImmutable();
+
+/*
+ * Custom Inflector rules, can be set to correctly pluralize or singularize
+ * table, model, controller names or whatever other string is passed to the
+ * inflection functions.
+ */
+//Inflector::rules('plural', ['/^(inflect)or$/i' => '\1ables']);
+//Inflector::rules('irregular', ['red' => 'redlings']);
+//Inflector::rules('uninflected', ['dontinflectme']);
+//Inflector::rules('transliteration', ['/å/' => 'aa']);
diff --git a/community_server/config/bootstrap_cli.php b/community_server/config/bootstrap_cli.php
new file mode 100644
index 000000000..d3679d754
--- /dev/null
+++ b/community_server/config/bootstrap_cli.php
@@ -0,0 +1,28 @@
+ '{{content}}',
+ // Container element used by control() when a field has an error.
+ 'inputContainerError' => '{{content}}{{error}}
',
+ // Label element when inputs are not nested inside the label.
+ 'label' => '{{text}} ',
+ // Generic input element.
+ 'input' => ' ',
+ // Textarea input element,
+ 'textarea' => '',
+ // Error message wrapper elements.
+ 'error' => ''
+ . '{{content}}'
+ . '
',
+ // Container for error items.
+ 'errorList' => '{{content}}',
+ // Error item wrapper.
+ 'errorItem' => '{{text}}
'
+];
+/*
+
+
+
+
+
+ Amount
+
+
+
+ */
diff --git a/community_server/config/nginx/fastcgi.conf b/community_server/config/nginx/fastcgi.conf
new file mode 100644
index 000000000..c2976fe91
--- /dev/null
+++ b/community_server/config/nginx/fastcgi.conf
@@ -0,0 +1,25 @@
+fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+fastcgi_param QUERY_STRING $query_string;
+fastcgi_param REQUEST_METHOD $request_method;
+fastcgi_param CONTENT_TYPE $content_type;
+fastcgi_param CONTENT_LENGTH $content_length;
+
+fastcgi_param SCRIPT_NAME $fastcgi_script_name;
+fastcgi_param REQUEST_URI $request_uri;
+fastcgi_param DOCUMENT_URI $document_uri;
+fastcgi_param DOCUMENT_ROOT $document_root;
+fastcgi_param SERVER_PROTOCOL $server_protocol;
+fastcgi_param REQUEST_SCHEME $scheme;
+fastcgi_param HTTPS $https if_not_empty;
+
+fastcgi_param GATEWAY_INTERFACE CGI/1.1;
+fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
+
+fastcgi_param REMOTE_ADDR $remote_addr;
+fastcgi_param REMOTE_PORT $remote_port;
+fastcgi_param SERVER_ADDR $server_addr;
+fastcgi_param SERVER_PORT $server_port;
+fastcgi_param SERVER_NAME $server_name;
+
+# PHP only, required if PHP was built with --enable-force-cgi-redirect
+fastcgi_param REDIRECT_STATUS 200;
\ No newline at end of file
diff --git a/community_server/config/nginx/mime.types b/community_server/config/nginx/mime.types
new file mode 100644
index 000000000..84c644fc7
--- /dev/null
+++ b/community_server/config/nginx/mime.types
@@ -0,0 +1,88 @@
+types {
+ text/html html htm shtml;
+ text/css css;
+ text/xml xml;
+ image/gif gif;
+ image/jpeg jpeg jpg;
+ application/javascript js;
+ application/atom+xml atom;
+ application/rss+xml rss;
+
+ text/mathml mml;
+ text/plain txt;
+ text/vnd.sun.j2me.app-descriptor jad;
+ text/vnd.wap.wml wml;
+ text/x-component htc;
+
+ image/png png;
+ image/tiff tif tiff;
+ image/vnd.wap.wbmp wbmp;
+ image/x-icon ico;
+ image/x-jng jng;
+ image/x-ms-bmp bmp;
+ image/svg+xml svg svgz;
+ image/webp webp;
+
+ application/font-woff woff;
+ application/java-archive jar war ear;
+ application/json json;
+ application/mac-binhex40 hqx;
+ application/msword doc;
+ application/pdf pdf;
+ application/postscript ps eps ai;
+ application/rtf rtf;
+ application/vnd.apple.mpegurl m3u8;
+ application/vnd.ms-excel xls;
+ application/vnd.ms-fontobject eot;
+ application/vnd.ms-powerpoint ppt;
+ application/vnd.wap.wmlc wmlc;
+ application/vnd.google-earth.kml+xml kml;
+ application/vnd.google-earth.kmz kmz;
+ application/x-7z-compressed 7z;
+ application/x-cocoa cco;
+ application/x-java-archive-diff jardiff;
+ application/x-java-jnlp-file jnlp;
+ application/x-makeself run;
+ application/x-perl pl pm;
+ application/x-pilot prc pdb;
+ application/x-rar-compressed rar;
+ application/x-redhat-package-manager rpm;
+ application/x-sea sea;
+ application/x-shockwave-flash swf;
+ application/x-stuffit sit;
+ application/x-tcl tcl tk;
+ application/x-x509-ca-cert der pem crt;
+ application/x-xpinstall xpi;
+ application/xhtml+xml xhtml;
+ application/xspf+xml xspf;
+ application/zip zip;
+
+ application/octet-stream bin exe dll;
+ application/octet-stream deb;
+ application/octet-stream dmg;
+ application/octet-stream iso img;
+ application/octet-stream msi msp msm;
+
+ application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
+ application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
+ application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
+
+ audio/midi mid midi kar;
+ audio/mpeg mp3;
+ audio/ogg ogg;
+ audio/x-m4a m4a;
+ audio/x-realaudio ra;
+
+ video/3gpp 3gpp 3gp;
+ video/mp2t ts;
+ video/mp4 mp4;
+ video/mpeg mpeg mpg;
+ video/quicktime mov;
+ video/webm webm;
+ video/x-flv flv;
+ video/x-m4v m4v;
+ video/x-mng mng;
+ video/x-ms-asf asx asf;
+ video/x-ms-wmv wmv;
+ video/x-msvideo avi;
+}
diff --git a/community_server/config/nginx/nginx.conf b/community_server/config/nginx/nginx.conf
new file mode 100644
index 000000000..5aa5c3095
--- /dev/null
+++ b/community_server/config/nginx/nginx.conf
@@ -0,0 +1,86 @@
+
+server {
+
+ listen 80 ;
+ listen [::]:80;
+ server_name 0.0.0.0;
+
+ #include /etc/nginx/common/protect.conf;
+ #include /etc/nginx/common/protect_add_header.conf;
+ #include /etc/nginx/common/ssl.conf;
+
+
+ root /usr/share/nginx/html/webroot;
+ index index.php;
+
+ location ~* \.(png|jpg|ico|webp)\$ {
+ expires 30d;
+ }
+
+ location ~* \.(js|css) {
+ # expires 1d;
+ expires 1d;
+ }
+
+ location ~ \.php\$ {
+ # regex to split $uri to $fastcgi_script_name and $fastcgi_path
+ fastcgi_split_path_info ^(.+\.php)(/.+)$;
+
+ # Check that the PHP script exists before passing it
+ try_files $fastcgi_script_name =404;
+
+ # Bypass the fact that try_files resets $fastcgi_path_info
+ # see: http://trac.nginx.org/nginx/ticket/321
+ set $path_info $fastcgi_path_info;
+ fastcgi_param PATH_INFO $path_info;
+
+ fastcgi_index index.php;
+ include fastcgi.conf;
+
+ #fastcgi_pass unix:/run/php/php7.3-fpm.sock;
+ fastcgi_pass 127.0.0.1:9000;
+
+ }
+
+ location ~ /\.ht {
+ deny all;
+ }
+
+ location /account {
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade \$http_upgrade;
+ proxy_set_header Connection 'upgrade';
+ proxy_cache_bypass \$http_upgrade;
+ proxy_set_header X-Real-IP \$remote_addr;
+ proxy_set_header X-Forwarded-For \$remote_addr;
+ proxy_set_header Host \$host;
+ rewrite /account/(.*) /\$1 break;
+
+ #proxy_next_upstream error timeout invalid_header http_502 non_idempotent;
+ proxy_pass http://login-server:1200;
+ proxy_redirect off;
+
+
+ }
+
+ location /login_api {
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade \$http_upgrade;
+ proxy_set_header Connection 'upgrade';
+ proxy_cache_bypass \$http_upgrade;
+ proxy_set_header X-Real-IP \$remote_addr;
+ proxy_set_header X-Forwarded-For \$remote_addr;
+ proxy_set_header Host \$host;
+ rewrite /login_api/(.*) /\$1 break;
+
+ proxy_pass http://login-server:1201;
+ proxy_redirect off;
+ }
+
+ location / {
+ try_files \$uri \$uri/ /index.php?\$args;
+ }
+
+# access_log /var/log/nginx/access.log main;
+
+}
\ No newline at end of file
diff --git a/community_server/config/paths.php b/community_server/config/paths.php
new file mode 100644
index 000000000..1c8121588
--- /dev/null
+++ b/community_server/config/paths.php
@@ -0,0 +1,89 @@
+ '{{content}}',
+ 'input' => ''
+ . ' '
+ . '
',
+ 'error' => ''
+ . '{{content}}'
+ . '
',
+
+ // Container for error items.
+ //'errorList' => '',
+ 'errorList' => '{{content}}',
+
+ // Error item wrapper.
+ //'errorItem' => '{{text}} ',
+ 'errorItem' => '{{text}}
'
+];
diff --git a/community_server/config/routes.php b/community_server/config/routes.php
new file mode 100644
index 000000000..27d998f2c
--- /dev/null
+++ b/community_server/config/routes.php
@@ -0,0 +1,138 @@
+ true
+ ]);
+
+ // Token check will be skipped when callback returns `true`.
+ $csrf->whitelistCallback(function ($request) {
+ // Skip token check for API URLs.
+ //die($request->getParam('controller'));
+ $whitelist = ['JsonRequestHandler', 'ElopageWebhook'];
+
+ foreach($whitelist as $entry) {
+ if($request->getParam('controller') === $entry) {
+ if($entry == 'ElopageWebhook') {
+ return true;
+ }
+ if($request->clientIp() == '127.0.0.1' || $request->clientIp() == 'localhost') {
+ return true;
+ }
+ $allowedCaller = Configure::read('API.allowedCaller');
+ if($allowedCaller && count($allowedCaller) > 0) {
+ $callerIp = $request->clientIp();
+ foreach($allowedCaller as $allowed) {
+ $ip = gethostbyname($allowed);
+ if($ip === $callerIp) return true;
+ }
+ }
+ }
+ }
+ });
+
+ // Register scoped middleware for in scopes.
+ $routes->registerMiddleware('csrf', $csrf);
+
+ /**
+ * Apply a middleware to the current route scope.
+ * Requires middleware to be registered via `Application::routes()` with `registerMiddleware()`
+ */
+ $routes->applyMiddleware('csrf');
+
+ /**
+ * Here, we are connecting '/' (base path) to a controller called 'Pages',
+ * its action called 'display', and we pass a param to select the view file
+ * to use (in this case, src/Template/Pages/home.ctp)...
+ */
+ //$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
+ $routes->connect('/', ['controller' => 'Dashboard', 'action' => 'index']);
+ $routes->connect('/server', ['controller' => 'Dashboard', 'action' => 'serverIndex']);
+ //$routes->connect('/', 'https://gradido2.dario-rekowski.de/account', array('status' => 303));
+
+ /**
+ * ...and connect the rest of 'Pages' controller's URLs.
+ */
+ $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
+
+ /**
+ * Connect catchall routes for all controllers.
+ *
+ * Using the argument `DashedRoute`, the `fallbacks` method is a shortcut for
+ *
+ * ```
+ * $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);
+ * $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
+ * ```
+ *
+ * Any route class can be used with this method, such as:
+ * - DashedRoute
+ * - InflectedRoute
+ * - Route
+ * - Or your own route class
+ *
+ * You can remove these routes once you've connected the
+ * routes you want in your application.
+ */
+ $routes->fallbacks(DashedRoute::class);
+});
+
+/**
+ * If you need a different set of middleware or none at all,
+ * open new scope and define routes there.
+ *
+ * ```
+ * Router::scope('/api', function (RouteBuilder $routes) {
+ * // No $routes->applyMiddleware() here.
+ * // Connect API actions here.
+ * });
+ * ```
+ */
diff --git a/community_server/config/schema/i18n.sql b/community_server/config/schema/i18n.sql
new file mode 100644
index 000000000..e59d1e651
--- /dev/null
+++ b/community_server/config/schema/i18n.sql
@@ -0,0 +1,18 @@
+# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (https://opensource.org/licenses/mit-license.php)
+
+CREATE TABLE i18n (
+ id int NOT NULL auto_increment,
+ locale varchar(6) NOT NULL,
+ model varchar(255) NOT NULL,
+ foreign_key int(10) NOT NULL,
+ field varchar(255) NOT NULL,
+ content text,
+ PRIMARY KEY (id),
+ UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field),
+ INDEX I18N_FIELD(model, foreign_key, field)
+);
diff --git a/community_server/config/schema/sessions.sql b/community_server/config/schema/sessions.sql
new file mode 100644
index 000000000..1aa0a0f54
--- /dev/null
+++ b/community_server/config/schema/sessions.sql
@@ -0,0 +1,15 @@
+# Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
+#
+# Licensed under The MIT License
+# For full copyright and license information, please see the LICENSE.txt
+# Redistributions of files must retain the above copyright notice.
+# MIT License (https://opensource.org/licenses/mit-license.php)
+
+CREATE TABLE `sessions` (
+ `id` char(40) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
+ `created` datetime DEFAULT CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+
+ `modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- optional, requires MySQL 5.6.5+
+ `data` blob DEFAULT NULL, -- for PostgreSQL use bytea instead of blob
+ `expires` int(10) unsigned DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
diff --git a/community_server/db/address_types.sql b/community_server/db/address_types.sql
new file mode 100644
index 000000000..27f6bb410
--- /dev/null
+++ b/community_server/db/address_types.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `address_types` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(25) NOT NULL,
+ `text` VARCHAR(255) NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
\ No newline at end of file
diff --git a/community_server/db/operators.sql b/community_server/db/operators.sql
new file mode 100644
index 000000000..8ffa9f04f
--- /dev/null
+++ b/community_server/db/operators.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `operators` (
+ `id` INT NOT NULL AUTO_INCREMENT ,
+ `username` VARCHAR(128) NOT NULL ,
+ `data_base64` VARCHAR(255) NOT NULL ,
+ PRIMARY KEY (`id`), UNIQUE (`username`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+
diff --git a/community_server/db/state_balances.sql b/community_server/db/state_balances.sql
new file mode 100644
index 000000000..0bc263093
--- /dev/null
+++ b/community_server/db/state_balances.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `state_balances` (
+ `id` int(11) NOT NULL,
+ `state_user_id` int(11) NOT NULL,
+ `modified` datetime NOT NULL,
+ `amount` bigint(20) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
\ No newline at end of file
diff --git a/community_server/db/state_created.sql b/community_server/db/state_created.sql
new file mode 100644
index 000000000..a15ccacd3
--- /dev/null
+++ b/community_server/db/state_created.sql
@@ -0,0 +1,10 @@
+CREATE TABLE `state_created` (
+ `id` int(11) NOT NULL,
+ `transaction_id` int(11) NOT NULL,
+ `month` tinyint(4) NOT NULL,
+ `year` smallint(6) NOT NULL,
+ `state_user_id` int(11) NOT NULL,
+ `created` datetime NOT NULL,
+ `short_ident_hash` int(11) NOT NULL,
+ PRIMARY KEY (`id`), INDEX(`short_ident_hash`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/state_group_addresses.sql b/community_server/db/state_group_addresses.sql
new file mode 100644
index 000000000..3e09b8658
--- /dev/null
+++ b/community_server/db/state_group_addresses.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `state_group_addresses` (
+ `id` int(11) NOT NULL,
+ `state_group_id` int(11) NOT NULL,
+ `public_key` binary(32) NOT NULL,
+ `address_type_id` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/state_group_relationships.sql b/community_server/db/state_group_relationships.sql
new file mode 100644
index 000000000..0d26e91b6
--- /dev/null
+++ b/community_server/db/state_group_relationships.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `state_group_relationships` (
+ `id` int(11) NOT NULL,
+ `state_group1_id` int(11) NOT NULL,
+ `state_group2_id` int(11) NOT NULL,
+ `state_relationship_id` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/state_groups.sql b/community_server/db/state_groups.sql
new file mode 100644
index 000000000..dc5ca5251
--- /dev/null
+++ b/community_server/db/state_groups.sql
@@ -0,0 +1,8 @@
+CREATE TABLE `state_groups` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `index_id` VARBINARY(64) NOT NULL,
+ `name` VARCHAR(50) NOT NULL,
+ `root_public_key` BINARY(32) NOT NULL,
+ `user_count` SMALLINT NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
\ No newline at end of file
diff --git a/community_server/db/state_relationship_types.sql b/community_server/db/state_relationship_types.sql
new file mode 100644
index 000000000..d6e53a966
--- /dev/null
+++ b/community_server/db/state_relationship_types.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `state_relationship_types` (
+ `id` int(11) NOT NULL,
+ `name` varchar(25) COLLATE utf8_bin NOT NULL,
+ `text` varchar(255) COLLATE utf8_bin DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/state_users.sql b/community_server/db/state_users.sql
new file mode 100644
index 000000000..82d61f10e
--- /dev/null
+++ b/community_server/db/state_users.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `state_users` (
+ `id` int(11) NOT NULL,
+ `index_id` smallint(6) NOT NULL,
+ `state_group_id` int(11) NOT NULL,
+ `public_key` binary(32) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/transaction_creations.sql b/community_server/db/transaction_creations.sql
new file mode 100644
index 000000000..343404ddb
--- /dev/null
+++ b/community_server/db/transaction_creations.sql
@@ -0,0 +1,10 @@
+
+CREATE TABLE `transaction_creations` (
+ `id` int(11) NOT NULL,
+ `transaction_id` int(11) NOT NULL,
+ `state_user_id` int(11) NOT NULL,
+ `amount` bigint(20) NOT NULL,
+ `ident_hash` binary(32) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
+
diff --git a/community_server/db/transaction_group_addAddress.sql b/community_server/db/transaction_group_addAddress.sql
new file mode 100644
index 000000000..f7474cc73
--- /dev/null
+++ b/community_server/db/transaction_group_addAddress.sql
@@ -0,0 +1,8 @@
+
+CREATE TABLE `transaction_group_addaddress` (
+ `id` int(11) NOT NULL,
+ `transaction_id` int(11) NOT NULL,
+ `address_type_id` int(11) NOT NULL,
+ `public_key` binary(32) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/transaction_group_allowtrades.sql b/community_server/db/transaction_group_allowtrades.sql
new file mode 100644
index 000000000..2fd94b4d6
--- /dev/null
+++ b/community_server/db/transaction_group_allowtrades.sql
@@ -0,0 +1,8 @@
+
+CREATE TABLE `transaction_group_allowtrades` (
+ `id` int(11) NOT NULL,
+ `transaction_id` int(11) NOT NULL,
+ `group_id` int(11) NOT NULL,
+ `allow` tinyint(1) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/transaction_group_creates.sql b/community_server/db/transaction_group_creates.sql
new file mode 100644
index 000000000..0c0d7cc5d
--- /dev/null
+++ b/community_server/db/transaction_group_creates.sql
@@ -0,0 +1,9 @@
+
+CREATE TABLE `transaction_group_creates` (
+ `id` int(11) NOT NULL,
+ `transaction_id` int(11) NOT NULL,
+ `group_public_key` binary(32) NOT NULL,
+ `state_group_id` int(11) COLLATE utf8_bin NOT NULL,
+ `name` varchar(64) COLLATE utf8_bin NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/transaction_send_coins.sql b/community_server/db/transaction_send_coins.sql
new file mode 100644
index 000000000..8113c78e0
--- /dev/null
+++ b/community_server/db/transaction_send_coins.sql
@@ -0,0 +1,11 @@
+
+CREATE TABLE `transaction_send_coins` (
+ `id` int(11) NOT NULL,
+ `transaction_id` int(11) NOT NULL,
+ `state_user_id` int(11) NOT NULL,
+ `receiver_public_key` binary(32) NOT NULL,
+ `receiver_user_id` varbinary(64) NOT NULL,
+ `amount` bigint(20) NOT NULL,
+ `sender_final_balance` bigint(20) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/transaction_signatures.sql b/community_server/db/transaction_signatures.sql
new file mode 100644
index 000000000..9fab87fb2
--- /dev/null
+++ b/community_server/db/transaction_signatures.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `transaction_signatures` (
+ `id` int(11) NOT NULL,
+ `transaction_id` int(11) NOT NULL,
+ `signature` binary(64) NOT NULL,
+ `pubkey` binary(32) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/db/transaction_types.sql b/community_server/db/transaction_types.sql
new file mode 100644
index 000000000..26bd70c52
--- /dev/null
+++ b/community_server/db/transaction_types.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `transaction_types` (
+ `id` INT NOT NULL AUTO_INCREMENT,
+ `name` VARCHAR(24) NOT NULL,
+ `text` VARCHAR(255) NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
\ No newline at end of file
diff --git a/community_server/db/transactions.sql b/community_server/db/transactions.sql
new file mode 100644
index 000000000..e664b067f
--- /dev/null
+++ b/community_server/db/transactions.sql
@@ -0,0 +1,9 @@
+
+CREATE TABLE `transactions` (
+ `id` bigint(20) NOT NULL,
+ `state_group_id` int(11) NOT NULL,
+ `transaction_type_id` int(11) NOT NULL,
+ `tx_hash` binary(32) NOT NULL,
+ `received` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
diff --git a/community_server/index.php b/community_server/index.php
new file mode 100644
index 000000000..459176916
--- /dev/null
+++ b/community_server/index.php
@@ -0,0 +1,16 @@
+=2.1.2 <3.0.0',
+175 silly cache add type: 'range' }
+176 silly addNamed clone@>=2.1.2 <3.0.0
+177 verbose addNamed ">=2.1.2 <3.0.0" is a valid semver range for clone
+178 silly addNameRange { name: 'clone', range: '>=2.1.2 <3.0.0', hasData: false }
+179 silly mapToRegistry name clone
+180 silly mapToRegistry using default registry
+181 silly mapToRegistry registry https://registry.npmjs.org/
+182 silly mapToRegistry uri https://registry.npmjs.org/clone
+183 verbose addNameRange registry:https://registry.npmjs.org/clone not in flight; fetching
+184 verbose get https://registry.npmjs.org/clone not expired, no request
+185 silly addNameRange number 2 { name: 'clone', range: '>=2.1.2 <3.0.0', hasData: true }
+186 silly addNameRange versions [ 'clone',
+186 silly addNameRange [ '0.0.0',
+186 silly addNameRange '0.0.1',
+186 silly addNameRange '0.0.2',
+186 silly addNameRange '0.0.3',
+186 silly addNameRange '0.0.4',
+186 silly addNameRange '0.0.5',
+186 silly addNameRange '0.0.6',
+186 silly addNameRange '0.0.7',
+186 silly addNameRange '0.1.0',
+186 silly addNameRange '0.1.1',
+186 silly addNameRange '0.1.2',
+186 silly addNameRange '0.1.3',
+186 silly addNameRange '0.1.4',
+186 silly addNameRange '0.1.5',
+186 silly addNameRange '0.1.6',
+186 silly addNameRange '0.1.7',
+186 silly addNameRange '0.1.8',
+186 silly addNameRange '0.1.9',
+186 silly addNameRange '0.1.10',
+186 silly addNameRange '0.1.11',
+186 silly addNameRange '0.1.12',
+186 silly addNameRange '0.1.13',
+186 silly addNameRange '0.1.14',
+186 silly addNameRange '0.1.15',
+186 silly addNameRange '0.1.16',
+186 silly addNameRange '0.1.17',
+186 silly addNameRange '0.1.18',
+186 silly addNameRange '0.2.0',
+186 silly addNameRange '0.1.19',
+186 silly addNameRange '1.0.0',
+186 silly addNameRange '1.0.1',
+186 silly addNameRange '1.0.2',
+186 silly addNameRange '2.0.0',
+186 silly addNameRange '2.1.0',
+186 silly addNameRange '2.1.1',
+186 silly addNameRange '1.0.3',
+186 silly addNameRange '2.1.2',
+186 silly addNameRange '1.0.4' ] ]
+187 silly addNamed clone@2.1.2
+188 verbose addNamed "2.1.2" is a plain semver version for clone
+189 silly mapToRegistry name clone
+190 silly mapToRegistry using default registry
+191 silly mapToRegistry registry https://registry.npmjs.org/
+192 silly mapToRegistry uri https://registry.npmjs.org/clone
+193 verbose addRemoteTarball https://registry.npmjs.org/clone/-/clone-2.1.2.tgz not in flight; adding
+194 verbose addRemoteTarball [ 'https://registry.npmjs.org/clone/-/clone-2.1.2.tgz',
+194 verbose addRemoteTarball '1b7f4b9f591f1e8f83670401600345a02887435f' ]
+195 info retry fetch attempt 1 at 13:48:57
+196 info attempt registry request try #1 at 13:48:57
+197 http fetch GET https://registry.npmjs.org/clone/-/clone-2.1.2.tgz
+198 http fetch 200 https://registry.npmjs.org/clone/-/clone-2.1.2.tgz
+199 silly fetchAndShaCheck shasum 1b7f4b9f591f1e8f83670401600345a02887435f
+200 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/clone/-/clone-2.1.2.tgz not in flight; adding
+201 verbose addTmpTarball already have metadata; skipping unpack for clone@2.1.2
+202 http 200 https://registry.npmjs.org/mime
+203 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+203 verbose headers 'content-type': 'application/json',
+203 verbose headers 'transfer-encoding': 'chunked',
+203 verbose headers connection: 'keep-alive',
+203 verbose headers 'set-cookie':
+203 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+203 verbose headers 'cf-ray': '59764fa1caba6347-FRA',
+203 verbose headers age: '5658',
+203 verbose headers 'cache-control': 'public, max-age=300',
+203 verbose headers etag: 'W/"06d541b2c21df82e268be063f8846ba5"',
+203 verbose headers 'last-modified': 'Fri, 01 May 2020 23:10:52 GMT',
+203 verbose headers vary: 'accept-encoding, accept',
+203 verbose headers 'cf-cache-status': 'HIT',
+203 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+203 verbose headers server: 'cloudflare',
+203 verbose headers 'content-encoding': 'gzip',
+203 verbose headers 'cf-request-id': '02ddd0192000006347e8890200000001' }
+204 silly get cb [ 200,
+204 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+204 silly get 'content-type': 'application/json',
+204 silly get 'transfer-encoding': 'chunked',
+204 silly get connection: 'keep-alive',
+204 silly get 'set-cookie':
+204 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+204 silly get 'cf-ray': '59764fa1caba6347-FRA',
+204 silly get age: '5658',
+204 silly get 'cache-control': 'public, max-age=300',
+204 silly get etag: 'W/"06d541b2c21df82e268be063f8846ba5"',
+204 silly get 'last-modified': 'Fri, 01 May 2020 23:10:52 GMT',
+204 silly get vary: 'accept-encoding, accept',
+204 silly get 'cf-cache-status': 'HIT',
+204 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+204 silly get server: 'cloudflare',
+204 silly get 'content-encoding': 'gzip',
+204 silly get 'cf-request-id': '02ddd0192000006347e8890200000001' } ]
+205 verbose get saving mime to /home/christine/.npm/registry.npmjs.org/mime/.cache.json
+206 http 304 https://registry.npmjs.org/errno
+207 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+207 verbose headers connection: 'keep-alive',
+207 verbose headers 'set-cookie':
+207 verbose headers [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+207 verbose headers 'cf-ray': '59764fa1ddccd6e9-FRA',
+207 verbose headers age: '5629',
+207 verbose headers 'cache-control': 'public, max-age=300',
+207 verbose headers etag: '"93d3c79a655f99137298121fc95d36c6"',
+207 verbose headers 'last-modified': 'Sat, 26 May 2018 23:40:24 GMT',
+207 verbose headers vary: 'Accept-Encoding',
+207 verbose headers 'cf-cache-status': 'HIT',
+207 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+207 verbose headers server: 'cloudflare',
+207 verbose headers 'cf-request-id': '02ddd019240000d6e975b00200000001' }
+208 silly get cb [ 304,
+208 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+208 silly get connection: 'keep-alive',
+208 silly get 'set-cookie':
+208 silly get [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+208 silly get 'cf-ray': '59764fa1ddccd6e9-FRA',
+208 silly get age: '5629',
+208 silly get 'cache-control': 'public, max-age=300',
+208 silly get etag: '"93d3c79a655f99137298121fc95d36c6"',
+208 silly get 'last-modified': 'Sat, 26 May 2018 23:40:24 GMT',
+208 silly get vary: 'Accept-Encoding',
+208 silly get 'cf-cache-status': 'HIT',
+208 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+208 silly get server: 'cloudflare',
+208 silly get 'cf-request-id': '02ddd019240000d6e975b00200000001' } ]
+209 verbose etag https://registry.npmjs.org/errno from cache
+210 verbose get saving errno to /home/christine/.npm/registry.npmjs.org/errno/.cache.json
+211 http 200 https://registry.npmjs.org/promise
+212 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+212 verbose headers 'content-type': 'application/json',
+212 verbose headers 'transfer-encoding': 'chunked',
+212 verbose headers connection: 'keep-alive',
+212 verbose headers 'set-cookie':
+212 verbose headers [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+212 verbose headers 'cf-ray': '59764fa1c9c76413-FRA',
+212 verbose headers age: '5628',
+212 verbose headers 'cache-control': 'public, max-age=300',
+212 verbose headers etag: 'W/"0560bb757d840a7a46bf8d008bc75194"',
+212 verbose headers 'last-modified': 'Mon, 02 Mar 2020 10:57:46 GMT',
+212 verbose headers vary: 'accept-encoding, accept',
+212 verbose headers 'cf-cache-status': 'HIT',
+212 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+212 verbose headers server: 'cloudflare',
+212 verbose headers 'content-encoding': 'gzip',
+212 verbose headers 'cf-request-id': '02ddd01920000064135f8cb200000001' }
+213 silly get cb [ 200,
+213 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+213 silly get 'content-type': 'application/json',
+213 silly get 'transfer-encoding': 'chunked',
+213 silly get connection: 'keep-alive',
+213 silly get 'set-cookie':
+213 silly get [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+213 silly get 'cf-ray': '59764fa1c9c76413-FRA',
+213 silly get age: '5628',
+213 silly get 'cache-control': 'public, max-age=300',
+213 silly get etag: 'W/"0560bb757d840a7a46bf8d008bc75194"',
+213 silly get 'last-modified': 'Mon, 02 Mar 2020 10:57:46 GMT',
+213 silly get vary: 'accept-encoding, accept',
+213 silly get 'cf-cache-status': 'HIT',
+213 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+213 silly get server: 'cloudflare',
+213 silly get 'content-encoding': 'gzip',
+213 silly get 'cf-request-id': '02ddd01920000064135f8cb200000001' } ]
+214 verbose get saving promise to /home/christine/.npm/registry.npmjs.org/promise/.cache.json
+215 http 200 https://registry.npmjs.org/graceful-fs
+216 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+216 verbose headers 'content-type': 'application/json',
+216 verbose headers 'transfer-encoding': 'chunked',
+216 verbose headers connection: 'keep-alive',
+216 verbose headers 'set-cookie':
+216 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+216 verbose headers 'cf-ray': '59764fa1da22325c-FRA',
+216 verbose headers age: '5345',
+216 verbose headers 'cache-control': 'public, max-age=300',
+216 verbose headers etag: 'W/"84e1c483529d18a582ac0265096141af"',
+216 verbose headers 'last-modified': 'Tue, 28 Apr 2020 15:14:15 GMT',
+216 verbose headers vary: 'accept-encoding, accept',
+216 verbose headers 'cf-cache-status': 'HIT',
+216 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+216 verbose headers server: 'cloudflare',
+216 verbose headers 'content-encoding': 'gzip',
+216 verbose headers 'cf-request-id': '02ddd019250000325c4cbef200000001' }
+217 silly get cb [ 200,
+217 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+217 silly get 'content-type': 'application/json',
+217 silly get 'transfer-encoding': 'chunked',
+217 silly get connection: 'keep-alive',
+217 silly get 'set-cookie':
+217 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+217 silly get 'cf-ray': '59764fa1da22325c-FRA',
+217 silly get age: '5345',
+217 silly get 'cache-control': 'public, max-age=300',
+217 silly get etag: 'W/"84e1c483529d18a582ac0265096141af"',
+217 silly get 'last-modified': 'Tue, 28 Apr 2020 15:14:15 GMT',
+217 silly get vary: 'accept-encoding, accept',
+217 silly get 'cf-cache-status': 'HIT',
+217 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+217 silly get server: 'cloudflare',
+217 silly get 'content-encoding': 'gzip',
+217 silly get 'cf-request-id': '02ddd019250000325c4cbef200000001' } ]
+218 verbose get saving graceful-fs to /home/christine/.npm/registry.npmjs.org/graceful-fs/.cache.json
+219 silly resolveWithNewModule errno@0.1.7 checking installable status
+220 silly cache add args [ 'errno@^0.1.1', null ]
+221 verbose cache add spec errno@^0.1.1
+222 silly cache add parsed spec Result {
+222 silly cache add raw: 'errno@^0.1.1',
+222 silly cache add scope: null,
+222 silly cache add name: 'errno',
+222 silly cache add rawSpec: '^0.1.1',
+222 silly cache add spec: '>=0.1.1 <0.2.0',
+222 silly cache add type: 'range' }
+223 silly addNamed errno@>=0.1.1 <0.2.0
+224 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for errno
+225 silly addNameRange { name: 'errno', range: '>=0.1.1 <0.2.0', hasData: false }
+226 silly mapToRegistry name errno
+227 silly mapToRegistry using default registry
+228 silly mapToRegistry registry https://registry.npmjs.org/
+229 silly mapToRegistry uri https://registry.npmjs.org/errno
+230 verbose addNameRange registry:https://registry.npmjs.org/errno not in flight; fetching
+231 silly resolveWithNewModule mime@1.6.0 checking installable status
+232 silly cache add args [ 'mime@^1.4.1', null ]
+233 verbose cache add spec mime@^1.4.1
+234 silly cache add parsed spec Result {
+234 silly cache add raw: 'mime@^1.4.1',
+234 silly cache add scope: null,
+234 silly cache add name: 'mime',
+234 silly cache add rawSpec: '^1.4.1',
+234 silly cache add spec: '>=1.4.1 <2.0.0',
+234 silly cache add type: 'range' }
+235 silly addNamed mime@>=1.4.1 <2.0.0
+236 verbose addNamed ">=1.4.1 <2.0.0" is a valid semver range for mime
+237 silly addNameRange { name: 'mime', range: '>=1.4.1 <2.0.0', hasData: false }
+238 silly mapToRegistry name mime
+239 silly mapToRegistry using default registry
+240 silly mapToRegistry registry https://registry.npmjs.org/
+241 silly mapToRegistry uri https://registry.npmjs.org/mime
+242 verbose addNameRange registry:https://registry.npmjs.org/mime not in flight; fetching
+243 http 200 https://registry.npmjs.org/tslib
+244 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+244 verbose headers 'content-type': 'application/json',
+244 verbose headers 'transfer-encoding': 'chunked',
+244 verbose headers connection: 'keep-alive',
+244 verbose headers 'set-cookie':
+244 verbose headers [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+244 verbose headers 'cf-ray': '59764fa1d9e7d715-FRA',
+244 verbose headers age: '5299',
+244 verbose headers 'cache-control': 'public, max-age=300',
+244 verbose headers etag: 'W/"2b86a514bc0f750da0d0f62d3dbfde51"',
+244 verbose headers 'last-modified': 'Wed, 13 May 2020 23:18:43 GMT',
+244 verbose headers vary: 'accept-encoding, accept',
+244 verbose headers 'cf-cache-status': 'HIT',
+244 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+244 verbose headers server: 'cloudflare',
+244 verbose headers 'content-encoding': 'gzip',
+244 verbose headers 'cf-request-id': '02ddd019240000d715c11d3200000001' }
+245 silly get cb [ 200,
+245 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+245 silly get 'content-type': 'application/json',
+245 silly get 'transfer-encoding': 'chunked',
+245 silly get connection: 'keep-alive',
+245 silly get 'set-cookie':
+245 silly get [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+245 silly get 'cf-ray': '59764fa1d9e7d715-FRA',
+245 silly get age: '5299',
+245 silly get 'cache-control': 'public, max-age=300',
+245 silly get etag: 'W/"2b86a514bc0f750da0d0f62d3dbfde51"',
+245 silly get 'last-modified': 'Wed, 13 May 2020 23:18:43 GMT',
+245 silly get vary: 'accept-encoding, accept',
+245 silly get 'cf-cache-status': 'HIT',
+245 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+245 silly get server: 'cloudflare',
+245 silly get 'content-encoding': 'gzip',
+245 silly get 'cf-request-id': '02ddd019240000d715c11d3200000001' } ]
+246 verbose get saving tslib to /home/christine/.npm/registry.npmjs.org/tslib/.cache.json
+247 verbose get https://registry.npmjs.org/errno not expired, no request
+248 silly addNameRange number 2 { name: 'errno', range: '>=0.1.1 <0.2.0', hasData: true }
+249 silly addNameRange versions [ 'errno',
+249 silly addNameRange [ '0.0.1',
+249 silly addNameRange '0.0.2',
+249 silly addNameRange '0.0.3',
+249 silly addNameRange '0.0.4',
+249 silly addNameRange '0.0.5',
+249 silly addNameRange '0.1.0',
+249 silly addNameRange '0.1.1',
+249 silly addNameRange '0.1.2',
+249 silly addNameRange '0.1.3',
+249 silly addNameRange '0.1.4',
+249 silly addNameRange '0.1.5',
+249 silly addNameRange '0.1.6',
+249 silly addNameRange '0.1.7' ] ]
+250 silly addNamed errno@0.1.7
+251 verbose addNamed "0.1.7" is a plain semver version for errno
+252 verbose get https://registry.npmjs.org/mime not expired, no request
+253 silly addNameRange number 2 { name: 'mime', range: '>=1.4.1 <2.0.0', hasData: true }
+254 silly addNameRange versions [ 'mime',
+254 silly addNameRange [ '1.0.0',
+254 silly addNameRange '1.1.0',
+254 silly addNameRange '1.2.1',
+254 silly addNameRange '1.2.2',
+254 silly addNameRange '1.2.3',
+254 silly addNameRange '1.2.4',
+254 silly addNameRange '1.2.5',
+254 silly addNameRange '1.2.6',
+254 silly addNameRange '1.2.7',
+254 silly addNameRange '1.2.8',
+254 silly addNameRange '1.2.9',
+254 silly addNameRange '1.2.10',
+254 silly addNameRange '1.2.11',
+254 silly addNameRange '1.3.0',
+254 silly addNameRange '1.3.2',
+254 silly addNameRange '1.3.3',
+254 silly addNameRange '1.3.4',
+254 silly addNameRange '1.3.5',
+254 silly addNameRange '1.3.6',
+254 silly addNameRange '1.4.0',
+254 silly addNameRange '2.0.0',
+254 silly addNameRange '2.0.1',
+254 silly addNameRange '2.0.2',
+254 silly addNameRange '1.4.1',
+254 silly addNameRange '2.0.3',
+254 silly addNameRange '1.5.0',
+254 silly addNameRange '1.6.0',
+254 silly addNameRange '2.0.5',
+254 silly addNameRange '2.1.0',
+254 silly addNameRange '2.2.0',
+254 silly addNameRange '2.2.1',
+254 silly addNameRange '2.2.2',
+254 silly addNameRange '2.3.0',
+254 silly addNameRange '2.3.1',
+254 silly addNameRange '2.4.0',
+254 silly addNameRange '2.4.1',
+254 silly addNameRange '2.4.2',
+254 silly addNameRange '2.4.3',
+254 silly addNameRange '2.4.4',
+254 silly addNameRange '2.4.5' ] ]
+255 silly addNamed mime@1.6.0
+256 verbose addNamed "1.6.0" is a plain semver version for mime
+257 silly cache afterAdd clone@2.1.2
+258 verbose afterAdd /home/christine/.npm/clone/2.1.2/package/package.json not in flight; writing
+259 silly mapToRegistry name mime
+260 silly mapToRegistry using default registry
+261 silly mapToRegistry registry https://registry.npmjs.org/
+262 silly mapToRegistry uri https://registry.npmjs.org/mime
+263 verbose addRemoteTarball https://registry.npmjs.org/mime/-/mime-1.6.0.tgz not in flight; adding
+264 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime/-/mime-1.6.0.tgz',
+264 verbose addRemoteTarball '32cd9e5c64553bd58d19a568af452acff04981b1' ]
+265 http 200 https://registry.npmjs.org/mkdirp
+266 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+266 verbose headers 'content-type': 'application/json',
+266 verbose headers 'transfer-encoding': 'chunked',
+266 verbose headers connection: 'keep-alive',
+266 verbose headers 'set-cookie':
+266 verbose headers [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+266 verbose headers 'cf-ray': '59764fa1fe51175a-FRA',
+266 verbose headers age: '5346',
+266 verbose headers 'cache-control': 'public, max-age=300',
+266 verbose headers etag: 'W/"0730d9c43c136c318d8e19c69cbd72aa"',
+266 verbose headers 'last-modified': 'Wed, 22 Apr 2020 06:03:24 GMT',
+266 verbose headers vary: 'accept-encoding, accept',
+266 verbose headers 'cf-cache-status': 'HIT',
+266 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+266 verbose headers server: 'cloudflare',
+266 verbose headers 'content-encoding': 'gzip',
+266 verbose headers 'cf-request-id': '02ddd019380000175a1e1e7200000001' }
+267 silly get cb [ 200,
+267 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+267 silly get 'content-type': 'application/json',
+267 silly get 'transfer-encoding': 'chunked',
+267 silly get connection: 'keep-alive',
+267 silly get 'set-cookie':
+267 silly get [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+267 silly get 'cf-ray': '59764fa1fe51175a-FRA',
+267 silly get age: '5346',
+267 silly get 'cache-control': 'public, max-age=300',
+267 silly get etag: 'W/"0730d9c43c136c318d8e19c69cbd72aa"',
+267 silly get 'last-modified': 'Wed, 22 Apr 2020 06:03:24 GMT',
+267 silly get vary: 'accept-encoding, accept',
+267 silly get 'cf-cache-status': 'HIT',
+267 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+267 silly get server: 'cloudflare',
+267 silly get 'content-encoding': 'gzip',
+267 silly get 'cf-request-id': '02ddd019380000175a1e1e7200000001' } ]
+268 verbose get saving mkdirp to /home/christine/.npm/registry.npmjs.org/mkdirp/.cache.json
+269 silly resolveWithNewModule graceful-fs@4.2.4 checking installable status
+270 silly cache add args [ 'graceful-fs@^4.1.2', null ]
+271 verbose cache add spec graceful-fs@^4.1.2
+272 silly cache add parsed spec Result {
+272 silly cache add raw: 'graceful-fs@^4.1.2',
+272 silly cache add scope: null,
+272 silly cache add name: 'graceful-fs',
+272 silly cache add rawSpec: '^4.1.2',
+272 silly cache add spec: '>=4.1.2 <5.0.0',
+272 silly cache add type: 'range' }
+273 silly addNamed graceful-fs@>=4.1.2 <5.0.0
+274 verbose addNamed ">=4.1.2 <5.0.0" is a valid semver range for graceful-fs
+275 silly addNameRange { name: 'graceful-fs', range: '>=4.1.2 <5.0.0', hasData: false }
+276 silly mapToRegistry name graceful-fs
+277 silly mapToRegistry using default registry
+278 silly mapToRegistry registry https://registry.npmjs.org/
+279 silly mapToRegistry uri https://registry.npmjs.org/graceful-fs
+280 verbose addNameRange registry:https://registry.npmjs.org/graceful-fs not in flight; fetching
+281 http 200 https://registry.npmjs.org/image-size
+282 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+282 verbose headers 'content-type': 'application/json',
+282 verbose headers 'transfer-encoding': 'chunked',
+282 verbose headers connection: 'keep-alive',
+282 verbose headers 'set-cookie':
+282 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+282 verbose headers 'cf-ray': '59764fa1cf14648b-FRA',
+282 verbose headers age: '4621',
+282 verbose headers 'cache-control': 'public, max-age=300',
+282 verbose headers etag: 'W/"c223fda42dcf547145c5fcea3c32c5da"',
+282 verbose headers 'last-modified': 'Mon, 30 Sep 2019 10:49:43 GMT',
+282 verbose headers vary: 'accept-encoding, accept',
+282 verbose headers 'cf-cache-status': 'HIT',
+282 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+282 verbose headers server: 'cloudflare',
+282 verbose headers 'content-encoding': 'gzip',
+282 verbose headers 'cf-request-id': '02ddd0191b0000648bda3f1200000001' }
+283 silly get cb [ 200,
+283 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+283 silly get 'content-type': 'application/json',
+283 silly get 'transfer-encoding': 'chunked',
+283 silly get connection: 'keep-alive',
+283 silly get 'set-cookie':
+283 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+283 silly get 'cf-ray': '59764fa1cf14648b-FRA',
+283 silly get age: '4621',
+283 silly get 'cache-control': 'public, max-age=300',
+283 silly get etag: 'W/"c223fda42dcf547145c5fcea3c32c5da"',
+283 silly get 'last-modified': 'Mon, 30 Sep 2019 10:49:43 GMT',
+283 silly get vary: 'accept-encoding, accept',
+283 silly get 'cf-cache-status': 'HIT',
+283 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+283 silly get server: 'cloudflare',
+283 silly get 'content-encoding': 'gzip',
+283 silly get 'cf-request-id': '02ddd0191b0000648bda3f1200000001' } ]
+284 verbose get saving image-size to /home/christine/.npm/registry.npmjs.org/image-size/.cache.json
+285 silly resolveWithNewModule promise@7.3.1 checking installable status
+286 silly cache add args [ 'promise@^7.1.1', null ]
+287 verbose cache add spec promise@^7.1.1
+288 silly cache add parsed spec Result {
+288 silly cache add raw: 'promise@^7.1.1',
+288 silly cache add scope: null,
+288 silly cache add name: 'promise',
+288 silly cache add rawSpec: '^7.1.1',
+288 silly cache add spec: '>=7.1.1 <8.0.0',
+288 silly cache add type: 'range' }
+289 silly addNamed promise@>=7.1.1 <8.0.0
+290 verbose addNamed ">=7.1.1 <8.0.0" is a valid semver range for promise
+291 silly addNameRange { name: 'promise', range: '>=7.1.1 <8.0.0', hasData: false }
+292 silly mapToRegistry name promise
+293 silly mapToRegistry using default registry
+294 silly mapToRegistry registry https://registry.npmjs.org/
+295 silly mapToRegistry uri https://registry.npmjs.org/promise
+296 verbose addNameRange registry:https://registry.npmjs.org/promise not in flight; fetching
+297 info retry fetch attempt 1 at 13:48:57
+298 info attempt registry request try #1 at 13:48:57
+299 http fetch GET https://registry.npmjs.org/mime/-/mime-1.6.0.tgz
+300 silly resolveWithNewModule tslib@1.13.0 checking installable status
+301 silly cache add args [ 'tslib@^1.10.0', null ]
+302 verbose cache add spec tslib@^1.10.0
+303 silly cache add parsed spec Result {
+303 silly cache add raw: 'tslib@^1.10.0',
+303 silly cache add scope: null,
+303 silly cache add name: 'tslib',
+303 silly cache add rawSpec: '^1.10.0',
+303 silly cache add spec: '>=1.10.0 <2.0.0',
+303 silly cache add type: 'range' }
+304 silly addNamed tslib@>=1.10.0 <2.0.0
+305 verbose addNamed ">=1.10.0 <2.0.0" is a valid semver range for tslib
+306 silly addNameRange { name: 'tslib', range: '>=1.10.0 <2.0.0', hasData: false }
+307 silly mapToRegistry name tslib
+308 silly mapToRegistry using default registry
+309 silly mapToRegistry registry https://registry.npmjs.org/
+310 silly mapToRegistry uri https://registry.npmjs.org/tslib
+311 verbose addNameRange registry:https://registry.npmjs.org/tslib not in flight; fetching
+312 verbose afterAdd /home/christine/.npm/clone/2.1.2/package/package.json written
+313 verbose get https://registry.npmjs.org/graceful-fs not expired, no request
+314 silly addNameRange number 2 { name: 'graceful-fs', range: '>=4.1.2 <5.0.0', hasData: true }
+315 silly addNameRange versions [ 'graceful-fs',
+315 silly addNameRange [ '1.0.0',
+315 silly addNameRange '1.0.1',
+315 silly addNameRange '1.0.2',
+315 silly addNameRange '1.1.0',
+315 silly addNameRange '1.1.1',
+315 silly addNameRange '1.1.2',
+315 silly addNameRange '1.1.3',
+315 silly addNameRange '1.1.4',
+315 silly addNameRange '1.1.5',
+315 silly addNameRange '1.1.6',
+315 silly addNameRange '1.1.7',
+315 silly addNameRange '1.1.8',
+315 silly addNameRange '1.1.9',
+315 silly addNameRange '1.1.10',
+315 silly addNameRange '1.1.11',
+315 silly addNameRange '1.1.12',
+315 silly addNameRange '1.1.13',
+315 silly addNameRange '1.1.14',
+315 silly addNameRange '1.2.0',
+315 silly addNameRange '1.2.1',
+315 silly addNameRange '1.2.2',
+315 silly addNameRange '1.2.3',
+315 silly addNameRange '2.0.0',
+315 silly addNameRange '2.0.1',
+315 silly addNameRange '2.0.2',
+315 silly addNameRange '2.0.3',
+315 silly addNameRange '3.0.0',
+315 silly addNameRange '3.0.1',
+315 silly addNameRange '3.0.2',
+315 silly addNameRange '3.0.3',
+315 silly addNameRange '3.0.4',
+315 silly addNameRange '3.0.5',
+315 silly addNameRange '3.0.6',
+315 silly addNameRange '3.0.7',
+315 silly addNameRange '3.0.8',
+315 silly addNameRange '4.1.0',
+315 silly addNameRange '4.1.1',
+315 silly addNameRange '4.1.2',
+315 silly addNameRange '4.1.3',
+315 silly addNameRange '4.1.4',
+315 silly addNameRange '4.1.5',
+315 silly addNameRange '3.0.9',
+315 silly addNameRange '4.1.6',
+315 silly addNameRange '3.0.10',
+315 silly addNameRange '3.0.11',
+315 silly addNameRange '4.1.7',
+315 silly addNameRange '4.1.8',
+315 silly addNameRange '4.1.9',
+315 silly addNameRange '4.1.10',
+315 silly addNameRange '4.1.11',
+315 silly addNameRange '4.1.12',
+315 silly addNameRange '4.1.13',
+315 silly addNameRange '4.1.14',
+315 silly addNameRange '4.1.15',
+315 silly addNameRange '4.2.0',
+315 silly addNameRange '4.2.1',
+315 silly addNameRange '3.0.12',
+315 silly addNameRange '4.2.2',
+315 silly addNameRange '4.2.3',
+315 silly addNameRange '4.2.4' ] ]
+316 silly addNamed graceful-fs@4.2.4
+317 verbose addNamed "4.2.4" is a plain semver version for graceful-fs
+318 silly cache afterAdd errno@0.1.7
+319 verbose afterAdd /home/christine/.npm/errno/0.1.7/package/package.json not in flight; writing
+320 silly mapToRegistry name graceful-fs
+321 silly mapToRegistry using default registry
+322 silly mapToRegistry registry https://registry.npmjs.org/
+323 silly mapToRegistry uri https://registry.npmjs.org/graceful-fs
+324 verbose addRemoteTarball https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz not in flight; adding
+325 verbose addRemoteTarball [ 'https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz',
+325 verbose addRemoteTarball '2256bde14d3632958c465ebc96dc467ca07a29fb' ]
+326 verbose get https://registry.npmjs.org/promise not expired, no request
+327 silly addNameRange number 2 { name: 'promise', range: '>=7.1.1 <8.0.0', hasData: true }
+328 silly addNameRange versions [ 'promise',
+328 silly addNameRange [ '1.2.1',
+328 silly addNameRange '1.2.2',
+328 silly addNameRange '1.3.0',
+328 silly addNameRange '2.0.0',
+328 silly addNameRange '3.0.0',
+328 silly addNameRange '3.0.1',
+328 silly addNameRange '3.1.0',
+328 silly addNameRange '3.2.0',
+328 silly addNameRange '4.0.0',
+328 silly addNameRange '5.0.0',
+328 silly addNameRange '6.0.0',
+328 silly addNameRange '6.0.1',
+328 silly addNameRange '6.1.0',
+328 silly addNameRange '7.0.0',
+328 silly addNameRange '7.0.1',
+328 silly addNameRange '7.0.2',
+328 silly addNameRange '7.0.3',
+328 silly addNameRange '7.0.4',
+328 silly addNameRange '7.1.0',
+328 silly addNameRange '7.1.1',
+328 silly addNameRange '7.2.0',
+328 silly addNameRange '7.3.0',
+328 silly addNameRange '7.3.1',
+328 silly addNameRange '8.0.0',
+328 silly addNameRange '8.0.1',
+328 silly addNameRange '8.0.2',
+328 silly addNameRange '8.0.3',
+328 silly addNameRange '8.1.0' ] ]
+329 silly addNamed promise@7.3.1
+330 verbose addNamed "7.3.1" is a plain semver version for promise
+331 verbose get https://registry.npmjs.org/tslib not expired, no request
+332 silly addNameRange number 2 { name: 'tslib', range: '>=1.10.0 <2.0.0', hasData: true }
+333 silly addNameRange versions [ 'tslib',
+333 silly addNameRange [ '0.0.1-security',
+333 silly addNameRange '1.0.0',
+333 silly addNameRange '1.1.0',
+333 silly addNameRange '1.2.0',
+333 silly addNameRange '1.3.0',
+333 silly addNameRange '1.4.0',
+333 silly addNameRange '1.5.0',
+333 silly addNameRange '1.6.0',
+333 silly addNameRange '1.6.1',
+333 silly addNameRange '1.7.0',
+333 silly addNameRange '1.7.1',
+333 silly addNameRange '1.8.0',
+333 silly addNameRange '1.8.1',
+333 silly addNameRange '1.9.0',
+333 silly addNameRange '1.9.1',
+333 silly addNameRange '1.9.2',
+333 silly addNameRange '1.9.3',
+333 silly addNameRange '1.10.0',
+333 silly addNameRange '1.11.0',
+333 silly addNameRange '1.11.1',
+333 silly addNameRange '1.11.2',
+333 silly addNameRange '1.12.0',
+333 silly addNameRange '1.13.0',
+333 silly addNameRange '2.0.0' ] ]
+334 silly addNamed tslib@1.13.0
+335 verbose addNamed "1.13.0" is a plain semver version for tslib
+336 silly mapToRegistry name promise
+337 silly mapToRegistry using default registry
+338 silly mapToRegistry registry https://registry.npmjs.org/
+339 silly mapToRegistry uri https://registry.npmjs.org/promise
+340 verbose addRemoteTarball https://registry.npmjs.org/promise/-/promise-7.3.1.tgz not in flight; adding
+341 verbose addRemoteTarball [ 'https://registry.npmjs.org/promise/-/promise-7.3.1.tgz',
+341 verbose addRemoteTarball '064b72602b18f90f29192b8b1bc418ffd1ebd3bf' ]
+342 silly resolveWithNewModule mkdirp@0.5.5 checking installable status
+343 silly cache add args [ 'mkdirp@^0.5.0', null ]
+344 verbose cache add spec mkdirp@^0.5.0
+345 silly cache add parsed spec Result {
+345 silly cache add raw: 'mkdirp@^0.5.0',
+345 silly cache add scope: null,
+345 silly cache add name: 'mkdirp',
+345 silly cache add rawSpec: '^0.5.0',
+345 silly cache add spec: '>=0.5.0 <0.6.0',
+345 silly cache add type: 'range' }
+346 silly addNamed mkdirp@>=0.5.0 <0.6.0
+347 verbose addNamed ">=0.5.0 <0.6.0" is a valid semver range for mkdirp
+348 silly addNameRange { name: 'mkdirp', range: '>=0.5.0 <0.6.0', hasData: false }
+349 silly mapToRegistry name mkdirp
+350 silly mapToRegistry using default registry
+351 silly mapToRegistry registry https://registry.npmjs.org/
+352 silly mapToRegistry uri https://registry.npmjs.org/mkdirp
+353 verbose addNameRange registry:https://registry.npmjs.org/mkdirp not in flight; fetching
+354 silly mapToRegistry name tslib
+355 silly mapToRegistry using default registry
+356 silly mapToRegistry registry https://registry.npmjs.org/
+357 silly mapToRegistry uri https://registry.npmjs.org/tslib
+358 verbose addRemoteTarball https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz not in flight; adding
+359 verbose addRemoteTarball [ 'https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz',
+359 verbose addRemoteTarball 'c881e13cc7015894ed914862d276436fa9a47043' ]
+360 info retry fetch attempt 1 at 13:48:57
+361 info attempt registry request try #1 at 13:48:57
+362 http fetch GET https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz
+363 info retry fetch attempt 1 at 13:48:57
+364 info attempt registry request try #1 at 13:48:57
+365 http fetch GET https://registry.npmjs.org/promise/-/promise-7.3.1.tgz
+366 http 200 https://registry.npmjs.org/source-map
+367 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+367 verbose headers 'content-type': 'application/json',
+367 verbose headers 'transfer-encoding': 'chunked',
+367 verbose headers connection: 'keep-alive',
+367 verbose headers 'set-cookie':
+367 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+367 verbose headers 'cf-ray': '59764fa1f8a405fd-FRA',
+367 verbose headers age: '5629',
+367 verbose headers 'cache-control': 'public, max-age=300',
+367 verbose headers etag: 'W/"ed6422e25077febab77501a786cb4bdd"',
+367 verbose headers 'last-modified': 'Thu, 07 May 2020 17:23:05 GMT',
+367 verbose headers vary: 'accept-encoding, accept',
+367 verbose headers 'cf-cache-status': 'HIT',
+367 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+367 verbose headers server: 'cloudflare',
+367 verbose headers 'content-encoding': 'gzip',
+367 verbose headers 'cf-request-id': '02ddd0193d000005fd8da0d200000001' }
+368 silly get cb [ 200,
+368 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+368 silly get 'content-type': 'application/json',
+368 silly get 'transfer-encoding': 'chunked',
+368 silly get connection: 'keep-alive',
+368 silly get 'set-cookie':
+368 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+368 silly get 'cf-ray': '59764fa1f8a405fd-FRA',
+368 silly get age: '5629',
+368 silly get 'cache-control': 'public, max-age=300',
+368 silly get etag: 'W/"ed6422e25077febab77501a786cb4bdd"',
+368 silly get 'last-modified': 'Thu, 07 May 2020 17:23:05 GMT',
+368 silly get vary: 'accept-encoding, accept',
+368 silly get 'cf-cache-status': 'HIT',
+368 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+368 silly get server: 'cloudflare',
+368 silly get 'content-encoding': 'gzip',
+368 silly get 'cf-request-id': '02ddd0193d000005fd8da0d200000001' } ]
+369 verbose get saving source-map to /home/christine/.npm/registry.npmjs.org/source-map/.cache.json
+370 silly resolveWithNewModule image-size@0.5.5 checking installable status
+371 silly cache add args [ 'image-size@~0.5.0', null ]
+372 verbose cache add spec image-size@~0.5.0
+373 silly cache add parsed spec Result {
+373 silly cache add raw: 'image-size@~0.5.0',
+373 silly cache add scope: null,
+373 silly cache add name: 'image-size',
+373 silly cache add rawSpec: '~0.5.0',
+373 silly cache add spec: '>=0.5.0 <0.6.0',
+373 silly cache add type: 'range' }
+374 silly addNamed image-size@>=0.5.0 <0.6.0
+375 verbose addNamed ">=0.5.0 <0.6.0" is a valid semver range for image-size
+376 silly addNameRange { name: 'image-size', range: '>=0.5.0 <0.6.0', hasData: false }
+377 silly mapToRegistry name image-size
+378 silly mapToRegistry using default registry
+379 silly mapToRegistry registry https://registry.npmjs.org/
+380 silly mapToRegistry uri https://registry.npmjs.org/image-size
+381 verbose addNameRange registry:https://registry.npmjs.org/image-size not in flight; fetching
+382 info retry fetch attempt 1 at 13:48:57
+383 info attempt registry request try #1 at 13:48:57
+384 http fetch GET https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz
+385 verbose afterAdd /home/christine/.npm/errno/0.1.7/package/package.json written
+386 verbose get https://registry.npmjs.org/mkdirp not expired, no request
+387 silly addNameRange number 2 { name: 'mkdirp', range: '>=0.5.0 <0.6.0', hasData: true }
+388 silly addNameRange versions [ 'mkdirp',
+388 silly addNameRange [ '0.0.1',
+388 silly addNameRange '0.0.2',
+388 silly addNameRange '0.0.3',
+388 silly addNameRange '0.0.4',
+388 silly addNameRange '0.0.5',
+388 silly addNameRange '0.0.6',
+388 silly addNameRange '0.0.7',
+388 silly addNameRange '0.1.0',
+388 silly addNameRange '0.2.0',
+388 silly addNameRange '0.2.1',
+388 silly addNameRange '0.2.2',
+388 silly addNameRange '0.3.0',
+388 silly addNameRange '0.3.1',
+388 silly addNameRange '0.3.2',
+388 silly addNameRange '0.3.3',
+388 silly addNameRange '0.3.4',
+388 silly addNameRange '0.3.5',
+388 silly addNameRange '0.4.0',
+388 silly addNameRange '0.4.1',
+388 silly addNameRange '0.4.2',
+388 silly addNameRange '0.5.0',
+388 silly addNameRange '0.5.1',
+388 silly addNameRange '1.0.0',
+388 silly addNameRange '1.0.1',
+388 silly addNameRange '1.0.2',
+388 silly addNameRange '1.0.3',
+388 silly addNameRange '0.5.2',
+388 silly addNameRange '0.5.3',
+388 silly addNameRange '0.5.4',
+388 silly addNameRange '1.0.4',
+388 silly addNameRange '0.5.5' ] ]
+389 silly addNamed mkdirp@0.5.5
+390 verbose addNamed "0.5.5" is a plain semver version for mkdirp
+391 silly mapToRegistry name mkdirp
+392 silly mapToRegistry using default registry
+393 silly mapToRegistry registry https://registry.npmjs.org/
+394 silly mapToRegistry uri https://registry.npmjs.org/mkdirp
+395 verbose addRemoteTarball https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz not in flight; adding
+396 verbose addRemoteTarball [ 'https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz',
+396 verbose addRemoteTarball 'd91cefd62d1436ca0f41620e251288d420099def' ]
+397 verbose get https://registry.npmjs.org/image-size not expired, no request
+398 silly addNameRange number 2 { name: 'image-size', range: '>=0.5.0 <0.6.0', hasData: true }
+399 silly addNameRange versions [ 'image-size',
+399 silly addNameRange [ '0.0.2',
+399 silly addNameRange '0.0.3',
+399 silly addNameRange '0.0.5',
+399 silly addNameRange '0.1.0',
+399 silly addNameRange '0.1.1',
+399 silly addNameRange '0.1.2',
+399 silly addNameRange '0.1.3',
+399 silly addNameRange '0.1.4',
+399 silly addNameRange '0.1.5',
+399 silly addNameRange '0.1.6',
+399 silly addNameRange '0.1.7',
+399 silly addNameRange '0.1.10',
+399 silly addNameRange '0.1.15',
+399 silly addNameRange '0.0.16',
+399 silly addNameRange '0.1.16',
+399 silly addNameRange '0.1.17',
+399 silly addNameRange '0.1.20',
+399 silly addNameRange '0.2.1',
+399 silly addNameRange '0.2.2',
+399 silly addNameRange '0.2.3',
+399 silly addNameRange '0.2.4',
+399 silly addNameRange '0.2.5',
+399 silly addNameRange '0.3.0',
+399 silly addNameRange '0.3.1',
+399 silly addNameRange '0.3.2',
+399 silly addNameRange '0.3.3',
+399 silly addNameRange '0.3.5',
+399 silly addNameRange '0.4.0',
+399 silly addNameRange '0.5.0',
+399 silly addNameRange '0.5.1',
+399 silly addNameRange '0.5.2',
+399 silly addNameRange '0.5.3',
+399 silly addNameRange '0.5.4',
+399 silly addNameRange '0.5.5',
+399 silly addNameRange '0.6.0',
+399 silly addNameRange '0.6.1',
+399 silly addNameRange '0.6.2',
+399 silly addNameRange '0.6.3',
+399 silly addNameRange '0.7.0',
+399 silly addNameRange '0.7.1',
+399 silly addNameRange '0.7.2',
+399 silly addNameRange '0.7.3',
+399 silly addNameRange '0.7.4',
+399 silly addNameRange '0.7.5',
+399 silly addNameRange '0.8.0',
+399 silly addNameRange '0.8.1',
+399 silly addNameRange '0.8.2',
+399 silly addNameRange '0.8.3' ] ]
+400 silly addNamed image-size@0.5.5
+401 verbose addNamed "0.5.5" is a plain semver version for image-size
+402 silly mapToRegistry name image-size
+403 silly mapToRegistry using default registry
+404 silly mapToRegistry registry https://registry.npmjs.org/
+405 silly mapToRegistry uri https://registry.npmjs.org/image-size
+406 verbose addRemoteTarball https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz not in flight; adding
+407 verbose addRemoteTarball [ 'https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz',
+407 verbose addRemoteTarball '09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c' ]
+408 http fetch 200 https://registry.npmjs.org/mime/-/mime-1.6.0.tgz
+409 info retry fetch attempt 1 at 13:48:57
+410 info attempt registry request try #1 at 13:48:57
+411 http fetch GET https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz
+412 http 200 https://registry.npmjs.org/request
+413 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+413 verbose headers 'content-type': 'application/json',
+413 verbose headers 'transfer-encoding': 'chunked',
+413 verbose headers connection: 'keep-alive',
+413 verbose headers 'set-cookie':
+413 verbose headers [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+413 verbose headers 'cf-ray': '59764fa1dc0ec272-FRA',
+413 verbose headers age: '5668',
+413 verbose headers 'cache-control': 'public, max-age=300',
+413 verbose headers etag: 'W/"f6a50554348a0710692c70f1bd6574ab"',
+413 verbose headers 'last-modified': 'Mon, 11 May 2020 15:19:07 GMT',
+413 verbose headers vary: 'accept-encoding, accept',
+413 verbose headers 'cf-cache-status': 'HIT',
+413 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+413 verbose headers server: 'cloudflare',
+413 verbose headers 'content-encoding': 'gzip',
+413 verbose headers 'cf-request-id': '02ddd0192b0000c27238899200000001' }
+414 silly get cb [ 200,
+414 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+414 silly get 'content-type': 'application/json',
+414 silly get 'transfer-encoding': 'chunked',
+414 silly get connection: 'keep-alive',
+414 silly get 'set-cookie':
+414 silly get [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+414 silly get 'cf-ray': '59764fa1dc0ec272-FRA',
+414 silly get age: '5668',
+414 silly get 'cache-control': 'public, max-age=300',
+414 silly get etag: 'W/"f6a50554348a0710692c70f1bd6574ab"',
+414 silly get 'last-modified': 'Mon, 11 May 2020 15:19:07 GMT',
+414 silly get vary: 'accept-encoding, accept',
+414 silly get 'cf-cache-status': 'HIT',
+414 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+414 silly get server: 'cloudflare',
+414 silly get 'content-encoding': 'gzip',
+414 silly get 'cf-request-id': '02ddd0192b0000c27238899200000001' } ]
+415 verbose get saving request to /home/christine/.npm/registry.npmjs.org/request/.cache.json
+416 silly resolveWithNewModule source-map@0.6.1 checking installable status
+417 silly cache add args [ 'source-map@~0.6.0', null ]
+418 verbose cache add spec source-map@~0.6.0
+419 silly cache add parsed spec Result {
+419 silly cache add raw: 'source-map@~0.6.0',
+419 silly cache add scope: null,
+419 silly cache add name: 'source-map',
+419 silly cache add rawSpec: '~0.6.0',
+419 silly cache add spec: '>=0.6.0 <0.7.0',
+419 silly cache add type: 'range' }
+420 silly addNamed source-map@>=0.6.0 <0.7.0
+421 verbose addNamed ">=0.6.0 <0.7.0" is a valid semver range for source-map
+422 silly addNameRange { name: 'source-map', range: '>=0.6.0 <0.7.0', hasData: false }
+423 silly mapToRegistry name source-map
+424 silly mapToRegistry using default registry
+425 silly mapToRegistry registry https://registry.npmjs.org/
+426 silly mapToRegistry uri https://registry.npmjs.org/source-map
+427 verbose addNameRange registry:https://registry.npmjs.org/source-map not in flight; fetching
+428 info retry fetch attempt 1 at 13:48:57
+429 info attempt registry request try #1 at 13:48:57
+430 http fetch GET https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz
+431 silly fetchAndShaCheck shasum 32cd9e5c64553bd58d19a568af452acff04981b1
+432 http fetch 200 https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz
+433 http fetch 200 https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz
+434 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime/-/mime-1.6.0.tgz not in flight; adding
+435 verbose addTmpTarball already have metadata; skipping unpack for mime@1.6.0
+436 verbose get https://registry.npmjs.org/source-map not expired, no request
+437 silly addNameRange number 2 { name: 'source-map', range: '>=0.6.0 <0.7.0', hasData: true }
+438 silly addNameRange versions [ 'source-map',
+438 silly addNameRange [ '0.0.0',
+438 silly addNameRange '0.1.0',
+438 silly addNameRange '0.1.1',
+438 silly addNameRange '0.1.2',
+438 silly addNameRange '0.1.3',
+438 silly addNameRange '0.1.4',
+438 silly addNameRange '0.1.5',
+438 silly addNameRange '0.1.6',
+438 silly addNameRange '0.1.7',
+438 silly addNameRange '0.1.8',
+438 silly addNameRange '0.1.9',
+438 silly addNameRange '0.1.10',
+438 silly addNameRange '0.1.11',
+438 silly addNameRange '0.1.12',
+438 silly addNameRange '0.1.13',
+438 silly addNameRange '0.1.14',
+438 silly addNameRange '0.1.15',
+438 silly addNameRange '0.1.16',
+438 silly addNameRange '0.1.17',
+438 silly addNameRange '0.1.18',
+438 silly addNameRange '0.1.19',
+438 silly addNameRange '0.1.20',
+438 silly addNameRange '0.1.21',
+438 silly addNameRange '0.1.22',
+438 silly addNameRange '0.1.23',
+438 silly addNameRange '0.1.24',
+438 silly addNameRange '0.1.25',
+438 silly addNameRange '0.1.26',
+438 silly addNameRange '0.1.27',
+438 silly addNameRange '0.1.28',
+438 silly addNameRange '0.1.29',
+438 silly addNameRange '0.1.30',
+438 silly addNameRange '0.1.31',
+438 silly addNameRange '0.1.32',
+438 silly addNameRange '0.1.33',
+438 silly addNameRange '0.1.34',
+438 silly addNameRange '0.1.35',
+438 silly addNameRange '0.1.36',
+438 silly addNameRange '0.1.37',
+438 silly addNameRange '0.1.38',
+438 silly addNameRange '0.1.39',
+438 silly addNameRange '0.1.40',
+438 silly addNameRange '0.1.41',
+438 silly addNameRange '0.1.42',
+438 silly addNameRange '0.1.43',
+438 silly addNameRange '0.2.0',
+438 silly addNameRange '0.3.0',
+438 silly addNameRange '0.4.0',
+438 silly addNameRange '0.4.1',
+438 silly addNameRange '0.4.2',
+438 silly addNameRange '0.4.3',
+438 silly addNameRange '0.4.4',
+438 silly addNameRange '0.5.0',
+438 silly addNameRange '0.5.1',
+438 silly addNameRange '0.5.2',
+438 silly addNameRange '0.5.3',
+438 silly addNameRange '0.5.4',
+438 silly addNameRange '0.5.5',
+438 silly addNameRange '0.5.6',
+438 silly addNameRange '0.5.7',
+438 silly addNameRange '0.6.0',
+438 silly addNameRange '0.6.1',
+438 silly addNameRange '0.7.0',
+438 silly addNameRange '0.7.1',
+438 silly addNameRange '0.7.2',
+438 silly addNameRange '0.7.3',
+438 silly addNameRange '0.8.0-beta.0' ] ]
+439 silly addNamed source-map@0.6.1
+440 verbose addNamed "0.6.1" is a plain semver version for source-map
+441 silly fetchAndShaCheck shasum 2256bde14d3632958c465ebc96dc467ca07a29fb
+442 silly fetchAndShaCheck shasum c881e13cc7015894ed914862d276436fa9a47043
+443 silly resolveWithNewModule request@2.88.2 checking installable status
+444 silly cache add args [ 'request@^2.83.0', null ]
+445 verbose cache add spec request@^2.83.0
+446 silly cache add parsed spec Result {
+446 silly cache add raw: 'request@^2.83.0',
+446 silly cache add scope: null,
+446 silly cache add name: 'request',
+446 silly cache add rawSpec: '^2.83.0',
+446 silly cache add spec: '>=2.83.0 <3.0.0',
+446 silly cache add type: 'range' }
+447 silly addNamed request@>=2.83.0 <3.0.0
+448 verbose addNamed ">=2.83.0 <3.0.0" is a valid semver range for request
+449 silly addNameRange { name: 'request', range: '>=2.83.0 <3.0.0', hasData: false }
+450 silly mapToRegistry name request
+451 silly mapToRegistry using default registry
+452 silly mapToRegistry registry https://registry.npmjs.org/
+453 silly mapToRegistry uri https://registry.npmjs.org/request
+454 verbose addNameRange registry:https://registry.npmjs.org/request not in flight; fetching
+455 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz not in flight; adding
+456 verbose addTmpTarball already have metadata; skipping unpack for graceful-fs@4.2.4
+457 http fetch 200 https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz
+458 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/tslib/-/tslib-1.13.0.tgz not in flight; adding
+459 verbose addTmpTarball already have metadata; skipping unpack for tslib@1.13.0
+460 verbose get https://registry.npmjs.org/request not expired, no request
+461 silly addNameRange number 2 { name: 'request', range: '>=2.83.0 <3.0.0', hasData: true }
+462 silly addNameRange versions [ 'request',
+462 silly addNameRange [ '0.10.0',
+462 silly addNameRange '0.8.3',
+462 silly addNameRange '0.9.0',
+462 silly addNameRange '0.9.1',
+462 silly addNameRange '0.9.5',
+462 silly addNameRange '1.0.0',
+462 silly addNameRange '1.1.0',
+462 silly addNameRange '1.1.1',
+462 silly addNameRange '1.2.0',
+462 silly addNameRange '1.9.0',
+462 silly addNameRange '1.9.1',
+462 silly addNameRange '1.9.2',
+462 silly addNameRange '1.9.3',
+462 silly addNameRange '1.9.5',
+462 silly addNameRange '1.9.7',
+462 silly addNameRange '1.9.8',
+462 silly addNameRange '1.9.9',
+462 silly addNameRange '2.0.0',
+462 silly addNameRange '2.0.1',
+462 silly addNameRange '2.0.2',
+462 silly addNameRange '2.0.3',
+462 silly addNameRange '2.0.4',
+462 silly addNameRange '2.0.5',
+462 silly addNameRange '2.1.0',
+462 silly addNameRange '2.1.1',
+462 silly addNameRange '2.2.0',
+462 silly addNameRange '2.2.5',
+462 silly addNameRange '2.2.6',
+462 silly addNameRange '2.2.9',
+462 silly addNameRange '2.9.0',
+462 silly addNameRange '2.9.1',
+462 silly addNameRange '2.9.2',
+462 silly addNameRange '2.9.3',
+462 silly addNameRange '2.9.100',
+462 silly addNameRange '2.9.150',
+462 silly addNameRange '2.9.151',
+462 silly addNameRange '2.9.152',
+462 silly addNameRange '2.9.153',
+462 silly addNameRange '2.9.200',
+462 silly addNameRange '2.9.201',
+462 silly addNameRange '2.9.202',
+462 silly addNameRange '2.9.203',
+462 silly addNameRange '2.10.0',
+462 silly addNameRange '2.11.0',
+462 silly addNameRange '2.11.1',
+462 silly addNameRange '2.11.2',
+462 silly addNameRange '2.11.3',
+462 silly addNameRange '2.11.4',
+462 silly addNameRange '2.12.0',
+462 silly addNameRange '2.14.0',
+462 silly addNameRange '2.16.0',
+462 silly addNameRange '2.16.2',
+462 silly addNameRange '2.16.4',
+462 silly addNameRange '2.16.6',
+462 silly addNameRange '2.18.0',
+462 silly addNameRange '2.19.0',
+462 silly addNameRange '2.20.0',
+462 silly addNameRange '2.21.0',
+462 silly addNameRange '2.22.0',
+462 silly addNameRange '2.23.0',
+462 silly addNameRange '2.24.0',
+462 silly addNameRange '2.25.0',
+462 silly addNameRange '2.26.0',
+462 silly addNameRange '2.27.0',
+462 silly addNameRange '2.28.0',
+462 silly addNameRange '2.29.0',
+462 silly addNameRange '2.30.0',
+462 silly addNameRange '2.31.0',
+462 silly addNameRange '2.32.0',
+462 silly addNameRange '2.33.0',
+462 silly addNameRange '2.34.0',
+462 silly addNameRange '2.35.0',
+462 silly addNameRange '2.36.0',
+462 silly addNameRange '2.37.0',
+462 silly addNameRange '2.38.0',
+462 silly addNameRange '2.39.0',
+462 silly addNameRange '2.40.0',
+462 silly addNameRange '2.41.0',
+462 silly addNameRange '2.42.0',
+462 silly addNameRange '2.43.0',
+462 silly addNameRange '2.44.0',
+462 silly addNameRange '2.45.0',
+462 silly addNameRange '2.46.0',
+462 silly addNameRange '2.47.0',
+462 silly addNameRange '2.48.0',
+462 silly addNameRange '2.49.0',
+462 silly addNameRange '2.50.0',
+462 silly addNameRange '2.51.0',
+462 silly addNameRange '2.52.0',
+462 silly addNameRange '2.53.0',
+462 silly addNameRange '2.54.0',
+462 silly addNameRange '2.55.0',
+462 silly addNameRange '2.56.0',
+462 silly addNameRange '2.57.0',
+462 silly addNameRange '2.58.0',
+462 silly addNameRange '2.59.0',
+462 silly addNameRange '2.60.0',
+462 silly addNameRange '2.61.0',
+462 silly addNameRange '2.62.0',
+462 silly addNameRange '2.63.0',
+462 silly addNameRange ... 26 more items ] ]
+463 silly addNamed request@2.88.2
+464 verbose addNamed "2.88.2" is a plain semver version for request
+465 warn deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
+466 silly fetchAndShaCheck shasum d91cefd62d1436ca0f41620e251288d420099def
+467 silly cache afterAdd source-map@0.6.1
+468 verbose afterAdd /home/christine/.npm/source-map/0.6.1/package/package.json not in flight; writing
+469 silly mapToRegistry name request
+470 silly mapToRegistry using default registry
+471 silly mapToRegistry registry https://registry.npmjs.org/
+472 silly mapToRegistry uri https://registry.npmjs.org/request
+473 verbose addRemoteTarball https://registry.npmjs.org/request/-/request-2.88.2.tgz not in flight; adding
+474 verbose addRemoteTarball [ 'https://registry.npmjs.org/request/-/request-2.88.2.tgz',
+474 verbose addRemoteTarball 'd73c918731cb5a87da047e207234146f664d12b3' ]
+475 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz not in flight; adding
+476 verbose addTmpTarball already have metadata; skipping unpack for mkdirp@0.5.5
+477 info retry fetch attempt 1 at 13:48:57
+478 info attempt registry request try #1 at 13:48:57
+479 http fetch GET https://registry.npmjs.org/request/-/request-2.88.2.tgz
+480 verbose afterAdd /home/christine/.npm/source-map/0.6.1/package/package.json written
+481 silly cache afterAdd graceful-fs@4.2.4
+482 verbose afterAdd /home/christine/.npm/graceful-fs/4.2.4/package/package.json not in flight; writing
+483 silly cache afterAdd tslib@1.13.0
+484 verbose afterAdd /home/christine/.npm/tslib/1.13.0/package/package.json not in flight; writing
+485 silly cache afterAdd mime@1.6.0
+486 verbose afterAdd /home/christine/.npm/mime/1.6.0/package/package.json not in flight; writing
+487 verbose afterAdd /home/christine/.npm/graceful-fs/4.2.4/package/package.json written
+488 verbose afterAdd /home/christine/.npm/tslib/1.13.0/package/package.json written
+489 verbose afterAdd /home/christine/.npm/mime/1.6.0/package/package.json written
+490 silly cache afterAdd mkdirp@0.5.5
+491 verbose afterAdd /home/christine/.npm/mkdirp/0.5.5/package/package.json not in flight; writing
+492 verbose afterAdd /home/christine/.npm/mkdirp/0.5.5/package/package.json written
+493 http fetch 200 https://registry.npmjs.org/promise/-/promise-7.3.1.tgz
+494 silly fetchAndShaCheck shasum 064b72602b18f90f29192b8b1bc418ffd1ebd3bf
+495 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/promise/-/promise-7.3.1.tgz not in flight; adding
+496 verbose addTmpTarball already have metadata; skipping unpack for promise@7.3.1
+497 silly cache afterAdd promise@7.3.1
+498 verbose afterAdd /home/christine/.npm/promise/7.3.1/package/package.json not in flight; writing
+499 verbose afterAdd /home/christine/.npm/promise/7.3.1/package/package.json written
+500 http fetch 200 https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz
+501 silly fetchAndShaCheck shasum 09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c
+502 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/image-size/-/image-size-0.5.5.tgz not in flight; adding
+503 verbose addTmpTarball already have metadata; skipping unpack for image-size@0.5.5
+504 http fetch 200 https://registry.npmjs.org/request/-/request-2.88.2.tgz
+505 silly cache afterAdd image-size@0.5.5
+506 verbose afterAdd /home/christine/.npm/image-size/0.5.5/package/package.json not in flight; writing
+507 verbose afterAdd /home/christine/.npm/image-size/0.5.5/package/package.json written
+508 silly fetchAndShaCheck shasum d73c918731cb5a87da047e207234146f664d12b3
+509 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/request/-/request-2.88.2.tgz not in flight; adding
+510 verbose addTmpTarball already have metadata; skipping unpack for request@2.88.2
+511 silly cache afterAdd request@2.88.2
+512 verbose afterAdd /home/christine/.npm/request/2.88.2/package/package.json not in flight; writing
+513 verbose afterAdd /home/christine/.npm/request/2.88.2/package/package.json written
+514 silly fetchNamedPackageData prr
+515 silly mapToRegistry name prr
+516 silly mapToRegistry using default registry
+517 silly mapToRegistry registry https://registry.npmjs.org/
+518 silly mapToRegistry uri https://registry.npmjs.org/prr
+519 verbose request uri https://registry.npmjs.org/prr
+520 verbose request no auth needed
+521 info attempt registry request try #1 at 13:48:57
+522 verbose etag W/"07ebb6c11e7a8b0a67aabb93f8b3aa09"
+523 verbose lastModified Sun, 27 May 2018 13:04:47 GMT
+524 http request GET https://registry.npmjs.org/prr
+525 http 304 https://registry.npmjs.org/prr
+526 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+526 verbose headers connection: 'keep-alive',
+526 verbose headers 'set-cookie':
+526 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+526 verbose headers 'cf-ray': '59764fa31fae648b-FRA',
+526 verbose headers age: '5629',
+526 verbose headers 'cache-control': 'public, max-age=300',
+526 verbose headers etag: '"07ebb6c11e7a8b0a67aabb93f8b3aa09"',
+526 verbose headers 'last-modified': 'Sun, 27 May 2018 13:04:47 GMT',
+526 verbose headers vary: 'Accept-Encoding',
+526 verbose headers 'cf-cache-status': 'HIT',
+526 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+526 verbose headers server: 'cloudflare',
+526 verbose headers 'cf-request-id': '02ddd019ef0000648bda3f9200000001' }
+527 silly get cb [ 304,
+527 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+527 silly get connection: 'keep-alive',
+527 silly get 'set-cookie':
+527 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+527 silly get 'cf-ray': '59764fa31fae648b-FRA',
+527 silly get age: '5629',
+527 silly get 'cache-control': 'public, max-age=300',
+527 silly get etag: '"07ebb6c11e7a8b0a67aabb93f8b3aa09"',
+527 silly get 'last-modified': 'Sun, 27 May 2018 13:04:47 GMT',
+527 silly get vary: 'Accept-Encoding',
+527 silly get 'cf-cache-status': 'HIT',
+527 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+527 silly get server: 'cloudflare',
+527 silly get 'cf-request-id': '02ddd019ef0000648bda3f9200000001' } ]
+528 verbose etag https://registry.npmjs.org/prr from cache
+529 verbose get saving prr to /home/christine/.npm/registry.npmjs.org/prr/.cache.json
+530 silly resolveWithNewModule prr@1.0.1 checking installable status
+531 silly cache add args [ 'prr@~1.0.1', null ]
+532 verbose cache add spec prr@~1.0.1
+533 silly cache add parsed spec Result {
+533 silly cache add raw: 'prr@~1.0.1',
+533 silly cache add scope: null,
+533 silly cache add name: 'prr',
+533 silly cache add rawSpec: '~1.0.1',
+533 silly cache add spec: '>=1.0.1 <1.1.0',
+533 silly cache add type: 'range' }
+534 silly addNamed prr@>=1.0.1 <1.1.0
+535 verbose addNamed ">=1.0.1 <1.1.0" is a valid semver range for prr
+536 silly addNameRange { name: 'prr', range: '>=1.0.1 <1.1.0', hasData: false }
+537 silly mapToRegistry name prr
+538 silly mapToRegistry using default registry
+539 silly mapToRegistry registry https://registry.npmjs.org/
+540 silly mapToRegistry uri https://registry.npmjs.org/prr
+541 verbose addNameRange registry:https://registry.npmjs.org/prr not in flight; fetching
+542 verbose get https://registry.npmjs.org/prr not expired, no request
+543 silly addNameRange number 2 { name: 'prr', range: '>=1.0.1 <1.1.0', hasData: true }
+544 silly addNameRange versions [ 'prr', [ '0.0.0', '1.0.0', '1.0.1' ] ]
+545 silly addNamed prr@1.0.1
+546 verbose addNamed "1.0.1" is a plain semver version for prr
+547 silly cache afterAdd prr@1.0.1
+548 verbose afterAdd /home/christine/.npm/prr/1.0.1/package/package.json not in flight; writing
+549 verbose afterAdd /home/christine/.npm/prr/1.0.1/package/package.json written
+550 silly fetchNamedPackageData minimist
+551 silly mapToRegistry name minimist
+552 silly mapToRegistry using default registry
+553 silly mapToRegistry registry https://registry.npmjs.org/
+554 silly mapToRegistry uri https://registry.npmjs.org/minimist
+555 verbose request uri https://registry.npmjs.org/minimist
+556 verbose request no auth needed
+557 info attempt registry request try #1 at 13:48:57
+558 verbose etag W/"81c2eaf8bba19c1bd6131ba9e932902f"
+559 verbose lastModified Sun, 11 Aug 2019 09:03:19 GMT
+560 http request GET https://registry.npmjs.org/minimist
+561 http 200 https://registry.npmjs.org/minimist
+562 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+562 verbose headers 'content-type': 'application/json',
+562 verbose headers 'transfer-encoding': 'chunked',
+562 verbose headers connection: 'keep-alive',
+562 verbose headers 'set-cookie':
+562 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+562 verbose headers 'cf-ray': '59764fa35d5205fd-FRA',
+562 verbose headers age: '5653',
+562 verbose headers 'cache-control': 'public, max-age=300',
+562 verbose headers etag: 'W/"ab6c93df45eeb8867cab5ea4f62b4b74"',
+562 verbose headers 'last-modified': 'Thu, 12 Mar 2020 22:16:24 GMT',
+562 verbose headers vary: 'accept-encoding, accept',
+562 verbose headers 'cf-cache-status': 'HIT',
+562 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+562 verbose headers server: 'cloudflare',
+562 verbose headers 'content-encoding': 'gzip',
+562 verbose headers 'cf-request-id': '02ddd01a16000005fd8da2d200000001' }
+563 silly get cb [ 200,
+563 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+563 silly get 'content-type': 'application/json',
+563 silly get 'transfer-encoding': 'chunked',
+563 silly get connection: 'keep-alive',
+563 silly get 'set-cookie':
+563 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+563 silly get 'cf-ray': '59764fa35d5205fd-FRA',
+563 silly get age: '5653',
+563 silly get 'cache-control': 'public, max-age=300',
+563 silly get etag: 'W/"ab6c93df45eeb8867cab5ea4f62b4b74"',
+563 silly get 'last-modified': 'Thu, 12 Mar 2020 22:16:24 GMT',
+563 silly get vary: 'accept-encoding, accept',
+563 silly get 'cf-cache-status': 'HIT',
+563 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+563 silly get server: 'cloudflare',
+563 silly get 'content-encoding': 'gzip',
+563 silly get 'cf-request-id': '02ddd01a16000005fd8da2d200000001' } ]
+564 verbose get saving minimist to /home/christine/.npm/registry.npmjs.org/minimist/.cache.json
+565 silly resolveWithNewModule minimist@1.2.5 checking installable status
+566 silly cache add args [ 'minimist@^1.2.5', null ]
+567 verbose cache add spec minimist@^1.2.5
+568 silly cache add parsed spec Result {
+568 silly cache add raw: 'minimist@^1.2.5',
+568 silly cache add scope: null,
+568 silly cache add name: 'minimist',
+568 silly cache add rawSpec: '^1.2.5',
+568 silly cache add spec: '>=1.2.5 <2.0.0',
+568 silly cache add type: 'range' }
+569 silly addNamed minimist@>=1.2.5 <2.0.0
+570 verbose addNamed ">=1.2.5 <2.0.0" is a valid semver range for minimist
+571 silly addNameRange { name: 'minimist', range: '>=1.2.5 <2.0.0', hasData: false }
+572 silly mapToRegistry name minimist
+573 silly mapToRegistry using default registry
+574 silly mapToRegistry registry https://registry.npmjs.org/
+575 silly mapToRegistry uri https://registry.npmjs.org/minimist
+576 verbose addNameRange registry:https://registry.npmjs.org/minimist not in flight; fetching
+577 verbose get https://registry.npmjs.org/minimist not expired, no request
+578 silly addNameRange number 2 { name: 'minimist', range: '>=1.2.5 <2.0.0', hasData: true }
+579 silly addNameRange versions [ 'minimist',
+579 silly addNameRange [ '0.0.0',
+579 silly addNameRange '0.0.1',
+579 silly addNameRange '0.0.2',
+579 silly addNameRange '0.0.3',
+579 silly addNameRange '0.0.4',
+579 silly addNameRange '0.0.5',
+579 silly addNameRange '0.0.6',
+579 silly addNameRange '0.0.7',
+579 silly addNameRange '0.0.8',
+579 silly addNameRange '0.0.9',
+579 silly addNameRange '0.0.10',
+579 silly addNameRange '0.1.0',
+579 silly addNameRange '0.2.0',
+579 silly addNameRange '1.0.0',
+579 silly addNameRange '1.1.0',
+579 silly addNameRange '1.1.1',
+579 silly addNameRange '1.1.2',
+579 silly addNameRange '1.1.3',
+579 silly addNameRange '1.2.0',
+579 silly addNameRange '1.2.1',
+579 silly addNameRange '1.2.2',
+579 silly addNameRange '1.2.3',
+579 silly addNameRange '1.2.4',
+579 silly addNameRange '0.2.1',
+579 silly addNameRange '1.2.5' ] ]
+580 silly addNamed minimist@1.2.5
+581 verbose addNamed "1.2.5" is a plain semver version for minimist
+582 silly mapToRegistry name minimist
+583 silly mapToRegistry using default registry
+584 silly mapToRegistry registry https://registry.npmjs.org/
+585 silly mapToRegistry uri https://registry.npmjs.org/minimist
+586 verbose addRemoteTarball https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz not in flight; adding
+587 verbose addRemoteTarball [ 'https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz',
+587 verbose addRemoteTarball '67d66014b66a6a8aaa0c083c5fd58df4e4e97602' ]
+588 info retry fetch attempt 1 at 13:48:57
+589 info attempt registry request try #1 at 13:48:57
+590 http fetch GET https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz
+591 http fetch 200 https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz
+592 silly fetchAndShaCheck shasum 67d66014b66a6a8aaa0c083c5fd58df4e4e97602
+593 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/minimist/-/minimist-1.2.5.tgz not in flight; adding
+594 verbose addTmpTarball already have metadata; skipping unpack for minimist@1.2.5
+595 silly cache afterAdd minimist@1.2.5
+596 verbose afterAdd /home/christine/.npm/minimist/1.2.5/package/package.json not in flight; writing
+597 verbose afterAdd /home/christine/.npm/minimist/1.2.5/package/package.json written
+598 silly fetchNamedPackageData asap
+599 silly mapToRegistry name asap
+600 silly mapToRegistry using default registry
+601 silly mapToRegistry registry https://registry.npmjs.org/
+602 silly mapToRegistry uri https://registry.npmjs.org/asap
+603 verbose request uri https://registry.npmjs.org/asap
+604 verbose request no auth needed
+605 info attempt registry request try #1 at 13:48:57
+606 http request GET https://registry.npmjs.org/asap
+607 http 200 https://registry.npmjs.org/asap
+608 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+608 verbose headers 'content-type': 'application/json; charset=UTF-8',
+608 verbose headers 'transfer-encoding': 'chunked',
+608 verbose headers connection: 'keep-alive',
+608 verbose headers 'set-cookie':
+608 verbose headers [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+608 verbose headers 'cf-ray': '59764fa3da5bdfc7-FRA',
+608 verbose headers age: '5027',
+608 verbose headers 'cache-control': 'public, max-age=300',
+608 verbose headers etag: 'W/"b9309e9e7d929bcdb698cfa401f3696f"',
+608 verbose headers 'last-modified': 'Sat, 26 May 2018 17:25:23 GMT',
+608 verbose headers vary: 'accept-encoding, accept',
+608 verbose headers 'cf-cache-status': 'HIT',
+608 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+608 verbose headers server: 'cloudflare',
+608 verbose headers 'content-encoding': 'gzip',
+608 verbose headers 'cf-request-id': '02ddd01a6b0000dfc72a89b200000001' }
+609 silly get cb [ 200,
+609 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+609 silly get 'content-type': 'application/json; charset=UTF-8',
+609 silly get 'transfer-encoding': 'chunked',
+609 silly get connection: 'keep-alive',
+609 silly get 'set-cookie':
+609 silly get [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+609 silly get 'cf-ray': '59764fa3da5bdfc7-FRA',
+609 silly get age: '5027',
+609 silly get 'cache-control': 'public, max-age=300',
+609 silly get etag: 'W/"b9309e9e7d929bcdb698cfa401f3696f"',
+609 silly get 'last-modified': 'Sat, 26 May 2018 17:25:23 GMT',
+609 silly get vary: 'accept-encoding, accept',
+609 silly get 'cf-cache-status': 'HIT',
+609 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+609 silly get server: 'cloudflare',
+609 silly get 'content-encoding': 'gzip',
+609 silly get 'cf-request-id': '02ddd01a6b0000dfc72a89b200000001' } ]
+610 verbose get saving asap to /home/christine/.npm/registry.npmjs.org/asap/.cache.json
+611 silly resolveWithNewModule asap@2.0.6 checking installable status
+612 silly cache add args [ 'asap@~2.0.3', null ]
+613 verbose cache add spec asap@~2.0.3
+614 silly cache add parsed spec Result {
+614 silly cache add raw: 'asap@~2.0.3',
+614 silly cache add scope: null,
+614 silly cache add name: 'asap',
+614 silly cache add rawSpec: '~2.0.3',
+614 silly cache add spec: '>=2.0.3 <2.1.0',
+614 silly cache add type: 'range' }
+615 silly addNamed asap@>=2.0.3 <2.1.0
+616 verbose addNamed ">=2.0.3 <2.1.0" is a valid semver range for asap
+617 silly addNameRange { name: 'asap', range: '>=2.0.3 <2.1.0', hasData: false }
+618 silly mapToRegistry name asap
+619 silly mapToRegistry using default registry
+620 silly mapToRegistry registry https://registry.npmjs.org/
+621 silly mapToRegistry uri https://registry.npmjs.org/asap
+622 verbose addNameRange registry:https://registry.npmjs.org/asap not in flight; fetching
+623 verbose get https://registry.npmjs.org/asap not expired, no request
+624 silly addNameRange number 2 { name: 'asap', range: '>=2.0.3 <2.1.0', hasData: true }
+625 silly addNameRange versions [ 'asap',
+625 silly addNameRange [ '0.0.0',
+625 silly addNameRange '1.0.0',
+625 silly addNameRange '2.0.0',
+625 silly addNameRange '2.0.1',
+625 silly addNameRange '2.0.2',
+625 silly addNameRange '2.0.3',
+625 silly addNameRange '2.0.4',
+625 silly addNameRange '2.0.5',
+625 silly addNameRange '2.0.6' ] ]
+626 silly addNamed asap@2.0.6
+627 verbose addNamed "2.0.6" is a plain semver version for asap
+628 silly mapToRegistry name asap
+629 silly mapToRegistry using default registry
+630 silly mapToRegistry registry https://registry.npmjs.org/
+631 silly mapToRegistry uri https://registry.npmjs.org/asap
+632 verbose addRemoteTarball https://registry.npmjs.org/asap/-/asap-2.0.6.tgz not in flight; adding
+633 verbose addRemoteTarball [ 'https://registry.npmjs.org/asap/-/asap-2.0.6.tgz',
+633 verbose addRemoteTarball 'e50347611d7e690943208bbdafebcbc2fb866d46' ]
+634 info retry fetch attempt 1 at 13:48:57
+635 info attempt registry request try #1 at 13:48:57
+636 http fetch GET https://registry.npmjs.org/asap/-/asap-2.0.6.tgz
+637 http fetch 200 https://registry.npmjs.org/asap/-/asap-2.0.6.tgz
+638 silly fetchAndShaCheck shasum e50347611d7e690943208bbdafebcbc2fb866d46
+639 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/asap/-/asap-2.0.6.tgz not in flight; adding
+640 verbose addTmpTarball already have metadata; skipping unpack for asap@2.0.6
+641 silly cache afterAdd asap@2.0.6
+642 verbose afterAdd /home/christine/.npm/asap/2.0.6/package/package.json not in flight; writing
+643 verbose afterAdd /home/christine/.npm/asap/2.0.6/package/package.json written
+644 silly fetchNamedPackageData aws-sign2
+645 silly mapToRegistry name aws-sign2
+646 silly mapToRegistry using default registry
+647 silly mapToRegistry registry https://registry.npmjs.org/
+648 silly mapToRegistry uri https://registry.npmjs.org/aws-sign2
+649 silly fetchNamedPackageData aws4
+650 silly mapToRegistry name aws4
+651 silly mapToRegistry using default registry
+652 silly mapToRegistry registry https://registry.npmjs.org/
+653 silly mapToRegistry uri https://registry.npmjs.org/aws4
+654 silly fetchNamedPackageData caseless
+655 silly mapToRegistry name caseless
+656 silly mapToRegistry using default registry
+657 silly mapToRegistry registry https://registry.npmjs.org/
+658 silly mapToRegistry uri https://registry.npmjs.org/caseless
+659 silly fetchNamedPackageData combined-stream
+660 silly mapToRegistry name combined-stream
+661 silly mapToRegistry using default registry
+662 silly mapToRegistry registry https://registry.npmjs.org/
+663 silly mapToRegistry uri https://registry.npmjs.org/combined-stream
+664 silly fetchNamedPackageData extend
+665 silly mapToRegistry name extend
+666 silly mapToRegistry using default registry
+667 silly mapToRegistry registry https://registry.npmjs.org/
+668 silly mapToRegistry uri https://registry.npmjs.org/extend
+669 silly fetchNamedPackageData forever-agent
+670 silly mapToRegistry name forever-agent
+671 silly mapToRegistry using default registry
+672 silly mapToRegistry registry https://registry.npmjs.org/
+673 silly mapToRegistry uri https://registry.npmjs.org/forever-agent
+674 silly fetchNamedPackageData form-data
+675 silly mapToRegistry name form-data
+676 silly mapToRegistry using default registry
+677 silly mapToRegistry registry https://registry.npmjs.org/
+678 silly mapToRegistry uri https://registry.npmjs.org/form-data
+679 silly fetchNamedPackageData har-validator
+680 silly mapToRegistry name har-validator
+681 silly mapToRegistry using default registry
+682 silly mapToRegistry registry https://registry.npmjs.org/
+683 silly mapToRegistry uri https://registry.npmjs.org/har-validator
+684 silly fetchNamedPackageData http-signature
+685 silly mapToRegistry name http-signature
+686 silly mapToRegistry using default registry
+687 silly mapToRegistry registry https://registry.npmjs.org/
+688 silly mapToRegistry uri https://registry.npmjs.org/http-signature
+689 silly fetchNamedPackageData is-typedarray
+690 silly mapToRegistry name is-typedarray
+691 silly mapToRegistry using default registry
+692 silly mapToRegistry registry https://registry.npmjs.org/
+693 silly mapToRegistry uri https://registry.npmjs.org/is-typedarray
+694 silly fetchNamedPackageData isstream
+695 silly mapToRegistry name isstream
+696 silly mapToRegistry using default registry
+697 silly mapToRegistry registry https://registry.npmjs.org/
+698 silly mapToRegistry uri https://registry.npmjs.org/isstream
+699 silly fetchNamedPackageData json-stringify-safe
+700 silly mapToRegistry name json-stringify-safe
+701 silly mapToRegistry using default registry
+702 silly mapToRegistry registry https://registry.npmjs.org/
+703 silly mapToRegistry uri https://registry.npmjs.org/json-stringify-safe
+704 silly fetchNamedPackageData mime-types
+705 silly mapToRegistry name mime-types
+706 silly mapToRegistry using default registry
+707 silly mapToRegistry registry https://registry.npmjs.org/
+708 silly mapToRegistry uri https://registry.npmjs.org/mime-types
+709 silly fetchNamedPackageData oauth-sign
+710 silly mapToRegistry name oauth-sign
+711 silly mapToRegistry using default registry
+712 silly mapToRegistry registry https://registry.npmjs.org/
+713 silly mapToRegistry uri https://registry.npmjs.org/oauth-sign
+714 silly fetchNamedPackageData performance-now
+715 silly mapToRegistry name performance-now
+716 silly mapToRegistry using default registry
+717 silly mapToRegistry registry https://registry.npmjs.org/
+718 silly mapToRegistry uri https://registry.npmjs.org/performance-now
+719 silly fetchNamedPackageData qs
+720 silly mapToRegistry name qs
+721 silly mapToRegistry using default registry
+722 silly mapToRegistry registry https://registry.npmjs.org/
+723 silly mapToRegistry uri https://registry.npmjs.org/qs
+724 silly fetchNamedPackageData safe-buffer
+725 silly mapToRegistry name safe-buffer
+726 silly mapToRegistry using default registry
+727 silly mapToRegistry registry https://registry.npmjs.org/
+728 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer
+729 silly fetchNamedPackageData tough-cookie
+730 silly mapToRegistry name tough-cookie
+731 silly mapToRegistry using default registry
+732 silly mapToRegistry registry https://registry.npmjs.org/
+733 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie
+734 silly fetchNamedPackageData tunnel-agent
+735 silly mapToRegistry name tunnel-agent
+736 silly mapToRegistry using default registry
+737 silly mapToRegistry registry https://registry.npmjs.org/
+738 silly mapToRegistry uri https://registry.npmjs.org/tunnel-agent
+739 silly fetchNamedPackageData uuid
+740 silly mapToRegistry name uuid
+741 silly mapToRegistry using default registry
+742 silly mapToRegistry registry https://registry.npmjs.org/
+743 silly mapToRegistry uri https://registry.npmjs.org/uuid
+744 verbose request uri https://registry.npmjs.org/aws-sign2
+745 verbose request no auth needed
+746 info attempt registry request try #1 at 13:48:57
+747 verbose etag W/"7bf763d2cccd0806178c5c3e43895950"
+748 verbose lastModified Sat, 26 May 2018 17:48:52 GMT
+749 http request GET https://registry.npmjs.org/aws-sign2
+750 verbose request uri https://registry.npmjs.org/aws4
+751 verbose request no auth needed
+752 info attempt registry request try #1 at 13:48:57
+753 verbose etag W/"95c9834de9b7164b9a063970ba631035"
+754 verbose lastModified Mon, 13 Jan 2020 23:25:51 GMT
+755 http request GET https://registry.npmjs.org/aws4
+756 verbose request uri https://registry.npmjs.org/caseless
+757 verbose request no auth needed
+758 info attempt registry request try #1 at 13:48:57
+759 verbose etag W/"37dc2c2e48fd048da76bb52a97386418"
+760 verbose lastModified Sat, 26 May 2018 19:27:25 GMT
+761 http request GET https://registry.npmjs.org/caseless
+762 verbose request uri https://registry.npmjs.org/combined-stream
+763 verbose request no auth needed
+764 info attempt registry request try #1 at 13:48:57
+765 verbose etag W/"01d038e7b9fcfd5e5654a7d7003bfe74"
+766 verbose lastModified Sun, 12 May 2019 17:49:50 GMT
+767 http request GET https://registry.npmjs.org/combined-stream
+768 verbose request uri https://registry.npmjs.org/extend
+769 verbose request no auth needed
+770 info attempt registry request try #1 at 13:48:57
+771 verbose etag W/"924fa39abddd399eb964b1aa611da651"
+772 verbose lastModified Thu, 19 Jul 2018 22:12:47 GMT
+773 http request GET https://registry.npmjs.org/extend
+774 verbose request uri https://registry.npmjs.org/forever-agent
+775 verbose request no auth needed
+776 info attempt registry request try #1 at 13:48:57
+777 verbose etag W/"9e6ef96089dd23304c2ea7d2fb731c9c"
+778 verbose lastModified Sun, 27 May 2018 01:06:13 GMT
+779 http request GET https://registry.npmjs.org/forever-agent
+780 verbose request uri https://registry.npmjs.org/form-data
+781 verbose request no auth needed
+782 info attempt registry request try #1 at 13:48:57
+783 verbose etag W/"5e211bf0fabf58f7b2a855c8b4ce28a4"
+784 verbose lastModified Wed, 06 Nov 2019 07:57:03 GMT
+785 http request GET https://registry.npmjs.org/form-data
+786 verbose request uri https://registry.npmjs.org/har-validator
+787 verbose request no auth needed
+788 info attempt registry request try #1 at 13:48:57
+789 verbose etag W/"a261ac4614f4e022065b83613ee209ab"
+790 verbose lastModified Fri, 04 Jan 2019 02:36:17 GMT
+791 http request GET https://registry.npmjs.org/har-validator
+792 verbose request uri https://registry.npmjs.org/http-signature
+793 verbose request no auth needed
+794 info attempt registry request try #1 at 13:48:57
+795 verbose etag W/"a22cccd7d585d00e5e26fe5111bee01d"
+796 verbose lastModified Fri, 13 Dec 2019 16:32:29 GMT
+797 http request GET https://registry.npmjs.org/http-signature
+798 verbose request uri https://registry.npmjs.org/is-typedarray
+799 verbose request no auth needed
+800 info attempt registry request try #1 at 13:48:57
+801 verbose etag W/"e7b88219ebe721b877b678c51795c9c5"
+802 verbose lastModified Sun, 27 May 2018 04:59:55 GMT
+803 http request GET https://registry.npmjs.org/is-typedarray
+804 verbose request uri https://registry.npmjs.org/isstream
+805 verbose request no auth needed
+806 info attempt registry request try #1 at 13:48:57
+807 verbose etag W/"9dc7f37e087df077683bf238c847ad45"
+808 verbose lastModified Sun, 27 May 2018 05:02:31 GMT
+809 http request GET https://registry.npmjs.org/isstream
+810 verbose request uri https://registry.npmjs.org/json-stringify-safe
+811 verbose request no auth needed
+812 info attempt registry request try #1 at 13:48:57
+813 verbose etag W/"7f39a9aafcaefe8efbf43a9f2e56c4eb"
+814 verbose lastModified Sun, 27 May 2018 05:41:03 GMT
+815 http request GET https://registry.npmjs.org/json-stringify-safe
+816 verbose request uri https://registry.npmjs.org/oauth-sign
+817 verbose request no auth needed
+818 info attempt registry request try #1 at 13:48:57
+819 verbose etag W/"3032c1efe9ec61d748d027a1da2bab61"
+820 verbose lastModified Thu, 02 Aug 2018 18:04:02 GMT
+821 http request GET https://registry.npmjs.org/oauth-sign
+822 verbose request uri https://registry.npmjs.org/mime-types
+823 verbose request no auth needed
+824 info attempt registry request try #1 at 13:48:57
+825 verbose etag W/"ace0d1d2bbdfabcc2f0fdf5db2297cb9"
+826 verbose lastModified Mon, 06 Jan 2020 03:47:58 GMT
+827 http request GET https://registry.npmjs.org/mime-types
+828 verbose request uri https://registry.npmjs.org/performance-now
+829 verbose request no auth needed
+830 info attempt registry request try #1 at 13:48:57
+831 verbose etag W/"5f12ad497b3e39323dcdde75c34f5767"
+832 verbose lastModified Sun, 27 May 2018 12:05:53 GMT
+833 http request GET https://registry.npmjs.org/performance-now
+834 verbose request uri https://registry.npmjs.org/qs
+835 verbose request no auth needed
+836 info attempt registry request try #1 at 13:48:57
+837 verbose etag W/"ccaef4541845c31c4cc05bcf8dd00ce6"
+838 verbose lastModified Fri, 08 Nov 2019 06:46:39 GMT
+839 http request GET https://registry.npmjs.org/qs
+840 verbose request uri https://registry.npmjs.org/tough-cookie
+841 verbose request no auth needed
+842 info attempt registry request try #1 at 13:48:57
+843 verbose etag W/"f1d93d88b646bb4c354f8c481852a1b7"
+844 verbose lastModified Tue, 05 Feb 2019 03:09:49 GMT
+845 http request GET https://registry.npmjs.org/tough-cookie
+846 verbose request uri https://registry.npmjs.org/tunnel-agent
+847 verbose request no auth needed
+848 info attempt registry request try #1 at 13:48:57
+849 verbose etag W/"03911fc1f433b33bccf8a4a2a5de2375"
+850 verbose lastModified Sun, 27 May 2018 20:02:57 GMT
+851 http request GET https://registry.npmjs.org/tunnel-agent
+852 verbose request uri https://registry.npmjs.org/safe-buffer
+853 verbose request no auth needed
+854 info attempt registry request try #1 at 13:48:57
+855 verbose etag W/"00b820fed08175238fc3473b2b3e0278"
+856 verbose lastModified Fri, 05 Jul 2019 18:04:37 GMT
+857 http request GET https://registry.npmjs.org/safe-buffer
+858 verbose request uri https://registry.npmjs.org/uuid
+859 verbose request no auth needed
+860 info attempt registry request try #1 at 13:48:57
+861 verbose etag W/"e1230e67a078f82b785335adbba5abd3"
+862 verbose lastModified Thu, 16 Jan 2020 21:05:42 GMT
+863 http request GET https://registry.npmjs.org/uuid
+864 http 304 https://registry.npmjs.org/aws-sign2
+865 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+865 verbose headers connection: 'keep-alive',
+865 verbose headers 'set-cookie':
+865 verbose headers [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+865 verbose headers 'cf-ray': '59764fa49cf4d6e9-FRA',
+865 verbose headers age: '5657',
+865 verbose headers 'cache-control': 'public, max-age=300',
+865 verbose headers etag: '"7bf763d2cccd0806178c5c3e43895950"',
+865 verbose headers 'last-modified': 'Sat, 26 May 2018 17:48:52 GMT',
+865 verbose headers vary: 'Accept-Encoding',
+865 verbose headers 'cf-cache-status': 'HIT',
+865 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+865 verbose headers server: 'cloudflare',
+865 verbose headers 'cf-request-id': '02ddd01ae00000d6e975b28200000001' }
+866 silly get cb [ 304,
+866 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+866 silly get connection: 'keep-alive',
+866 silly get 'set-cookie':
+866 silly get [ '__cfduid=d6501da2c31d6ed13bf98ae2d437c1a051590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+866 silly get 'cf-ray': '59764fa49cf4d6e9-FRA',
+866 silly get age: '5657',
+866 silly get 'cache-control': 'public, max-age=300',
+866 silly get etag: '"7bf763d2cccd0806178c5c3e43895950"',
+866 silly get 'last-modified': 'Sat, 26 May 2018 17:48:52 GMT',
+866 silly get vary: 'Accept-Encoding',
+866 silly get 'cf-cache-status': 'HIT',
+866 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+866 silly get server: 'cloudflare',
+866 silly get 'cf-request-id': '02ddd01ae00000d6e975b28200000001' } ]
+867 verbose etag https://registry.npmjs.org/aws-sign2 from cache
+868 verbose get saving aws-sign2 to /home/christine/.npm/registry.npmjs.org/aws-sign2/.cache.json
+869 silly resolveWithNewModule aws-sign2@0.7.0 checking installable status
+870 silly cache add args [ 'aws-sign2@~0.7.0', null ]
+871 verbose cache add spec aws-sign2@~0.7.0
+872 silly cache add parsed spec Result {
+872 silly cache add raw: 'aws-sign2@~0.7.0',
+872 silly cache add scope: null,
+872 silly cache add name: 'aws-sign2',
+872 silly cache add rawSpec: '~0.7.0',
+872 silly cache add spec: '>=0.7.0 <0.8.0',
+872 silly cache add type: 'range' }
+873 silly addNamed aws-sign2@>=0.7.0 <0.8.0
+874 verbose addNamed ">=0.7.0 <0.8.0" is a valid semver range for aws-sign2
+875 silly addNameRange { name: 'aws-sign2', range: '>=0.7.0 <0.8.0', hasData: false }
+876 silly mapToRegistry name aws-sign2
+877 silly mapToRegistry using default registry
+878 silly mapToRegistry registry https://registry.npmjs.org/
+879 silly mapToRegistry uri https://registry.npmjs.org/aws-sign2
+880 verbose addNameRange registry:https://registry.npmjs.org/aws-sign2 not in flight; fetching
+881 verbose get https://registry.npmjs.org/aws-sign2 not expired, no request
+882 silly addNameRange number 2 { name: 'aws-sign2', range: '>=0.7.0 <0.8.0', hasData: true }
+883 silly addNameRange versions [ 'aws-sign2', [ '0.4.0', '0.5.0', '0.6.0', '0.7.0' ] ]
+884 silly addNamed aws-sign2@0.7.0
+885 verbose addNamed "0.7.0" is a plain semver version for aws-sign2
+886 silly cache afterAdd aws-sign2@0.7.0
+887 verbose afterAdd /home/christine/.npm/aws-sign2/0.7.0/package/package.json not in flight; writing
+888 verbose afterAdd /home/christine/.npm/aws-sign2/0.7.0/package/package.json written
+889 http 304 https://registry.npmjs.org/form-data
+890 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+890 verbose headers connection: 'keep-alive',
+890 verbose headers 'set-cookie':
+890 verbose headers [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+890 verbose headers 'cf-ray': '59764fa4ba1305fd-FRA',
+890 verbose headers age: '5355',
+890 verbose headers 'cache-control': 'public, max-age=300',
+890 verbose headers etag: '"5e211bf0fabf58f7b2a855c8b4ce28a4"',
+890 verbose headers 'last-modified': 'Wed, 06 Nov 2019 07:57:03 GMT',
+890 verbose headers vary: 'Accept-Encoding',
+890 verbose headers 'cf-cache-status': 'HIT',
+890 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+890 verbose headers server: 'cloudflare',
+890 verbose headers 'cf-request-id': '02ddd01af4000005fd8da55200000001' }
+891 silly get cb [ 304,
+891 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+891 silly get connection: 'keep-alive',
+891 silly get 'set-cookie':
+891 silly get [ '__cfduid=d850f5e63141a007f397139d82cf517f01590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+891 silly get 'cf-ray': '59764fa4ba1305fd-FRA',
+891 silly get age: '5355',
+891 silly get 'cache-control': 'public, max-age=300',
+891 silly get etag: '"5e211bf0fabf58f7b2a855c8b4ce28a4"',
+891 silly get 'last-modified': 'Wed, 06 Nov 2019 07:57:03 GMT',
+891 silly get vary: 'Accept-Encoding',
+891 silly get 'cf-cache-status': 'HIT',
+891 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+891 silly get server: 'cloudflare',
+891 silly get 'cf-request-id': '02ddd01af4000005fd8da55200000001' } ]
+892 verbose etag https://registry.npmjs.org/form-data from cache
+893 verbose get saving form-data to /home/christine/.npm/registry.npmjs.org/form-data/.cache.json
+894 http 304 https://registry.npmjs.org/har-validator
+895 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+895 verbose headers connection: 'keep-alive',
+895 verbose headers 'set-cookie':
+895 verbose headers [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+895 verbose headers 'cf-ray': '59764fa4b9a6c272-FRA',
+895 verbose headers age: '5655',
+895 verbose headers 'cache-control': 'public, max-age=300',
+895 verbose headers etag: '"a261ac4614f4e022065b83613ee209ab"',
+895 verbose headers 'last-modified': 'Fri, 04 Jan 2019 02:36:17 GMT',
+895 verbose headers vary: 'Accept-Encoding',
+895 verbose headers 'cf-cache-status': 'HIT',
+895 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+895 verbose headers server: 'cloudflare',
+895 verbose headers 'cf-request-id': '02ddd01af40000c272388b2200000001' }
+896 silly get cb [ 304,
+896 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+896 silly get connection: 'keep-alive',
+896 silly get 'set-cookie':
+896 silly get [ '__cfduid=da26bd26924c67acdff0555528c279ae61590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+896 silly get 'cf-ray': '59764fa4b9a6c272-FRA',
+896 silly get age: '5655',
+896 silly get 'cache-control': 'public, max-age=300',
+896 silly get etag: '"a261ac4614f4e022065b83613ee209ab"',
+896 silly get 'last-modified': 'Fri, 04 Jan 2019 02:36:17 GMT',
+896 silly get vary: 'Accept-Encoding',
+896 silly get 'cf-cache-status': 'HIT',
+896 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+896 silly get server: 'cloudflare',
+896 silly get 'cf-request-id': '02ddd01af40000c272388b2200000001' } ]
+897 verbose etag https://registry.npmjs.org/har-validator from cache
+898 verbose get saving har-validator to /home/christine/.npm/registry.npmjs.org/har-validator/.cache.json
+899 http 304 https://registry.npmjs.org/caseless
+900 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+900 verbose headers connection: 'keep-alive',
+900 verbose headers 'set-cookie':
+900 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+900 verbose headers 'cf-ray': '59764fa4b9de325c-FRA',
+900 verbose headers age: '5655',
+900 verbose headers 'cache-control': 'public, max-age=300',
+900 verbose headers etag: '"37dc2c2e48fd048da76bb52a97386418"',
+900 verbose headers 'last-modified': 'Sat, 26 May 2018 19:27:25 GMT',
+900 verbose headers vary: 'Accept-Encoding',
+900 verbose headers 'cf-cache-status': 'HIT',
+900 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+900 verbose headers server: 'cloudflare',
+900 verbose headers 'cf-request-id': '02ddd01af40000325c4c810200000001' }
+901 silly get cb [ 304,
+901 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+901 silly get connection: 'keep-alive',
+901 silly get 'set-cookie':
+901 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+901 silly get 'cf-ray': '59764fa4b9de325c-FRA',
+901 silly get age: '5655',
+901 silly get 'cache-control': 'public, max-age=300',
+901 silly get etag: '"37dc2c2e48fd048da76bb52a97386418"',
+901 silly get 'last-modified': 'Sat, 26 May 2018 19:27:25 GMT',
+901 silly get vary: 'Accept-Encoding',
+901 silly get 'cf-cache-status': 'HIT',
+901 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+901 silly get server: 'cloudflare',
+901 silly get 'cf-request-id': '02ddd01af40000325c4c810200000001' } ]
+902 verbose etag https://registry.npmjs.org/caseless from cache
+903 verbose get saving caseless to /home/christine/.npm/registry.npmjs.org/caseless/.cache.json
+904 http 304 https://registry.npmjs.org/is-typedarray
+905 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+905 verbose headers connection: 'keep-alive',
+905 verbose headers 'set-cookie':
+905 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+905 verbose headers 'cf-ray': '59764fa4bc4a6347-FRA',
+905 verbose headers age: '5655',
+905 verbose headers 'cache-control': 'public, max-age=300',
+905 verbose headers etag: '"e7b88219ebe721b877b678c51795c9c5"',
+905 verbose headers 'last-modified': 'Sun, 27 May 2018 04:59:55 GMT',
+905 verbose headers vary: 'Accept-Encoding',
+905 verbose headers 'cf-cache-status': 'HIT',
+905 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+905 verbose headers server: 'cloudflare',
+905 verbose headers 'cf-request-id': '02ddd01af400006347e88ad200000001' }
+906 silly get cb [ 304,
+906 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+906 silly get connection: 'keep-alive',
+906 silly get 'set-cookie':
+906 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+906 silly get 'cf-ray': '59764fa4bc4a6347-FRA',
+906 silly get age: '5655',
+906 silly get 'cache-control': 'public, max-age=300',
+906 silly get etag: '"e7b88219ebe721b877b678c51795c9c5"',
+906 silly get 'last-modified': 'Sun, 27 May 2018 04:59:55 GMT',
+906 silly get vary: 'Accept-Encoding',
+906 silly get 'cf-cache-status': 'HIT',
+906 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+906 silly get server: 'cloudflare',
+906 silly get 'cf-request-id': '02ddd01af400006347e88ad200000001' } ]
+907 verbose etag https://registry.npmjs.org/is-typedarray from cache
+908 verbose get saving is-typedarray to /home/christine/.npm/registry.npmjs.org/is-typedarray/.cache.json
+909 http 304 https://registry.npmjs.org/forever-agent
+910 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+910 verbose headers connection: 'keep-alive',
+910 verbose headers 'set-cookie':
+910 verbose headers [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+910 verbose headers 'cf-ray': '59764fa4b87c648b-FRA',
+910 verbose headers age: '5655',
+910 verbose headers 'cache-control': 'public, max-age=300',
+910 verbose headers etag: '"9e6ef96089dd23304c2ea7d2fb731c9c"',
+910 verbose headers 'last-modified': 'Sun, 27 May 2018 01:06:13 GMT',
+910 verbose headers vary: 'Accept-Encoding',
+910 verbose headers 'cf-cache-status': 'HIT',
+910 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+910 verbose headers server: 'cloudflare',
+910 verbose headers 'cf-request-id': '02ddd01af40000648bda003200000001' }
+911 silly get cb [ 304,
+911 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+911 silly get connection: 'keep-alive',
+911 silly get 'set-cookie':
+911 silly get [ '__cfduid=d69b2d3a0ed04b60eed400c38cdaaf9511590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+911 silly get 'cf-ray': '59764fa4b87c648b-FRA',
+911 silly get age: '5655',
+911 silly get 'cache-control': 'public, max-age=300',
+911 silly get etag: '"9e6ef96089dd23304c2ea7d2fb731c9c"',
+911 silly get 'last-modified': 'Sun, 27 May 2018 01:06:13 GMT',
+911 silly get vary: 'Accept-Encoding',
+911 silly get 'cf-cache-status': 'HIT',
+911 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+911 silly get server: 'cloudflare',
+911 silly get 'cf-request-id': '02ddd01af40000648bda003200000001' } ]
+912 verbose etag https://registry.npmjs.org/forever-agent from cache
+913 verbose get saving forever-agent to /home/christine/.npm/registry.npmjs.org/forever-agent/.cache.json
+914 silly resolveWithNewModule form-data@2.3.3 checking installable status
+915 silly cache add args [ 'form-data@~2.3.2', null ]
+916 verbose cache add spec form-data@~2.3.2
+917 silly cache add parsed spec Result {
+917 silly cache add raw: 'form-data@~2.3.2',
+917 silly cache add scope: null,
+917 silly cache add name: 'form-data',
+917 silly cache add rawSpec: '~2.3.2',
+917 silly cache add spec: '>=2.3.2 <2.4.0',
+917 silly cache add type: 'range' }
+918 silly addNamed form-data@>=2.3.2 <2.4.0
+919 verbose addNamed ">=2.3.2 <2.4.0" is a valid semver range for form-data
+920 silly addNameRange { name: 'form-data', range: '>=2.3.2 <2.4.0', hasData: false }
+921 silly mapToRegistry name form-data
+922 silly mapToRegistry using default registry
+923 silly mapToRegistry registry https://registry.npmjs.org/
+924 silly mapToRegistry uri https://registry.npmjs.org/form-data
+925 verbose addNameRange registry:https://registry.npmjs.org/form-data not in flight; fetching
+926 silly resolveWithNewModule har-validator@5.1.3 checking installable status
+927 silly cache add args [ 'har-validator@~5.1.3', null ]
+928 verbose cache add spec har-validator@~5.1.3
+929 silly cache add parsed spec Result {
+929 silly cache add raw: 'har-validator@~5.1.3',
+929 silly cache add scope: null,
+929 silly cache add name: 'har-validator',
+929 silly cache add rawSpec: '~5.1.3',
+929 silly cache add spec: '>=5.1.3 <5.2.0',
+929 silly cache add type: 'range' }
+930 silly addNamed har-validator@>=5.1.3 <5.2.0
+931 verbose addNamed ">=5.1.3 <5.2.0" is a valid semver range for har-validator
+932 silly addNameRange { name: 'har-validator',
+932 silly addNameRange range: '>=5.1.3 <5.2.0',
+932 silly addNameRange hasData: false }
+933 silly mapToRegistry name har-validator
+934 silly mapToRegistry using default registry
+935 silly mapToRegistry registry https://registry.npmjs.org/
+936 silly mapToRegistry uri https://registry.npmjs.org/har-validator
+937 verbose addNameRange registry:https://registry.npmjs.org/har-validator not in flight; fetching
+938 http 304 https://registry.npmjs.org/extend
+939 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+939 verbose headers connection: 'keep-alive',
+939 verbose headers 'set-cookie':
+939 verbose headers [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+939 verbose headers 'cf-ray': '59764fa4bc61175a-FRA',
+939 verbose headers age: '5656',
+939 verbose headers 'cache-control': 'public, max-age=300',
+939 verbose headers etag: '"924fa39abddd399eb964b1aa611da651"',
+939 verbose headers 'last-modified': 'Thu, 19 Jul 2018 22:12:47 GMT',
+939 verbose headers vary: 'Accept-Encoding',
+939 verbose headers 'cf-cache-status': 'HIT',
+939 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+939 verbose headers server: 'cloudflare',
+939 verbose headers 'cf-request-id': '02ddd01af40000175a1e1fb200000001' }
+940 silly get cb [ 304,
+940 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+940 silly get connection: 'keep-alive',
+940 silly get 'set-cookie':
+940 silly get [ '__cfduid=d29dbbf504bb01fed0e3216d3e4c64fcc1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+940 silly get 'cf-ray': '59764fa4bc61175a-FRA',
+940 silly get age: '5656',
+940 silly get 'cache-control': 'public, max-age=300',
+940 silly get etag: '"924fa39abddd399eb964b1aa611da651"',
+940 silly get 'last-modified': 'Thu, 19 Jul 2018 22:12:47 GMT',
+940 silly get vary: 'Accept-Encoding',
+940 silly get 'cf-cache-status': 'HIT',
+940 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+940 silly get server: 'cloudflare',
+940 silly get 'cf-request-id': '02ddd01af40000175a1e1fb200000001' } ]
+941 verbose etag https://registry.npmjs.org/extend from cache
+942 verbose get saving extend to /home/christine/.npm/registry.npmjs.org/extend/.cache.json
+943 http 304 https://registry.npmjs.org/combined-stream
+944 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+944 verbose headers connection: 'keep-alive',
+944 verbose headers 'set-cookie':
+944 verbose headers [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+944 verbose headers 'cf-ray': '59764fa4b963d715-FRA',
+944 verbose headers age: '5355',
+944 verbose headers 'cache-control': 'public, max-age=300',
+944 verbose headers etag: '"01d038e7b9fcfd5e5654a7d7003bfe74"',
+944 verbose headers 'last-modified': 'Sun, 12 May 2019 17:49:50 GMT',
+944 verbose headers vary: 'Accept-Encoding',
+944 verbose headers 'cf-cache-status': 'HIT',
+944 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+944 verbose headers server: 'cloudflare',
+944 verbose headers 'cf-request-id': '02ddd01af40000d715c11f3200000001' }
+945 silly get cb [ 304,
+945 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+945 silly get connection: 'keep-alive',
+945 silly get 'set-cookie':
+945 silly get [ '__cfduid=de2f13b30bfc4f0fe2c257a08857023531590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+945 silly get 'cf-ray': '59764fa4b963d715-FRA',
+945 silly get age: '5355',
+945 silly get 'cache-control': 'public, max-age=300',
+945 silly get etag: '"01d038e7b9fcfd5e5654a7d7003bfe74"',
+945 silly get 'last-modified': 'Sun, 12 May 2019 17:49:50 GMT',
+945 silly get vary: 'Accept-Encoding',
+945 silly get 'cf-cache-status': 'HIT',
+945 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+945 silly get server: 'cloudflare',
+945 silly get 'cf-request-id': '02ddd01af40000d715c11f3200000001' } ]
+946 verbose etag https://registry.npmjs.org/combined-stream from cache
+947 verbose get saving combined-stream to /home/christine/.npm/registry.npmjs.org/combined-stream/.cache.json
+948 silly resolveWithNewModule is-typedarray@1.0.0 checking installable status
+949 silly cache add args [ 'is-typedarray@~1.0.0', null ]
+950 verbose cache add spec is-typedarray@~1.0.0
+951 silly cache add parsed spec Result {
+951 silly cache add raw: 'is-typedarray@~1.0.0',
+951 silly cache add scope: null,
+951 silly cache add name: 'is-typedarray',
+951 silly cache add rawSpec: '~1.0.0',
+951 silly cache add spec: '>=1.0.0 <1.1.0',
+951 silly cache add type: 'range' }
+952 silly addNamed is-typedarray@>=1.0.0 <1.1.0
+953 verbose addNamed ">=1.0.0 <1.1.0" is a valid semver range for is-typedarray
+954 silly addNameRange { name: 'is-typedarray',
+954 silly addNameRange range: '>=1.0.0 <1.1.0',
+954 silly addNameRange hasData: false }
+955 silly mapToRegistry name is-typedarray
+956 silly mapToRegistry using default registry
+957 silly mapToRegistry registry https://registry.npmjs.org/
+958 silly mapToRegistry uri https://registry.npmjs.org/is-typedarray
+959 verbose addNameRange registry:https://registry.npmjs.org/is-typedarray not in flight; fetching
+960 silly resolveWithNewModule caseless@0.12.0 checking installable status
+961 silly cache add args [ 'caseless@~0.12.0', null ]
+962 verbose cache add spec caseless@~0.12.0
+963 silly cache add parsed spec Result {
+963 silly cache add raw: 'caseless@~0.12.0',
+963 silly cache add scope: null,
+963 silly cache add name: 'caseless',
+963 silly cache add rawSpec: '~0.12.0',
+963 silly cache add spec: '>=0.12.0 <0.13.0',
+963 silly cache add type: 'range' }
+964 silly addNamed caseless@>=0.12.0 <0.13.0
+965 verbose addNamed ">=0.12.0 <0.13.0" is a valid semver range for caseless
+966 silly addNameRange { name: 'caseless', range: '>=0.12.0 <0.13.0', hasData: false }
+967 silly mapToRegistry name caseless
+968 silly mapToRegistry using default registry
+969 silly mapToRegistry registry https://registry.npmjs.org/
+970 silly mapToRegistry uri https://registry.npmjs.org/caseless
+971 verbose addNameRange registry:https://registry.npmjs.org/caseless not in flight; fetching
+972 http 304 https://registry.npmjs.org/aws4
+973 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+973 verbose headers connection: 'keep-alive',
+973 verbose headers 'set-cookie':
+973 verbose headers [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+973 verbose headers 'cf-ray': '59764fa4bb7d6413-FRA',
+973 verbose headers age: '5655',
+973 verbose headers 'cache-control': 'public, max-age=300',
+973 verbose headers etag: '"95c9834de9b7164b9a063970ba631035"',
+973 verbose headers 'last-modified': 'Mon, 13 Jan 2020 23:25:51 GMT',
+973 verbose headers vary: 'Accept-Encoding',
+973 verbose headers 'cf-cache-status': 'HIT',
+973 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+973 verbose headers server: 'cloudflare',
+973 verbose headers 'cf-request-id': '02ddd01af4000064135f8e3200000001' }
+974 silly get cb [ 304,
+974 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+974 silly get connection: 'keep-alive',
+974 silly get 'set-cookie':
+974 silly get [ '__cfduid=d0651730248de197cc0bf9e0b3e6fc5ab1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+974 silly get 'cf-ray': '59764fa4bb7d6413-FRA',
+974 silly get age: '5655',
+974 silly get 'cache-control': 'public, max-age=300',
+974 silly get etag: '"95c9834de9b7164b9a063970ba631035"',
+974 silly get 'last-modified': 'Mon, 13 Jan 2020 23:25:51 GMT',
+974 silly get vary: 'Accept-Encoding',
+974 silly get 'cf-cache-status': 'HIT',
+974 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+974 silly get server: 'cloudflare',
+974 silly get 'cf-request-id': '02ddd01af4000064135f8e3200000001' } ]
+975 verbose etag https://registry.npmjs.org/aws4 from cache
+976 verbose get saving aws4 to /home/christine/.npm/registry.npmjs.org/aws4/.cache.json
+977 silly resolveWithNewModule forever-agent@0.6.1 checking installable status
+978 silly cache add args [ 'forever-agent@~0.6.1', null ]
+979 verbose cache add spec forever-agent@~0.6.1
+980 silly cache add parsed spec Result {
+980 silly cache add raw: 'forever-agent@~0.6.1',
+980 silly cache add scope: null,
+980 silly cache add name: 'forever-agent',
+980 silly cache add rawSpec: '~0.6.1',
+980 silly cache add spec: '>=0.6.1 <0.7.0',
+980 silly cache add type: 'range' }
+981 silly addNamed forever-agent@>=0.6.1 <0.7.0
+982 verbose addNamed ">=0.6.1 <0.7.0" is a valid semver range for forever-agent
+983 silly addNameRange { name: 'forever-agent',
+983 silly addNameRange range: '>=0.6.1 <0.7.0',
+983 silly addNameRange hasData: false }
+984 silly mapToRegistry name forever-agent
+985 silly mapToRegistry using default registry
+986 silly mapToRegistry registry https://registry.npmjs.org/
+987 silly mapToRegistry uri https://registry.npmjs.org/forever-agent
+988 verbose addNameRange registry:https://registry.npmjs.org/forever-agent not in flight; fetching
+989 verbose get https://registry.npmjs.org/form-data not expired, no request
+990 silly addNameRange number 2 { name: 'form-data', range: '>=2.3.2 <2.4.0', hasData: true }
+991 silly addNameRange versions [ 'form-data',
+991 silly addNameRange [ '0.0.0',
+991 silly addNameRange '0.0.2',
+991 silly addNameRange '0.0.3',
+991 silly addNameRange '0.0.4',
+991 silly addNameRange '0.0.5',
+991 silly addNameRange '0.0.6',
+991 silly addNameRange '0.0.7',
+991 silly addNameRange '0.0.8',
+991 silly addNameRange '0.0.9',
+991 silly addNameRange '0.0.10',
+991 silly addNameRange '0.1.0',
+991 silly addNameRange '0.1.1',
+991 silly addNameRange '0.1.2',
+991 silly addNameRange '0.1.3',
+991 silly addNameRange '0.1.4',
+991 silly addNameRange '0.2.0',
+991 silly addNameRange '1.0.0-rc1',
+991 silly addNameRange '1.0.0-rc2',
+991 silly addNameRange '1.0.0-rc3',
+991 silly addNameRange '1.0.0-rc4',
+991 silly addNameRange '1.0.0',
+991 silly addNameRange '1.0.1',
+991 silly addNameRange '2.0.0',
+991 silly addNameRange '2.1.0',
+991 silly addNameRange '2.1.1',
+991 silly addNameRange '2.1.2',
+991 silly addNameRange '2.1.4',
+991 silly addNameRange '2.2.0',
+991 silly addNameRange '2.3.1',
+991 silly addNameRange '2.3.2-rc1',
+991 silly addNameRange '2.3.2',
+991 silly addNameRange '2.3.3',
+991 silly addNameRange '2.4.0',
+991 silly addNameRange '2.5.0',
+991 silly addNameRange '2.5.1',
+991 silly addNameRange '3.0.0' ] ]
+992 silly addNamed form-data@2.3.3
+993 verbose addNamed "2.3.3" is a plain semver version for form-data
+994 http 200 https://registry.npmjs.org/http-signature
+995 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+995 verbose headers 'content-type': 'application/json',
+995 verbose headers 'transfer-encoding': 'chunked',
+995 verbose headers connection: 'keep-alive',
+995 verbose headers 'set-cookie':
+995 verbose headers [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+995 verbose headers 'cf-ray': '59764fa4bcfedfc7-FRA',
+995 verbose headers age: '5657',
+995 verbose headers 'cache-control': 'public, max-age=300',
+995 verbose headers etag: 'W/"3b46cb4c3a2db9af415ea171ef07cebe"',
+995 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:40 GMT',
+995 verbose headers vary: 'accept-encoding, accept',
+995 verbose headers 'cf-cache-status': 'HIT',
+995 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+995 verbose headers server: 'cloudflare',
+995 verbose headers 'content-encoding': 'gzip',
+995 verbose headers 'cf-request-id': '02ddd01af40000dfc72a8a0200000001' }
+996 silly get cb [ 200,
+996 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+996 silly get 'content-type': 'application/json',
+996 silly get 'transfer-encoding': 'chunked',
+996 silly get connection: 'keep-alive',
+996 silly get 'set-cookie':
+996 silly get [ '__cfduid=d3adb321249b44604682ca627e182cc9b1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+996 silly get 'cf-ray': '59764fa4bcfedfc7-FRA',
+996 silly get age: '5657',
+996 silly get 'cache-control': 'public, max-age=300',
+996 silly get etag: 'W/"3b46cb4c3a2db9af415ea171ef07cebe"',
+996 silly get 'last-modified': 'Wed, 06 May 2020 14:47:40 GMT',
+996 silly get vary: 'accept-encoding, accept',
+996 silly get 'cf-cache-status': 'HIT',
+996 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+996 silly get server: 'cloudflare',
+996 silly get 'content-encoding': 'gzip',
+996 silly get 'cf-request-id': '02ddd01af40000dfc72a8a0200000001' } ]
+997 verbose get saving http-signature to /home/christine/.npm/registry.npmjs.org/http-signature/.cache.json
+998 verbose get https://registry.npmjs.org/har-validator not expired, no request
+999 silly addNameRange number 2 { name: 'har-validator', range: '>=5.1.3 <5.2.0', hasData: true }
+1000 silly addNameRange versions [ 'har-validator',
+1000 silly addNameRange [ '1.0.0',
+1000 silly addNameRange '1.0.1',
+1000 silly addNameRange '1.0.2',
+1000 silly addNameRange '1.1.0',
+1000 silly addNameRange '1.1.1',
+1000 silly addNameRange '1.1.2',
+1000 silly addNameRange '1.1.3',
+1000 silly addNameRange '1.2.0',
+1000 silly addNameRange '1.3.0',
+1000 silly addNameRange '1.3.1',
+1000 silly addNameRange '1.4.0',
+1000 silly addNameRange '1.5.0',
+1000 silly addNameRange '1.5.1',
+1000 silly addNameRange '1.6.0',
+1000 silly addNameRange '1.6.1',
+1000 silly addNameRange '1.7.0',
+1000 silly addNameRange '1.7.1',
+1000 silly addNameRange '1.8.0',
+1000 silly addNameRange '2.0.0',
+1000 silly addNameRange '2.0.1',
+1000 silly addNameRange '2.0.2',
+1000 silly addNameRange '2.0.3',
+1000 silly addNameRange '2.0.4',
+1000 silly addNameRange '2.0.5',
+1000 silly addNameRange '2.0.6',
+1000 silly addNameRange '2.1.0',
+1000 silly addNameRange '2.1.1',
+1000 silly addNameRange '2.1.2',
+1000 silly addNameRange '2.1.3',
+1000 silly addNameRange '3.0.0',
+1000 silly addNameRange '3.1.0',
+1000 silly addNameRange '3.2.0',
+1000 silly addNameRange '3.3.0',
+1000 silly addNameRange '3.3.1',
+1000 silly addNameRange '3.4.0',
+1000 silly addNameRange '4.0.0',
+1000 silly addNameRange '4.0.1',
+1000 silly addNameRange '4.0.2',
+1000 silly addNameRange '4.0.3',
+1000 silly addNameRange '4.0.4',
+1000 silly addNameRange '4.1.0',
+1000 silly addNameRange '4.1.1',
+1000 silly addNameRange '4.1.2',
+1000 silly addNameRange '4.2.0',
+1000 silly addNameRange '4.2.1',
+1000 silly addNameRange '5.0.0',
+1000 silly addNameRange '5.0.1',
+1000 silly addNameRange '5.0.2',
+1000 silly addNameRange '5.0.3',
+1000 silly addNameRange '5.1.0',
+1000 silly addNameRange '5.1.3' ] ]
+1001 silly addNamed har-validator@5.1.3
+1002 verbose addNamed "5.1.3" is a plain semver version for har-validator
+1003 verbose get https://registry.npmjs.org/is-typedarray not expired, no request
+1004 silly addNameRange number 2 { name: 'is-typedarray', range: '>=1.0.0 <1.1.0', hasData: true }
+1005 silly addNameRange versions [ 'is-typedarray', [ '0.0.0', '1.0.0' ] ]
+1006 silly addNamed is-typedarray@1.0.0
+1007 verbose addNamed "1.0.0" is a plain semver version for is-typedarray
+1008 verbose get https://registry.npmjs.org/caseless not expired, no request
+1009 silly addNameRange number 2 { name: 'caseless', range: '>=0.12.0 <0.13.0', hasData: true }
+1010 silly addNameRange versions [ 'caseless',
+1010 silly addNameRange [ '0.1.0',
+1010 silly addNameRange '0.2.0',
+1010 silly addNameRange '0.3.0',
+1010 silly addNameRange '0.4.0',
+1010 silly addNameRange '0.5.0',
+1010 silly addNameRange '0.6.0',
+1010 silly addNameRange '0.7.0',
+1010 silly addNameRange '0.8.0',
+1010 silly addNameRange '0.9.0',
+1010 silly addNameRange '0.10.0',
+1010 silly addNameRange '0.11.0',
+1010 silly addNameRange '0.12.0' ] ]
+1011 silly addNamed caseless@0.12.0
+1012 verbose addNamed "0.12.0" is a plain semver version for caseless
+1013 verbose get https://registry.npmjs.org/forever-agent not expired, no request
+1014 silly addNameRange number 2 { name: 'forever-agent', range: '>=0.6.1 <0.7.0', hasData: true }
+1015 silly addNameRange versions [ 'forever-agent',
+1015 silly addNameRange [ '0.2.0', '0.3.0', '0.4.0', '0.5.0', '0.5.2', '0.6.0', '0.6.1' ] ]
+1016 silly addNamed forever-agent@0.6.1
+1017 verbose addNamed "0.6.1" is a plain semver version for forever-agent
+1018 silly resolveWithNewModule combined-stream@1.0.8 checking installable status
+1019 silly cache add args [ 'combined-stream@~1.0.6', null ]
+1020 verbose cache add spec combined-stream@~1.0.6
+1021 silly cache add parsed spec Result {
+1021 silly cache add raw: 'combined-stream@~1.0.6',
+1021 silly cache add scope: null,
+1021 silly cache add name: 'combined-stream',
+1021 silly cache add rawSpec: '~1.0.6',
+1021 silly cache add spec: '>=1.0.6 <1.1.0',
+1021 silly cache add type: 'range' }
+1022 silly addNamed combined-stream@>=1.0.6 <1.1.0
+1023 verbose addNamed ">=1.0.6 <1.1.0" is a valid semver range for combined-stream
+1024 silly addNameRange { name: 'combined-stream',
+1024 silly addNameRange range: '>=1.0.6 <1.1.0',
+1024 silly addNameRange hasData: false }
+1025 silly mapToRegistry name combined-stream
+1026 silly mapToRegistry using default registry
+1027 silly mapToRegistry registry https://registry.npmjs.org/
+1028 silly mapToRegistry uri https://registry.npmjs.org/combined-stream
+1029 verbose addNameRange registry:https://registry.npmjs.org/combined-stream not in flight; fetching
+1030 silly resolveWithNewModule extend@3.0.2 checking installable status
+1031 silly cache add args [ 'extend@~3.0.2', null ]
+1032 verbose cache add spec extend@~3.0.2
+1033 silly cache add parsed spec Result {
+1033 silly cache add raw: 'extend@~3.0.2',
+1033 silly cache add scope: null,
+1033 silly cache add name: 'extend',
+1033 silly cache add rawSpec: '~3.0.2',
+1033 silly cache add spec: '>=3.0.2 <3.1.0',
+1033 silly cache add type: 'range' }
+1034 silly addNamed extend@>=3.0.2 <3.1.0
+1035 verbose addNamed ">=3.0.2 <3.1.0" is a valid semver range for extend
+1036 silly addNameRange { name: 'extend', range: '>=3.0.2 <3.1.0', hasData: false }
+1037 silly mapToRegistry name extend
+1038 silly mapToRegistry using default registry
+1039 silly mapToRegistry registry https://registry.npmjs.org/
+1040 silly mapToRegistry uri https://registry.npmjs.org/extend
+1041 verbose addNameRange registry:https://registry.npmjs.org/extend not in flight; fetching
+1042 silly cache afterAdd form-data@2.3.3
+1043 verbose afterAdd /home/christine/.npm/form-data/2.3.3/package/package.json not in flight; writing
+1044 silly resolveWithNewModule aws4@1.9.1 checking installable status
+1045 silly cache add args [ 'aws4@^1.8.0', null ]
+1046 verbose cache add spec aws4@^1.8.0
+1047 silly cache add parsed spec Result {
+1047 silly cache add raw: 'aws4@^1.8.0',
+1047 silly cache add scope: null,
+1047 silly cache add name: 'aws4',
+1047 silly cache add rawSpec: '^1.8.0',
+1047 silly cache add spec: '>=1.8.0 <2.0.0',
+1047 silly cache add type: 'range' }
+1048 silly addNamed aws4@>=1.8.0 <2.0.0
+1049 verbose addNamed ">=1.8.0 <2.0.0" is a valid semver range for aws4
+1050 silly addNameRange { name: 'aws4', range: '>=1.8.0 <2.0.0', hasData: false }
+1051 silly mapToRegistry name aws4
+1052 silly mapToRegistry using default registry
+1053 silly mapToRegistry registry https://registry.npmjs.org/
+1054 silly mapToRegistry uri https://registry.npmjs.org/aws4
+1055 verbose addNameRange registry:https://registry.npmjs.org/aws4 not in flight; fetching
+1056 silly resolveWithNewModule http-signature@1.2.0 checking installable status
+1057 silly cache add args [ 'http-signature@~1.2.0', null ]
+1058 verbose cache add spec http-signature@~1.2.0
+1059 silly cache add parsed spec Result {
+1059 silly cache add raw: 'http-signature@~1.2.0',
+1059 silly cache add scope: null,
+1059 silly cache add name: 'http-signature',
+1059 silly cache add rawSpec: '~1.2.0',
+1059 silly cache add spec: '>=1.2.0 <1.3.0',
+1059 silly cache add type: 'range' }
+1060 silly addNamed http-signature@>=1.2.0 <1.3.0
+1061 verbose addNamed ">=1.2.0 <1.3.0" is a valid semver range for http-signature
+1062 silly addNameRange { name: 'http-signature',
+1062 silly addNameRange range: '>=1.2.0 <1.3.0',
+1062 silly addNameRange hasData: false }
+1063 silly mapToRegistry name http-signature
+1064 silly mapToRegistry using default registry
+1065 silly mapToRegistry registry https://registry.npmjs.org/
+1066 silly mapToRegistry uri https://registry.npmjs.org/http-signature
+1067 verbose addNameRange registry:https://registry.npmjs.org/http-signature not in flight; fetching
+1068 silly cache afterAdd har-validator@5.1.3
+1069 verbose afterAdd /home/christine/.npm/har-validator/5.1.3/package/package.json not in flight; writing
+1070 verbose get https://registry.npmjs.org/extend not expired, no request
+1071 silly addNameRange number 2 { name: 'extend', range: '>=3.0.2 <3.1.0', hasData: true }
+1072 silly addNameRange versions [ 'extend',
+1072 silly addNameRange [ '1.0.0',
+1072 silly addNameRange '1.1.0',
+1072 silly addNameRange '1.1.1',
+1072 silly addNameRange '1.1.3',
+1072 silly addNameRange '1.2.0',
+1072 silly addNameRange '1.2.1',
+1072 silly addNameRange '1.3.0',
+1072 silly addNameRange '2.0.0',
+1072 silly addNameRange '2.0.1',
+1072 silly addNameRange '3.0.0',
+1072 silly addNameRange '3.0.1',
+1072 silly addNameRange '3.0.2',
+1072 silly addNameRange '2.0.2' ] ]
+1073 silly addNamed extend@3.0.2
+1074 verbose addNamed "3.0.2" is a plain semver version for extend
+1075 verbose get https://registry.npmjs.org/combined-stream not expired, no request
+1076 silly addNameRange number 2 { name: 'combined-stream',
+1076 silly addNameRange range: '>=1.0.6 <1.1.0',
+1076 silly addNameRange hasData: true }
+1077 silly addNameRange versions [ 'combined-stream',
+1077 silly addNameRange [ '0.0.0',
+1077 silly addNameRange '0.0.1',
+1077 silly addNameRange '0.0.2',
+1077 silly addNameRange '0.0.3',
+1077 silly addNameRange '0.0.4',
+1077 silly addNameRange '0.0.5',
+1077 silly addNameRange '0.0.7',
+1077 silly addNameRange '1.0.0',
+1077 silly addNameRange '1.0.1',
+1077 silly addNameRange '1.0.2',
+1077 silly addNameRange '1.0.3',
+1077 silly addNameRange '1.0.4',
+1077 silly addNameRange '1.0.5',
+1077 silly addNameRange '1.0.6-rc1',
+1077 silly addNameRange '1.0.6',
+1077 silly addNameRange '1.0.7',
+1077 silly addNameRange '1.0.8' ] ]
+1078 silly addNamed combined-stream@1.0.8
+1079 verbose addNamed "1.0.8" is a plain semver version for combined-stream
+1080 silly cache afterAdd is-typedarray@1.0.0
+1081 verbose afterAdd /home/christine/.npm/is-typedarray/1.0.0/package/package.json not in flight; writing
+1082 silly cache afterAdd caseless@0.12.0
+1083 verbose afterAdd /home/christine/.npm/caseless/0.12.0/package/package.json not in flight; writing
+1084 silly cache afterAdd forever-agent@0.6.1
+1085 verbose afterAdd /home/christine/.npm/forever-agent/0.6.1/package/package.json not in flight; writing
+1086 verbose get https://registry.npmjs.org/aws4 not expired, no request
+1087 silly addNameRange number 2 { name: 'aws4', range: '>=1.8.0 <2.0.0', hasData: true }
+1088 silly addNameRange versions [ 'aws4',
+1088 silly addNameRange [ '0.0.1',
+1088 silly addNameRange '0.1.0',
+1088 silly addNameRange '0.1.1',
+1088 silly addNameRange '0.1.2',
+1088 silly addNameRange '0.1.3',
+1088 silly addNameRange '0.1.4',
+1088 silly addNameRange '0.1.5',
+1088 silly addNameRange '0.1.6',
+1088 silly addNameRange '0.1.7',
+1088 silly addNameRange '0.1.8',
+1088 silly addNameRange '0.1.9',
+1088 silly addNameRange '0.1.10',
+1088 silly addNameRange '0.1.12',
+1088 silly addNameRange '0.2.0',
+1088 silly addNameRange '0.2.1',
+1088 silly addNameRange '0.2.2',
+1088 silly addNameRange '0.2.3',
+1088 silly addNameRange '0.3.0',
+1088 silly addNameRange '0.4.0',
+1088 silly addNameRange '0.4.1',
+1088 silly addNameRange '0.4.2',
+1088 silly addNameRange '0.5.0',
+1088 silly addNameRange '0.5.1',
+1088 silly addNameRange '1.0.0',
+1088 silly addNameRange '1.0.1',
+1088 silly addNameRange '1.0.2',
+1088 silly addNameRange '1.0.3',
+1088 silly addNameRange '1.0.4',
+1088 silly addNameRange '1.1.0',
+1088 silly addNameRange '1.2.0',
+1088 silly addNameRange '1.2.1',
+1088 silly addNameRange '1.3.1',
+1088 silly addNameRange '1.3.2',
+1088 silly addNameRange '1.4.0',
+1088 silly addNameRange '1.4.1',
+1088 silly addNameRange '1.5.0',
+1088 silly addNameRange '1.6.0',
+1088 silly addNameRange '1.7.0',
+1088 silly addNameRange '1.8.0',
+1088 silly addNameRange '1.9.0',
+1088 silly addNameRange '1.9.1' ] ]
+1089 silly addNamed aws4@1.9.1
+1090 verbose addNamed "1.9.1" is a plain semver version for aws4
+1091 verbose afterAdd /home/christine/.npm/form-data/2.3.3/package/package.json written
+1092 verbose get https://registry.npmjs.org/http-signature not expired, no request
+1093 silly addNameRange number 2 { name: 'http-signature',
+1093 silly addNameRange range: '>=1.2.0 <1.3.0',
+1093 silly addNameRange hasData: true }
+1094 silly addNameRange versions [ 'http-signature',
+1094 silly addNameRange [ '0.9.0',
+1094 silly addNameRange '0.9.2',
+1094 silly addNameRange '0.9.3',
+1094 silly addNameRange '0.9.4',
+1094 silly addNameRange '0.9.5',
+1094 silly addNameRange '0.9.6',
+1094 silly addNameRange '0.9.7',
+1094 silly addNameRange '0.9.8',
+1094 silly addNameRange '0.9.9',
+1094 silly addNameRange '0.9.10',
+1094 silly addNameRange '0.9.11',
+1094 silly addNameRange '0.10.0',
+1094 silly addNameRange '0.10.1',
+1094 silly addNameRange '0.11.0',
+1094 silly addNameRange '1.0.0',
+1094 silly addNameRange '1.0.1',
+1094 silly addNameRange '1.0.2',
+1094 silly addNameRange '1.1.0',
+1094 silly addNameRange '1.1.1',
+1094 silly addNameRange '1.2.0',
+1094 silly addNameRange '1.3.0',
+1094 silly addNameRange '1.3.1',
+1094 silly addNameRange '1.3.2',
+1094 silly addNameRange '1.3.3',
+1094 silly addNameRange '1.3.4' ] ]
+1095 silly addNamed http-signature@1.2.0
+1096 verbose addNamed "1.2.0" is a plain semver version for http-signature
+1097 verbose afterAdd /home/christine/.npm/har-validator/5.1.3/package/package.json written
+1098 http 304 https://registry.npmjs.org/isstream
+1099 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1099 verbose headers connection: 'keep-alive',
+1099 verbose headers 'set-cookie':
+1099 verbose headers [ '__cfduid=daf4947ff118e7cd8a36c058a538ff6131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1099 verbose headers 'cf-ray': '59764fa4fe4d05bb-FRA',
+1099 verbose headers age: '5355',
+1099 verbose headers 'cache-control': 'public, max-age=300',
+1099 verbose headers etag: '"9dc7f37e087df077683bf238c847ad45"',
+1099 verbose headers 'last-modified': 'Sun, 27 May 2018 05:02:31 GMT',
+1099 verbose headers vary: 'Accept-Encoding',
+1099 verbose headers 'cf-cache-status': 'HIT',
+1099 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1099 verbose headers server: 'cloudflare',
+1099 verbose headers 'cf-request-id': '02ddd01b1f000005bb0ca62200000001' }
+1100 silly get cb [ 304,
+1100 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1100 silly get connection: 'keep-alive',
+1100 silly get 'set-cookie':
+1100 silly get [ '__cfduid=daf4947ff118e7cd8a36c058a538ff6131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1100 silly get 'cf-ray': '59764fa4fe4d05bb-FRA',
+1100 silly get age: '5355',
+1100 silly get 'cache-control': 'public, max-age=300',
+1100 silly get etag: '"9dc7f37e087df077683bf238c847ad45"',
+1100 silly get 'last-modified': 'Sun, 27 May 2018 05:02:31 GMT',
+1100 silly get vary: 'Accept-Encoding',
+1100 silly get 'cf-cache-status': 'HIT',
+1100 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1100 silly get server: 'cloudflare',
+1100 silly get 'cf-request-id': '02ddd01b1f000005bb0ca62200000001' } ]
+1101 verbose etag https://registry.npmjs.org/isstream from cache
+1102 verbose get saving isstream to /home/christine/.npm/registry.npmjs.org/isstream/.cache.json
+1103 verbose afterAdd /home/christine/.npm/is-typedarray/1.0.0/package/package.json written
+1104 silly cache afterAdd combined-stream@1.0.8
+1105 verbose afterAdd /home/christine/.npm/combined-stream/1.0.8/package/package.json not in flight; writing
+1106 verbose afterAdd /home/christine/.npm/caseless/0.12.0/package/package.json written
+1107 verbose afterAdd /home/christine/.npm/forever-agent/0.6.1/package/package.json written
+1108 silly cache afterAdd extend@3.0.2
+1109 verbose afterAdd /home/christine/.npm/extend/3.0.2/package/package.json not in flight; writing
+1110 silly cache afterAdd aws4@1.9.1
+1111 verbose afterAdd /home/christine/.npm/aws4/1.9.1/package/package.json not in flight; writing
+1112 http 304 https://registry.npmjs.org/json-stringify-safe
+1113 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1113 verbose headers connection: 'keep-alive',
+1113 verbose headers 'set-cookie':
+1113 verbose headers [ '__cfduid=dd03692ace9824ebd46c46f408f2989131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1113 verbose headers 'cf-ray': '59764fa4fe54d6e1-FRA',
+1113 verbose headers age: '5657',
+1113 verbose headers 'cache-control': 'public, max-age=300',
+1113 verbose headers etag: '"7f39a9aafcaefe8efbf43a9f2e56c4eb"',
+1113 verbose headers 'last-modified': 'Sun, 27 May 2018 05:41:03 GMT',
+1113 verbose headers vary: 'Accept-Encoding',
+1113 verbose headers 'cf-cache-status': 'HIT',
+1113 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1113 verbose headers server: 'cloudflare',
+1113 verbose headers 'cf-request-id': '02ddd01b1e0000d6e132367200000001' }
+1114 silly get cb [ 304,
+1114 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1114 silly get connection: 'keep-alive',
+1114 silly get 'set-cookie':
+1114 silly get [ '__cfduid=dd03692ace9824ebd46c46f408f2989131590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1114 silly get 'cf-ray': '59764fa4fe54d6e1-FRA',
+1114 silly get age: '5657',
+1114 silly get 'cache-control': 'public, max-age=300',
+1114 silly get etag: '"7f39a9aafcaefe8efbf43a9f2e56c4eb"',
+1114 silly get 'last-modified': 'Sun, 27 May 2018 05:41:03 GMT',
+1114 silly get vary: 'Accept-Encoding',
+1114 silly get 'cf-cache-status': 'HIT',
+1114 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1114 silly get server: 'cloudflare',
+1114 silly get 'cf-request-id': '02ddd01b1e0000d6e132367200000001' } ]
+1115 verbose etag https://registry.npmjs.org/json-stringify-safe from cache
+1116 verbose get saving json-stringify-safe to /home/christine/.npm/registry.npmjs.org/json-stringify-safe/.cache.json
+1117 silly cache afterAdd http-signature@1.2.0
+1118 verbose afterAdd /home/christine/.npm/http-signature/1.2.0/package/package.json not in flight; writing
+1119 verbose afterAdd /home/christine/.npm/combined-stream/1.0.8/package/package.json written
+1120 verbose afterAdd /home/christine/.npm/extend/3.0.2/package/package.json written
+1121 verbose afterAdd /home/christine/.npm/aws4/1.9.1/package/package.json written
+1122 silly resolveWithNewModule isstream@0.1.2 checking installable status
+1123 silly cache add args [ 'isstream@~0.1.2', null ]
+1124 verbose cache add spec isstream@~0.1.2
+1125 silly cache add parsed spec Result {
+1125 silly cache add raw: 'isstream@~0.1.2',
+1125 silly cache add scope: null,
+1125 silly cache add name: 'isstream',
+1125 silly cache add rawSpec: '~0.1.2',
+1125 silly cache add spec: '>=0.1.2 <0.2.0',
+1125 silly cache add type: 'range' }
+1126 silly addNamed isstream@>=0.1.2 <0.2.0
+1127 verbose addNamed ">=0.1.2 <0.2.0" is a valid semver range for isstream
+1128 silly addNameRange { name: 'isstream', range: '>=0.1.2 <0.2.0', hasData: false }
+1129 silly mapToRegistry name isstream
+1130 silly mapToRegistry using default registry
+1131 silly mapToRegistry registry https://registry.npmjs.org/
+1132 silly mapToRegistry uri https://registry.npmjs.org/isstream
+1133 verbose addNameRange registry:https://registry.npmjs.org/isstream not in flight; fetching
+1134 http 304 https://registry.npmjs.org/tunnel-agent
+1135 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1135 verbose headers connection: 'keep-alive',
+1135 verbose headers 'set-cookie':
+1135 verbose headers [ '__cfduid=dd8a9957676dab4f7a1bd7377a7d9ca671590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1135 verbose headers 'cf-ray': '59764fa51970c2f9-FRA',
+1135 verbose headers age: '5655',
+1135 verbose headers 'cache-control': 'public, max-age=300',
+1135 verbose headers etag: '"03911fc1f433b33bccf8a4a2a5de2375"',
+1135 verbose headers 'last-modified': 'Sun, 27 May 2018 20:02:57 GMT',
+1135 verbose headers vary: 'Accept-Encoding',
+1135 verbose headers 'cf-cache-status': 'HIT',
+1135 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1135 verbose headers server: 'cloudflare',
+1135 verbose headers 'cf-request-id': '02ddd01b2a0000c2f926071200000001' }
+1136 silly get cb [ 304,
+1136 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1136 silly get connection: 'keep-alive',
+1136 silly get 'set-cookie':
+1136 silly get [ '__cfduid=dd8a9957676dab4f7a1bd7377a7d9ca671590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1136 silly get 'cf-ray': '59764fa51970c2f9-FRA',
+1136 silly get age: '5655',
+1136 silly get 'cache-control': 'public, max-age=300',
+1136 silly get etag: '"03911fc1f433b33bccf8a4a2a5de2375"',
+1136 silly get 'last-modified': 'Sun, 27 May 2018 20:02:57 GMT',
+1136 silly get vary: 'Accept-Encoding',
+1136 silly get 'cf-cache-status': 'HIT',
+1136 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1136 silly get server: 'cloudflare',
+1136 silly get 'cf-request-id': '02ddd01b2a0000c2f926071200000001' } ]
+1137 verbose etag https://registry.npmjs.org/tunnel-agent from cache
+1138 verbose get saving tunnel-agent to /home/christine/.npm/registry.npmjs.org/tunnel-agent/.cache.json
+1139 verbose afterAdd /home/christine/.npm/http-signature/1.2.0/package/package.json written
+1140 http 304 https://registry.npmjs.org/performance-now
+1141 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1141 verbose headers connection: 'keep-alive',
+1141 verbose headers 'set-cookie':
+1141 verbose headers [ '__cfduid=d42ce80dcff65dca26b6883967f7411d41590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1141 verbose headers 'cf-ray': '59764fa51f721772-FRA',
+1141 verbose headers age: '5657',
+1141 verbose headers 'cache-control': 'public, max-age=300',
+1141 verbose headers etag: '"5f12ad497b3e39323dcdde75c34f5767"',
+1141 verbose headers 'last-modified': 'Sun, 27 May 2018 12:05:53 GMT',
+1141 verbose headers vary: 'Accept-Encoding',
+1141 verbose headers 'cf-cache-status': 'HIT',
+1141 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1141 verbose headers server: 'cloudflare',
+1141 verbose headers 'cf-request-id': '02ddd01b2a0000177264160200000001' }
+1142 silly get cb [ 304,
+1142 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1142 silly get connection: 'keep-alive',
+1142 silly get 'set-cookie':
+1142 silly get [ '__cfduid=d42ce80dcff65dca26b6883967f7411d41590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1142 silly get 'cf-ray': '59764fa51f721772-FRA',
+1142 silly get age: '5657',
+1142 silly get 'cache-control': 'public, max-age=300',
+1142 silly get etag: '"5f12ad497b3e39323dcdde75c34f5767"',
+1142 silly get 'last-modified': 'Sun, 27 May 2018 12:05:53 GMT',
+1142 silly get vary: 'Accept-Encoding',
+1142 silly get 'cf-cache-status': 'HIT',
+1142 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1142 silly get server: 'cloudflare',
+1142 silly get 'cf-request-id': '02ddd01b2a0000177264160200000001' } ]
+1143 verbose etag https://registry.npmjs.org/performance-now from cache
+1144 verbose get saving performance-now to /home/christine/.npm/registry.npmjs.org/performance-now/.cache.json
+1145 silly resolveWithNewModule json-stringify-safe@5.0.1 checking installable status
+1146 silly cache add args [ 'json-stringify-safe@~5.0.1', null ]
+1147 verbose cache add spec json-stringify-safe@~5.0.1
+1148 silly cache add parsed spec Result {
+1148 silly cache add raw: 'json-stringify-safe@~5.0.1',
+1148 silly cache add scope: null,
+1148 silly cache add name: 'json-stringify-safe',
+1148 silly cache add rawSpec: '~5.0.1',
+1148 silly cache add spec: '>=5.0.1 <5.1.0',
+1148 silly cache add type: 'range' }
+1149 silly addNamed json-stringify-safe@>=5.0.1 <5.1.0
+1150 verbose addNamed ">=5.0.1 <5.1.0" is a valid semver range for json-stringify-safe
+1151 silly addNameRange { name: 'json-stringify-safe',
+1151 silly addNameRange range: '>=5.0.1 <5.1.0',
+1151 silly addNameRange hasData: false }
+1152 silly mapToRegistry name json-stringify-safe
+1153 silly mapToRegistry using default registry
+1154 silly mapToRegistry registry https://registry.npmjs.org/
+1155 silly mapToRegistry uri https://registry.npmjs.org/json-stringify-safe
+1156 verbose addNameRange registry:https://registry.npmjs.org/json-stringify-safe not in flight; fetching
+1157 verbose get https://registry.npmjs.org/isstream not expired, no request
+1158 silly addNameRange number 2 { name: 'isstream', range: '>=0.1.2 <0.2.0', hasData: true }
+1159 silly addNameRange versions [ 'isstream', [ '0.0.0', '0.1.0', '0.1.1', '0.1.2' ] ]
+1160 silly addNamed isstream@0.1.2
+1161 verbose addNamed "0.1.2" is a plain semver version for isstream
+1162 http 200 https://registry.npmjs.org/safe-buffer
+1163 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1163 verbose headers 'content-type': 'application/json',
+1163 verbose headers 'transfer-encoding': 'chunked',
+1163 verbose headers connection: 'keep-alive',
+1163 verbose headers 'set-cookie':
+1163 verbose headers [ '__cfduid=d242459e8d4d49451c98a98743f04b3251590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1163 verbose headers 'cf-ray': '59764fa51a7b0eab-FRA',
+1163 verbose headers age: '5658',
+1163 verbose headers 'cache-control': 'public, max-age=300',
+1163 verbose headers etag: 'W/"7d10eeac57e4baa4c8bd0dd7caa1703c"',
+1163 verbose headers 'last-modified': 'Sun, 10 May 2020 16:37:34 GMT',
+1163 verbose headers vary: 'accept-encoding, accept',
+1163 verbose headers 'cf-cache-status': 'HIT',
+1163 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1163 verbose headers server: 'cloudflare',
+1163 verbose headers 'content-encoding': 'gzip',
+1163 verbose headers 'cf-request-id': '02ddd01b2a00000eabe9143200000001' }
+1164 silly get cb [ 200,
+1164 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1164 silly get 'content-type': 'application/json',
+1164 silly get 'transfer-encoding': 'chunked',
+1164 silly get connection: 'keep-alive',
+1164 silly get 'set-cookie':
+1164 silly get [ '__cfduid=d242459e8d4d49451c98a98743f04b3251590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1164 silly get 'cf-ray': '59764fa51a7b0eab-FRA',
+1164 silly get age: '5658',
+1164 silly get 'cache-control': 'public, max-age=300',
+1164 silly get etag: 'W/"7d10eeac57e4baa4c8bd0dd7caa1703c"',
+1164 silly get 'last-modified': 'Sun, 10 May 2020 16:37:34 GMT',
+1164 silly get vary: 'accept-encoding, accept',
+1164 silly get 'cf-cache-status': 'HIT',
+1164 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1164 silly get server: 'cloudflare',
+1164 silly get 'content-encoding': 'gzip',
+1164 silly get 'cf-request-id': '02ddd01b2a00000eabe9143200000001' } ]
+1165 verbose get saving safe-buffer to /home/christine/.npm/registry.npmjs.org/safe-buffer/.cache.json
+1166 http 304 https://registry.npmjs.org/oauth-sign
+1167 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1167 verbose headers connection: 'keep-alive',
+1167 verbose headers 'set-cookie':
+1167 verbose headers [ '__cfduid=d287f9144cf6663f63602865423a0b4ea1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1167 verbose headers 'cf-ray': '59764fa51ff7dfbb-FRA',
+1167 verbose headers age: '5355',
+1167 verbose headers 'cache-control': 'public, max-age=300',
+1167 verbose headers etag: '"3032c1efe9ec61d748d027a1da2bab61"',
+1167 verbose headers 'last-modified': 'Thu, 02 Aug 2018 18:04:02 GMT',
+1167 verbose headers vary: 'Accept-Encoding',
+1167 verbose headers 'cf-cache-status': 'HIT',
+1167 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1167 verbose headers server: 'cloudflare',
+1167 verbose headers 'cf-request-id': '02ddd01b2a0000dfbb5fa74200000001' }
+1168 silly get cb [ 304,
+1168 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1168 silly get connection: 'keep-alive',
+1168 silly get 'set-cookie':
+1168 silly get [ '__cfduid=d287f9144cf6663f63602865423a0b4ea1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1168 silly get 'cf-ray': '59764fa51ff7dfbb-FRA',
+1168 silly get age: '5355',
+1168 silly get 'cache-control': 'public, max-age=300',
+1168 silly get etag: '"3032c1efe9ec61d748d027a1da2bab61"',
+1168 silly get 'last-modified': 'Thu, 02 Aug 2018 18:04:02 GMT',
+1168 silly get vary: 'Accept-Encoding',
+1168 silly get 'cf-cache-status': 'HIT',
+1168 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1168 silly get server: 'cloudflare',
+1168 silly get 'cf-request-id': '02ddd01b2a0000dfbb5fa74200000001' } ]
+1169 verbose etag https://registry.npmjs.org/oauth-sign from cache
+1170 verbose get saving oauth-sign to /home/christine/.npm/registry.npmjs.org/oauth-sign/.cache.json
+1171 verbose get https://registry.npmjs.org/json-stringify-safe not expired, no request
+1172 silly addNameRange number 2 { name: 'json-stringify-safe',
+1172 silly addNameRange range: '>=5.0.1 <5.1.0',
+1172 silly addNameRange hasData: true }
+1173 silly addNameRange versions [ 'json-stringify-safe',
+1173 silly addNameRange [ '2.0.0', '3.0.0', '4.0.0', '5.0.0', '5.0.1' ] ]
+1174 silly addNamed json-stringify-safe@5.0.1
+1175 verbose addNamed "5.0.1" is a plain semver version for json-stringify-safe
+1176 silly resolveWithNewModule tunnel-agent@0.6.0 checking installable status
+1177 silly cache add args [ 'tunnel-agent@^0.6.0', null ]
+1178 verbose cache add spec tunnel-agent@^0.6.0
+1179 silly cache add parsed spec Result {
+1179 silly cache add raw: 'tunnel-agent@^0.6.0',
+1179 silly cache add scope: null,
+1179 silly cache add name: 'tunnel-agent',
+1179 silly cache add rawSpec: '^0.6.0',
+1179 silly cache add spec: '>=0.6.0 <0.7.0',
+1179 silly cache add type: 'range' }
+1180 silly addNamed tunnel-agent@>=0.6.0 <0.7.0
+1181 verbose addNamed ">=0.6.0 <0.7.0" is a valid semver range for tunnel-agent
+1182 silly addNameRange { name: 'tunnel-agent', range: '>=0.6.0 <0.7.0', hasData: false }
+1183 silly mapToRegistry name tunnel-agent
+1184 silly mapToRegistry using default registry
+1185 silly mapToRegistry registry https://registry.npmjs.org/
+1186 silly mapToRegistry uri https://registry.npmjs.org/tunnel-agent
+1187 verbose addNameRange registry:https://registry.npmjs.org/tunnel-agent not in flight; fetching
+1188 silly resolveWithNewModule performance-now@2.1.0 checking installable status
+1189 silly cache add args [ 'performance-now@^2.1.0', null ]
+1190 verbose cache add spec performance-now@^2.1.0
+1191 silly cache add parsed spec Result {
+1191 silly cache add raw: 'performance-now@^2.1.0',
+1191 silly cache add scope: null,
+1191 silly cache add name: 'performance-now',
+1191 silly cache add rawSpec: '^2.1.0',
+1191 silly cache add spec: '>=2.1.0 <3.0.0',
+1191 silly cache add type: 'range' }
+1192 silly addNamed performance-now@>=2.1.0 <3.0.0
+1193 verbose addNamed ">=2.1.0 <3.0.0" is a valid semver range for performance-now
+1194 silly addNameRange { name: 'performance-now',
+1194 silly addNameRange range: '>=2.1.0 <3.0.0',
+1194 silly addNameRange hasData: false }
+1195 silly mapToRegistry name performance-now
+1196 silly mapToRegistry using default registry
+1197 silly mapToRegistry registry https://registry.npmjs.org/
+1198 silly mapToRegistry uri https://registry.npmjs.org/performance-now
+1199 verbose addNameRange registry:https://registry.npmjs.org/performance-now not in flight; fetching
+1200 silly cache afterAdd isstream@0.1.2
+1201 verbose afterAdd /home/christine/.npm/isstream/0.1.2/package/package.json not in flight; writing
+1202 http 200 https://registry.npmjs.org/tough-cookie
+1203 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1203 verbose headers 'content-type': 'application/json',
+1203 verbose headers 'transfer-encoding': 'chunked',
+1203 verbose headers connection: 'keep-alive',
+1203 verbose headers 'set-cookie':
+1203 verbose headers [ '__cfduid=d898cd72de597ecab2d8a354f76a0072c1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1203 verbose headers 'cf-ray': '59764fa518cb05e9-FRA',
+1203 verbose headers age: '5655',
+1203 verbose headers 'cache-control': 'public, max-age=300',
+1203 verbose headers etag: 'W/"818fa172eb6f27e219e81140db530363"',
+1203 verbose headers 'last-modified': 'Thu, 19 Mar 2020 19:20:30 GMT',
+1203 verbose headers vary: 'accept-encoding, accept',
+1203 verbose headers 'cf-cache-status': 'HIT',
+1203 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1203 verbose headers server: 'cloudflare',
+1203 verbose headers 'content-encoding': 'gzip',
+1203 verbose headers 'cf-request-id': '02ddd01b2a000005e903b1d200000001' }
+1204 silly get cb [ 200,
+1204 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1204 silly get 'content-type': 'application/json',
+1204 silly get 'transfer-encoding': 'chunked',
+1204 silly get connection: 'keep-alive',
+1204 silly get 'set-cookie':
+1204 silly get [ '__cfduid=d898cd72de597ecab2d8a354f76a0072c1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1204 silly get 'cf-ray': '59764fa518cb05e9-FRA',
+1204 silly get age: '5655',
+1204 silly get 'cache-control': 'public, max-age=300',
+1204 silly get etag: 'W/"818fa172eb6f27e219e81140db530363"',
+1204 silly get 'last-modified': 'Thu, 19 Mar 2020 19:20:30 GMT',
+1204 silly get vary: 'accept-encoding, accept',
+1204 silly get 'cf-cache-status': 'HIT',
+1204 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1204 silly get server: 'cloudflare',
+1204 silly get 'content-encoding': 'gzip',
+1204 silly get 'cf-request-id': '02ddd01b2a000005e903b1d200000001' } ]
+1205 verbose get saving tough-cookie to /home/christine/.npm/registry.npmjs.org/tough-cookie/.cache.json
+1206 silly cache afterAdd json-stringify-safe@5.0.1
+1207 verbose afterAdd /home/christine/.npm/json-stringify-safe/5.0.1/package/package.json not in flight; writing
+1208 silly resolveWithNewModule safe-buffer@5.2.1 checking installable status
+1209 silly cache add args [ 'safe-buffer@^5.1.2', null ]
+1210 verbose cache add spec safe-buffer@^5.1.2
+1211 silly cache add parsed spec Result {
+1211 silly cache add raw: 'safe-buffer@^5.1.2',
+1211 silly cache add scope: null,
+1211 silly cache add name: 'safe-buffer',
+1211 silly cache add rawSpec: '^5.1.2',
+1211 silly cache add spec: '>=5.1.2 <6.0.0',
+1211 silly cache add type: 'range' }
+1212 silly addNamed safe-buffer@>=5.1.2 <6.0.0
+1213 verbose addNamed ">=5.1.2 <6.0.0" is a valid semver range for safe-buffer
+1214 silly addNameRange { name: 'safe-buffer', range: '>=5.1.2 <6.0.0', hasData: false }
+1215 silly mapToRegistry name safe-buffer
+1216 silly mapToRegistry using default registry
+1217 silly mapToRegistry registry https://registry.npmjs.org/
+1218 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer
+1219 verbose addNameRange registry:https://registry.npmjs.org/safe-buffer not in flight; fetching
+1220 http 200 https://registry.npmjs.org/mime-types
+1221 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1221 verbose headers 'content-type': 'application/json',
+1221 verbose headers 'transfer-encoding': 'chunked',
+1221 verbose headers connection: 'keep-alive',
+1221 verbose headers 'set-cookie':
+1221 verbose headers [ '__cfduid=d8091989cd66bf129670ccfa4d20cf63d1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1221 verbose headers 'cf-ray': '59764fa51e27c2ae-FRA',
+1221 verbose headers age: '5656',
+1221 verbose headers 'cache-control': 'public, max-age=300',
+1221 verbose headers etag: 'W/"b0572cbc8ddbbb6b61205820d06deb3a"',
+1221 verbose headers 'last-modified': 'Fri, 24 Apr 2020 03:36:16 GMT',
+1221 verbose headers vary: 'accept-encoding, accept',
+1221 verbose headers 'cf-cache-status': 'HIT',
+1221 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1221 verbose headers server: 'cloudflare',
+1221 verbose headers 'content-encoding': 'gzip',
+1221 verbose headers 'cf-request-id': '02ddd01b2a0000c2aea0161200000001' }
+1222 silly get cb [ 200,
+1222 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1222 silly get 'content-type': 'application/json',
+1222 silly get 'transfer-encoding': 'chunked',
+1222 silly get connection: 'keep-alive',
+1222 silly get 'set-cookie':
+1222 silly get [ '__cfduid=d8091989cd66bf129670ccfa4d20cf63d1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1222 silly get 'cf-ray': '59764fa51e27c2ae-FRA',
+1222 silly get age: '5656',
+1222 silly get 'cache-control': 'public, max-age=300',
+1222 silly get etag: 'W/"b0572cbc8ddbbb6b61205820d06deb3a"',
+1222 silly get 'last-modified': 'Fri, 24 Apr 2020 03:36:16 GMT',
+1222 silly get vary: 'accept-encoding, accept',
+1222 silly get 'cf-cache-status': 'HIT',
+1222 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1222 silly get server: 'cloudflare',
+1222 silly get 'content-encoding': 'gzip',
+1222 silly get 'cf-request-id': '02ddd01b2a0000c2aea0161200000001' } ]
+1223 verbose get saving mime-types to /home/christine/.npm/registry.npmjs.org/mime-types/.cache.json
+1224 verbose get https://registry.npmjs.org/tunnel-agent not expired, no request
+1225 silly addNameRange number 2 { name: 'tunnel-agent', range: '>=0.6.0 <0.7.0', hasData: true }
+1226 silly addNameRange versions [ 'tunnel-agent',
+1226 silly addNameRange [ '0.2.0',
+1226 silly addNameRange '0.3.0',
+1226 silly addNameRange '0.4.0',
+1226 silly addNameRange '0.4.1',
+1226 silly addNameRange '0.4.2',
+1226 silly addNameRange '0.4.3',
+1226 silly addNameRange '0.5.0',
+1226 silly addNameRange '0.6.0' ] ]
+1227 silly addNamed tunnel-agent@0.6.0
+1228 verbose addNamed "0.6.0" is a plain semver version for tunnel-agent
+1229 silly resolveWithNewModule oauth-sign@0.9.0 checking installable status
+1230 silly cache add args [ 'oauth-sign@~0.9.0', null ]
+1231 verbose cache add spec oauth-sign@~0.9.0
+1232 silly cache add parsed spec Result {
+1232 silly cache add raw: 'oauth-sign@~0.9.0',
+1232 silly cache add scope: null,
+1232 silly cache add name: 'oauth-sign',
+1232 silly cache add rawSpec: '~0.9.0',
+1232 silly cache add spec: '>=0.9.0 <0.10.0',
+1232 silly cache add type: 'range' }
+1233 silly addNamed oauth-sign@>=0.9.0 <0.10.0
+1234 verbose addNamed ">=0.9.0 <0.10.0" is a valid semver range for oauth-sign
+1235 silly addNameRange { name: 'oauth-sign', range: '>=0.9.0 <0.10.0', hasData: false }
+1236 silly mapToRegistry name oauth-sign
+1237 silly mapToRegistry using default registry
+1238 silly mapToRegistry registry https://registry.npmjs.org/
+1239 silly mapToRegistry uri https://registry.npmjs.org/oauth-sign
+1240 verbose addNameRange registry:https://registry.npmjs.org/oauth-sign not in flight; fetching
+1241 verbose get https://registry.npmjs.org/performance-now not expired, no request
+1242 silly addNameRange number 2 { name: 'performance-now',
+1242 silly addNameRange range: '>=2.1.0 <3.0.0',
+1242 silly addNameRange hasData: true }
+1243 silly addNameRange versions [ 'performance-now',
+1243 silly addNameRange [ '0.1.0',
+1243 silly addNameRange '0.1.1',
+1243 silly addNameRange '0.1.2',
+1243 silly addNameRange '0.1.3',
+1243 silly addNameRange '0.1.4',
+1243 silly addNameRange '0.2.0',
+1243 silly addNameRange '1.0.0',
+1243 silly addNameRange '1.0.1',
+1243 silly addNameRange '1.0.2',
+1243 silly addNameRange '2.0.0',
+1243 silly addNameRange '2.1.0' ] ]
+1244 silly addNamed performance-now@2.1.0
+1245 verbose addNamed "2.1.0" is a plain semver version for performance-now
+1246 verbose afterAdd /home/christine/.npm/isstream/0.1.2/package/package.json written
+1247 http 200 https://registry.npmjs.org/uuid
+1248 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1248 verbose headers 'content-type': 'application/json',
+1248 verbose headers 'transfer-encoding': 'chunked',
+1248 verbose headers connection: 'keep-alive',
+1248 verbose headers 'set-cookie':
+1248 verbose headers [ '__cfduid=d42e977fd11818895c4979b1006ea23be1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1248 verbose headers 'cf-ray': '59764fa5195d1f2d-FRA',
+1248 verbose headers age: '5355',
+1248 verbose headers 'cache-control': 'public, max-age=300',
+1248 verbose headers etag: 'W/"3fc4e0f16b6e5d55bc0144a7f38b6e49"',
+1248 verbose headers 'last-modified': 'Wed, 20 May 2020 18:52:41 GMT',
+1248 verbose headers vary: 'accept-encoding, accept',
+1248 verbose headers 'cf-cache-status': 'HIT',
+1248 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1248 verbose headers server: 'cloudflare',
+1248 verbose headers 'content-encoding': 'gzip',
+1248 verbose headers 'cf-request-id': '02ddd01b2a00001f2df51ed200000001' }
+1249 silly get cb [ 200,
+1249 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1249 silly get 'content-type': 'application/json',
+1249 silly get 'transfer-encoding': 'chunked',
+1249 silly get connection: 'keep-alive',
+1249 silly get 'set-cookie':
+1249 silly get [ '__cfduid=d42e977fd11818895c4979b1006ea23be1590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1249 silly get 'cf-ray': '59764fa5195d1f2d-FRA',
+1249 silly get age: '5355',
+1249 silly get 'cache-control': 'public, max-age=300',
+1249 silly get etag: 'W/"3fc4e0f16b6e5d55bc0144a7f38b6e49"',
+1249 silly get 'last-modified': 'Wed, 20 May 2020 18:52:41 GMT',
+1249 silly get vary: 'accept-encoding, accept',
+1249 silly get 'cf-cache-status': 'HIT',
+1249 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1249 silly get server: 'cloudflare',
+1249 silly get 'content-encoding': 'gzip',
+1249 silly get 'cf-request-id': '02ddd01b2a00001f2df51ed200000001' } ]
+1250 verbose get saving uuid to /home/christine/.npm/registry.npmjs.org/uuid/.cache.json
+1251 verbose get https://registry.npmjs.org/safe-buffer not expired, no request
+1252 silly addNameRange number 2 { name: 'safe-buffer', range: '>=5.1.2 <6.0.0', hasData: true }
+1253 silly addNameRange versions [ 'safe-buffer',
+1253 silly addNameRange [ '1.0.0',
+1253 silly addNameRange '2.0.0',
+1253 silly addNameRange '3.0.0',
+1253 silly addNameRange '4.0.0',
+1253 silly addNameRange '5.0.0',
+1253 silly addNameRange '5.0.1',
+1253 silly addNameRange '5.1.0',
+1253 silly addNameRange '5.1.1',
+1253 silly addNameRange '5.1.2',
+1253 silly addNameRange '5.2.0',
+1253 silly addNameRange '5.2.1' ] ]
+1254 silly addNamed safe-buffer@5.2.1
+1255 verbose addNamed "5.2.1" is a plain semver version for safe-buffer
+1256 verbose afterAdd /home/christine/.npm/json-stringify-safe/5.0.1/package/package.json written
+1257 verbose get https://registry.npmjs.org/oauth-sign not expired, no request
+1258 silly addNameRange number 2 { name: 'oauth-sign', range: '>=0.9.0 <0.10.0', hasData: true }
+1259 silly addNameRange versions [ 'oauth-sign',
+1259 silly addNameRange [ '0.2.0',
+1259 silly addNameRange '0.3.0',
+1259 silly addNameRange '0.4.0',
+1259 silly addNameRange '0.5.0',
+1259 silly addNameRange '0.6.0',
+1259 silly addNameRange '0.7.0',
+1259 silly addNameRange '0.8.0',
+1259 silly addNameRange '0.8.1',
+1259 silly addNameRange '0.8.2',
+1259 silly addNameRange '0.9.0' ] ]
+1260 silly addNamed oauth-sign@0.9.0
+1261 verbose addNamed "0.9.0" is a plain semver version for oauth-sign
+1262 silly mapToRegistry name safe-buffer
+1263 silly mapToRegistry using default registry
+1264 silly mapToRegistry registry https://registry.npmjs.org/
+1265 silly mapToRegistry uri https://registry.npmjs.org/safe-buffer
+1266 verbose addRemoteTarball https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz not in flight; adding
+1267 verbose addRemoteTarball [ 'https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz',
+1267 verbose addRemoteTarball '1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6' ]
+1268 silly resolveWithNewModule tough-cookie@2.5.0 checking installable status
+1269 silly cache add args [ 'tough-cookie@~2.5.0', null ]
+1270 verbose cache add spec tough-cookie@~2.5.0
+1271 silly cache add parsed spec Result {
+1271 silly cache add raw: 'tough-cookie@~2.5.0',
+1271 silly cache add scope: null,
+1271 silly cache add name: 'tough-cookie',
+1271 silly cache add rawSpec: '~2.5.0',
+1271 silly cache add spec: '>=2.5.0 <2.6.0',
+1271 silly cache add type: 'range' }
+1272 silly addNamed tough-cookie@>=2.5.0 <2.6.0
+1273 verbose addNamed ">=2.5.0 <2.6.0" is a valid semver range for tough-cookie
+1274 silly addNameRange { name: 'tough-cookie', range: '>=2.5.0 <2.6.0', hasData: false }
+1275 silly mapToRegistry name tough-cookie
+1276 silly mapToRegistry using default registry
+1277 silly mapToRegistry registry https://registry.npmjs.org/
+1278 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie
+1279 verbose addNameRange registry:https://registry.npmjs.org/tough-cookie not in flight; fetching
+1280 silly cache afterAdd tunnel-agent@0.6.0
+1281 verbose afterAdd /home/christine/.npm/tunnel-agent/0.6.0/package/package.json not in flight; writing
+1282 silly cache afterAdd performance-now@2.1.0
+1283 verbose afterAdd /home/christine/.npm/performance-now/2.1.0/package/package.json not in flight; writing
+1284 silly resolveWithNewModule mime-types@2.1.27 checking installable status
+1285 silly cache add args [ 'mime-types@~2.1.19', null ]
+1286 verbose cache add spec mime-types@~2.1.19
+1287 silly cache add parsed spec Result {
+1287 silly cache add raw: 'mime-types@~2.1.19',
+1287 silly cache add scope: null,
+1287 silly cache add name: 'mime-types',
+1287 silly cache add rawSpec: '~2.1.19',
+1287 silly cache add spec: '>=2.1.19 <2.2.0',
+1287 silly cache add type: 'range' }
+1288 silly addNamed mime-types@>=2.1.19 <2.2.0
+1289 verbose addNamed ">=2.1.19 <2.2.0" is a valid semver range for mime-types
+1290 silly addNameRange { name: 'mime-types', range: '>=2.1.19 <2.2.0', hasData: false }
+1291 silly mapToRegistry name mime-types
+1292 silly mapToRegistry using default registry
+1293 silly mapToRegistry registry https://registry.npmjs.org/
+1294 silly mapToRegistry uri https://registry.npmjs.org/mime-types
+1295 verbose addNameRange registry:https://registry.npmjs.org/mime-types not in flight; fetching
+1296 http 200 https://registry.npmjs.org/qs
+1297 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1297 verbose headers 'content-type': 'application/json',
+1297 verbose headers 'transfer-encoding': 'chunked',
+1297 verbose headers connection: 'keep-alive',
+1297 verbose headers 'set-cookie':
+1297 verbose headers [ '__cfduid=dd8aaa3b832fe3de3ea175ff8604d63411590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1297 verbose headers 'cf-ray': '59764fa5183d176a-FRA',
+1297 verbose headers age: '5657',
+1297 verbose headers 'cache-control': 'public, max-age=300',
+1297 verbose headers etag: 'W/"679aa380b84cf75f89f99363ed5f9c98"',
+1297 verbose headers 'last-modified': 'Sun, 03 May 2020 21:52:54 GMT',
+1297 verbose headers vary: 'accept-encoding, accept',
+1297 verbose headers 'cf-cache-status': 'HIT',
+1297 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1297 verbose headers server: 'cloudflare',
+1297 verbose headers 'content-encoding': 'gzip',
+1297 verbose headers 'cf-request-id': '02ddd01b2a0000176a65b45200000001' }
+1298 silly get cb [ 200,
+1298 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1298 silly get 'content-type': 'application/json',
+1298 silly get 'transfer-encoding': 'chunked',
+1298 silly get connection: 'keep-alive',
+1298 silly get 'set-cookie':
+1298 silly get [ '__cfduid=dd8aaa3b832fe3de3ea175ff8604d63411590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1298 silly get 'cf-ray': '59764fa5183d176a-FRA',
+1298 silly get age: '5657',
+1298 silly get 'cache-control': 'public, max-age=300',
+1298 silly get etag: 'W/"679aa380b84cf75f89f99363ed5f9c98"',
+1298 silly get 'last-modified': 'Sun, 03 May 2020 21:52:54 GMT',
+1298 silly get vary: 'accept-encoding, accept',
+1298 silly get 'cf-cache-status': 'HIT',
+1298 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1298 silly get server: 'cloudflare',
+1298 silly get 'content-encoding': 'gzip',
+1298 silly get 'cf-request-id': '02ddd01b2a0000176a65b45200000001' } ]
+1299 verbose get saving qs to /home/christine/.npm/registry.npmjs.org/qs/.cache.json
+1300 info retry fetch attempt 1 at 13:48:57
+1301 info attempt registry request try #1 at 13:48:57
+1302 http fetch GET https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz
+1303 verbose get https://registry.npmjs.org/tough-cookie not expired, no request
+1304 silly addNameRange number 2 { name: 'tough-cookie', range: '>=2.5.0 <2.6.0', hasData: true }
+1305 silly addNameRange versions [ 'tough-cookie',
+1305 silly addNameRange [ '0.9.0',
+1305 silly addNameRange '0.9.1',
+1305 silly addNameRange '0.9.3',
+1305 silly addNameRange '0.9.4',
+1305 silly addNameRange '0.9.5',
+1305 silly addNameRange '0.9.6',
+1305 silly addNameRange '0.9.7',
+1305 silly addNameRange '0.9.8',
+1305 silly addNameRange '0.9.9',
+1305 silly addNameRange '0.9.11',
+1305 silly addNameRange '0.9.12',
+1305 silly addNameRange '0.9.13',
+1305 silly addNameRange '0.9.14',
+1305 silly addNameRange '0.9.15',
+1305 silly addNameRange '0.10.0',
+1305 silly addNameRange '0.11.0',
+1305 silly addNameRange '0.12.0',
+1305 silly addNameRange '0.12.1',
+1305 silly addNameRange '0.13.0',
+1305 silly addNameRange '1.0.0',
+1305 silly addNameRange '1.1.0',
+1305 silly addNameRange '1.2.0',
+1305 silly addNameRange '2.0.0',
+1305 silly addNameRange '2.1.0',
+1305 silly addNameRange '2.2.0',
+1305 silly addNameRange '2.2.1',
+1305 silly addNameRange '2.2.2',
+1305 silly addNameRange '2.3.0',
+1305 silly addNameRange '2.3.1',
+1305 silly addNameRange '2.3.2',
+1305 silly addNameRange '2.3.3',
+1305 silly addNameRange '2.3.4',
+1305 silly addNameRange '2.4.2',
+1305 silly addNameRange '2.4.3',
+1305 silly addNameRange '2.5.0',
+1305 silly addNameRange '3.0.0',
+1305 silly addNameRange '3.0.1',
+1305 silly addNameRange '4.0.0' ] ]
+1306 silly addNamed tough-cookie@2.5.0
+1307 verbose addNamed "2.5.0" is a plain semver version for tough-cookie
+1308 silly cache afterAdd oauth-sign@0.9.0
+1309 verbose afterAdd /home/christine/.npm/oauth-sign/0.9.0/package/package.json not in flight; writing
+1310 silly resolveWithNewModule uuid@3.4.0 checking installable status
+1311 silly cache add args [ 'uuid@^3.3.2', null ]
+1312 verbose cache add spec uuid@^3.3.2
+1313 silly cache add parsed spec Result {
+1313 silly cache add raw: 'uuid@^3.3.2',
+1313 silly cache add scope: null,
+1313 silly cache add name: 'uuid',
+1313 silly cache add rawSpec: '^3.3.2',
+1313 silly cache add spec: '>=3.3.2 <4.0.0',
+1313 silly cache add type: 'range' }
+1314 silly addNamed uuid@>=3.3.2 <4.0.0
+1315 verbose addNamed ">=3.3.2 <4.0.0" is a valid semver range for uuid
+1316 silly addNameRange { name: 'uuid', range: '>=3.3.2 <4.0.0', hasData: false }
+1317 silly mapToRegistry name uuid
+1318 silly mapToRegistry using default registry
+1319 silly mapToRegistry registry https://registry.npmjs.org/
+1320 silly mapToRegistry uri https://registry.npmjs.org/uuid
+1321 verbose addNameRange registry:https://registry.npmjs.org/uuid not in flight; fetching
+1322 verbose afterAdd /home/christine/.npm/tunnel-agent/0.6.0/package/package.json written
+1323 silly mapToRegistry name tough-cookie
+1324 silly mapToRegistry using default registry
+1325 silly mapToRegistry registry https://registry.npmjs.org/
+1326 silly mapToRegistry uri https://registry.npmjs.org/tough-cookie
+1327 verbose addRemoteTarball https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz not in flight; adding
+1328 verbose addRemoteTarball [ 'https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz',
+1328 verbose addRemoteTarball 'cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2' ]
+1329 verbose afterAdd /home/christine/.npm/performance-now/2.1.0/package/package.json written
+1330 verbose get https://registry.npmjs.org/mime-types not expired, no request
+1331 silly addNameRange number 2 { name: 'mime-types', range: '>=2.1.19 <2.2.0', hasData: true }
+1332 silly addNameRange versions [ 'mime-types',
+1332 silly addNameRange [ '0.1.0',
+1332 silly addNameRange '1.0.0',
+1332 silly addNameRange '1.0.1',
+1332 silly addNameRange '1.0.2',
+1332 silly addNameRange '2.0.0',
+1332 silly addNameRange '2.0.1',
+1332 silly addNameRange '2.0.2',
+1332 silly addNameRange '2.0.3',
+1332 silly addNameRange '2.0.4',
+1332 silly addNameRange '2.0.5',
+1332 silly addNameRange '2.0.6',
+1332 silly addNameRange '2.0.7',
+1332 silly addNameRange '2.0.8',
+1332 silly addNameRange '2.0.9',
+1332 silly addNameRange '2.0.10',
+1332 silly addNameRange '2.0.11',
+1332 silly addNameRange '2.0.12',
+1332 silly addNameRange '2.0.13',
+1332 silly addNameRange '2.0.14',
+1332 silly addNameRange '2.1.0',
+1332 silly addNameRange '2.1.1',
+1332 silly addNameRange '2.1.2',
+1332 silly addNameRange '2.1.3',
+1332 silly addNameRange '2.1.4',
+1332 silly addNameRange '2.1.5',
+1332 silly addNameRange '2.1.6',
+1332 silly addNameRange '2.1.7',
+1332 silly addNameRange '2.1.8',
+1332 silly addNameRange '2.1.9',
+1332 silly addNameRange '2.1.10',
+1332 silly addNameRange '2.1.11',
+1332 silly addNameRange '2.1.12',
+1332 silly addNameRange '2.1.13',
+1332 silly addNameRange '2.1.14',
+1332 silly addNameRange '2.1.15',
+1332 silly addNameRange '2.1.16',
+1332 silly addNameRange '2.1.17',
+1332 silly addNameRange '2.1.18',
+1332 silly addNameRange '2.1.19',
+1332 silly addNameRange '2.1.20',
+1332 silly addNameRange '2.1.21',
+1332 silly addNameRange '2.1.22',
+1332 silly addNameRange '2.1.23',
+1332 silly addNameRange '2.1.24',
+1332 silly addNameRange '2.1.25',
+1332 silly addNameRange '2.1.26',
+1332 silly addNameRange '2.1.27' ] ]
+1333 silly addNamed mime-types@2.1.27
+1334 verbose addNamed "2.1.27" is a plain semver version for mime-types
+1335 silly mapToRegistry name mime-types
+1336 silly mapToRegistry using default registry
+1337 silly mapToRegistry registry https://registry.npmjs.org/
+1338 silly mapToRegistry uri https://registry.npmjs.org/mime-types
+1339 verbose addRemoteTarball https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz not in flight; adding
+1340 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz',
+1340 verbose addRemoteTarball '47949f98e279ea53119f5722e0f34e529bec009f' ]
+1341 info retry fetch attempt 1 at 13:48:57
+1342 info attempt registry request try #1 at 13:48:57
+1343 http fetch GET https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz
+1344 verbose get https://registry.npmjs.org/uuid not expired, no request
+1345 silly addNameRange number 2 { name: 'uuid', range: '>=3.3.2 <4.0.0', hasData: true }
+1346 silly addNameRange versions [ 'uuid',
+1346 silly addNameRange [ '0.0.1',
+1346 silly addNameRange '0.0.2',
+1346 silly addNameRange '1.4.0',
+1346 silly addNameRange '1.4.1',
+1346 silly addNameRange '1.4.2',
+1346 silly addNameRange '2.0.0',
+1346 silly addNameRange '2.0.1',
+1346 silly addNameRange '2.0.2',
+1346 silly addNameRange '2.0.3',
+1346 silly addNameRange '3.0.0',
+1346 silly addNameRange '3.0.1',
+1346 silly addNameRange '3.1.0',
+1346 silly addNameRange '3.2.0',
+1346 silly addNameRange '3.2.1',
+1346 silly addNameRange '3.3.0',
+1346 silly addNameRange '3.3.2',
+1346 silly addNameRange '3.3.3',
+1346 silly addNameRange '3.4.0',
+1346 silly addNameRange '7.0.0-beta.0',
+1346 silly addNameRange '7.0.0',
+1346 silly addNameRange '7.0.1',
+1346 silly addNameRange '7.0.2-beta.0',
+1346 silly addNameRange '7.0.2',
+1346 silly addNameRange '7.0.3',
+1346 silly addNameRange '8.0.0-beta.0',
+1346 silly addNameRange '8.0.0',
+1346 silly addNameRange '8.1.0' ] ]
+1347 silly addNamed uuid@3.4.0
+1348 verbose addNamed "3.4.0" is a plain semver version for uuid
+1349 silly resolveWithNewModule qs@6.5.2 checking installable status
+1350 silly cache add args [ 'qs@~6.5.2', null ]
+1351 verbose cache add spec qs@~6.5.2
+1352 silly cache add parsed spec Result {
+1352 silly cache add raw: 'qs@~6.5.2',
+1352 silly cache add scope: null,
+1352 silly cache add name: 'qs',
+1352 silly cache add rawSpec: '~6.5.2',
+1352 silly cache add spec: '>=6.5.2 <6.6.0',
+1352 silly cache add type: 'range' }
+1353 silly addNamed qs@>=6.5.2 <6.6.0
+1354 verbose addNamed ">=6.5.2 <6.6.0" is a valid semver range for qs
+1355 silly addNameRange { name: 'qs', range: '>=6.5.2 <6.6.0', hasData: false }
+1356 silly mapToRegistry name qs
+1357 silly mapToRegistry using default registry
+1358 silly mapToRegistry registry https://registry.npmjs.org/
+1359 silly mapToRegistry uri https://registry.npmjs.org/qs
+1360 verbose addNameRange registry:https://registry.npmjs.org/qs not in flight; fetching
+1361 verbose afterAdd /home/christine/.npm/oauth-sign/0.9.0/package/package.json written
+1362 http fetch 200 https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz
+1363 info retry fetch attempt 1 at 13:48:57
+1364 info attempt registry request try #1 at 13:48:57
+1365 http fetch GET https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz
+1366 verbose get https://registry.npmjs.org/qs not expired, no request
+1367 silly addNameRange number 2 { name: 'qs', range: '>=6.5.2 <6.6.0', hasData: true }
+1368 silly addNameRange versions [ 'qs',
+1368 silly addNameRange [ '0.0.1',
+1368 silly addNameRange '0.0.2',
+1368 silly addNameRange '0.0.3',
+1368 silly addNameRange '0.0.4',
+1368 silly addNameRange '0.0.5',
+1368 silly addNameRange '0.0.6',
+1368 silly addNameRange '0.0.7',
+1368 silly addNameRange '0.1.0',
+1368 silly addNameRange '0.2.0',
+1368 silly addNameRange '0.3.0',
+1368 silly addNameRange '0.3.1',
+1368 silly addNameRange '0.3.2',
+1368 silly addNameRange '0.4.0',
+1368 silly addNameRange '0.4.1',
+1368 silly addNameRange '0.4.2',
+1368 silly addNameRange '0.5.0',
+1368 silly addNameRange '0.5.1',
+1368 silly addNameRange '0.5.2',
+1368 silly addNameRange '0.5.3',
+1368 silly addNameRange '0.5.4',
+1368 silly addNameRange '0.5.5',
+1368 silly addNameRange '0.5.6',
+1368 silly addNameRange '0.6.0',
+1368 silly addNameRange '0.6.1',
+1368 silly addNameRange '0.6.2',
+1368 silly addNameRange '0.6.3',
+1368 silly addNameRange '0.6.4',
+1368 silly addNameRange '0.6.5',
+1368 silly addNameRange '0.6.6',
+1368 silly addNameRange '1.0.0',
+1368 silly addNameRange '1.0.1',
+1368 silly addNameRange '1.0.2',
+1368 silly addNameRange '1.1.0',
+1368 silly addNameRange '1.2.0',
+1368 silly addNameRange '1.2.1',
+1368 silly addNameRange '1.2.2',
+1368 silly addNameRange '2.0.0',
+1368 silly addNameRange '2.1.0',
+1368 silly addNameRange '2.2.0',
+1368 silly addNameRange '2.2.1',
+1368 silly addNameRange '2.2.2',
+1368 silly addNameRange '2.2.3',
+1368 silly addNameRange '2.2.4',
+1368 silly addNameRange '2.2.5',
+1368 silly addNameRange '2.3.0',
+1368 silly addNameRange '2.3.1',
+1368 silly addNameRange '2.3.2',
+1368 silly addNameRange '2.3.3',
+1368 silly addNameRange '2.4.0',
+1368 silly addNameRange '2.4.1',
+1368 silly addNameRange '2.4.2',
+1368 silly addNameRange '3.0.0',
+1368 silly addNameRange '3.1.0',
+1368 silly addNameRange '4.0.0',
+1368 silly addNameRange '5.0.0',
+1368 silly addNameRange '5.1.0',
+1368 silly addNameRange '5.2.0',
+1368 silly addNameRange '6.0.0',
+1368 silly addNameRange '6.0.1',
+1368 silly addNameRange '6.0.2',
+1368 silly addNameRange '6.1.0',
+1368 silly addNameRange '6.2.0',
+1368 silly addNameRange '5.2.1',
+1368 silly addNameRange '6.2.1',
+1368 silly addNameRange '6.3.0',
+1368 silly addNameRange '6.3.1',
+1368 silly addNameRange '6.1.1',
+1368 silly addNameRange '6.0.3',
+1368 silly addNameRange '6.2.2',
+1368 silly addNameRange '6.4.0',
+1368 silly addNameRange '6.3.2',
+1368 silly addNameRange '6.2.3',
+1368 silly addNameRange '6.1.2',
+1368 silly addNameRange '6.0.4',
+1368 silly addNameRange '6.5.0',
+1368 silly addNameRange '6.5.1',
+1368 silly addNameRange '6.5.2',
+1368 silly addNameRange '6.6.0',
+1368 silly addNameRange '6.7.0',
+1368 silly addNameRange '6.8.0',
+1368 silly addNameRange '6.9.0',
+1368 silly addNameRange '6.9.1',
+1368 silly addNameRange '6.9.2',
+1368 silly addNameRange '6.8.1',
+1368 silly addNameRange '6.7.1',
+1368 silly addNameRange '6.7.2',
+1368 silly addNameRange '6.8.2',
+1368 silly addNameRange '6.9.3',
+1368 silly addNameRange '6.9.4' ] ]
+1369 silly addNamed qs@6.5.2
+1370 verbose addNamed "6.5.2" is a plain semver version for qs
+1371 silly fetchAndShaCheck shasum 1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6
+1372 http fetch 200 https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz
+1373 silly cache afterAdd uuid@3.4.0
+1374 verbose afterAdd /home/christine/.npm/uuid/3.4.0/package/package.json not in flight; writing
+1375 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz not in flight; adding
+1376 verbose addTmpTarball already have metadata; skipping unpack for safe-buffer@5.2.1
+1377 silly cache afterAdd qs@6.5.2
+1378 verbose afterAdd /home/christine/.npm/qs/6.5.2/package/package.json not in flight; writing
+1379 verbose afterAdd /home/christine/.npm/uuid/3.4.0/package/package.json written
+1380 silly fetchAndShaCheck shasum cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2
+1381 verbose afterAdd /home/christine/.npm/qs/6.5.2/package/package.json written
+1382 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz not in flight; adding
+1383 verbose addTmpTarball already have metadata; skipping unpack for tough-cookie@2.5.0
+1384 silly cache afterAdd safe-buffer@5.2.1
+1385 verbose afterAdd /home/christine/.npm/safe-buffer/5.2.1/package/package.json not in flight; writing
+1386 verbose afterAdd /home/christine/.npm/safe-buffer/5.2.1/package/package.json written
+1387 silly cache afterAdd tough-cookie@2.5.0
+1388 verbose afterAdd /home/christine/.npm/tough-cookie/2.5.0/package/package.json not in flight; writing
+1389 verbose afterAdd /home/christine/.npm/tough-cookie/2.5.0/package/package.json written
+1390 http fetch 200 https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz
+1391 silly fetchAndShaCheck shasum 47949f98e279ea53119f5722e0f34e529bec009f
+1392 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz not in flight; adding
+1393 verbose addTmpTarball already have metadata; skipping unpack for mime-types@2.1.27
+1394 silly cache afterAdd mime-types@2.1.27
+1395 verbose afterAdd /home/christine/.npm/mime-types/2.1.27/package/package.json not in flight; writing
+1396 verbose afterAdd /home/christine/.npm/mime-types/2.1.27/package/package.json written
+1397 silly fetchNamedPackageData delayed-stream
+1398 silly mapToRegistry name delayed-stream
+1399 silly mapToRegistry using default registry
+1400 silly mapToRegistry registry https://registry.npmjs.org/
+1401 silly mapToRegistry uri https://registry.npmjs.org/delayed-stream
+1402 verbose request uri https://registry.npmjs.org/delayed-stream
+1403 verbose request no auth needed
+1404 info attempt registry request try #1 at 13:48:57
+1405 verbose etag W/"d93fb1e0b12584f566e6f17a70c49721"
+1406 verbose lastModified Sat, 26 May 2018 21:57:10 GMT
+1407 http request GET https://registry.npmjs.org/delayed-stream
+1408 http 304 https://registry.npmjs.org/delayed-stream
+1409 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1409 verbose headers connection: 'keep-alive',
+1409 verbose headers 'set-cookie':
+1409 verbose headers [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1409 verbose headers 'cf-ray': '59764fa5ecd6325c-FRA',
+1409 verbose headers age: '5355',
+1409 verbose headers 'cache-control': 'public, max-age=300',
+1409 verbose headers etag: '"d93fb1e0b12584f566e6f17a70c49721"',
+1409 verbose headers 'last-modified': 'Sat, 26 May 2018 21:57:10 GMT',
+1409 verbose headers vary: 'Accept-Encoding',
+1409 verbose headers 'cf-cache-status': 'HIT',
+1409 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1409 verbose headers server: 'cloudflare',
+1409 verbose headers 'cf-request-id': '02ddd01baf0000325c4c82b200000001' }
+1410 silly get cb [ 304,
+1410 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1410 silly get connection: 'keep-alive',
+1410 silly get 'set-cookie':
+1410 silly get [ '__cfduid=d1ba0ebb5b0def6eb801cd0e2e5f4b1541590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1410 silly get 'cf-ray': '59764fa5ecd6325c-FRA',
+1410 silly get age: '5355',
+1410 silly get 'cache-control': 'public, max-age=300',
+1410 silly get etag: '"d93fb1e0b12584f566e6f17a70c49721"',
+1410 silly get 'last-modified': 'Sat, 26 May 2018 21:57:10 GMT',
+1410 silly get vary: 'Accept-Encoding',
+1410 silly get 'cf-cache-status': 'HIT',
+1410 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1410 silly get server: 'cloudflare',
+1410 silly get 'cf-request-id': '02ddd01baf0000325c4c82b200000001' } ]
+1411 verbose etag https://registry.npmjs.org/delayed-stream from cache
+1412 verbose get saving delayed-stream to /home/christine/.npm/registry.npmjs.org/delayed-stream/.cache.json
+1413 silly resolveWithNewModule delayed-stream@1.0.0 checking installable status
+1414 silly cache add args [ 'delayed-stream@~1.0.0', null ]
+1415 verbose cache add spec delayed-stream@~1.0.0
+1416 silly cache add parsed spec Result {
+1416 silly cache add raw: 'delayed-stream@~1.0.0',
+1416 silly cache add scope: null,
+1416 silly cache add name: 'delayed-stream',
+1416 silly cache add rawSpec: '~1.0.0',
+1416 silly cache add spec: '>=1.0.0 <1.1.0',
+1416 silly cache add type: 'range' }
+1417 silly addNamed delayed-stream@>=1.0.0 <1.1.0
+1418 verbose addNamed ">=1.0.0 <1.1.0" is a valid semver range for delayed-stream
+1419 silly addNameRange { name: 'delayed-stream',
+1419 silly addNameRange range: '>=1.0.0 <1.1.0',
+1419 silly addNameRange hasData: false }
+1420 silly mapToRegistry name delayed-stream
+1421 silly mapToRegistry using default registry
+1422 silly mapToRegistry registry https://registry.npmjs.org/
+1423 silly mapToRegistry uri https://registry.npmjs.org/delayed-stream
+1424 verbose addNameRange registry:https://registry.npmjs.org/delayed-stream not in flight; fetching
+1425 verbose get https://registry.npmjs.org/delayed-stream not expired, no request
+1426 silly addNameRange number 2 { name: 'delayed-stream',
+1426 silly addNameRange range: '>=1.0.0 <1.1.0',
+1426 silly addNameRange hasData: true }
+1427 silly addNameRange versions [ 'delayed-stream',
+1427 silly addNameRange [ '0.0.0',
+1427 silly addNameRange '0.0.1',
+1427 silly addNameRange '0.0.2',
+1427 silly addNameRange '0.0.3',
+1427 silly addNameRange '0.0.4',
+1427 silly addNameRange '0.0.5',
+1427 silly addNameRange '0.0.6',
+1427 silly addNameRange '0.0.7',
+1427 silly addNameRange '1.0.0' ] ]
+1428 silly addNamed delayed-stream@1.0.0
+1429 verbose addNamed "1.0.0" is a plain semver version for delayed-stream
+1430 silly cache afterAdd delayed-stream@1.0.0
+1431 verbose afterAdd /home/christine/.npm/delayed-stream/1.0.0/package/package.json not in flight; writing
+1432 verbose afterAdd /home/christine/.npm/delayed-stream/1.0.0/package/package.json written
+1433 silly fetchNamedPackageData asynckit
+1434 silly mapToRegistry name asynckit
+1435 silly mapToRegistry using default registry
+1436 silly mapToRegistry registry https://registry.npmjs.org/
+1437 silly mapToRegistry uri https://registry.npmjs.org/asynckit
+1438 verbose request uri https://registry.npmjs.org/asynckit
+1439 verbose request no auth needed
+1440 info attempt registry request try #1 at 13:48:57
+1441 verbose etag W/"34349b180d8fff99867769eadfb4b93e"
+1442 verbose lastModified Sat, 26 May 2018 17:31:47 GMT
+1443 http request GET https://registry.npmjs.org/asynckit
+1444 http 304 https://registry.npmjs.org/asynckit
+1445 verbose headers { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1445 verbose headers connection: 'keep-alive',
+1445 verbose headers 'set-cookie':
+1445 verbose headers [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1445 verbose headers 'cf-ray': '59764fa64d096347-FRA',
+1445 verbose headers age: '5354',
+1445 verbose headers 'cache-control': 'public, max-age=300',
+1445 verbose headers etag: '"34349b180d8fff99867769eadfb4b93e"',
+1445 verbose headers 'last-modified': 'Sat, 26 May 2018 17:31:47 GMT',
+1445 verbose headers vary: 'Accept-Encoding',
+1445 verbose headers 'cf-cache-status': 'HIT',
+1445 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1445 verbose headers server: 'cloudflare',
+1445 verbose headers 'cf-request-id': '02ddd01be900006347e88c6200000001' }
+1446 silly get cb [ 304,
+1446 silly get { date: 'Fri, 22 May 2020 11:48:57 GMT',
+1446 silly get connection: 'keep-alive',
+1446 silly get 'set-cookie':
+1446 silly get [ '__cfduid=d2f816bc144e9d07683b5f46095af6dd51590148137; expires=Sun, 21-Jun-20 11:48:57 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1446 silly get 'cf-ray': '59764fa64d096347-FRA',
+1446 silly get age: '5354',
+1446 silly get 'cache-control': 'public, max-age=300',
+1446 silly get etag: '"34349b180d8fff99867769eadfb4b93e"',
+1446 silly get 'last-modified': 'Sat, 26 May 2018 17:31:47 GMT',
+1446 silly get vary: 'Accept-Encoding',
+1446 silly get 'cf-cache-status': 'HIT',
+1446 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1446 silly get server: 'cloudflare',
+1446 silly get 'cf-request-id': '02ddd01be900006347e88c6200000001' } ]
+1447 verbose etag https://registry.npmjs.org/asynckit from cache
+1448 verbose get saving asynckit to /home/christine/.npm/registry.npmjs.org/asynckit/.cache.json
+1449 silly resolveWithNewModule asynckit@0.4.0 checking installable status
+1450 silly cache add args [ 'asynckit@^0.4.0', null ]
+1451 verbose cache add spec asynckit@^0.4.0
+1452 silly cache add parsed spec Result {
+1452 silly cache add raw: 'asynckit@^0.4.0',
+1452 silly cache add scope: null,
+1452 silly cache add name: 'asynckit',
+1452 silly cache add rawSpec: '^0.4.0',
+1452 silly cache add spec: '>=0.4.0 <0.5.0',
+1452 silly cache add type: 'range' }
+1453 silly addNamed asynckit@>=0.4.0 <0.5.0
+1454 verbose addNamed ">=0.4.0 <0.5.0" is a valid semver range for asynckit
+1455 silly addNameRange { name: 'asynckit', range: '>=0.4.0 <0.5.0', hasData: false }
+1456 silly mapToRegistry name asynckit
+1457 silly mapToRegistry using default registry
+1458 silly mapToRegistry registry https://registry.npmjs.org/
+1459 silly mapToRegistry uri https://registry.npmjs.org/asynckit
+1460 verbose addNameRange registry:https://registry.npmjs.org/asynckit not in flight; fetching
+1461 verbose get https://registry.npmjs.org/asynckit not expired, no request
+1462 silly addNameRange number 2 { name: 'asynckit', range: '>=0.4.0 <0.5.0', hasData: true }
+1463 silly addNameRange versions [ 'asynckit', [ '0.1.0', '0.2.0', '0.3.0', '0.4.0' ] ]
+1464 silly addNamed asynckit@0.4.0
+1465 verbose addNamed "0.4.0" is a plain semver version for asynckit
+1466 silly cache afterAdd asynckit@0.4.0
+1467 verbose afterAdd /home/christine/.npm/asynckit/0.4.0/package/package.json not in flight; writing
+1468 verbose afterAdd /home/christine/.npm/asynckit/0.4.0/package/package.json written
+1469 silly fetchNamedPackageData mime-db
+1470 silly mapToRegistry name mime-db
+1471 silly mapToRegistry using default registry
+1472 silly mapToRegistry registry https://registry.npmjs.org/
+1473 silly mapToRegistry uri https://registry.npmjs.org/mime-db
+1474 verbose request uri https://registry.npmjs.org/mime-db
+1475 verbose request no auth needed
+1476 info attempt registry request try #1 at 13:48:57
+1477 verbose etag W/"2b27fd56fd1f376697dd3c190a16cbca"
+1478 verbose lastModified Mon, 06 Jan 2020 03:24:41 GMT
+1479 http request GET https://registry.npmjs.org/mime-db
+1480 http 200 https://registry.npmjs.org/mime-db
+1481 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1481 verbose headers 'content-type': 'application/json',
+1481 verbose headers 'transfer-encoding': 'chunked',
+1481 verbose headers connection: 'keep-alive',
+1481 verbose headers 'set-cookie':
+1481 verbose headers [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1481 verbose headers 'cf-ray': '59764fa68978648b-FRA',
+1481 verbose headers age: '5355',
+1481 verbose headers 'cache-control': 'public, max-age=300',
+1481 verbose headers etag: 'W/"b954c5c9a96f2fe6e200fdac9b6d1184"',
+1481 verbose headers 'last-modified': 'Thu, 23 Apr 2020 00:55:28 GMT',
+1481 verbose headers vary: 'accept-encoding, accept',
+1481 verbose headers 'cf-cache-status': 'HIT',
+1481 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1481 verbose headers server: 'cloudflare',
+1481 verbose headers 'content-encoding': 'gzip',
+1481 verbose headers 'cf-request-id': '02ddd01c160000648bda012200000001' }
+1482 silly get cb [ 200,
+1482 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1482 silly get 'content-type': 'application/json',
+1482 silly get 'transfer-encoding': 'chunked',
+1482 silly get connection: 'keep-alive',
+1482 silly get 'set-cookie':
+1482 silly get [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1482 silly get 'cf-ray': '59764fa68978648b-FRA',
+1482 silly get age: '5355',
+1482 silly get 'cache-control': 'public, max-age=300',
+1482 silly get etag: 'W/"b954c5c9a96f2fe6e200fdac9b6d1184"',
+1482 silly get 'last-modified': 'Thu, 23 Apr 2020 00:55:28 GMT',
+1482 silly get vary: 'accept-encoding, accept',
+1482 silly get 'cf-cache-status': 'HIT',
+1482 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1482 silly get server: 'cloudflare',
+1482 silly get 'content-encoding': 'gzip',
+1482 silly get 'cf-request-id': '02ddd01c160000648bda012200000001' } ]
+1483 verbose get saving mime-db to /home/christine/.npm/registry.npmjs.org/mime-db/.cache.json
+1484 silly resolveWithNewModule mime-db@1.44.0 checking installable status
+1485 silly cache add args [ 'mime-db@1.44.0', null ]
+1486 verbose cache add spec mime-db@1.44.0
+1487 silly cache add parsed spec Result {
+1487 silly cache add raw: 'mime-db@1.44.0',
+1487 silly cache add scope: null,
+1487 silly cache add name: 'mime-db',
+1487 silly cache add rawSpec: '1.44.0',
+1487 silly cache add spec: '1.44.0',
+1487 silly cache add type: 'version' }
+1488 silly addNamed mime-db@1.44.0
+1489 verbose addNamed "1.44.0" is a plain semver version for mime-db
+1490 silly mapToRegistry name mime-db
+1491 silly mapToRegistry using default registry
+1492 silly mapToRegistry registry https://registry.npmjs.org/
+1493 silly mapToRegistry uri https://registry.npmjs.org/mime-db
+1494 verbose addNameVersion registry:https://registry.npmjs.org/mime-db not in flight; fetching
+1495 verbose get https://registry.npmjs.org/mime-db not expired, no request
+1496 silly mapToRegistry name mime-db
+1497 silly mapToRegistry using default registry
+1498 silly mapToRegistry registry https://registry.npmjs.org/
+1499 silly mapToRegistry uri https://registry.npmjs.org/mime-db
+1500 verbose addRemoteTarball https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz not in flight; adding
+1501 verbose addRemoteTarball [ 'https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz',
+1501 verbose addRemoteTarball 'fa11c5eb0aca1334b4233cb4d52f10c5a6272f92' ]
+1502 info retry fetch attempt 1 at 13:48:58
+1503 info attempt registry request try #1 at 13:48:58
+1504 http fetch GET https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz
+1505 http fetch 200 https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz
+1506 silly fetchAndShaCheck shasum fa11c5eb0aca1334b4233cb4d52f10c5a6272f92
+1507 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz not in flight; adding
+1508 verbose addTmpTarball already have metadata; skipping unpack for mime-db@1.44.0
+1509 silly cache afterAdd mime-db@1.44.0
+1510 verbose afterAdd /home/christine/.npm/mime-db/1.44.0/package/package.json not in flight; writing
+1511 verbose afterAdd /home/christine/.npm/mime-db/1.44.0/package/package.json written
+1512 silly fetchNamedPackageData ajv
+1513 silly mapToRegistry name ajv
+1514 silly mapToRegistry using default registry
+1515 silly mapToRegistry registry https://registry.npmjs.org/
+1516 silly mapToRegistry uri https://registry.npmjs.org/ajv
+1517 silly fetchNamedPackageData har-schema
+1518 silly mapToRegistry name har-schema
+1519 silly mapToRegistry using default registry
+1520 silly mapToRegistry registry https://registry.npmjs.org/
+1521 silly mapToRegistry uri https://registry.npmjs.org/har-schema
+1522 verbose request uri https://registry.npmjs.org/har-schema
+1523 verbose request no auth needed
+1524 info attempt registry request try #1 at 13:48:58
+1525 verbose etag W/"63c48c25d01ab9ec3e3fb5fe89f0600c"
+1526 verbose lastModified Tue, 08 Jan 2019 06:13:01 GMT
+1527 http request GET https://registry.npmjs.org/har-schema
+1528 verbose request uri https://registry.npmjs.org/ajv
+1529 verbose request no auth needed
+1530 info attempt registry request try #1 at 13:48:58
+1531 verbose etag W/"da116ce9064cf3ae300f7c5410f85976"
+1532 verbose lastModified Sat, 22 Feb 2020 13:51:53 GMT
+1533 http request GET https://registry.npmjs.org/ajv
+1534 http 304 https://registry.npmjs.org/har-schema
+1535 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1535 verbose headers connection: 'keep-alive',
+1535 verbose headers 'set-cookie':
+1535 verbose headers [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1535 verbose headers 'cf-ray': '59764fa77b11175a-FRA',
+1535 verbose headers age: '5352',
+1535 verbose headers 'cache-control': 'public, max-age=300',
+1535 verbose headers etag: '"63c48c25d01ab9ec3e3fb5fe89f0600c"',
+1535 verbose headers 'last-modified': 'Tue, 08 Jan 2019 06:13:01 GMT',
+1535 verbose headers vary: 'Accept-Encoding',
+1535 verbose headers 'cf-cache-status': 'HIT',
+1535 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1535 verbose headers server: 'cloudflare',
+1535 verbose headers 'cf-request-id': '02ddd01caf0000175a1e21a200000001' }
+1536 silly get cb [ 304,
+1536 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1536 silly get connection: 'keep-alive',
+1536 silly get 'set-cookie':
+1536 silly get [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1536 silly get 'cf-ray': '59764fa77b11175a-FRA',
+1536 silly get age: '5352',
+1536 silly get 'cache-control': 'public, max-age=300',
+1536 silly get etag: '"63c48c25d01ab9ec3e3fb5fe89f0600c"',
+1536 silly get 'last-modified': 'Tue, 08 Jan 2019 06:13:01 GMT',
+1536 silly get vary: 'Accept-Encoding',
+1536 silly get 'cf-cache-status': 'HIT',
+1536 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1536 silly get server: 'cloudflare',
+1536 silly get 'cf-request-id': '02ddd01caf0000175a1e21a200000001' } ]
+1537 verbose etag https://registry.npmjs.org/har-schema from cache
+1538 verbose get saving har-schema to /home/christine/.npm/registry.npmjs.org/har-schema/.cache.json
+1539 silly resolveWithNewModule har-schema@2.0.0 checking installable status
+1540 silly cache add args [ 'har-schema@^2.0.0', null ]
+1541 verbose cache add spec har-schema@^2.0.0
+1542 silly cache add parsed spec Result {
+1542 silly cache add raw: 'har-schema@^2.0.0',
+1542 silly cache add scope: null,
+1542 silly cache add name: 'har-schema',
+1542 silly cache add rawSpec: '^2.0.0',
+1542 silly cache add spec: '>=2.0.0 <3.0.0',
+1542 silly cache add type: 'range' }
+1543 silly addNamed har-schema@>=2.0.0 <3.0.0
+1544 verbose addNamed ">=2.0.0 <3.0.0" is a valid semver range for har-schema
+1545 silly addNameRange { name: 'har-schema', range: '>=2.0.0 <3.0.0', hasData: false }
+1546 silly mapToRegistry name har-schema
+1547 silly mapToRegistry using default registry
+1548 silly mapToRegistry registry https://registry.npmjs.org/
+1549 silly mapToRegistry uri https://registry.npmjs.org/har-schema
+1550 verbose addNameRange registry:https://registry.npmjs.org/har-schema not in flight; fetching
+1551 verbose get https://registry.npmjs.org/har-schema not expired, no request
+1552 silly addNameRange number 2 { name: 'har-schema', range: '>=2.0.0 <3.0.0', hasData: true }
+1553 silly addNameRange versions [ 'har-schema',
+1553 silly addNameRange [ '0.0.1',
+1553 silly addNameRange '0.1.0',
+1553 silly addNameRange '0.2.0',
+1553 silly addNameRange '1.0.0',
+1553 silly addNameRange '1.0.1',
+1553 silly addNameRange '1.0.2',
+1553 silly addNameRange '1.0.3',
+1553 silly addNameRange '1.0.4',
+1553 silly addNameRange '1.0.5',
+1553 silly addNameRange '2.0.0' ] ]
+1554 silly addNamed har-schema@2.0.0
+1555 verbose addNamed "2.0.0" is a plain semver version for har-schema
+1556 silly cache afterAdd har-schema@2.0.0
+1557 verbose afterAdd /home/christine/.npm/har-schema/2.0.0/package/package.json not in flight; writing
+1558 verbose afterAdd /home/christine/.npm/har-schema/2.0.0/package/package.json written
+1559 http 200 https://registry.npmjs.org/ajv
+1560 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1560 verbose headers 'content-type': 'application/json',
+1560 verbose headers 'transfer-encoding': 'chunked',
+1560 verbose headers connection: 'keep-alive',
+1560 verbose headers 'set-cookie':
+1560 verbose headers [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1560 verbose headers 'cf-ray': '59764fa798ddd715-FRA',
+1560 verbose headers age: '5352',
+1560 verbose headers 'cache-control': 'public, max-age=300',
+1560 verbose headers etag: 'W/"ba29f88f088d4acc36748d3083785459"',
+1560 verbose headers 'last-modified': 'Sun, 19 Apr 2020 23:18:27 GMT',
+1560 verbose headers vary: 'accept-encoding, accept',
+1560 verbose headers 'cf-cache-status': 'HIT',
+1560 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1560 verbose headers server: 'cloudflare',
+1560 verbose headers 'content-encoding': 'gzip',
+1560 verbose headers 'cf-request-id': '02ddd01cc30000d715c1209200000001' }
+1561 silly get cb [ 200,
+1561 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1561 silly get 'content-type': 'application/json',
+1561 silly get 'transfer-encoding': 'chunked',
+1561 silly get connection: 'keep-alive',
+1561 silly get 'set-cookie':
+1561 silly get [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1561 silly get 'cf-ray': '59764fa798ddd715-FRA',
+1561 silly get age: '5352',
+1561 silly get 'cache-control': 'public, max-age=300',
+1561 silly get etag: 'W/"ba29f88f088d4acc36748d3083785459"',
+1561 silly get 'last-modified': 'Sun, 19 Apr 2020 23:18:27 GMT',
+1561 silly get vary: 'accept-encoding, accept',
+1561 silly get 'cf-cache-status': 'HIT',
+1561 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1561 silly get server: 'cloudflare',
+1561 silly get 'content-encoding': 'gzip',
+1561 silly get 'cf-request-id': '02ddd01cc30000d715c1209200000001' } ]
+1562 verbose get saving ajv to /home/christine/.npm/registry.npmjs.org/ajv/.cache.json
+1563 silly resolveWithNewModule ajv@6.12.2 checking installable status
+1564 silly cache add args [ 'ajv@^6.5.5', null ]
+1565 verbose cache add spec ajv@^6.5.5
+1566 silly cache add parsed spec Result {
+1566 silly cache add raw: 'ajv@^6.5.5',
+1566 silly cache add scope: null,
+1566 silly cache add name: 'ajv',
+1566 silly cache add rawSpec: '^6.5.5',
+1566 silly cache add spec: '>=6.5.5 <7.0.0',
+1566 silly cache add type: 'range' }
+1567 silly addNamed ajv@>=6.5.5 <7.0.0
+1568 verbose addNamed ">=6.5.5 <7.0.0" is a valid semver range for ajv
+1569 silly addNameRange { name: 'ajv', range: '>=6.5.5 <7.0.0', hasData: false }
+1570 silly mapToRegistry name ajv
+1571 silly mapToRegistry using default registry
+1572 silly mapToRegistry registry https://registry.npmjs.org/
+1573 silly mapToRegistry uri https://registry.npmjs.org/ajv
+1574 verbose addNameRange registry:https://registry.npmjs.org/ajv not in flight; fetching
+1575 verbose get https://registry.npmjs.org/ajv not expired, no request
+1576 silly addNameRange number 2 { name: 'ajv', range: '>=6.5.5 <7.0.0', hasData: true }
+1577 silly addNameRange versions [ 'ajv',
+1577 silly addNameRange [ '0.0.4',
+1577 silly addNameRange '0.0.5',
+1577 silly addNameRange '0.0.6',
+1577 silly addNameRange '0.0.7',
+1577 silly addNameRange '0.0.8',
+1577 silly addNameRange '0.0.9',
+1577 silly addNameRange '0.0.10',
+1577 silly addNameRange '0.0.11',
+1577 silly addNameRange '0.0.12',
+1577 silly addNameRange '0.1.0',
+1577 silly addNameRange '0.1.1',
+1577 silly addNameRange '0.1.2',
+1577 silly addNameRange '0.1.3',
+1577 silly addNameRange '0.1.4',
+1577 silly addNameRange '0.1.5',
+1577 silly addNameRange '0.1.6',
+1577 silly addNameRange '0.1.7',
+1577 silly addNameRange '0.1.8',
+1577 silly addNameRange '0.1.9',
+1577 silly addNameRange '0.1.10',
+1577 silly addNameRange '0.1.11',
+1577 silly addNameRange '0.1.12',
+1577 silly addNameRange '0.1.13',
+1577 silly addNameRange '0.1.14',
+1577 silly addNameRange '0.1.15',
+1577 silly addNameRange '0.1.16',
+1577 silly addNameRange '0.2.0',
+1577 silly addNameRange '0.2.1',
+1577 silly addNameRange '0.2.2',
+1577 silly addNameRange '0.2.3',
+1577 silly addNameRange '0.2.4',
+1577 silly addNameRange '0.2.5',
+1577 silly addNameRange '0.2.6',
+1577 silly addNameRange '0.2.7',
+1577 silly addNameRange '0.2.8',
+1577 silly addNameRange '0.2.9',
+1577 silly addNameRange '0.3.0',
+1577 silly addNameRange '0.3.1',
+1577 silly addNameRange '0.3.2',
+1577 silly addNameRange '0.3.3',
+1577 silly addNameRange '0.3.4',
+1577 silly addNameRange '0.3.5',
+1577 silly addNameRange '0.3.6',
+1577 silly addNameRange '0.3.7',
+1577 silly addNameRange '0.3.8',
+1577 silly addNameRange '0.3.11',
+1577 silly addNameRange '0.3.12',
+1577 silly addNameRange '0.4.0',
+1577 silly addNameRange '0.4.1',
+1577 silly addNameRange '0.4.2',
+1577 silly addNameRange '0.4.3',
+1577 silly addNameRange '0.4.4',
+1577 silly addNameRange '0.4.5',
+1577 silly addNameRange '0.4.6',
+1577 silly addNameRange '0.4.7',
+1577 silly addNameRange '0.4.8',
+1577 silly addNameRange '0.4.9',
+1577 silly addNameRange '0.4.10',
+1577 silly addNameRange '0.4.12',
+1577 silly addNameRange '0.4.14',
+1577 silly addNameRange '0.4.15',
+1577 silly addNameRange '0.5.0',
+1577 silly addNameRange '0.5.2',
+1577 silly addNameRange '0.5.3',
+1577 silly addNameRange '0.5.4',
+1577 silly addNameRange '0.5.5',
+1577 silly addNameRange '0.5.6',
+1577 silly addNameRange '0.5.7',
+1577 silly addNameRange '0.5.8',
+1577 silly addNameRange '0.5.9',
+1577 silly addNameRange '0.5.10',
+1577 silly addNameRange '0.5.11',
+1577 silly addNameRange '0.5.12',
+1577 silly addNameRange '0.6.0',
+1577 silly addNameRange '0.6.1',
+1577 silly addNameRange '0.6.2',
+1577 silly addNameRange '0.6.3',
+1577 silly addNameRange '0.6.4',
+1577 silly addNameRange '0.6.5',
+1577 silly addNameRange '0.6.6',
+1577 silly addNameRange '0.6.7',
+1577 silly addNameRange '0.6.8',
+1577 silly addNameRange '0.6.9',
+1577 silly addNameRange '0.6.10',
+1577 silly addNameRange '0.6.11',
+1577 silly addNameRange '0.6.12',
+1577 silly addNameRange '0.6.13',
+1577 silly addNameRange '0.6.14',
+1577 silly addNameRange '0.6.15',
+1577 silly addNameRange '0.7.0',
+1577 silly addNameRange '0.7.1',
+1577 silly addNameRange '0.7.2',
+1577 silly addNameRange '1.0.0',
+1577 silly addNameRange '1.0.1',
+1577 silly addNameRange '1.1.1',
+1577 silly addNameRange '1.2.0',
+1577 silly addNameRange '1.2.1',
+1577 silly addNameRange '1.3.0',
+1577 silly addNameRange '1.3.1',
+1577 silly addNameRange '1.3.2',
+1577 silly addNameRange ... 185 more items ] ]
+1578 silly addNamed ajv@6.12.2
+1579 verbose addNamed "6.12.2" is a plain semver version for ajv
+1580 silly mapToRegistry name ajv
+1581 silly mapToRegistry using default registry
+1582 silly mapToRegistry registry https://registry.npmjs.org/
+1583 silly mapToRegistry uri https://registry.npmjs.org/ajv
+1584 verbose addRemoteTarball https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz not in flight; adding
+1585 verbose addRemoteTarball [ 'https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz',
+1585 verbose addRemoteTarball 'c629c5eced17baf314437918d2da88c99d5958cd' ]
+1586 info retry fetch attempt 1 at 13:48:58
+1587 info attempt registry request try #1 at 13:48:58
+1588 http fetch GET https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz
+1589 http fetch 200 https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz
+1590 silly fetchAndShaCheck shasum c629c5eced17baf314437918d2da88c99d5958cd
+1591 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/ajv/-/ajv-6.12.2.tgz not in flight; adding
+1592 verbose addTmpTarball already have metadata; skipping unpack for ajv@6.12.2
+1593 silly cache afterAdd ajv@6.12.2
+1594 verbose afterAdd /home/christine/.npm/ajv/6.12.2/package/package.json not in flight; writing
+1595 verbose afterAdd /home/christine/.npm/ajv/6.12.2/package/package.json written
+1596 silly fetchNamedPackageData fast-deep-equal
+1597 silly mapToRegistry name fast-deep-equal
+1598 silly mapToRegistry using default registry
+1599 silly mapToRegistry registry https://registry.npmjs.org/
+1600 silly mapToRegistry uri https://registry.npmjs.org/fast-deep-equal
+1601 silly fetchNamedPackageData fast-json-stable-stringify
+1602 silly mapToRegistry name fast-json-stable-stringify
+1603 silly mapToRegistry using default registry
+1604 silly mapToRegistry registry https://registry.npmjs.org/
+1605 silly mapToRegistry uri https://registry.npmjs.org/fast-json-stable-stringify
+1606 silly fetchNamedPackageData json-schema-traverse
+1607 silly mapToRegistry name json-schema-traverse
+1608 silly mapToRegistry using default registry
+1609 silly mapToRegistry registry https://registry.npmjs.org/
+1610 silly mapToRegistry uri https://registry.npmjs.org/json-schema-traverse
+1611 silly fetchNamedPackageData uri-js
+1612 silly mapToRegistry name uri-js
+1613 silly mapToRegistry using default registry
+1614 silly mapToRegistry registry https://registry.npmjs.org/
+1615 silly mapToRegistry uri https://registry.npmjs.org/uri-js
+1616 verbose request uri https://registry.npmjs.org/fast-deep-equal
+1617 verbose request no auth needed
+1618 info attempt registry request try #1 at 13:48:58
+1619 verbose etag W/"db2dac15e1de3baf39963d09ad4d32a5"
+1620 verbose lastModified Wed, 22 Jan 2020 05:22:55 GMT
+1621 http request GET https://registry.npmjs.org/fast-deep-equal
+1622 verbose request uri https://registry.npmjs.org/json-schema-traverse
+1623 verbose request no auth needed
+1624 info attempt registry request try #1 at 13:48:58
+1625 verbose etag W/"ff9cf4d0fe6dae90110c679f03d42f51"
+1626 verbose lastModified Sun, 10 Jun 2018 08:42:10 GMT
+1627 http request GET https://registry.npmjs.org/json-schema-traverse
+1628 verbose request uri https://registry.npmjs.org/fast-json-stable-stringify
+1629 verbose request no auth needed
+1630 info attempt registry request try #1 at 13:48:58
+1631 verbose etag W/"ae0fff93e18698c6aa2dc573fe85ad0a"
+1632 verbose lastModified Sat, 14 Dec 2019 16:18:01 GMT
+1633 http request GET https://registry.npmjs.org/fast-json-stable-stringify
+1634 verbose request uri https://registry.npmjs.org/uri-js
+1635 verbose request no auth needed
+1636 info attempt registry request try #1 at 13:48:58
+1637 verbose etag W/"98dc8f4198063595fc640811868341b2"
+1638 verbose lastModified Wed, 09 Jan 2019 05:32:41 GMT
+1639 http request GET https://registry.npmjs.org/uri-js
+1640 http 304 https://registry.npmjs.org/fast-deep-equal
+1641 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1641 verbose headers connection: 'keep-alive',
+1641 verbose headers 'set-cookie':
+1641 verbose headers [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1641 verbose headers 'cf-ray': '59764fa919db05bb-FRA',
+1641 verbose headers age: '5351',
+1641 verbose headers 'cache-control': 'public, max-age=300',
+1641 verbose headers etag: '"db2dac15e1de3baf39963d09ad4d32a5"',
+1641 verbose headers 'last-modified': 'Wed, 22 Jan 2020 05:22:55 GMT',
+1641 verbose headers vary: 'Accept-Encoding',
+1641 verbose headers 'cf-cache-status': 'HIT',
+1641 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1641 verbose headers server: 'cloudflare',
+1641 verbose headers 'cf-request-id': '02ddd01db3000005bb0ca9e200000001' }
+1642 silly get cb [ 304,
+1642 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1642 silly get connection: 'keep-alive',
+1642 silly get 'set-cookie':
+1642 silly get [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1642 silly get 'cf-ray': '59764fa919db05bb-FRA',
+1642 silly get age: '5351',
+1642 silly get 'cache-control': 'public, max-age=300',
+1642 silly get etag: '"db2dac15e1de3baf39963d09ad4d32a5"',
+1642 silly get 'last-modified': 'Wed, 22 Jan 2020 05:22:55 GMT',
+1642 silly get vary: 'Accept-Encoding',
+1642 silly get 'cf-cache-status': 'HIT',
+1642 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1642 silly get server: 'cloudflare',
+1642 silly get 'cf-request-id': '02ddd01db3000005bb0ca9e200000001' } ]
+1643 verbose etag https://registry.npmjs.org/fast-deep-equal from cache
+1644 verbose get saving fast-deep-equal to /home/christine/.npm/registry.npmjs.org/fast-deep-equal/.cache.json
+1645 silly resolveWithNewModule fast-deep-equal@3.1.1 checking installable status
+1646 silly cache add args [ 'fast-deep-equal@^3.1.1', null ]
+1647 verbose cache add spec fast-deep-equal@^3.1.1
+1648 silly cache add parsed spec Result {
+1648 silly cache add raw: 'fast-deep-equal@^3.1.1',
+1648 silly cache add scope: null,
+1648 silly cache add name: 'fast-deep-equal',
+1648 silly cache add rawSpec: '^3.1.1',
+1648 silly cache add spec: '>=3.1.1 <4.0.0',
+1648 silly cache add type: 'range' }
+1649 silly addNamed fast-deep-equal@>=3.1.1 <4.0.0
+1650 verbose addNamed ">=3.1.1 <4.0.0" is a valid semver range for fast-deep-equal
+1651 silly addNameRange { name: 'fast-deep-equal',
+1651 silly addNameRange range: '>=3.1.1 <4.0.0',
+1651 silly addNameRange hasData: false }
+1652 silly mapToRegistry name fast-deep-equal
+1653 silly mapToRegistry using default registry
+1654 silly mapToRegistry registry https://registry.npmjs.org/
+1655 silly mapToRegistry uri https://registry.npmjs.org/fast-deep-equal
+1656 verbose addNameRange registry:https://registry.npmjs.org/fast-deep-equal not in flight; fetching
+1657 verbose get https://registry.npmjs.org/fast-deep-equal not expired, no request
+1658 silly addNameRange number 2 { name: 'fast-deep-equal',
+1658 silly addNameRange range: '>=3.1.1 <4.0.0',
+1658 silly addNameRange hasData: true }
+1659 silly addNameRange versions [ 'fast-deep-equal',
+1659 silly addNameRange [ '0.0.1',
+1659 silly addNameRange '0.1.0',
+1659 silly addNameRange '1.0.0',
+1659 silly addNameRange '1.1.0',
+1659 silly addNameRange '2.0.0',
+1659 silly addNameRange '2.0.1',
+1659 silly addNameRange '3.0.0-beta.0',
+1659 silly addNameRange '3.0.0-beta.1',
+1659 silly addNameRange '3.0.0-beta.2',
+1659 silly addNameRange '3.0.0',
+1659 silly addNameRange '3.0.1',
+1659 silly addNameRange '3.1.0',
+1659 silly addNameRange '3.1.1' ] ]
+1660 silly addNamed fast-deep-equal@3.1.1
+1661 verbose addNamed "3.1.1" is a plain semver version for fast-deep-equal
+1662 silly cache afterAdd fast-deep-equal@3.1.1
+1663 verbose afterAdd /home/christine/.npm/fast-deep-equal/3.1.1/package/package.json not in flight; writing
+1664 verbose afterAdd /home/christine/.npm/fast-deep-equal/3.1.1/package/package.json written
+1665 http 304 https://registry.npmjs.org/fast-json-stable-stringify
+1666 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1666 verbose headers connection: 'keep-alive',
+1666 verbose headers 'set-cookie':
+1666 verbose headers [ '__cfduid=d2af9fdb41f2d4571645353fe78c8280d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1666 verbose headers 'cf-ray': '59764fa92ba70eab-FRA',
+1666 verbose headers age: '5351',
+1666 verbose headers 'cache-control': 'public, max-age=300',
+1666 verbose headers etag: '"ae0fff93e18698c6aa2dc573fe85ad0a"',
+1666 verbose headers 'last-modified': 'Sat, 14 Dec 2019 16:18:01 GMT',
+1666 verbose headers vary: 'Accept-Encoding',
+1666 verbose headers 'cf-cache-status': 'HIT',
+1666 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1666 verbose headers server: 'cloudflare',
+1666 verbose headers 'cf-request-id': '02ddd01db900000eabe9180200000001' }
+1667 silly get cb [ 304,
+1667 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1667 silly get connection: 'keep-alive',
+1667 silly get 'set-cookie':
+1667 silly get [ '__cfduid=d2af9fdb41f2d4571645353fe78c8280d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1667 silly get 'cf-ray': '59764fa92ba70eab-FRA',
+1667 silly get age: '5351',
+1667 silly get 'cache-control': 'public, max-age=300',
+1667 silly get etag: '"ae0fff93e18698c6aa2dc573fe85ad0a"',
+1667 silly get 'last-modified': 'Sat, 14 Dec 2019 16:18:01 GMT',
+1667 silly get vary: 'Accept-Encoding',
+1667 silly get 'cf-cache-status': 'HIT',
+1667 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1667 silly get server: 'cloudflare',
+1667 silly get 'cf-request-id': '02ddd01db900000eabe9180200000001' } ]
+1668 verbose etag https://registry.npmjs.org/fast-json-stable-stringify from cache
+1669 verbose get saving fast-json-stable-stringify to /home/christine/.npm/registry.npmjs.org/fast-json-stable-stringify/.cache.json
+1670 silly resolveWithNewModule fast-json-stable-stringify@2.1.0 checking installable status
+1671 silly cache add args [ 'fast-json-stable-stringify@^2.0.0', null ]
+1672 verbose cache add spec fast-json-stable-stringify@^2.0.0
+1673 silly cache add parsed spec Result {
+1673 silly cache add raw: 'fast-json-stable-stringify@^2.0.0',
+1673 silly cache add scope: null,
+1673 silly cache add name: 'fast-json-stable-stringify',
+1673 silly cache add rawSpec: '^2.0.0',
+1673 silly cache add spec: '>=2.0.0 <3.0.0',
+1673 silly cache add type: 'range' }
+1674 silly addNamed fast-json-stable-stringify@>=2.0.0 <3.0.0
+1675 verbose addNamed ">=2.0.0 <3.0.0" is a valid semver range for fast-json-stable-stringify
+1676 silly addNameRange { name: 'fast-json-stable-stringify',
+1676 silly addNameRange range: '>=2.0.0 <3.0.0',
+1676 silly addNameRange hasData: false }
+1677 silly mapToRegistry name fast-json-stable-stringify
+1678 silly mapToRegistry using default registry
+1679 silly mapToRegistry registry https://registry.npmjs.org/
+1680 silly mapToRegistry uri https://registry.npmjs.org/fast-json-stable-stringify
+1681 verbose addNameRange registry:https://registry.npmjs.org/fast-json-stable-stringify not in flight; fetching
+1682 http 304 https://registry.npmjs.org/json-schema-traverse
+1683 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1683 verbose headers connection: 'keep-alive',
+1683 verbose headers 'set-cookie':
+1683 verbose headers [ '__cfduid=d3221de8ef62ba021521e3facdf4646ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1683 verbose headers 'cf-ray': '59764fa928dbd6e1-FRA',
+1683 verbose headers age: '5351',
+1683 verbose headers 'cache-control': 'public, max-age=300',
+1683 verbose headers etag: '"ff9cf4d0fe6dae90110c679f03d42f51"',
+1683 verbose headers 'last-modified': 'Sun, 10 Jun 2018 08:42:10 GMT',
+1683 verbose headers vary: 'Accept-Encoding',
+1683 verbose headers 'cf-cache-status': 'HIT',
+1683 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1683 verbose headers server: 'cloudflare',
+1683 verbose headers 'cf-request-id': '02ddd01db80000d6e132393200000001' }
+1684 silly get cb [ 304,
+1684 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1684 silly get connection: 'keep-alive',
+1684 silly get 'set-cookie':
+1684 silly get [ '__cfduid=d3221de8ef62ba021521e3facdf4646ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1684 silly get 'cf-ray': '59764fa928dbd6e1-FRA',
+1684 silly get age: '5351',
+1684 silly get 'cache-control': 'public, max-age=300',
+1684 silly get etag: '"ff9cf4d0fe6dae90110c679f03d42f51"',
+1684 silly get 'last-modified': 'Sun, 10 Jun 2018 08:42:10 GMT',
+1684 silly get vary: 'Accept-Encoding',
+1684 silly get 'cf-cache-status': 'HIT',
+1684 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1684 silly get server: 'cloudflare',
+1684 silly get 'cf-request-id': '02ddd01db80000d6e132393200000001' } ]
+1685 verbose etag https://registry.npmjs.org/json-schema-traverse from cache
+1686 verbose get saving json-schema-traverse to /home/christine/.npm/registry.npmjs.org/json-schema-traverse/.cache.json
+1687 http 304 https://registry.npmjs.org/uri-js
+1688 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1688 verbose headers connection: 'keep-alive',
+1688 verbose headers 'set-cookie':
+1688 verbose headers [ '__cfduid=daac5443483b19b682dfd1142d78174b81590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1688 verbose headers 'cf-ray': '59764fa92aaec2f9-FRA',
+1688 verbose headers age: '5351',
+1688 verbose headers 'cache-control': 'public, max-age=300',
+1688 verbose headers etag: '"98dc8f4198063595fc640811868341b2"',
+1688 verbose headers 'last-modified': 'Wed, 09 Jan 2019 05:32:41 GMT',
+1688 verbose headers vary: 'Accept-Encoding',
+1688 verbose headers 'cf-cache-status': 'HIT',
+1688 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1688 verbose headers server: 'cloudflare',
+1688 verbose headers 'cf-request-id': '02ddd01db90000c2f92609d200000001' }
+1689 silly get cb [ 304,
+1689 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1689 silly get connection: 'keep-alive',
+1689 silly get 'set-cookie':
+1689 silly get [ '__cfduid=daac5443483b19b682dfd1142d78174b81590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1689 silly get 'cf-ray': '59764fa92aaec2f9-FRA',
+1689 silly get age: '5351',
+1689 silly get 'cache-control': 'public, max-age=300',
+1689 silly get etag: '"98dc8f4198063595fc640811868341b2"',
+1689 silly get 'last-modified': 'Wed, 09 Jan 2019 05:32:41 GMT',
+1689 silly get vary: 'Accept-Encoding',
+1689 silly get 'cf-cache-status': 'HIT',
+1689 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1689 silly get server: 'cloudflare',
+1689 silly get 'cf-request-id': '02ddd01db90000c2f92609d200000001' } ]
+1690 verbose etag https://registry.npmjs.org/uri-js from cache
+1691 verbose get saving uri-js to /home/christine/.npm/registry.npmjs.org/uri-js/.cache.json
+1692 verbose get https://registry.npmjs.org/fast-json-stable-stringify not expired, no request
+1693 silly addNameRange number 2 { name: 'fast-json-stable-stringify',
+1693 silly addNameRange range: '>=2.0.0 <3.0.0',
+1693 silly addNameRange hasData: true }
+1694 silly addNameRange versions [ 'fast-json-stable-stringify', [ '1.0.2', '2.0.0', '2.1.0' ] ]
+1695 silly addNamed fast-json-stable-stringify@2.1.0
+1696 verbose addNamed "2.1.0" is a plain semver version for fast-json-stable-stringify
+1697 silly resolveWithNewModule json-schema-traverse@0.4.1 checking installable status
+1698 silly cache add args [ 'json-schema-traverse@^0.4.1', null ]
+1699 verbose cache add spec json-schema-traverse@^0.4.1
+1700 silly cache add parsed spec Result {
+1700 silly cache add raw: 'json-schema-traverse@^0.4.1',
+1700 silly cache add scope: null,
+1700 silly cache add name: 'json-schema-traverse',
+1700 silly cache add rawSpec: '^0.4.1',
+1700 silly cache add spec: '>=0.4.1 <0.5.0',
+1700 silly cache add type: 'range' }
+1701 silly addNamed json-schema-traverse@>=0.4.1 <0.5.0
+1702 verbose addNamed ">=0.4.1 <0.5.0" is a valid semver range for json-schema-traverse
+1703 silly addNameRange { name: 'json-schema-traverse',
+1703 silly addNameRange range: '>=0.4.1 <0.5.0',
+1703 silly addNameRange hasData: false }
+1704 silly mapToRegistry name json-schema-traverse
+1705 silly mapToRegistry using default registry
+1706 silly mapToRegistry registry https://registry.npmjs.org/
+1707 silly mapToRegistry uri https://registry.npmjs.org/json-schema-traverse
+1708 verbose addNameRange registry:https://registry.npmjs.org/json-schema-traverse not in flight; fetching
+1709 silly resolveWithNewModule uri-js@4.2.2 checking installable status
+1710 silly cache add args [ 'uri-js@^4.2.2', null ]
+1711 verbose cache add spec uri-js@^4.2.2
+1712 silly cache add parsed spec Result {
+1712 silly cache add raw: 'uri-js@^4.2.2',
+1712 silly cache add scope: null,
+1712 silly cache add name: 'uri-js',
+1712 silly cache add rawSpec: '^4.2.2',
+1712 silly cache add spec: '>=4.2.2 <5.0.0',
+1712 silly cache add type: 'range' }
+1713 silly addNamed uri-js@>=4.2.2 <5.0.0
+1714 verbose addNamed ">=4.2.2 <5.0.0" is a valid semver range for uri-js
+1715 silly addNameRange { name: 'uri-js', range: '>=4.2.2 <5.0.0', hasData: false }
+1716 silly mapToRegistry name uri-js
+1717 silly mapToRegistry using default registry
+1718 silly mapToRegistry registry https://registry.npmjs.org/
+1719 silly mapToRegistry uri https://registry.npmjs.org/uri-js
+1720 verbose addNameRange registry:https://registry.npmjs.org/uri-js not in flight; fetching
+1721 verbose get https://registry.npmjs.org/json-schema-traverse not expired, no request
+1722 silly addNameRange number 2 { name: 'json-schema-traverse',
+1722 silly addNameRange range: '>=0.4.1 <0.5.0',
+1722 silly addNameRange hasData: true }
+1723 silly addNameRange versions [ 'json-schema-traverse',
+1723 silly addNameRange [ '0.0.1', '0.1.0', '0.2.0', '0.3.0', '0.3.1', '0.4.0', '0.4.1' ] ]
+1724 silly addNamed json-schema-traverse@0.4.1
+1725 verbose addNamed "0.4.1" is a plain semver version for json-schema-traverse
+1726 verbose get https://registry.npmjs.org/uri-js not expired, no request
+1727 silly addNameRange number 2 { name: 'uri-js', range: '>=4.2.2 <5.0.0', hasData: true }
+1728 silly addNameRange versions [ 'uri-js',
+1728 silly addNameRange [ '1.4.0',
+1728 silly addNameRange '1.4.2',
+1728 silly addNameRange '2.0.0',
+1728 silly addNameRange '2.1.0',
+1728 silly addNameRange '2.1.1',
+1728 silly addNameRange '3.0.0',
+1728 silly addNameRange '3.0.1',
+1728 silly addNameRange '3.0.2',
+1728 silly addNameRange '4.2.0',
+1728 silly addNameRange '4.2.1',
+1728 silly addNameRange '4.2.2' ] ]
+1729 silly addNamed uri-js@4.2.2
+1730 verbose addNamed "4.2.2" is a plain semver version for uri-js
+1731 silly cache afterAdd fast-json-stable-stringify@2.1.0
+1732 verbose afterAdd /home/christine/.npm/fast-json-stable-stringify/2.1.0/package/package.json not in flight; writing
+1733 verbose afterAdd /home/christine/.npm/fast-json-stable-stringify/2.1.0/package/package.json written
+1734 silly cache afterAdd json-schema-traverse@0.4.1
+1735 verbose afterAdd /home/christine/.npm/json-schema-traverse/0.4.1/package/package.json not in flight; writing
+1736 silly cache afterAdd uri-js@4.2.2
+1737 verbose afterAdd /home/christine/.npm/uri-js/4.2.2/package/package.json not in flight; writing
+1738 verbose afterAdd /home/christine/.npm/json-schema-traverse/0.4.1/package/package.json written
+1739 verbose afterAdd /home/christine/.npm/uri-js/4.2.2/package/package.json written
+1740 silly fetchNamedPackageData punycode
+1741 silly mapToRegistry name punycode
+1742 silly mapToRegistry using default registry
+1743 silly mapToRegistry registry https://registry.npmjs.org/
+1744 silly mapToRegistry uri https://registry.npmjs.org/punycode
+1745 verbose request uri https://registry.npmjs.org/punycode
+1746 verbose request no auth needed
+1747 info attempt registry request try #1 at 13:48:58
+1748 verbose etag W/"27ef686d9a29403de9242fe625c85934"
+1749 verbose lastModified Sun, 27 May 2018 13:11:15 GMT
+1750 http request GET https://registry.npmjs.org/punycode
+1751 http 304 https://registry.npmjs.org/punycode
+1752 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1752 verbose headers connection: 'keep-alive',
+1752 verbose headers 'set-cookie':
+1752 verbose headers [ '__cfduid=d27785e001b27740005b62566f67820581590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1752 verbose headers 'cf-ray': '59764fa969ce1772-FRA',
+1752 verbose headers age: '5655',
+1752 verbose headers 'cache-control': 'public, max-age=300',
+1752 verbose headers etag: '"27ef686d9a29403de9242fe625c85934"',
+1752 verbose headers 'last-modified': 'Sun, 27 May 2018 13:11:15 GMT',
+1752 verbose headers vary: 'Accept-Encoding',
+1752 verbose headers 'cf-cache-status': 'HIT',
+1752 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1752 verbose headers server: 'cloudflare',
+1752 verbose headers 'cf-request-id': '02ddd01de4000017726419b200000001' }
+1753 silly get cb [ 304,
+1753 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1753 silly get connection: 'keep-alive',
+1753 silly get 'set-cookie':
+1753 silly get [ '__cfduid=d27785e001b27740005b62566f67820581590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1753 silly get 'cf-ray': '59764fa969ce1772-FRA',
+1753 silly get age: '5655',
+1753 silly get 'cache-control': 'public, max-age=300',
+1753 silly get etag: '"27ef686d9a29403de9242fe625c85934"',
+1753 silly get 'last-modified': 'Sun, 27 May 2018 13:11:15 GMT',
+1753 silly get vary: 'Accept-Encoding',
+1753 silly get 'cf-cache-status': 'HIT',
+1753 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1753 silly get server: 'cloudflare',
+1753 silly get 'cf-request-id': '02ddd01de4000017726419b200000001' } ]
+1754 verbose etag https://registry.npmjs.org/punycode from cache
+1755 verbose get saving punycode to /home/christine/.npm/registry.npmjs.org/punycode/.cache.json
+1756 silly resolveWithNewModule punycode@2.1.1 checking installable status
+1757 silly cache add args [ 'punycode@^2.1.0', null ]
+1758 verbose cache add spec punycode@^2.1.0
+1759 silly cache add parsed spec Result {
+1759 silly cache add raw: 'punycode@^2.1.0',
+1759 silly cache add scope: null,
+1759 silly cache add name: 'punycode',
+1759 silly cache add rawSpec: '^2.1.0',
+1759 silly cache add spec: '>=2.1.0 <3.0.0',
+1759 silly cache add type: 'range' }
+1760 silly addNamed punycode@>=2.1.0 <3.0.0
+1761 verbose addNamed ">=2.1.0 <3.0.0" is a valid semver range for punycode
+1762 silly addNameRange { name: 'punycode', range: '>=2.1.0 <3.0.0', hasData: false }
+1763 silly mapToRegistry name punycode
+1764 silly mapToRegistry using default registry
+1765 silly mapToRegistry registry https://registry.npmjs.org/
+1766 silly mapToRegistry uri https://registry.npmjs.org/punycode
+1767 verbose addNameRange registry:https://registry.npmjs.org/punycode not in flight; fetching
+1768 verbose get https://registry.npmjs.org/punycode not expired, no request
+1769 silly addNameRange number 2 { name: 'punycode', range: '>=2.1.0 <3.0.0', hasData: true }
+1770 silly addNameRange versions [ 'punycode',
+1770 silly addNameRange [ '0.0.1',
+1770 silly addNameRange '0.0.2',
+1770 silly addNameRange '0.0.1337',
+1770 silly addNameRange '0.1.0',
+1770 silly addNameRange '0.1.1',
+1770 silly addNameRange '0.1.2',
+1770 silly addNameRange '0.2.0',
+1770 silly addNameRange '0.2.1',
+1770 silly addNameRange '0.2.2',
+1770 silly addNameRange '0.3.0',
+1770 silly addNameRange '1.0.0',
+1770 silly addNameRange '1.1.0',
+1770 silly addNameRange '1.1.1',
+1770 silly addNameRange '1.2.0',
+1770 silly addNameRange '1.2.1',
+1770 silly addNameRange '1.2.2',
+1770 silly addNameRange '1.2.3',
+1770 silly addNameRange '1.2.4',
+1770 silly addNameRange '1.3.0',
+1770 silly addNameRange '1.3.1',
+1770 silly addNameRange '1.3.2',
+1770 silly addNameRange '1.4.0',
+1770 silly addNameRange '1.4.1',
+1770 silly addNameRange '2.0.0',
+1770 silly addNameRange '2.0.1',
+1770 silly addNameRange '2.1.0',
+1770 silly addNameRange '2.1.1' ] ]
+1771 silly addNamed punycode@2.1.1
+1772 verbose addNamed "2.1.1" is a plain semver version for punycode
+1773 silly cache afterAdd punycode@2.1.1
+1774 verbose afterAdd /home/christine/.npm/punycode/2.1.1/package/package.json not in flight; writing
+1775 verbose afterAdd /home/christine/.npm/punycode/2.1.1/package/package.json written
+1776 silly fetchNamedPackageData assert-plus
+1777 silly mapToRegistry name assert-plus
+1778 silly mapToRegistry using default registry
+1779 silly mapToRegistry registry https://registry.npmjs.org/
+1780 silly mapToRegistry uri https://registry.npmjs.org/assert-plus
+1781 silly fetchNamedPackageData jsprim
+1782 silly mapToRegistry name jsprim
+1783 silly mapToRegistry using default registry
+1784 silly mapToRegistry registry https://registry.npmjs.org/
+1785 silly mapToRegistry uri https://registry.npmjs.org/jsprim
+1786 silly fetchNamedPackageData sshpk
+1787 silly mapToRegistry name sshpk
+1788 silly mapToRegistry using default registry
+1789 silly mapToRegistry registry https://registry.npmjs.org/
+1790 silly mapToRegistry uri https://registry.npmjs.org/sshpk
+1791 verbose request uri https://registry.npmjs.org/assert-plus
+1792 verbose request no auth needed
+1793 info attempt registry request try #1 at 13:48:58
+1794 verbose etag W/"5f1c38f02647d4e0324c53fe90ea160c"
+1795 verbose lastModified Fri, 13 Dec 2019 16:32:10 GMT
+1796 http request GET https://registry.npmjs.org/assert-plus
+1797 verbose request uri https://registry.npmjs.org/jsprim
+1798 verbose request no auth needed
+1799 info attempt registry request try #1 at 13:48:58
+1800 verbose etag W/"ec307a0d291a7abbcabe4ca63c75468e"
+1801 verbose lastModified Fri, 13 Dec 2019 16:32:36 GMT
+1802 http request GET https://registry.npmjs.org/jsprim
+1803 verbose request uri https://registry.npmjs.org/sshpk
+1804 verbose request no auth needed
+1805 info attempt registry request try #1 at 13:48:58
+1806 verbose etag W/"e8e015112a9fbc16cc4a367405b14614"
+1807 verbose lastModified Fri, 13 Dec 2019 16:33:04 GMT
+1808 http request GET https://registry.npmjs.org/sshpk
+1809 http 200 https://registry.npmjs.org/assert-plus
+1810 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1810 verbose headers 'content-type': 'application/json',
+1810 verbose headers 'transfer-encoding': 'chunked',
+1810 verbose headers connection: 'keep-alive',
+1810 verbose headers 'set-cookie':
+1810 verbose headers [ '__cfduid=d7b1200d8018131cb680b33099b4da6111590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1810 verbose headers 'cf-ray': '59764fa9af0505e9-FRA',
+1810 verbose headers age: '5654',
+1810 verbose headers 'cache-control': 'public, max-age=300',
+1810 verbose headers etag: 'W/"a6e598834cba689561f3d676e817bde6"',
+1810 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT',
+1810 verbose headers vary: 'accept-encoding, accept',
+1810 verbose headers 'cf-cache-status': 'HIT',
+1810 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1810 verbose headers server: 'cloudflare',
+1810 verbose headers 'content-encoding': 'gzip',
+1810 verbose headers 'cf-request-id': '02ddd01e0b000005e903b57200000001' }
+1811 silly get cb [ 200,
+1811 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1811 silly get 'content-type': 'application/json',
+1811 silly get 'transfer-encoding': 'chunked',
+1811 silly get connection: 'keep-alive',
+1811 silly get 'set-cookie':
+1811 silly get [ '__cfduid=d7b1200d8018131cb680b33099b4da6111590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1811 silly get 'cf-ray': '59764fa9af0505e9-FRA',
+1811 silly get age: '5654',
+1811 silly get 'cache-control': 'public, max-age=300',
+1811 silly get etag: 'W/"a6e598834cba689561f3d676e817bde6"',
+1811 silly get 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT',
+1811 silly get vary: 'accept-encoding, accept',
+1811 silly get 'cf-cache-status': 'HIT',
+1811 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1811 silly get server: 'cloudflare',
+1811 silly get 'content-encoding': 'gzip',
+1811 silly get 'cf-request-id': '02ddd01e0b000005e903b57200000001' } ]
+1812 verbose get saving assert-plus to /home/christine/.npm/registry.npmjs.org/assert-plus/.cache.json
+1813 silly resolveWithNewModule assert-plus@1.0.0 checking installable status
+1814 silly cache add args [ 'assert-plus@^1.0.0', null ]
+1815 verbose cache add spec assert-plus@^1.0.0
+1816 silly cache add parsed spec Result {
+1816 silly cache add raw: 'assert-plus@^1.0.0',
+1816 silly cache add scope: null,
+1816 silly cache add name: 'assert-plus',
+1816 silly cache add rawSpec: '^1.0.0',
+1816 silly cache add spec: '>=1.0.0 <2.0.0',
+1816 silly cache add type: 'range' }
+1817 silly addNamed assert-plus@>=1.0.0 <2.0.0
+1818 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for assert-plus
+1819 silly addNameRange { name: 'assert-plus', range: '>=1.0.0 <2.0.0', hasData: false }
+1820 silly mapToRegistry name assert-plus
+1821 silly mapToRegistry using default registry
+1822 silly mapToRegistry registry https://registry.npmjs.org/
+1823 silly mapToRegistry uri https://registry.npmjs.org/assert-plus
+1824 verbose addNameRange registry:https://registry.npmjs.org/assert-plus not in flight; fetching
+1825 verbose get https://registry.npmjs.org/assert-plus not expired, no request
+1826 silly addNameRange number 2 { name: 'assert-plus', range: '>=1.0.0 <2.0.0', hasData: true }
+1827 silly addNameRange versions [ 'assert-plus',
+1827 silly addNameRange [ '0.1.0',
+1827 silly addNameRange '0.1.1',
+1827 silly addNameRange '0.1.2',
+1827 silly addNameRange '0.1.3',
+1827 silly addNameRange '0.1.4',
+1827 silly addNameRange '0.1.5',
+1827 silly addNameRange '0.2.0',
+1827 silly addNameRange '1.0.0' ] ]
+1828 silly addNamed assert-plus@1.0.0
+1829 verbose addNamed "1.0.0" is a plain semver version for assert-plus
+1830 silly cache afterAdd assert-plus@1.0.0
+1831 verbose afterAdd /home/christine/.npm/assert-plus/1.0.0/package/package.json not in flight; writing
+1832 verbose afterAdd /home/christine/.npm/assert-plus/1.0.0/package/package.json written
+1833 http 200 https://registry.npmjs.org/jsprim
+1834 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1834 verbose headers 'content-type': 'application/json',
+1834 verbose headers 'transfer-encoding': 'chunked',
+1834 verbose headers connection: 'keep-alive',
+1834 verbose headers 'set-cookie':
+1834 verbose headers [ '__cfduid=d570054c58525c9612ff8b11e8fa974871590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1834 verbose headers 'cf-ray': '59764fa9bc0d176a-FRA',
+1834 verbose headers age: '5654',
+1834 verbose headers 'cache-control': 'public, max-age=300',
+1834 verbose headers etag: 'W/"64e1b4713c2eacf5f810b5a6ad366cd9"',
+1834 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:51 GMT',
+1834 verbose headers vary: 'accept-encoding, accept',
+1834 verbose headers 'cf-cache-status': 'HIT',
+1834 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1834 verbose headers server: 'cloudflare',
+1834 verbose headers 'content-encoding': 'gzip',
+1834 verbose headers 'cf-request-id': '02ddd01e100000176a65ba5200000001' }
+1835 silly get cb [ 200,
+1835 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1835 silly get 'content-type': 'application/json',
+1835 silly get 'transfer-encoding': 'chunked',
+1835 silly get connection: 'keep-alive',
+1835 silly get 'set-cookie':
+1835 silly get [ '__cfduid=d570054c58525c9612ff8b11e8fa974871590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1835 silly get 'cf-ray': '59764fa9bc0d176a-FRA',
+1835 silly get age: '5654',
+1835 silly get 'cache-control': 'public, max-age=300',
+1835 silly get etag: 'W/"64e1b4713c2eacf5f810b5a6ad366cd9"',
+1835 silly get 'last-modified': 'Wed, 06 May 2020 14:47:51 GMT',
+1835 silly get vary: 'accept-encoding, accept',
+1835 silly get 'cf-cache-status': 'HIT',
+1835 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1835 silly get server: 'cloudflare',
+1835 silly get 'content-encoding': 'gzip',
+1835 silly get 'cf-request-id': '02ddd01e100000176a65ba5200000001' } ]
+1836 verbose get saving jsprim to /home/christine/.npm/registry.npmjs.org/jsprim/.cache.json
+1837 silly resolveWithNewModule jsprim@1.4.1 checking installable status
+1838 silly cache add args [ 'jsprim@^1.2.2', null ]
+1839 verbose cache add spec jsprim@^1.2.2
+1840 silly cache add parsed spec Result {
+1840 silly cache add raw: 'jsprim@^1.2.2',
+1840 silly cache add scope: null,
+1840 silly cache add name: 'jsprim',
+1840 silly cache add rawSpec: '^1.2.2',
+1840 silly cache add spec: '>=1.2.2 <2.0.0',
+1840 silly cache add type: 'range' }
+1841 silly addNamed jsprim@>=1.2.2 <2.0.0
+1842 verbose addNamed ">=1.2.2 <2.0.0" is a valid semver range for jsprim
+1843 silly addNameRange { name: 'jsprim', range: '>=1.2.2 <2.0.0', hasData: false }
+1844 silly mapToRegistry name jsprim
+1845 silly mapToRegistry using default registry
+1846 silly mapToRegistry registry https://registry.npmjs.org/
+1847 silly mapToRegistry uri https://registry.npmjs.org/jsprim
+1848 verbose addNameRange registry:https://registry.npmjs.org/jsprim not in flight; fetching
+1849 verbose get https://registry.npmjs.org/jsprim not expired, no request
+1850 silly addNameRange number 2 { name: 'jsprim', range: '>=1.2.2 <2.0.0', hasData: true }
+1851 silly addNameRange versions [ 'jsprim',
+1851 silly addNameRange [ '0.0.1',
+1851 silly addNameRange '0.0.2',
+1851 silly addNameRange '0.0.3',
+1851 silly addNameRange '0.0.4',
+1851 silly addNameRange '0.0.5',
+1851 silly addNameRange '0.1.0',
+1851 silly addNameRange '0.2.0',
+1851 silly addNameRange '0.3.0',
+1851 silly addNameRange '0.3.1',
+1851 silly addNameRange '0.4.0',
+1851 silly addNameRange '0.5.0',
+1851 silly addNameRange '0.5.1',
+1851 silly addNameRange '0.6.0',
+1851 silly addNameRange '0.6.1',
+1851 silly addNameRange '0.7.0',
+1851 silly addNameRange '0.8.0',
+1851 silly addNameRange '1.0.0',
+1851 silly addNameRange '1.1.0',
+1851 silly addNameRange '1.2.0',
+1851 silly addNameRange '1.2.1',
+1851 silly addNameRange '1.2.2',
+1851 silly addNameRange '1.3.0',
+1851 silly addNameRange '1.3.1',
+1851 silly addNameRange '1.4.0',
+1851 silly addNameRange '1.4.1',
+1851 silly addNameRange '2.0.0' ] ]
+1852 silly addNamed jsprim@1.4.1
+1853 verbose addNamed "1.4.1" is a plain semver version for jsprim
+1854 http 200 https://registry.npmjs.org/sshpk
+1855 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1855 verbose headers 'content-type': 'application/json',
+1855 verbose headers 'transfer-encoding': 'chunked',
+1855 verbose headers connection: 'keep-alive',
+1855 verbose headers 'set-cookie':
+1855 verbose headers [ '__cfduid=def5a536cfc1c142382a82585aa4561c11590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1855 verbose headers 'cf-ray': '59764fa9bc65dfbb-FRA',
+1855 verbose headers age: '5654',
+1855 verbose headers 'cache-control': 'public, max-age=300',
+1855 verbose headers etag: 'W/"4bb612bfd8ff73b94a8861a146b38953"',
+1855 verbose headers 'last-modified': 'Wed, 06 May 2020 14:48:13 GMT',
+1855 verbose headers vary: 'accept-encoding, accept',
+1855 verbose headers 'cf-cache-status': 'HIT',
+1855 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1855 verbose headers server: 'cloudflare',
+1855 verbose headers 'content-encoding': 'gzip',
+1855 verbose headers 'cf-request-id': '02ddd01e100000dfbb5fae5200000001' }
+1856 silly get cb [ 200,
+1856 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1856 silly get 'content-type': 'application/json',
+1856 silly get 'transfer-encoding': 'chunked',
+1856 silly get connection: 'keep-alive',
+1856 silly get 'set-cookie':
+1856 silly get [ '__cfduid=def5a536cfc1c142382a82585aa4561c11590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1856 silly get 'cf-ray': '59764fa9bc65dfbb-FRA',
+1856 silly get age: '5654',
+1856 silly get 'cache-control': 'public, max-age=300',
+1856 silly get etag: 'W/"4bb612bfd8ff73b94a8861a146b38953"',
+1856 silly get 'last-modified': 'Wed, 06 May 2020 14:48:13 GMT',
+1856 silly get vary: 'accept-encoding, accept',
+1856 silly get 'cf-cache-status': 'HIT',
+1856 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1856 silly get server: 'cloudflare',
+1856 silly get 'content-encoding': 'gzip',
+1856 silly get 'cf-request-id': '02ddd01e100000dfbb5fae5200000001' } ]
+1857 verbose get saving sshpk to /home/christine/.npm/registry.npmjs.org/sshpk/.cache.json
+1858 silly cache afterAdd jsprim@1.4.1
+1859 verbose afterAdd /home/christine/.npm/jsprim/1.4.1/package/package.json not in flight; writing
+1860 silly resolveWithNewModule sshpk@1.16.1 checking installable status
+1861 silly cache add args [ 'sshpk@^1.7.0', null ]
+1862 verbose cache add spec sshpk@^1.7.0
+1863 silly cache add parsed spec Result {
+1863 silly cache add raw: 'sshpk@^1.7.0',
+1863 silly cache add scope: null,
+1863 silly cache add name: 'sshpk',
+1863 silly cache add rawSpec: '^1.7.0',
+1863 silly cache add spec: '>=1.7.0 <2.0.0',
+1863 silly cache add type: 'range' }
+1864 silly addNamed sshpk@>=1.7.0 <2.0.0
+1865 verbose addNamed ">=1.7.0 <2.0.0" is a valid semver range for sshpk
+1866 silly addNameRange { name: 'sshpk', range: '>=1.7.0 <2.0.0', hasData: false }
+1867 silly mapToRegistry name sshpk
+1868 silly mapToRegistry using default registry
+1869 silly mapToRegistry registry https://registry.npmjs.org/
+1870 silly mapToRegistry uri https://registry.npmjs.org/sshpk
+1871 verbose addNameRange registry:https://registry.npmjs.org/sshpk not in flight; fetching
+1872 verbose afterAdd /home/christine/.npm/jsprim/1.4.1/package/package.json written
+1873 verbose get https://registry.npmjs.org/sshpk not expired, no request
+1874 silly addNameRange number 2 { name: 'sshpk', range: '>=1.7.0 <2.0.0', hasData: true }
+1875 silly addNameRange versions [ 'sshpk',
+1875 silly addNameRange [ '1.0.0',
+1875 silly addNameRange '1.0.1',
+1875 silly addNameRange '1.0.2',
+1875 silly addNameRange '1.0.3',
+1875 silly addNameRange '1.0.4',
+1875 silly addNameRange '1.1.0',
+1875 silly addNameRange '1.2.0',
+1875 silly addNameRange '1.2.1',
+1875 silly addNameRange '1.3.0',
+1875 silly addNameRange '1.4.0',
+1875 silly addNameRange '1.4.1',
+1875 silly addNameRange '1.4.2',
+1875 silly addNameRange '1.4.3',
+1875 silly addNameRange '1.4.4',
+1875 silly addNameRange '1.4.5',
+1875 silly addNameRange '1.4.6',
+1875 silly addNameRange '1.4.7',
+1875 silly addNameRange '1.5.0',
+1875 silly addNameRange '1.5.1',
+1875 silly addNameRange '1.6.0',
+1875 silly addNameRange '1.6.1',
+1875 silly addNameRange '1.6.2',
+1875 silly addNameRange '1.7.0',
+1875 silly addNameRange '1.7.1',
+1875 silly addNameRange '1.7.2',
+1875 silly addNameRange '1.7.3',
+1875 silly addNameRange '1.7.4',
+1875 silly addNameRange '1.8.0',
+1875 silly addNameRange '1.8.1',
+1875 silly addNameRange '1.8.2',
+1875 silly addNameRange '1.8.3',
+1875 silly addNameRange '1.9.0',
+1875 silly addNameRange '1.9.1',
+1875 silly addNameRange '1.9.2',
+1875 silly addNameRange '1.10.0',
+1875 silly addNameRange '1.10.1',
+1875 silly addNameRange '1.10.2',
+1875 silly addNameRange '1.11.0',
+1875 silly addNameRange '1.13.0',
+1875 silly addNameRange '1.13.1',
+1875 silly addNameRange '1.13.2',
+1875 silly addNameRange '1.14.1',
+1875 silly addNameRange '1.14.2',
+1875 silly addNameRange '1.15.0',
+1875 silly addNameRange '1.15.1',
+1875 silly addNameRange '1.15.2',
+1875 silly addNameRange '1.16.0',
+1875 silly addNameRange '1.16.1' ] ]
+1876 silly addNamed sshpk@1.16.1
+1877 verbose addNamed "1.16.1" is a plain semver version for sshpk
+1878 silly cache afterAdd sshpk@1.16.1
+1879 verbose afterAdd /home/christine/.npm/sshpk/1.16.1/package/package.json not in flight; writing
+1880 verbose afterAdd /home/christine/.npm/sshpk/1.16.1/package/package.json written
+1881 silly fetchNamedPackageData extsprintf
+1882 silly mapToRegistry name extsprintf
+1883 silly mapToRegistry using default registry
+1884 silly mapToRegistry registry https://registry.npmjs.org/
+1885 silly mapToRegistry uri https://registry.npmjs.org/extsprintf
+1886 silly fetchNamedPackageData json-schema
+1887 silly mapToRegistry name json-schema
+1888 silly mapToRegistry using default registry
+1889 silly mapToRegistry registry https://registry.npmjs.org/
+1890 silly mapToRegistry uri https://registry.npmjs.org/json-schema
+1891 silly fetchNamedPackageData verror
+1892 silly mapToRegistry name verror
+1893 silly mapToRegistry using default registry
+1894 silly mapToRegistry registry https://registry.npmjs.org/
+1895 silly mapToRegistry uri https://registry.npmjs.org/verror
+1896 verbose request uri https://registry.npmjs.org/json-schema
+1897 verbose request no auth needed
+1898 info attempt registry request try #1 at 13:48:58
+1899 verbose etag W/"5274dd0ff41b090868548552fd39da3b"
+1900 verbose lastModified Fri, 06 Sep 2019 03:31:48 GMT
+1901 http request GET https://registry.npmjs.org/json-schema
+1902 verbose request uri https://registry.npmjs.org/extsprintf
+1903 verbose request no auth needed
+1904 info attempt registry request try #1 at 13:48:58
+1905 verbose etag W/"181f798a7717cf280fb342d9306fa973"
+1906 verbose lastModified Fri, 13 Dec 2019 16:32:18 GMT
+1907 http request GET https://registry.npmjs.org/extsprintf
+1908 verbose request uri https://registry.npmjs.org/verror
+1909 verbose request no auth needed
+1910 info attempt registry request try #1 at 13:48:58
+1911 verbose etag W/"cee3cbe58715caedf23b4d5aa0f1317b"
+1912 verbose lastModified Fri, 13 Dec 2019 16:33:19 GMT
+1913 http request GET https://registry.npmjs.org/verror
+1914 http 200 https://registry.npmjs.org/extsprintf
+1915 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1915 verbose headers 'content-type': 'application/json',
+1915 verbose headers 'transfer-encoding': 'chunked',
+1915 verbose headers connection: 'keep-alive',
+1915 verbose headers 'set-cookie':
+1915 verbose headers [ '__cfduid=d97096327dc35362784756beebc4958ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1915 verbose headers 'cf-ray': '59764faa2855c2ae-FRA',
+1915 verbose headers age: '5351',
+1915 verbose headers 'cache-control': 'public, max-age=300',
+1915 verbose headers etag: 'W/"c1458bfec410835c4eaea2e0b344814b"',
+1915 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:29 GMT',
+1915 verbose headers vary: 'accept-encoding, accept',
+1915 verbose headers 'cf-cache-status': 'HIT',
+1915 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1915 verbose headers server: 'cloudflare',
+1915 verbose headers 'content-encoding': 'gzip',
+1915 verbose headers 'cf-request-id': '02ddd01e550000c2aea018c200000001' }
+1916 silly get cb [ 200,
+1916 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1916 silly get 'content-type': 'application/json',
+1916 silly get 'transfer-encoding': 'chunked',
+1916 silly get connection: 'keep-alive',
+1916 silly get 'set-cookie':
+1916 silly get [ '__cfduid=d97096327dc35362784756beebc4958ed1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1916 silly get 'cf-ray': '59764faa2855c2ae-FRA',
+1916 silly get age: '5351',
+1916 silly get 'cache-control': 'public, max-age=300',
+1916 silly get etag: 'W/"c1458bfec410835c4eaea2e0b344814b"',
+1916 silly get 'last-modified': 'Wed, 06 May 2020 14:47:29 GMT',
+1916 silly get vary: 'accept-encoding, accept',
+1916 silly get 'cf-cache-status': 'HIT',
+1916 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1916 silly get server: 'cloudflare',
+1916 silly get 'content-encoding': 'gzip',
+1916 silly get 'cf-request-id': '02ddd01e550000c2aea018c200000001' } ]
+1917 verbose get saving extsprintf to /home/christine/.npm/registry.npmjs.org/extsprintf/.cache.json
+1918 silly resolveWithNewModule extsprintf@1.3.0 checking installable status
+1919 silly cache add args [ 'extsprintf@1.3.0', null ]
+1920 verbose cache add spec extsprintf@1.3.0
+1921 silly cache add parsed spec Result {
+1921 silly cache add raw: 'extsprintf@1.3.0',
+1921 silly cache add scope: null,
+1921 silly cache add name: 'extsprintf',
+1921 silly cache add rawSpec: '1.3.0',
+1921 silly cache add spec: '1.3.0',
+1921 silly cache add type: 'version' }
+1922 silly addNamed extsprintf@1.3.0
+1923 verbose addNamed "1.3.0" is a plain semver version for extsprintf
+1924 silly mapToRegistry name extsprintf
+1925 silly mapToRegistry using default registry
+1926 silly mapToRegistry registry https://registry.npmjs.org/
+1927 silly mapToRegistry uri https://registry.npmjs.org/extsprintf
+1928 verbose addNameVersion registry:https://registry.npmjs.org/extsprintf not in flight; fetching
+1929 verbose get https://registry.npmjs.org/extsprintf not expired, no request
+1930 silly cache afterAdd extsprintf@1.3.0
+1931 verbose afterAdd /home/christine/.npm/extsprintf/1.3.0/package/package.json not in flight; writing
+1932 verbose afterAdd /home/christine/.npm/extsprintf/1.3.0/package/package.json written
+1933 http 200 https://registry.npmjs.org/verror
+1934 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1934 verbose headers 'content-type': 'application/json',
+1934 verbose headers 'transfer-encoding': 'chunked',
+1934 verbose headers connection: 'keep-alive',
+1934 verbose headers 'set-cookie':
+1934 verbose headers [ '__cfduid=dddfaf86196e34967260afba6c78f92301590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1934 verbose headers 'cf-ray': '59764faa2b02d6e9-FRA',
+1934 verbose headers age: '5351',
+1934 verbose headers 'cache-control': 'public, max-age=300',
+1934 verbose headers etag: 'W/"2464db9fac3b8d5a76540c0581baa37d"',
+1934 verbose headers 'last-modified': 'Wed, 06 May 2020 14:48:30 GMT',
+1934 verbose headers vary: 'accept-encoding, accept',
+1934 verbose headers 'cf-cache-status': 'HIT',
+1934 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1934 verbose headers server: 'cloudflare',
+1934 verbose headers 'content-encoding': 'gzip',
+1934 verbose headers 'cf-request-id': '02ddd01e550000d6e975b63200000001' }
+1935 silly get cb [ 200,
+1935 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1935 silly get 'content-type': 'application/json',
+1935 silly get 'transfer-encoding': 'chunked',
+1935 silly get connection: 'keep-alive',
+1935 silly get 'set-cookie':
+1935 silly get [ '__cfduid=dddfaf86196e34967260afba6c78f92301590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1935 silly get 'cf-ray': '59764faa2b02d6e9-FRA',
+1935 silly get age: '5351',
+1935 silly get 'cache-control': 'public, max-age=300',
+1935 silly get etag: 'W/"2464db9fac3b8d5a76540c0581baa37d"',
+1935 silly get 'last-modified': 'Wed, 06 May 2020 14:48:30 GMT',
+1935 silly get vary: 'accept-encoding, accept',
+1935 silly get 'cf-cache-status': 'HIT',
+1935 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1935 silly get server: 'cloudflare',
+1935 silly get 'content-encoding': 'gzip',
+1935 silly get 'cf-request-id': '02ddd01e550000d6e975b63200000001' } ]
+1936 verbose get saving verror to /home/christine/.npm/registry.npmjs.org/verror/.cache.json
+1937 silly resolveWithNewModule verror@1.10.0 checking installable status
+1938 silly cache add args [ 'verror@1.10.0', null ]
+1939 verbose cache add spec verror@1.10.0
+1940 silly cache add parsed spec Result {
+1940 silly cache add raw: 'verror@1.10.0',
+1940 silly cache add scope: null,
+1940 silly cache add name: 'verror',
+1940 silly cache add rawSpec: '1.10.0',
+1940 silly cache add spec: '1.10.0',
+1940 silly cache add type: 'version' }
+1941 silly addNamed verror@1.10.0
+1942 verbose addNamed "1.10.0" is a plain semver version for verror
+1943 silly mapToRegistry name verror
+1944 silly mapToRegistry using default registry
+1945 silly mapToRegistry registry https://registry.npmjs.org/
+1946 silly mapToRegistry uri https://registry.npmjs.org/verror
+1947 verbose addNameVersion registry:https://registry.npmjs.org/verror not in flight; fetching
+1948 verbose get https://registry.npmjs.org/verror not expired, no request
+1949 http 304 https://registry.npmjs.org/json-schema
+1950 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1950 verbose headers connection: 'keep-alive',
+1950 verbose headers 'set-cookie':
+1950 verbose headers [ '__cfduid=dcd1e19ee0a127106f70d3cbc3e6456db1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1950 verbose headers 'cf-ray': '59764faa2c451f2d-FRA',
+1950 verbose headers age: '5351',
+1950 verbose headers 'cache-control': 'public, max-age=300',
+1950 verbose headers etag: '"5274dd0ff41b090868548552fd39da3b"',
+1950 verbose headers 'last-modified': 'Fri, 06 Sep 2019 03:31:48 GMT',
+1950 verbose headers vary: 'Accept-Encoding',
+1950 verbose headers 'cf-cache-status': 'HIT',
+1950 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1950 verbose headers server: 'cloudflare',
+1950 verbose headers 'cf-request-id': '02ddd01e5500001f2df5221200000001' }
+1951 silly get cb [ 304,
+1951 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1951 silly get connection: 'keep-alive',
+1951 silly get 'set-cookie':
+1951 silly get [ '__cfduid=dcd1e19ee0a127106f70d3cbc3e6456db1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1951 silly get 'cf-ray': '59764faa2c451f2d-FRA',
+1951 silly get age: '5351',
+1951 silly get 'cache-control': 'public, max-age=300',
+1951 silly get etag: '"5274dd0ff41b090868548552fd39da3b"',
+1951 silly get 'last-modified': 'Fri, 06 Sep 2019 03:31:48 GMT',
+1951 silly get vary: 'Accept-Encoding',
+1951 silly get 'cf-cache-status': 'HIT',
+1951 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1951 silly get server: 'cloudflare',
+1951 silly get 'cf-request-id': '02ddd01e5500001f2df5221200000001' } ]
+1952 verbose etag https://registry.npmjs.org/json-schema from cache
+1953 verbose get saving json-schema to /home/christine/.npm/registry.npmjs.org/json-schema/.cache.json
+1954 silly cache afterAdd verror@1.10.0
+1955 verbose afterAdd /home/christine/.npm/verror/1.10.0/package/package.json not in flight; writing
+1956 silly resolveWithNewModule json-schema@0.2.3 checking installable status
+1957 silly cache add args [ 'json-schema@0.2.3', null ]
+1958 verbose cache add spec json-schema@0.2.3
+1959 silly cache add parsed spec Result {
+1959 silly cache add raw: 'json-schema@0.2.3',
+1959 silly cache add scope: null,
+1959 silly cache add name: 'json-schema',
+1959 silly cache add rawSpec: '0.2.3',
+1959 silly cache add spec: '0.2.3',
+1959 silly cache add type: 'version' }
+1960 silly addNamed json-schema@0.2.3
+1961 verbose addNamed "0.2.3" is a plain semver version for json-schema
+1962 silly mapToRegistry name json-schema
+1963 silly mapToRegistry using default registry
+1964 silly mapToRegistry registry https://registry.npmjs.org/
+1965 silly mapToRegistry uri https://registry.npmjs.org/json-schema
+1966 verbose addNameVersion registry:https://registry.npmjs.org/json-schema not in flight; fetching
+1967 verbose afterAdd /home/christine/.npm/verror/1.10.0/package/package.json written
+1968 verbose get https://registry.npmjs.org/json-schema not expired, no request
+1969 silly cache afterAdd json-schema@0.2.3
+1970 verbose afterAdd /home/christine/.npm/json-schema/0.2.3/package/package.json not in flight; writing
+1971 verbose afterAdd /home/christine/.npm/json-schema/0.2.3/package/package.json written
+1972 silly fetchNamedPackageData core-util-is
+1973 silly mapToRegistry name core-util-is
+1974 silly mapToRegistry using default registry
+1975 silly mapToRegistry registry https://registry.npmjs.org/
+1976 silly mapToRegistry uri https://registry.npmjs.org/core-util-is
+1977 verbose request uri https://registry.npmjs.org/core-util-is
+1978 verbose request no auth needed
+1979 info attempt registry request try #1 at 13:48:58
+1980 verbose etag W/"8076d16a76bac5764f6fda9911b2b501"
+1981 verbose lastModified Sat, 26 May 2018 21:08:01 GMT
+1982 http request GET https://registry.npmjs.org/core-util-is
+1983 http 304 https://registry.npmjs.org/core-util-is
+1984 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1984 verbose headers connection: 'keep-alive',
+1984 verbose headers 'set-cookie':
+1984 verbose headers [ '__cfduid=dd8c554223c8c1f8d1054bd78bd816a791590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1984 verbose headers 'cf-ray': '59764faa6c9405fd-FRA',
+1984 verbose headers age: '5358',
+1984 verbose headers 'cache-control': 'public, max-age=300',
+1984 verbose headers etag: '"8076d16a76bac5764f6fda9911b2b501"',
+1984 verbose headers 'last-modified': 'Sat, 26 May 2018 21:08:01 GMT',
+1984 verbose headers vary: 'Accept-Encoding',
+1984 verbose headers 'cf-cache-status': 'HIT',
+1984 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1984 verbose headers server: 'cloudflare',
+1984 verbose headers 'cf-request-id': '02ddd01e80000005fd8daad200000001' }
+1985 silly get cb [ 304,
+1985 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+1985 silly get connection: 'keep-alive',
+1985 silly get 'set-cookie':
+1985 silly get [ '__cfduid=dd8c554223c8c1f8d1054bd78bd816a791590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+1985 silly get 'cf-ray': '59764faa6c9405fd-FRA',
+1985 silly get age: '5358',
+1985 silly get 'cache-control': 'public, max-age=300',
+1985 silly get etag: '"8076d16a76bac5764f6fda9911b2b501"',
+1985 silly get 'last-modified': 'Sat, 26 May 2018 21:08:01 GMT',
+1985 silly get vary: 'Accept-Encoding',
+1985 silly get 'cf-cache-status': 'HIT',
+1985 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+1985 silly get server: 'cloudflare',
+1985 silly get 'cf-request-id': '02ddd01e80000005fd8daad200000001' } ]
+1986 verbose etag https://registry.npmjs.org/core-util-is from cache
+1987 verbose get saving core-util-is to /home/christine/.npm/registry.npmjs.org/core-util-is/.cache.json
+1988 silly resolveWithNewModule core-util-is@1.0.2 checking installable status
+1989 silly cache add args [ 'core-util-is@1.0.2', null ]
+1990 verbose cache add spec core-util-is@1.0.2
+1991 silly cache add parsed spec Result {
+1991 silly cache add raw: 'core-util-is@1.0.2',
+1991 silly cache add scope: null,
+1991 silly cache add name: 'core-util-is',
+1991 silly cache add rawSpec: '1.0.2',
+1991 silly cache add spec: '1.0.2',
+1991 silly cache add type: 'version' }
+1992 silly addNamed core-util-is@1.0.2
+1993 verbose addNamed "1.0.2" is a plain semver version for core-util-is
+1994 silly mapToRegistry name core-util-is
+1995 silly mapToRegistry using default registry
+1996 silly mapToRegistry registry https://registry.npmjs.org/
+1997 silly mapToRegistry uri https://registry.npmjs.org/core-util-is
+1998 verbose addNameVersion registry:https://registry.npmjs.org/core-util-is not in flight; fetching
+1999 verbose get https://registry.npmjs.org/core-util-is not expired, no request
+2000 silly cache afterAdd core-util-is@1.0.2
+2001 verbose afterAdd /home/christine/.npm/core-util-is/1.0.2/package/package.json not in flight; writing
+2002 verbose afterAdd /home/christine/.npm/core-util-is/1.0.2/package/package.json written
+2003 silly fetchNamedPackageData asn1
+2004 silly mapToRegistry name asn1
+2005 silly mapToRegistry using default registry
+2006 silly mapToRegistry registry https://registry.npmjs.org/
+2007 silly mapToRegistry uri https://registry.npmjs.org/asn1
+2008 silly fetchNamedPackageData dashdash
+2009 silly mapToRegistry name dashdash
+2010 silly mapToRegistry using default registry
+2011 silly mapToRegistry registry https://registry.npmjs.org/
+2012 silly mapToRegistry uri https://registry.npmjs.org/dashdash
+2013 silly fetchNamedPackageData getpass
+2014 silly mapToRegistry name getpass
+2015 silly mapToRegistry using default registry
+2016 silly mapToRegistry registry https://registry.npmjs.org/
+2017 silly mapToRegistry uri https://registry.npmjs.org/getpass
+2018 silly fetchNamedPackageData safer-buffer
+2019 silly mapToRegistry name safer-buffer
+2020 silly mapToRegistry using default registry
+2021 silly mapToRegistry registry https://registry.npmjs.org/
+2022 silly mapToRegistry uri https://registry.npmjs.org/safer-buffer
+2023 silly fetchNamedPackageData jsbn
+2024 silly mapToRegistry name jsbn
+2025 silly mapToRegistry using default registry
+2026 silly mapToRegistry registry https://registry.npmjs.org/
+2027 silly mapToRegistry uri https://registry.npmjs.org/jsbn
+2028 silly fetchNamedPackageData tweetnacl
+2029 silly mapToRegistry name tweetnacl
+2030 silly mapToRegistry using default registry
+2031 silly mapToRegistry registry https://registry.npmjs.org/
+2032 silly mapToRegistry uri https://registry.npmjs.org/tweetnacl
+2033 silly fetchNamedPackageData ecc-jsbn
+2034 silly mapToRegistry name ecc-jsbn
+2035 silly mapToRegistry using default registry
+2036 silly mapToRegistry registry https://registry.npmjs.org/
+2037 silly mapToRegistry uri https://registry.npmjs.org/ecc-jsbn
+2038 silly fetchNamedPackageData bcrypt-pbkdf
+2039 silly mapToRegistry name bcrypt-pbkdf
+2040 silly mapToRegistry using default registry
+2041 silly mapToRegistry registry https://registry.npmjs.org/
+2042 silly mapToRegistry uri https://registry.npmjs.org/bcrypt-pbkdf
+2043 verbose request uri https://registry.npmjs.org/asn1
+2044 verbose request no auth needed
+2045 info attempt registry request try #1 at 13:48:58
+2046 verbose etag W/"de813efa4f95d8b4547fcf05d55dc504"
+2047 verbose lastModified Fri, 13 Dec 2019 16:32:09 GMT
+2048 http request GET https://registry.npmjs.org/asn1
+2049 verbose request uri https://registry.npmjs.org/jsbn
+2050 verbose request no auth needed
+2051 info attempt registry request try #1 at 13:48:58
+2052 verbose etag W/"0611ae2a6c0b557511e766ff564197a0"
+2053 verbose lastModified Sun, 27 May 2018 05:34:52 GMT
+2054 http request GET https://registry.npmjs.org/jsbn
+2055 verbose request uri https://registry.npmjs.org/getpass
+2056 verbose request no auth needed
+2057 info attempt registry request try #1 at 13:48:58
+2058 verbose etag W/"cbefe53bd31f73e662e9120b48930d2f"
+2059 verbose lastModified Fri, 13 Dec 2019 16:32:27 GMT
+2060 http request GET https://registry.npmjs.org/getpass
+2061 verbose request uri https://registry.npmjs.org/safer-buffer
+2062 verbose request no auth needed
+2063 info attempt registry request try #1 at 13:48:58
+2064 verbose etag W/"af6bd5bd8c6f8fc6f2baa03c0e1637e9"
+2065 verbose lastModified Sun, 27 May 2018 16:29:44 GMT
+2066 http request GET https://registry.npmjs.org/safer-buffer
+2067 verbose request uri https://registry.npmjs.org/ecc-jsbn
+2068 verbose request no auth needed
+2069 info attempt registry request try #1 at 13:48:58
+2070 verbose etag W/"972b128f4c15e931ec8836237cce37e0"
+2071 verbose lastModified Sun, 29 Jul 2018 17:44:41 GMT
+2072 http request GET https://registry.npmjs.org/ecc-jsbn
+2073 verbose request uri https://registry.npmjs.org/dashdash
+2074 verbose request no auth needed
+2075 info attempt registry request try #1 at 13:48:58
+2076 verbose etag W/"4ed0f11669a0fcb66513077f2f321ea9"
+2077 verbose lastModified Sat, 26 May 2018 21:43:37 GMT
+2078 http request GET https://registry.npmjs.org/dashdash
+2079 verbose request uri https://registry.npmjs.org/tweetnacl
+2080 verbose request no auth needed
+2081 info attempt registry request try #1 at 13:48:58
+2082 verbose etag W/"fbf94e62e5226cbf0f67805b6d51d6fe"
+2083 verbose lastModified Thu, 16 Jan 2020 19:29:00 GMT
+2084 http request GET https://registry.npmjs.org/tweetnacl
+2085 verbose request uri https://registry.npmjs.org/bcrypt-pbkdf
+2086 verbose request no auth needed
+2087 info attempt registry request try #1 at 13:48:58
+2088 verbose etag W/"46ae03958b9d75cded3b6f53d3277a12"
+2089 verbose lastModified Fri, 13 Dec 2019 16:32:11 GMT
+2090 http request GET https://registry.npmjs.org/bcrypt-pbkdf
+2091 http 304 https://registry.npmjs.org/jsbn
+2092 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2092 verbose headers connection: 'keep-alive',
+2092 verbose headers 'set-cookie':
+2092 verbose headers [ '__cfduid=d7325b855bbed19ce898226d1ffb9a3291590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2092 verbose headers 'cf-ray': '59764faad8fd325c-FRA',
+2092 verbose headers age: '5657',
+2092 verbose headers 'cache-control': 'public, max-age=300',
+2092 verbose headers etag: '"0611ae2a6c0b557511e766ff564197a0"',
+2092 verbose headers 'last-modified': 'Sun, 27 May 2018 05:34:52 GMT',
+2092 verbose headers vary: 'Accept-Encoding',
+2092 verbose headers 'cf-cache-status': 'HIT',
+2092 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2092 verbose headers server: 'cloudflare',
+2092 verbose headers 'cf-request-id': '02ddd01ec40000325c4c86d200000001' }
+2093 silly get cb [ 304,
+2093 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2093 silly get connection: 'keep-alive',
+2093 silly get 'set-cookie':
+2093 silly get [ '__cfduid=d7325b855bbed19ce898226d1ffb9a3291590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2093 silly get 'cf-ray': '59764faad8fd325c-FRA',
+2093 silly get age: '5657',
+2093 silly get 'cache-control': 'public, max-age=300',
+2093 silly get etag: '"0611ae2a6c0b557511e766ff564197a0"',
+2093 silly get 'last-modified': 'Sun, 27 May 2018 05:34:52 GMT',
+2093 silly get vary: 'Accept-Encoding',
+2093 silly get 'cf-cache-status': 'HIT',
+2093 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2093 silly get server: 'cloudflare',
+2093 silly get 'cf-request-id': '02ddd01ec40000325c4c86d200000001' } ]
+2094 verbose etag https://registry.npmjs.org/jsbn from cache
+2095 verbose get saving jsbn to /home/christine/.npm/registry.npmjs.org/jsbn/.cache.json
+2096 silly resolveWithNewModule jsbn@0.1.1 checking installable status
+2097 silly cache add args [ 'jsbn@~0.1.0', null ]
+2098 verbose cache add spec jsbn@~0.1.0
+2099 silly cache add parsed spec Result {
+2099 silly cache add raw: 'jsbn@~0.1.0',
+2099 silly cache add scope: null,
+2099 silly cache add name: 'jsbn',
+2099 silly cache add rawSpec: '~0.1.0',
+2099 silly cache add spec: '>=0.1.0 <0.2.0',
+2099 silly cache add type: 'range' }
+2100 silly addNamed jsbn@>=0.1.0 <0.2.0
+2101 verbose addNamed ">=0.1.0 <0.2.0" is a valid semver range for jsbn
+2102 silly addNameRange { name: 'jsbn', range: '>=0.1.0 <0.2.0', hasData: false }
+2103 silly mapToRegistry name jsbn
+2104 silly mapToRegistry using default registry
+2105 silly mapToRegistry registry https://registry.npmjs.org/
+2106 silly mapToRegistry uri https://registry.npmjs.org/jsbn
+2107 verbose addNameRange registry:https://registry.npmjs.org/jsbn not in flight; fetching
+2108 http 304 https://registry.npmjs.org/safer-buffer
+2109 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2109 verbose headers connection: 'keep-alive',
+2109 verbose headers 'set-cookie':
+2109 verbose headers [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2109 verbose headers 'cf-ray': '59764faadb96648b-FRA',
+2109 verbose headers age: '5660',
+2109 verbose headers 'cache-control': 'public, max-age=300',
+2109 verbose headers etag: '"af6bd5bd8c6f8fc6f2baa03c0e1637e9"',
+2109 verbose headers 'last-modified': 'Sun, 27 May 2018 16:29:44 GMT',
+2109 verbose headers vary: 'Accept-Encoding',
+2109 verbose headers 'cf-cache-status': 'HIT',
+2109 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2109 verbose headers server: 'cloudflare',
+2109 verbose headers 'cf-request-id': '02ddd01ec80000648bda035200000001' }
+2110 silly get cb [ 304,
+2110 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2110 silly get connection: 'keep-alive',
+2110 silly get 'set-cookie':
+2110 silly get [ '__cfduid=d5c44467f99426bc8ed81135e17d288951590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2110 silly get 'cf-ray': '59764faadb96648b-FRA',
+2110 silly get age: '5660',
+2110 silly get 'cache-control': 'public, max-age=300',
+2110 silly get etag: '"af6bd5bd8c6f8fc6f2baa03c0e1637e9"',
+2110 silly get 'last-modified': 'Sun, 27 May 2018 16:29:44 GMT',
+2110 silly get vary: 'Accept-Encoding',
+2110 silly get 'cf-cache-status': 'HIT',
+2110 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2110 silly get server: 'cloudflare',
+2110 silly get 'cf-request-id': '02ddd01ec80000648bda035200000001' } ]
+2111 verbose etag https://registry.npmjs.org/safer-buffer from cache
+2112 verbose get saving safer-buffer to /home/christine/.npm/registry.npmjs.org/safer-buffer/.cache.json
+2113 http 200 https://registry.npmjs.org/getpass
+2114 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2114 verbose headers 'content-type': 'application/json',
+2114 verbose headers 'transfer-encoding': 'chunked',
+2114 verbose headers connection: 'keep-alive',
+2114 verbose headers 'set-cookie':
+2114 verbose headers [ '__cfduid=dd010058b9e3e0b8be866b1c539f3a13d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2114 verbose headers 'cf-ray': '59764faadf226347-FRA',
+2114 verbose headers age: '5656',
+2114 verbose headers 'cache-control': 'public, max-age=300',
+2114 verbose headers etag: 'W/"869ca13d164a27967315d623e8ce7ed7"',
+2114 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:37 GMT',
+2114 verbose headers vary: 'accept-encoding, accept',
+2114 verbose headers 'cf-cache-status': 'HIT',
+2114 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2114 verbose headers server: 'cloudflare',
+2114 verbose headers 'content-encoding': 'gzip',
+2114 verbose headers 'cf-request-id': '02ddd01ec800006347e88e6200000001' }
+2115 silly get cb [ 200,
+2115 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2115 silly get 'content-type': 'application/json',
+2115 silly get 'transfer-encoding': 'chunked',
+2115 silly get connection: 'keep-alive',
+2115 silly get 'set-cookie':
+2115 silly get [ '__cfduid=dd010058b9e3e0b8be866b1c539f3a13d1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2115 silly get 'cf-ray': '59764faadf226347-FRA',
+2115 silly get age: '5656',
+2115 silly get 'cache-control': 'public, max-age=300',
+2115 silly get etag: 'W/"869ca13d164a27967315d623e8ce7ed7"',
+2115 silly get 'last-modified': 'Wed, 06 May 2020 14:47:37 GMT',
+2115 silly get vary: 'accept-encoding, accept',
+2115 silly get 'cf-cache-status': 'HIT',
+2115 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2115 silly get server: 'cloudflare',
+2115 silly get 'content-encoding': 'gzip',
+2115 silly get 'cf-request-id': '02ddd01ec800006347e88e6200000001' } ]
+2116 verbose get saving getpass to /home/christine/.npm/registry.npmjs.org/getpass/.cache.json
+2117 http 200 https://registry.npmjs.org/bcrypt-pbkdf
+2118 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2118 verbose headers 'content-type': 'application/json',
+2118 verbose headers 'transfer-encoding': 'chunked',
+2118 verbose headers connection: 'keep-alive',
+2118 verbose headers 'set-cookie':
+2118 verbose headers [ '__cfduid=d0e932d8ab348df1bf36d2b5c827b275c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2118 verbose headers 'cf-ray': '59764faaef896413-FRA',
+2118 verbose headers age: '5653',
+2118 verbose headers 'cache-control': 'public, max-age=300',
+2118 verbose headers etag: 'W/"f08505ab6749543a27b96d63fd64d6c1"',
+2118 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT',
+2118 verbose headers vary: 'accept-encoding, accept',
+2118 verbose headers 'cf-cache-status': 'HIT',
+2118 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2118 verbose headers server: 'cloudflare',
+2118 verbose headers 'content-encoding': 'gzip',
+2118 verbose headers 'cf-request-id': '02ddd01ece000064135f93f200000001' }
+2119 silly get cb [ 200,
+2119 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2119 silly get 'content-type': 'application/json',
+2119 silly get 'transfer-encoding': 'chunked',
+2119 silly get connection: 'keep-alive',
+2119 silly get 'set-cookie':
+2119 silly get [ '__cfduid=d0e932d8ab348df1bf36d2b5c827b275c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2119 silly get 'cf-ray': '59764faaef896413-FRA',
+2119 silly get age: '5653',
+2119 silly get 'cache-control': 'public, max-age=300',
+2119 silly get etag: 'W/"f08505ab6749543a27b96d63fd64d6c1"',
+2119 silly get 'last-modified': 'Wed, 06 May 2020 14:47:21 GMT',
+2119 silly get vary: 'accept-encoding, accept',
+2119 silly get 'cf-cache-status': 'HIT',
+2119 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2119 silly get server: 'cloudflare',
+2119 silly get 'content-encoding': 'gzip',
+2119 silly get 'cf-request-id': '02ddd01ece000064135f93f200000001' } ]
+2120 verbose get saving bcrypt-pbkdf to /home/christine/.npm/registry.npmjs.org/bcrypt-pbkdf/.cache.json
+2121 http 200 https://registry.npmjs.org/asn1
+2122 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2122 verbose headers 'content-type': 'application/json',
+2122 verbose headers 'transfer-encoding': 'chunked',
+2122 verbose headers connection: 'keep-alive',
+2122 verbose headers 'set-cookie':
+2122 verbose headers [ '__cfduid=d2a12158e0b1816dc3511d38bce84223a1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2122 verbose headers 'cf-ray': '59764faadddcc272-FRA',
+2122 verbose headers age: '5652',
+2122 verbose headers 'cache-control': 'public, max-age=300',
+2122 verbose headers etag: 'W/"53988a6250256bd0f9e9b253aaf39e0b"',
+2122 verbose headers 'last-modified': 'Wed, 06 May 2020 14:47:19 GMT',
+2122 verbose headers vary: 'accept-encoding, accept',
+2122 verbose headers 'cf-cache-status': 'HIT',
+2122 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2122 verbose headers server: 'cloudflare',
+2122 verbose headers 'content-encoding': 'gzip',
+2122 verbose headers 'cf-request-id': '02ddd01ec40000c272388f9200000001' }
+2123 silly get cb [ 200,
+2123 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2123 silly get 'content-type': 'application/json',
+2123 silly get 'transfer-encoding': 'chunked',
+2123 silly get connection: 'keep-alive',
+2123 silly get 'set-cookie':
+2123 silly get [ '__cfduid=d2a12158e0b1816dc3511d38bce84223a1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2123 silly get 'cf-ray': '59764faadddcc272-FRA',
+2123 silly get age: '5652',
+2123 silly get 'cache-control': 'public, max-age=300',
+2123 silly get etag: 'W/"53988a6250256bd0f9e9b253aaf39e0b"',
+2123 silly get 'last-modified': 'Wed, 06 May 2020 14:47:19 GMT',
+2123 silly get vary: 'accept-encoding, accept',
+2123 silly get 'cf-cache-status': 'HIT',
+2123 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2123 silly get server: 'cloudflare',
+2123 silly get 'content-encoding': 'gzip',
+2123 silly get 'cf-request-id': '02ddd01ec40000c272388f9200000001' } ]
+2124 verbose get saving asn1 to /home/christine/.npm/registry.npmjs.org/asn1/.cache.json
+2125 verbose get https://registry.npmjs.org/jsbn not expired, no request
+2126 silly addNameRange number 2 { name: 'jsbn', range: '>=0.1.0 <0.2.0', hasData: true }
+2127 silly addNameRange versions [ 'jsbn', [ '0.0.0', '0.1.0', '0.1.1', '1.1.0' ] ]
+2128 silly addNamed jsbn@0.1.1
+2129 verbose addNamed "0.1.1" is a plain semver version for jsbn
+2130 http 304 https://registry.npmjs.org/dashdash
+2131 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2131 verbose headers connection: 'keep-alive',
+2131 verbose headers 'set-cookie':
+2131 verbose headers [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2131 verbose headers 'cf-ray': '59764faaeb21175a-FRA',
+2131 verbose headers age: '5350',
+2131 verbose headers 'cache-control': 'public, max-age=300',
+2131 verbose headers etag: '"4ed0f11669a0fcb66513077f2f321ea9"',
+2131 verbose headers 'last-modified': 'Sat, 26 May 2018 21:43:37 GMT',
+2131 verbose headers vary: 'Accept-Encoding',
+2131 verbose headers 'cf-cache-status': 'HIT',
+2131 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2131 verbose headers server: 'cloudflare',
+2131 verbose headers 'cf-request-id': '02ddd01ece0000175a1e236200000001' }
+2132 silly get cb [ 304,
+2132 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2132 silly get connection: 'keep-alive',
+2132 silly get 'set-cookie':
+2132 silly get [ '__cfduid=d4522c061ac7d1a53e179487bb5d818481590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2132 silly get 'cf-ray': '59764faaeb21175a-FRA',
+2132 silly get age: '5350',
+2132 silly get 'cache-control': 'public, max-age=300',
+2132 silly get etag: '"4ed0f11669a0fcb66513077f2f321ea9"',
+2132 silly get 'last-modified': 'Sat, 26 May 2018 21:43:37 GMT',
+2132 silly get vary: 'Accept-Encoding',
+2132 silly get 'cf-cache-status': 'HIT',
+2132 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2132 silly get server: 'cloudflare',
+2132 silly get 'cf-request-id': '02ddd01ece0000175a1e236200000001' } ]
+2133 verbose etag https://registry.npmjs.org/dashdash from cache
+2134 verbose get saving dashdash to /home/christine/.npm/registry.npmjs.org/dashdash/.cache.json
+2135 silly resolveWithNewModule safer-buffer@2.1.2 checking installable status
+2136 silly cache add args [ 'safer-buffer@^2.0.2', null ]
+2137 verbose cache add spec safer-buffer@^2.0.2
+2138 silly cache add parsed spec Result {
+2138 silly cache add raw: 'safer-buffer@^2.0.2',
+2138 silly cache add scope: null,
+2138 silly cache add name: 'safer-buffer',
+2138 silly cache add rawSpec: '^2.0.2',
+2138 silly cache add spec: '>=2.0.2 <3.0.0',
+2138 silly cache add type: 'range' }
+2139 silly addNamed safer-buffer@>=2.0.2 <3.0.0
+2140 verbose addNamed ">=2.0.2 <3.0.0" is a valid semver range for safer-buffer
+2141 silly addNameRange { name: 'safer-buffer', range: '>=2.0.2 <3.0.0', hasData: false }
+2142 silly mapToRegistry name safer-buffer
+2143 silly mapToRegistry using default registry
+2144 silly mapToRegistry registry https://registry.npmjs.org/
+2145 silly mapToRegistry uri https://registry.npmjs.org/safer-buffer
+2146 verbose addNameRange registry:https://registry.npmjs.org/safer-buffer not in flight; fetching
+2147 silly resolveWithNewModule getpass@0.1.7 checking installable status
+2148 silly cache add args [ 'getpass@^0.1.1', null ]
+2149 verbose cache add spec getpass@^0.1.1
+2150 silly cache add parsed spec Result {
+2150 silly cache add raw: 'getpass@^0.1.1',
+2150 silly cache add scope: null,
+2150 silly cache add name: 'getpass',
+2150 silly cache add rawSpec: '^0.1.1',
+2150 silly cache add spec: '>=0.1.1 <0.2.0',
+2150 silly cache add type: 'range' }
+2151 silly addNamed getpass@>=0.1.1 <0.2.0
+2152 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for getpass
+2153 silly addNameRange { name: 'getpass', range: '>=0.1.1 <0.2.0', hasData: false }
+2154 silly mapToRegistry name getpass
+2155 silly mapToRegistry using default registry
+2156 silly mapToRegistry registry https://registry.npmjs.org/
+2157 silly mapToRegistry uri https://registry.npmjs.org/getpass
+2158 verbose addNameRange registry:https://registry.npmjs.org/getpass not in flight; fetching
+2159 silly resolveWithNewModule bcrypt-pbkdf@1.0.2 checking installable status
+2160 silly cache add args [ 'bcrypt-pbkdf@^1.0.0', null ]
+2161 verbose cache add spec bcrypt-pbkdf@^1.0.0
+2162 silly cache add parsed spec Result {
+2162 silly cache add raw: 'bcrypt-pbkdf@^1.0.0',
+2162 silly cache add scope: null,
+2162 silly cache add name: 'bcrypt-pbkdf',
+2162 silly cache add rawSpec: '^1.0.0',
+2162 silly cache add spec: '>=1.0.0 <2.0.0',
+2162 silly cache add type: 'range' }
+2163 silly addNamed bcrypt-pbkdf@>=1.0.0 <2.0.0
+2164 verbose addNamed ">=1.0.0 <2.0.0" is a valid semver range for bcrypt-pbkdf
+2165 silly addNameRange { name: 'bcrypt-pbkdf', range: '>=1.0.0 <2.0.0', hasData: false }
+2166 silly mapToRegistry name bcrypt-pbkdf
+2167 silly mapToRegistry using default registry
+2168 silly mapToRegistry registry https://registry.npmjs.org/
+2169 silly mapToRegistry uri https://registry.npmjs.org/bcrypt-pbkdf
+2170 verbose addNameRange registry:https://registry.npmjs.org/bcrypt-pbkdf not in flight; fetching
+2171 silly cache afterAdd jsbn@0.1.1
+2172 verbose afterAdd /home/christine/.npm/jsbn/0.1.1/package/package.json not in flight; writing
+2173 silly resolveWithNewModule asn1@0.2.4 checking installable status
+2174 silly cache add args [ 'asn1@~0.2.3', null ]
+2175 verbose cache add spec asn1@~0.2.3
+2176 silly cache add parsed spec Result {
+2176 silly cache add raw: 'asn1@~0.2.3',
+2176 silly cache add scope: null,
+2176 silly cache add name: 'asn1',
+2176 silly cache add rawSpec: '~0.2.3',
+2176 silly cache add spec: '>=0.2.3 <0.3.0',
+2176 silly cache add type: 'range' }
+2177 silly addNamed asn1@>=0.2.3 <0.3.0
+2178 verbose addNamed ">=0.2.3 <0.3.0" is a valid semver range for asn1
+2179 silly addNameRange { name: 'asn1', range: '>=0.2.3 <0.3.0', hasData: false }
+2180 silly mapToRegistry name asn1
+2181 silly mapToRegistry using default registry
+2182 silly mapToRegistry registry https://registry.npmjs.org/
+2183 silly mapToRegistry uri https://registry.npmjs.org/asn1
+2184 verbose addNameRange registry:https://registry.npmjs.org/asn1 not in flight; fetching
+2185 silly resolveWithNewModule dashdash@1.14.1 checking installable status
+2186 silly cache add args [ 'dashdash@^1.12.0', null ]
+2187 verbose cache add spec dashdash@^1.12.0
+2188 silly cache add parsed spec Result {
+2188 silly cache add raw: 'dashdash@^1.12.0',
+2188 silly cache add scope: null,
+2188 silly cache add name: 'dashdash',
+2188 silly cache add rawSpec: '^1.12.0',
+2188 silly cache add spec: '>=1.12.0 <2.0.0',
+2188 silly cache add type: 'range' }
+2189 silly addNamed dashdash@>=1.12.0 <2.0.0
+2190 verbose addNamed ">=1.12.0 <2.0.0" is a valid semver range for dashdash
+2191 silly addNameRange { name: 'dashdash', range: '>=1.12.0 <2.0.0', hasData: false }
+2192 silly mapToRegistry name dashdash
+2193 silly mapToRegistry using default registry
+2194 silly mapToRegistry registry https://registry.npmjs.org/
+2195 silly mapToRegistry uri https://registry.npmjs.org/dashdash
+2196 verbose addNameRange registry:https://registry.npmjs.org/dashdash not in flight; fetching
+2197 http 200 https://registry.npmjs.org/tweetnacl
+2198 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2198 verbose headers 'content-type': 'application/json',
+2198 verbose headers 'transfer-encoding': 'chunked',
+2198 verbose headers connection: 'keep-alive',
+2198 verbose headers 'set-cookie':
+2198 verbose headers [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2198 verbose headers 'cf-ray': '59764faae943d715-FRA',
+2198 verbose headers age: '5653',
+2198 verbose headers 'cache-control': 'public, max-age=300',
+2198 verbose headers etag: 'W/"1b4cf5c8f09886b489d11782a23a9cbf"',
+2198 verbose headers 'last-modified': 'Sat, 09 May 2020 13:43:32 GMT',
+2198 verbose headers vary: 'accept-encoding, accept',
+2198 verbose headers 'cf-cache-status': 'HIT',
+2198 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2198 verbose headers server: 'cloudflare',
+2198 verbose headers 'content-encoding': 'gzip',
+2198 verbose headers 'cf-request-id': '02ddd01ecf0000d715c122c200000001' }
+2199 silly get cb [ 200,
+2199 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2199 silly get 'content-type': 'application/json',
+2199 silly get 'transfer-encoding': 'chunked',
+2199 silly get connection: 'keep-alive',
+2199 silly get 'set-cookie':
+2199 silly get [ '__cfduid=da40e9f27d1dea0fa61ff6ca4322cb73c1590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2199 silly get 'cf-ray': '59764faae943d715-FRA',
+2199 silly get age: '5653',
+2199 silly get 'cache-control': 'public, max-age=300',
+2199 silly get etag: 'W/"1b4cf5c8f09886b489d11782a23a9cbf"',
+2199 silly get 'last-modified': 'Sat, 09 May 2020 13:43:32 GMT',
+2199 silly get vary: 'accept-encoding, accept',
+2199 silly get 'cf-cache-status': 'HIT',
+2199 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2199 silly get server: 'cloudflare',
+2199 silly get 'content-encoding': 'gzip',
+2199 silly get 'cf-request-id': '02ddd01ecf0000d715c122c200000001' } ]
+2200 verbose get saving tweetnacl to /home/christine/.npm/registry.npmjs.org/tweetnacl/.cache.json
+2201 verbose get https://registry.npmjs.org/safer-buffer not expired, no request
+2202 silly addNameRange number 2 { name: 'safer-buffer', range: '>=2.0.2 <3.0.0', hasData: true }
+2203 silly addNameRange versions [ 'safer-buffer',
+2203 silly addNameRange [ '2.0.0', '2.0.1', '2.0.2', '2.1.0', '2.1.1', '2.1.2' ] ]
+2204 silly addNamed safer-buffer@2.1.2
+2205 verbose addNamed "2.1.2" is a plain semver version for safer-buffer
+2206 verbose get https://registry.npmjs.org/getpass not expired, no request
+2207 silly addNameRange number 2 { name: 'getpass', range: '>=0.1.1 <0.2.0', hasData: true }
+2208 silly addNameRange versions [ 'getpass',
+2208 silly addNameRange [ '0.1.0',
+2208 silly addNameRange '0.1.1',
+2208 silly addNameRange '0.1.2',
+2208 silly addNameRange '0.1.3',
+2208 silly addNameRange '0.1.4',
+2208 silly addNameRange '0.1.5',
+2208 silly addNameRange '0.1.6',
+2208 silly addNameRange '0.1.7' ] ]
+2209 silly addNamed getpass@0.1.7
+2210 verbose addNamed "0.1.7" is a plain semver version for getpass
+2211 verbose get https://registry.npmjs.org/bcrypt-pbkdf not expired, no request
+2212 silly addNameRange number 2 { name: 'bcrypt-pbkdf', range: '>=1.0.0 <2.0.0', hasData: true }
+2213 silly addNameRange versions [ 'bcrypt-pbkdf', [ '1.0.0', '1.0.1', '1.0.2' ] ]
+2214 silly addNamed bcrypt-pbkdf@1.0.2
+2215 verbose addNamed "1.0.2" is a plain semver version for bcrypt-pbkdf
+2216 verbose get https://registry.npmjs.org/asn1 not expired, no request
+2217 silly addNameRange number 2 { name: 'asn1', range: '>=0.2.3 <0.3.0', hasData: true }
+2218 silly addNameRange versions [ 'asn1',
+2218 silly addNameRange [ '0.1.0',
+2218 silly addNameRange '0.1.1',
+2218 silly addNameRange '0.1.2',
+2218 silly addNameRange '0.1.3',
+2218 silly addNameRange '0.1.4',
+2218 silly addNameRange '0.1.5',
+2218 silly addNameRange '0.1.6',
+2218 silly addNameRange '0.1.7',
+2218 silly addNameRange '0.1.8',
+2218 silly addNameRange '0.1.9',
+2218 silly addNameRange '0.1.10',
+2218 silly addNameRange '0.1.11',
+2218 silly addNameRange '0.2.0',
+2218 silly addNameRange '0.2.1',
+2218 silly addNameRange '0.2.2',
+2218 silly addNameRange '0.2.3',
+2218 silly addNameRange '0.2.4' ] ]
+2219 silly addNamed asn1@0.2.4
+2220 verbose addNamed "0.2.4" is a plain semver version for asn1
+2221 verbose afterAdd /home/christine/.npm/jsbn/0.1.1/package/package.json written
+2222 http 304 https://registry.npmjs.org/ecc-jsbn
+2223 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2223 verbose headers connection: 'keep-alive',
+2223 verbose headers 'set-cookie':
+2223 verbose headers [ '__cfduid=d3be9a0b80d7155f3e9da29972b7410c41590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2223 verbose headers 'cf-ray': '59764faaec18dfc7-FRA',
+2223 verbose headers age: '5653',
+2223 verbose headers 'cache-control': 'public, max-age=300',
+2223 verbose headers etag: '"972b128f4c15e931ec8836237cce37e0"',
+2223 verbose headers 'last-modified': 'Sun, 29 Jul 2018 17:44:41 GMT',
+2223 verbose headers vary: 'Accept-Encoding',
+2223 verbose headers 'cf-cache-status': 'HIT',
+2223 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2223 verbose headers server: 'cloudflare',
+2223 verbose headers 'cf-request-id': '02ddd01ece0000dfc72a8d3200000001' }
+2224 silly get cb [ 304,
+2224 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2224 silly get connection: 'keep-alive',
+2224 silly get 'set-cookie':
+2224 silly get [ '__cfduid=d3be9a0b80d7155f3e9da29972b7410c41590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2224 silly get 'cf-ray': '59764faaec18dfc7-FRA',
+2224 silly get age: '5653',
+2224 silly get 'cache-control': 'public, max-age=300',
+2224 silly get etag: '"972b128f4c15e931ec8836237cce37e0"',
+2224 silly get 'last-modified': 'Sun, 29 Jul 2018 17:44:41 GMT',
+2224 silly get vary: 'Accept-Encoding',
+2224 silly get 'cf-cache-status': 'HIT',
+2224 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2224 silly get server: 'cloudflare',
+2224 silly get 'cf-request-id': '02ddd01ece0000dfc72a8d3200000001' } ]
+2225 verbose etag https://registry.npmjs.org/ecc-jsbn from cache
+2226 verbose get saving ecc-jsbn to /home/christine/.npm/registry.npmjs.org/ecc-jsbn/.cache.json
+2227 verbose get https://registry.npmjs.org/dashdash not expired, no request
+2228 silly addNameRange number 2 { name: 'dashdash', range: '>=1.12.0 <2.0.0', hasData: true }
+2229 silly addNameRange versions [ 'dashdash',
+2229 silly addNameRange [ '1.0.0',
+2229 silly addNameRange '1.0.1',
+2229 silly addNameRange '1.0.2',
+2229 silly addNameRange '1.1.0',
+2229 silly addNameRange '1.2.0',
+2229 silly addNameRange '1.2.1',
+2229 silly addNameRange '1.3.0',
+2229 silly addNameRange '1.3.1',
+2229 silly addNameRange '1.3.2',
+2229 silly addNameRange '1.4.0',
+2229 silly addNameRange '1.5.0',
+2229 silly addNameRange '1.6.0',
+2229 silly addNameRange '1.7.0',
+2229 silly addNameRange '1.7.1',
+2229 silly addNameRange '1.7.2',
+2229 silly addNameRange '1.7.3',
+2229 silly addNameRange '1.8.0',
+2229 silly addNameRange '1.9.0',
+2229 silly addNameRange '1.10.0',
+2229 silly addNameRange '1.10.1',
+2229 silly addNameRange '1.11.0',
+2229 silly addNameRange '1.12.0',
+2229 silly addNameRange '1.12.1',
+2229 silly addNameRange '1.12.2',
+2229 silly addNameRange '1.13.0',
+2229 silly addNameRange '1.13.1',
+2229 silly addNameRange '1.14.0',
+2229 silly addNameRange '1.14.1' ] ]
+2230 silly addNamed dashdash@1.14.1
+2231 verbose addNamed "1.14.1" is a plain semver version for dashdash
+2232 silly cache afterAdd safer-buffer@2.1.2
+2233 verbose afterAdd /home/christine/.npm/safer-buffer/2.1.2/package/package.json not in flight; writing
+2234 silly resolveWithNewModule tweetnacl@0.14.5 checking installable status
+2235 silly cache add args [ 'tweetnacl@~0.14.0', null ]
+2236 verbose cache add spec tweetnacl@~0.14.0
+2237 silly cache add parsed spec Result {
+2237 silly cache add raw: 'tweetnacl@~0.14.0',
+2237 silly cache add scope: null,
+2237 silly cache add name: 'tweetnacl',
+2237 silly cache add rawSpec: '~0.14.0',
+2237 silly cache add spec: '>=0.14.0 <0.15.0',
+2237 silly cache add type: 'range' }
+2238 silly addNamed tweetnacl@>=0.14.0 <0.15.0
+2239 verbose addNamed ">=0.14.0 <0.15.0" is a valid semver range for tweetnacl
+2240 silly addNameRange { name: 'tweetnacl', range: '>=0.14.0 <0.15.0', hasData: false }
+2241 silly mapToRegistry name tweetnacl
+2242 silly mapToRegistry using default registry
+2243 silly mapToRegistry registry https://registry.npmjs.org/
+2244 silly mapToRegistry uri https://registry.npmjs.org/tweetnacl
+2245 verbose addNameRange registry:https://registry.npmjs.org/tweetnacl not in flight; fetching
+2246 silly cache afterAdd getpass@0.1.7
+2247 verbose afterAdd /home/christine/.npm/getpass/0.1.7/package/package.json not in flight; writing
+2248 silly cache afterAdd asn1@0.2.4
+2249 verbose afterAdd /home/christine/.npm/asn1/0.2.4/package/package.json not in flight; writing
+2250 silly cache afterAdd bcrypt-pbkdf@1.0.2
+2251 verbose afterAdd /home/christine/.npm/bcrypt-pbkdf/1.0.2/package/package.json not in flight; writing
+2252 silly resolveWithNewModule ecc-jsbn@0.1.2 checking installable status
+2253 silly cache add args [ 'ecc-jsbn@~0.1.1', null ]
+2254 verbose cache add spec ecc-jsbn@~0.1.1
+2255 silly cache add parsed spec Result {
+2255 silly cache add raw: 'ecc-jsbn@~0.1.1',
+2255 silly cache add scope: null,
+2255 silly cache add name: 'ecc-jsbn',
+2255 silly cache add rawSpec: '~0.1.1',
+2255 silly cache add spec: '>=0.1.1 <0.2.0',
+2255 silly cache add type: 'range' }
+2256 silly addNamed ecc-jsbn@>=0.1.1 <0.2.0
+2257 verbose addNamed ">=0.1.1 <0.2.0" is a valid semver range for ecc-jsbn
+2258 silly addNameRange { name: 'ecc-jsbn', range: '>=0.1.1 <0.2.0', hasData: false }
+2259 silly mapToRegistry name ecc-jsbn
+2260 silly mapToRegistry using default registry
+2261 silly mapToRegistry registry https://registry.npmjs.org/
+2262 silly mapToRegistry uri https://registry.npmjs.org/ecc-jsbn
+2263 verbose addNameRange registry:https://registry.npmjs.org/ecc-jsbn not in flight; fetching
+2264 silly cache afterAdd dashdash@1.14.1
+2265 verbose afterAdd /home/christine/.npm/dashdash/1.14.1/package/package.json not in flight; writing
+2266 verbose afterAdd /home/christine/.npm/safer-buffer/2.1.2/package/package.json written
+2267 verbose get https://registry.npmjs.org/tweetnacl not expired, no request
+2268 silly addNameRange number 2 { name: 'tweetnacl', range: '>=0.14.0 <0.15.0', hasData: true }
+2269 silly addNameRange versions [ 'tweetnacl',
+2269 silly addNameRange [ '0.9.1',
+2269 silly addNameRange '0.9.2',
+2269 silly addNameRange '0.10.0',
+2269 silly addNameRange '0.10.1',
+2269 silly addNameRange '0.11.0',
+2269 silly addNameRange '0.11.1',
+2269 silly addNameRange '0.11.2',
+2269 silly addNameRange '0.12.0',
+2269 silly addNameRange '0.12.1',
+2269 silly addNameRange '0.12.2',
+2269 silly addNameRange '0.13.0',
+2269 silly addNameRange '0.13.1',
+2269 silly addNameRange '0.13.2',
+2269 silly addNameRange '0.13.3',
+2269 silly addNameRange '0.14.0',
+2269 silly addNameRange '0.14.1',
+2269 silly addNameRange '0.14.2',
+2269 silly addNameRange '0.14.3',
+2269 silly addNameRange '0.14.4',
+2269 silly addNameRange '0.14.5',
+2269 silly addNameRange '1.0.0-rc.1',
+2269 silly addNameRange '1.0.0',
+2269 silly addNameRange '1.0.1',
+2269 silly addNameRange '1.0.2',
+2269 silly addNameRange '1.0.3' ] ]
+2270 silly addNamed tweetnacl@0.14.5
+2271 verbose addNamed "0.14.5" is a plain semver version for tweetnacl
+2272 verbose afterAdd /home/christine/.npm/getpass/0.1.7/package/package.json written
+2273 verbose afterAdd /home/christine/.npm/asn1/0.2.4/package/package.json written
+2274 verbose afterAdd /home/christine/.npm/bcrypt-pbkdf/1.0.2/package/package.json written
+2275 verbose get https://registry.npmjs.org/ecc-jsbn not expired, no request
+2276 silly addNameRange number 2 { name: 'ecc-jsbn', range: '>=0.1.1 <0.2.0', hasData: true }
+2277 silly addNameRange versions [ 'ecc-jsbn', [ '0.0.1', '0.1.1', '0.1.2', '0.2.0' ] ]
+2278 silly addNamed ecc-jsbn@0.1.2
+2279 verbose addNamed "0.1.2" is a plain semver version for ecc-jsbn
+2280 verbose afterAdd /home/christine/.npm/dashdash/1.14.1/package/package.json written
+2281 silly cache afterAdd tweetnacl@0.14.5
+2282 verbose afterAdd /home/christine/.npm/tweetnacl/0.14.5/package/package.json not in flight; writing
+2283 silly cache afterAdd ecc-jsbn@0.1.2
+2284 verbose afterAdd /home/christine/.npm/ecc-jsbn/0.1.2/package/package.json not in flight; writing
+2285 verbose afterAdd /home/christine/.npm/tweetnacl/0.14.5/package/package.json written
+2286 verbose afterAdd /home/christine/.npm/ecc-jsbn/0.1.2/package/package.json written
+2287 silly fetchNamedPackageData psl
+2288 silly mapToRegistry name psl
+2289 silly mapToRegistry using default registry
+2290 silly mapToRegistry registry https://registry.npmjs.org/
+2291 silly mapToRegistry uri https://registry.npmjs.org/psl
+2292 verbose request uri https://registry.npmjs.org/psl
+2293 verbose request no auth needed
+2294 info attempt registry request try #1 at 13:48:58
+2295 verbose etag W/"101ba2d632d4780d2de3d351ee1405be"
+2296 verbose lastModified Sat, 28 Dec 2019 13:07:08 GMT
+2297 http request GET https://registry.npmjs.org/psl
+2298 http 200 https://registry.npmjs.org/psl
+2299 verbose headers { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2299 verbose headers 'content-type': 'application/json',
+2299 verbose headers 'transfer-encoding': 'chunked',
+2299 verbose headers connection: 'keep-alive',
+2299 verbose headers 'set-cookie':
+2299 verbose headers [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2299 verbose headers 'cf-ray': '59764fab685905bb-FRA',
+2299 verbose headers age: '5659',
+2299 verbose headers 'cache-control': 'public, max-age=300',
+2299 verbose headers etag: 'W/"da7a245ac77d8bce14f4297f73f7e4b3"',
+2299 verbose headers 'last-modified': 'Wed, 25 Mar 2020 13:29:16 GMT',
+2299 verbose headers vary: 'accept-encoding, accept',
+2299 verbose headers 'cf-cache-status': 'HIT',
+2299 verbose headers 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2299 verbose headers server: 'cloudflare',
+2299 verbose headers 'content-encoding': 'gzip',
+2299 verbose headers 'cf-request-id': '02ddd01f1d000005bb0cac0200000001' }
+2300 silly get cb [ 200,
+2300 silly get { date: 'Fri, 22 May 2020 11:48:58 GMT',
+2300 silly get 'content-type': 'application/json',
+2300 silly get 'transfer-encoding': 'chunked',
+2300 silly get connection: 'keep-alive',
+2300 silly get 'set-cookie':
+2300 silly get [ '__cfduid=dde7af43ea1a3381d8e635d144d452f041590148138; expires=Sun, 21-Jun-20 11:48:58 GMT; path=/; domain=.npmjs.org; HttpOnly; SameSite=Lax' ],
+2300 silly get 'cf-ray': '59764fab685905bb-FRA',
+2300 silly get age: '5659',
+2300 silly get 'cache-control': 'public, max-age=300',
+2300 silly get etag: 'W/"da7a245ac77d8bce14f4297f73f7e4b3"',
+2300 silly get 'last-modified': 'Wed, 25 Mar 2020 13:29:16 GMT',
+2300 silly get vary: 'accept-encoding, accept',
+2300 silly get 'cf-cache-status': 'HIT',
+2300 silly get 'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
+2300 silly get server: 'cloudflare',
+2300 silly get 'content-encoding': 'gzip',
+2300 silly get 'cf-request-id': '02ddd01f1d000005bb0cac0200000001' } ]
+2301 verbose get saving psl to /home/christine/.npm/registry.npmjs.org/psl/.cache.json
+2302 silly resolveWithNewModule psl@1.8.0 checking installable status
+2303 silly cache add args [ 'psl@^1.1.28', null ]
+2304 verbose cache add spec psl@^1.1.28
+2305 silly cache add parsed spec Result {
+2305 silly cache add raw: 'psl@^1.1.28',
+2305 silly cache add scope: null,
+2305 silly cache add name: 'psl',
+2305 silly cache add rawSpec: '^1.1.28',
+2305 silly cache add spec: '>=1.1.28 <2.0.0',
+2305 silly cache add type: 'range' }
+2306 silly addNamed psl@>=1.1.28 <2.0.0
+2307 verbose addNamed ">=1.1.28 <2.0.0" is a valid semver range for psl
+2308 silly addNameRange { name: 'psl', range: '>=1.1.28 <2.0.0', hasData: false }
+2309 silly mapToRegistry name psl
+2310 silly mapToRegistry using default registry
+2311 silly mapToRegistry registry https://registry.npmjs.org/
+2312 silly mapToRegistry uri https://registry.npmjs.org/psl
+2313 verbose addNameRange registry:https://registry.npmjs.org/psl not in flight; fetching
+2314 verbose get https://registry.npmjs.org/psl not expired, no request
+2315 silly addNameRange number 2 { name: 'psl', range: '>=1.1.28 <2.0.0', hasData: true }
+2316 silly addNameRange versions [ 'psl',
+2316 silly addNameRange [ '1.0.0',
+2316 silly addNameRange '1.0.1',
+2316 silly addNameRange '1.0.2',
+2316 silly addNameRange '1.1.0',
+2316 silly addNameRange '1.1.1',
+2316 silly addNameRange '1.1.2',
+2316 silly addNameRange '1.1.3',
+2316 silly addNameRange '1.1.4',
+2316 silly addNameRange '1.1.5',
+2316 silly addNameRange '1.1.6',
+2316 silly addNameRange '1.1.7',
+2316 silly addNameRange '1.1.8',
+2316 silly addNameRange '1.1.9',
+2316 silly addNameRange '1.1.10',
+2316 silly addNameRange '1.1.11',
+2316 silly addNameRange '1.1.12',
+2316 silly addNameRange '1.1.13',
+2316 silly addNameRange '1.1.14',
+2316 silly addNameRange '1.1.15',
+2316 silly addNameRange '1.1.16',
+2316 silly addNameRange '1.1.17',
+2316 silly addNameRange '1.1.18',
+2316 silly addNameRange '1.1.19',
+2316 silly addNameRange '1.1.20',
+2316 silly addNameRange '1.1.21',
+2316 silly addNameRange '1.1.22',
+2316 silly addNameRange '1.1.23',
+2316 silly addNameRange '1.1.24',
+2316 silly addNameRange '1.1.25',
+2316 silly addNameRange '1.1.26',
+2316 silly addNameRange '1.1.27',
+2316 silly addNameRange '1.1.28',
+2316 silly addNameRange '1.1.29',
+2316 silly addNameRange '1.1.30',
+2316 silly addNameRange '1.1.31',
+2316 silly addNameRange '1.1.32',
+2316 silly addNameRange '1.1.33',
+2316 silly addNameRange '1.2.0',
+2316 silly addNameRange '1.3.0',
+2316 silly addNameRange '1.3.1',
+2316 silly addNameRange '1.4.0',
+2316 silly addNameRange '1.5.0',
+2316 silly addNameRange '1.6.0',
+2316 silly addNameRange '1.7.0',
+2316 silly addNameRange '1.8.0' ] ]
+2317 silly addNamed psl@1.8.0
+2318 verbose addNamed "1.8.0" is a plain semver version for psl
+2319 silly mapToRegistry name psl
+2320 silly mapToRegistry using default registry
+2321 silly mapToRegistry registry https://registry.npmjs.org/
+2322 silly mapToRegistry uri https://registry.npmjs.org/psl
+2323 verbose addRemoteTarball https://registry.npmjs.org/psl/-/psl-1.8.0.tgz not in flight; adding
+2324 verbose addRemoteTarball [ 'https://registry.npmjs.org/psl/-/psl-1.8.0.tgz',
+2324 verbose addRemoteTarball '9326f8bcfb013adcc005fdff056acce020e51c24' ]
+2325 info retry fetch attempt 1 at 13:48:58
+2326 info attempt registry request try #1 at 13:48:58
+2327 http fetch GET https://registry.npmjs.org/psl/-/psl-1.8.0.tgz
+2328 http fetch 200 https://registry.npmjs.org/psl/-/psl-1.8.0.tgz
+2329 silly fetchAndShaCheck shasum 9326f8bcfb013adcc005fdff056acce020e51c24
+2330 verbose addTmpTarball /tmp/npm-5369-43d945e1/registry.npmjs.org/psl/-/psl-1.8.0.tgz not in flight; adding
+2331 verbose addTmpTarball already have metadata; skipping unpack for psl@1.8.0
+2332 silly cache afterAdd psl@1.8.0
+2333 verbose afterAdd /home/christine/.npm/psl/1.8.0/package/package.json not in flight; writing
+2334 verbose afterAdd /home/christine/.npm/psl/1.8.0/package/package.json written
+2335 silly loadAllDepsIntoIdealTree Finishing
+2336 silly idealTree:prePrune lib
+2336 silly idealTree:prePrune └─┬ less@3.11.1
+2336 silly idealTree:prePrune ├── ajv@6.12.2
+2336 silly idealTree:prePrune ├── asap@2.0.6
+2336 silly idealTree:prePrune ├── asn1@0.2.4
+2336 silly idealTree:prePrune ├── assert-plus@1.0.0
+2336 silly idealTree:prePrune ├── asynckit@0.4.0
+2336 silly idealTree:prePrune ├── aws-sign2@0.7.0
+2336 silly idealTree:prePrune ├── aws4@1.9.1
+2336 silly idealTree:prePrune ├── bcrypt-pbkdf@1.0.2
+2336 silly idealTree:prePrune ├── caseless@0.12.0
+2336 silly idealTree:prePrune ├── clone@2.1.2
+2336 silly idealTree:prePrune ├── combined-stream@1.0.8
+2336 silly idealTree:prePrune ├── core-util-is@1.0.2
+2336 silly idealTree:prePrune ├── dashdash@1.14.1
+2336 silly idealTree:prePrune ├── delayed-stream@1.0.0
+2336 silly idealTree:prePrune ├── ecc-jsbn@0.1.2
+2336 silly idealTree:prePrune ├── errno@0.1.7
+2336 silly idealTree:prePrune ├── extend@3.0.2
+2336 silly idealTree:prePrune ├── extsprintf@1.3.0
+2336 silly idealTree:prePrune ├── fast-deep-equal@3.1.1
+2336 silly idealTree:prePrune ├── fast-json-stable-stringify@2.1.0
+2336 silly idealTree:prePrune ├── forever-agent@0.6.1
+2336 silly idealTree:prePrune ├── form-data@2.3.3
+2336 silly idealTree:prePrune ├── getpass@0.1.7
+2336 silly idealTree:prePrune ├── graceful-fs@4.2.4
+2336 silly idealTree:prePrune ├── har-schema@2.0.0
+2336 silly idealTree:prePrune ├── har-validator@5.1.3
+2336 silly idealTree:prePrune ├── http-signature@1.2.0
+2336 silly idealTree:prePrune ├── image-size@0.5.5
+2336 silly idealTree:prePrune ├── is-typedarray@1.0.0
+2336 silly idealTree:prePrune ├── isstream@0.1.2
+2336 silly idealTree:prePrune ├── jsbn@0.1.1
+2336 silly idealTree:prePrune ├── json-schema-traverse@0.4.1
+2336 silly idealTree:prePrune ├── json-schema@0.2.3
+2336 silly idealTree:prePrune ├── json-stringify-safe@5.0.1
+2336 silly idealTree:prePrune ├── jsprim@1.4.1
+2336 silly idealTree:prePrune ├── mime-db@1.44.0
+2336 silly idealTree:prePrune ├── mime-types@2.1.27
+2336 silly idealTree:prePrune ├── mime@1.6.0
+2336 silly idealTree:prePrune ├── minimist@1.2.5
+2336 silly idealTree:prePrune ├── mkdirp@0.5.5
+2336 silly idealTree:prePrune ├── oauth-sign@0.9.0
+2336 silly idealTree:prePrune ├── performance-now@2.1.0
+2336 silly idealTree:prePrune ├── promise@7.3.1
+2336 silly idealTree:prePrune ├── prr@1.0.1
+2336 silly idealTree:prePrune ├── psl@1.8.0
+2336 silly idealTree:prePrune ├── punycode@2.1.1
+2336 silly idealTree:prePrune ├── qs@6.5.2
+2336 silly idealTree:prePrune ├── request@2.88.2
+2336 silly idealTree:prePrune ├── safe-buffer@5.2.1
+2336 silly idealTree:prePrune ├── safer-buffer@2.1.2
+2336 silly idealTree:prePrune ├── source-map@0.6.1
+2336 silly idealTree:prePrune ├── sshpk@1.16.1
+2336 silly idealTree:prePrune ├── tough-cookie@2.5.0
+2336 silly idealTree:prePrune ├── tslib@1.13.0
+2336 silly idealTree:prePrune ├── tunnel-agent@0.6.0
+2336 silly idealTree:prePrune ├── tweetnacl@0.14.5
+2336 silly idealTree:prePrune ├── uri-js@4.2.2
+2336 silly idealTree:prePrune ├── uuid@3.4.0
+2336 silly idealTree:prePrune └── verror@1.10.0
+2337 silly loadIdealTree Finishing
+2338 silly currentTree lib
+2339 silly idealTree lib
+2339 silly idealTree └─┬ less@3.11.1
+2339 silly idealTree ├── ajv@6.12.2
+2339 silly idealTree ├── asap@2.0.6
+2339 silly idealTree ├── asn1@0.2.4
+2339 silly idealTree ├── assert-plus@1.0.0
+2339 silly idealTree ├── asynckit@0.4.0
+2339 silly idealTree ├── aws-sign2@0.7.0
+2339 silly idealTree ├── aws4@1.9.1
+2339 silly idealTree ├── bcrypt-pbkdf@1.0.2
+2339 silly idealTree ├── caseless@0.12.0
+2339 silly idealTree ├── clone@2.1.2
+2339 silly idealTree ├── combined-stream@1.0.8
+2339 silly idealTree ├── core-util-is@1.0.2
+2339 silly idealTree ├── dashdash@1.14.1
+2339 silly idealTree ├── delayed-stream@1.0.0
+2339 silly idealTree ├── ecc-jsbn@0.1.2
+2339 silly idealTree ├── errno@0.1.7
+2339 silly idealTree ├── extend@3.0.2
+2339 silly idealTree ├── extsprintf@1.3.0
+2339 silly idealTree ├── fast-deep-equal@3.1.1
+2339 silly idealTree ├── fast-json-stable-stringify@2.1.0
+2339 silly idealTree ├── forever-agent@0.6.1
+2339 silly idealTree ├── form-data@2.3.3
+2339 silly idealTree ├── getpass@0.1.7
+2339 silly idealTree ├── graceful-fs@4.2.4
+2339 silly idealTree ├── har-schema@2.0.0
+2339 silly idealTree ├── har-validator@5.1.3
+2339 silly idealTree ├── http-signature@1.2.0
+2339 silly idealTree ├── image-size@0.5.5
+2339 silly idealTree ├── is-typedarray@1.0.0
+2339 silly idealTree ├── isstream@0.1.2
+2339 silly idealTree ├── jsbn@0.1.1
+2339 silly idealTree ├── json-schema-traverse@0.4.1
+2339 silly idealTree ├── json-schema@0.2.3
+2339 silly idealTree ├── json-stringify-safe@5.0.1
+2339 silly idealTree ├── jsprim@1.4.1
+2339 silly idealTree ├── mime-db@1.44.0
+2339 silly idealTree ├── mime-types@2.1.27
+2339 silly idealTree ├── mime@1.6.0
+2339 silly idealTree ├── minimist@1.2.5
+2339 silly idealTree ├── mkdirp@0.5.5
+2339 silly idealTree ├── oauth-sign@0.9.0
+2339 silly idealTree ├── performance-now@2.1.0
+2339 silly idealTree ├── promise@7.3.1
+2339 silly idealTree ├── prr@1.0.1
+2339 silly idealTree ├── psl@1.8.0
+2339 silly idealTree ├── punycode@2.1.1
+2339 silly idealTree ├── qs@6.5.2
+2339 silly idealTree ├── request@2.88.2
+2339 silly idealTree ├── safe-buffer@5.2.1
+2339 silly idealTree ├── safer-buffer@2.1.2
+2339 silly idealTree ├── source-map@0.6.1
+2339 silly idealTree ├── sshpk@1.16.1
+2339 silly idealTree ├── tough-cookie@2.5.0
+2339 silly idealTree ├── tslib@1.13.0
+2339 silly idealTree ├── tunnel-agent@0.6.0
+2339 silly idealTree ├── tweetnacl@0.14.5
+2339 silly idealTree ├── uri-js@4.2.2
+2339 silly idealTree ├── uuid@3.4.0
+2339 silly idealTree └── verror@1.10.0
+2340 silly generateActionsToTake Starting
+2341 silly install generateActionsToTake
+2342 warn checkPermissions Missing write access to /usr/local/lib/node_modules
+2343 silly rollbackFailedOptional Starting
+2344 silly rollbackFailedOptional Finishing
+2345 silly runTopLevelLifecycles Starting
+2346 silly runTopLevelLifecycles Finishing
+2347 silly install printInstalled
+2348 verbose stack Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
+2349 verbose cwd /home/christine/0_WORK/gradcomm
+2350 error Linux 4.15.0-99-generic
+2351 error argv "/usr/bin/node" "/usr/bin/npm" "install" "-g" "less"
+2352 error node v8.10.0
+2353 error npm v3.5.2
+2354 error path /usr/local/lib/node_modules
+2355 error code EACCES
+2356 error errno -13
+2357 error syscall access
+2358 error Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
+2358 error { Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
+2358 error errno: -13,
+2358 error code: 'EACCES',
+2358 error syscall: 'access',
+2358 error path: '/usr/local/lib/node_modules' }
+2359 error Please try running this command again as root/Administrator.
+2360 verbose exit [ -13, true ]
diff --git a/community_server/parse_proto.php b/community_server/parse_proto.php
new file mode 100755
index 000000000..576b99691
--- /dev/null
+++ b/community_server/parse_proto.php
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Copyright 2015 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# need grpc only for hedera hashgraph
+#PHP_PLUGIN="$(which grpc_php_plugin)"
+#protoc --proto_path=./src/protobuf/gradido --php_out=./src/ --grpc_out=./src/ --plugin=protoc-gen-grpc=$PHP_PLUGIN ./src/protobuf/gradido/*.proto
+
+protoc --proto_path=./src/protobuf/gradido --php_out=./src/ ./src/protobuf/gradido/*.proto
+
diff --git a/community_server/phpunit.xml.dist b/community_server/phpunit.xml.dist
new file mode 100644
index 000000000..ba971b637
--- /dev/null
+++ b/community_server/phpunit.xml.dist
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+ tests/TestCase/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ src/
+ plugins/*/src/
+
+ src/Console/Installer.php
+
+
+
+
diff --git a/community_server/plugins/empty b/community_server/plugins/empty
new file mode 100644
index 000000000..e69de29bb
diff --git a/community_server/skeema/gradido_community/admin_errors.sql b/community_server/skeema/gradido_community/admin_errors.sql
new file mode 100644
index 000000000..020b4078b
--- /dev/null
+++ b/community_server/skeema/gradido_community/admin_errors.sql
@@ -0,0 +1,11 @@
+CREATE TABLE `admin_errors` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `state_user_id` int(11) NOT NULL,
+ `controller` varchar(255) NOT NULL,
+ `action` varchar(255) NOT NULL,
+ `state` varchar(255) NOT NULL,
+ `msg` varchar(255) NOT NULL,
+ `details` varchar(255) DEFAULT NULL,
+ `created` datetime NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
diff --git a/community_server/skeema/gradido_community/community_profiles.sql b/community_server/skeema/gradido_community/community_profiles.sql
new file mode 100644
index 000000000..ea857bebf
--- /dev/null
+++ b/community_server/skeema/gradido_community/community_profiles.sql
@@ -0,0 +1,8 @@
+CREATE TABLE `community_profiles` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `state_user_id` int(10) unsigned NOT NULL,
+ `profile_img` longblob,
+ `profile_desc` varchar(2000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `state_user_id` (`state_user_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/insert/insert_transaction_types.sql b/community_server/skeema/gradido_community/insert/insert_transaction_types.sql
new file mode 100644
index 000000000..9dbf5b93f
--- /dev/null
+++ b/community_server/skeema/gradido_community/insert/insert_transaction_types.sql
@@ -0,0 +1,5 @@
+
+INSERT INTO `transaction_types` (`id`, `name`, `text`) VALUES
+(1, 'creation', 'Aktives oder Bedingungsloses Grundeinkommen.'),
+(2, 'transfer', 'Einfache Überweisung');
+
diff --git a/community_server/skeema/gradido_community/operator_types.sql b/community_server/skeema/gradido_community/operator_types.sql
new file mode 100644
index 000000000..35df5264e
--- /dev/null
+++ b/community_server/skeema/gradido_community/operator_types.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `operator_types` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `text` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/operators.sql b/community_server/skeema/gradido_community/operators.sql
new file mode 100644
index 000000000..74808be9b
--- /dev/null
+++ b/community_server/skeema/gradido_community/operators.sql
@@ -0,0 +1,8 @@
+CREATE TABLE `operators` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `user_pubkey` binary(32) NOT NULL,
+ `data_base64` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `modified` datetime NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/pending_transactions.sql b/community_server/skeema/gradido_community/pending_transactions.sql
new file mode 100644
index 000000000..e3d6a4a08
--- /dev/null
+++ b/community_server/skeema/gradido_community/pending_transactions.sql
@@ -0,0 +1,10 @@
+CREATE TABLE `pending_transactions` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transactionID` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `service` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `method` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `h_server_id` int(11) NOT NULL,
+ `timeout` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `transactionID` (`transactionID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/roles.sql b/community_server/skeema/gradido_community/roles.sql
new file mode 100644
index 000000000..9fe9de710
--- /dev/null
+++ b/community_server/skeema/gradido_community/roles.sql
@@ -0,0 +1,5 @@
+CREATE TABLE `roles` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
+ `title` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/server_users.sql b/community_server/skeema/gradido_community/server_users.sql
new file mode 100644
index 000000000..982a4bdc3
--- /dev/null
+++ b/community_server/skeema/gradido_community/server_users.sql
@@ -0,0 +1,12 @@
+CREATE TABLE `server_users` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `email` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `role` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'admin',
+ `activated` tinyint(4) NOT NULL DEFAULT '0',
+ `last_login` datetime DEFAULT NULL,
+ `created` datetime NOT NULL,
+ `modified` datetime NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_balances.sql b/community_server/skeema/gradido_community/state_balances.sql
new file mode 100644
index 000000000..c8b013d44
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_balances.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `state_balances` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `state_user_id` int(10) unsigned NOT NULL,
+ `modified` datetime NOT NULL,
+ `amount` bigint(20) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_created.sql b/community_server/skeema/gradido_community/state_created.sql
new file mode 100644
index 000000000..5bc139594
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_created.sql
@@ -0,0 +1,11 @@
+CREATE TABLE `state_created` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transaction_id` int(10) unsigned NOT NULL,
+ `month` tinyint(3) unsigned NOT NULL,
+ `year` smallint(5) unsigned NOT NULL,
+ `state_user_id` int(10) unsigned NOT NULL,
+ `created` datetime NOT NULL,
+ `short_ident_hash` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `short_ident_hash` (`short_ident_hash`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_errors.sql b/community_server/skeema/gradido_community/state_errors.sql
new file mode 100644
index 000000000..8088f6ed2
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_errors.sql
@@ -0,0 +1,8 @@
+CREATE TABLE `state_errors` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `state_user_id` int(10) unsigned NOT NULL,
+ `transaction_type_id` int(10) unsigned NOT NULL,
+ `created` datetime NOT NULL,
+ `message_json` text COLLATE utf8mb4_unicode_ci NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_group_addresses.sql b/community_server/skeema/gradido_community/state_group_addresses.sql
new file mode 100644
index 000000000..1d256f3e0
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_group_addresses.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `state_group_addresses` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `group_id` int(10) unsigned NOT NULL,
+ `public_key` binary(32) NOT NULL,
+ `address_type_id` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_group_relationships.sql b/community_server/skeema/gradido_community/state_group_relationships.sql
new file mode 100644
index 000000000..d2eecbfc0
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_group_relationships.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `state_group_relationships` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `group1_id` int(10) unsigned NOT NULL,
+ `group2_id` int(10) unsigned NOT NULL,
+ `state_relationship_id` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_groups.sql b/community_server/skeema/gradido_community/state_groups.sql
new file mode 100644
index 000000000..30a810a19
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_groups.sql
@@ -0,0 +1,8 @@
+CREATE TABLE `state_groups` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `index_id` varbinary(64) NOT NULL,
+ `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `root_public_key` binary(32) NOT NULL,
+ `user_count` smallint(5) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_relationship_types.sql b/community_server/skeema/gradido_community/state_relationship_types.sql
new file mode 100644
index 000000000..fd901b8ac
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_relationship_types.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `state_relationship_types` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `text` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_user_roles.sql b/community_server/skeema/gradido_community/state_user_roles.sql
new file mode 100644
index 000000000..207c2de63
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_user_roles.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `state_user_roles` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT,
+ `state_user_id` int(11) NOT NULL,
+ `role_id` int(11) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/state_users.sql b/community_server/skeema/gradido_community/state_users.sql
new file mode 100644
index 000000000..706fa699e
--- /dev/null
+++ b/community_server/skeema/gradido_community/state_users.sql
@@ -0,0 +1,13 @@
+CREATE TABLE `state_users` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `index_id` smallint(6) NOT NULL DEFAULT '0',
+ `group_id` int(10) unsigned NOT NULL DEFAULT '0',
+ `public_key` binary(32) NOT NULL,
+ `email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `first_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `last_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `disabled` tinyint(4) DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `public_key` (`public_key`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transaction_creations.sql b/community_server/skeema/gradido_community/transaction_creations.sql
new file mode 100644
index 000000000..a2ff37539
--- /dev/null
+++ b/community_server/skeema/gradido_community/transaction_creations.sql
@@ -0,0 +1,9 @@
+CREATE TABLE `transaction_creations` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transaction_id` int(10) unsigned NOT NULL,
+ `state_user_id` int(10) unsigned NOT NULL,
+ `amount` bigint(20) NOT NULL,
+ `ident_hash` binary(32) NOT NULL,
+ `target_date` timestamp NULL DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transaction_group_addaddress.sql b/community_server/skeema/gradido_community/transaction_group_addaddress.sql
new file mode 100644
index 000000000..dceac273c
--- /dev/null
+++ b/community_server/skeema/gradido_community/transaction_group_addaddress.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `transaction_group_addaddress` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transaction_id` int(10) unsigned NOT NULL,
+ `address_type_id` int(10) unsigned NOT NULL,
+ `public_key` binary(32) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transaction_group_allowtrades.sql b/community_server/skeema/gradido_community/transaction_group_allowtrades.sql
new file mode 100644
index 000000000..923e0d5d0
--- /dev/null
+++ b/community_server/skeema/gradido_community/transaction_group_allowtrades.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `transaction_group_allowtrades` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transaction_id` int(10) unsigned NOT NULL,
+ `remote_group_id` varbinary(64) NOT NULL,
+ `allow` tinyint(4) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transaction_group_creates.sql b/community_server/skeema/gradido_community/transaction_group_creates.sql
new file mode 100644
index 000000000..b5d7629b4
--- /dev/null
+++ b/community_server/skeema/gradido_community/transaction_group_creates.sql
@@ -0,0 +1,8 @@
+CREATE TABLE `transaction_group_creates` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transaction_id` int(10) unsigned NOT NULL,
+ `group_public_key` binary(32) NOT NULL,
+ `group_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transaction_send_coins.sql b/community_server/skeema/gradido_community/transaction_send_coins.sql
new file mode 100644
index 000000000..f57a2175e
--- /dev/null
+++ b/community_server/skeema/gradido_community/transaction_send_coins.sql
@@ -0,0 +1,10 @@
+CREATE TABLE `transaction_send_coins` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transaction_id` int(10) unsigned NOT NULL,
+ `state_user_id` int(10) unsigned NOT NULL,
+ `receiver_public_key` binary(32) NOT NULL,
+ `receiver_user_id` int(10) unsigned NOT NULL,
+ `amount` bigint(20) NOT NULL,
+ `sender_final_balance` bigint(20) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transaction_signatures.sql b/community_server/skeema/gradido_community/transaction_signatures.sql
new file mode 100644
index 000000000..0c13b77da
--- /dev/null
+++ b/community_server/skeema/gradido_community/transaction_signatures.sql
@@ -0,0 +1,7 @@
+CREATE TABLE `transaction_signatures` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `transaction_id` int(10) unsigned NOT NULL,
+ `signature` binary(64) NOT NULL,
+ `pubkey` binary(32) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transaction_types.sql b/community_server/skeema/gradido_community/transaction_types.sql
new file mode 100644
index 000000000..87492e1fe
--- /dev/null
+++ b/community_server/skeema/gradido_community/transaction_types.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `transaction_types` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `text` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/skeema/gradido_community/transactions.sql b/community_server/skeema/gradido_community/transactions.sql
new file mode 100644
index 000000000..0e8c00ce6
--- /dev/null
+++ b/community_server/skeema/gradido_community/transactions.sql
@@ -0,0 +1,9 @@
+CREATE TABLE `transactions` (
+ `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
+ `state_group_id` int(10) unsigned DEFAULT NULL,
+ `transaction_type_id` int(10) unsigned NOT NULL,
+ `tx_hash` binary(32) DEFAULT NULL,
+ `memo` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `received` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
diff --git a/community_server/src/Application.php b/community_server/src/Application.php
new file mode 100644
index 000000000..dbc4640c0
--- /dev/null
+++ b/community_server/src/Application.php
@@ -0,0 +1,119 @@
+bootstrapCli();
+ }
+
+ /*
+ * Only try to load DebugKit in development mode
+ * Debug Kit should not be installed on a production system
+ */
+ if (Configure::read('debug')) {
+ $this->addPlugin(\DebugKit\Plugin::class);
+ }
+
+ // Load more plugins here
+ }
+
+
+
+ /**
+ * Setup the middleware queue your application will use.
+ *
+ * @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup.
+ * @return \Cake\Http\MiddlewareQueue The updated middleware queue.
+ */
+ public function middleware($middlewareQueue)
+ {
+ //$csrf = new CsrfProtectionMiddleware();
+
+ // Token check will be skipped when callback returns `true`.
+ /*$csrf->whitelistCallback(function ($request) {
+ // Skip token check for API URLs.
+ //if ($request->getParam('prefix') === 'api') {
+ if($request->getAttribute('base') === 'TransactionJsonRequestHandler') {
+ return true;
+ }
+ });
+*/
+ // Ensure routing middleware is added to the queue before CSRF protection middleware.
+ //$middlewareQueue->;
+
+ $middlewareQueue
+ // ->add($csrf)
+ // Catch any exceptions in the lower layers,
+ // and make an error page/response
+ ->add(new ErrorHandlerMiddleware(null, Configure::read('Error')))
+
+ // Handle plugin/theme assets like CakePHP normally does.
+ ->add(new AssetMiddleware([
+ 'cacheTime' => Configure::read('Asset.cacheTime')
+ ]))
+
+ // Add routing middleware.
+ // If you have a large number of routes connected, turning on routes
+ // caching in production could improve performance. For that when
+ // creating the middleware instance specify the cache config name by
+ // using it's second constructor argument:
+ // `new RoutingMiddleware($this, '_cake_routes_')`
+ ->add(new RoutingMiddleware($this));
+
+ return $middlewareQueue;
+ }
+
+ /**
+ * @return void
+ */
+ protected function bootstrapCli()
+ {
+ try {
+ $this->addPlugin('Bake');
+ } catch (MissingPluginException $e) {
+ // Do not halt if the plugin is missing
+ }
+
+ $this->addPlugin('Migrations');
+
+ // Load more plugins here
+ }
+}
diff --git a/community_server/src/Console/Installer.php b/community_server/src/Console/Installer.php
new file mode 100644
index 000000000..3bcef473b
--- /dev/null
+++ b/community_server/src/Console/Installer.php
@@ -0,0 +1,246 @@
+getIO();
+
+ $rootDir = dirname(dirname(__DIR__));
+
+ static::createAppConfig($rootDir, $io);
+ static::createWritableDirectories($rootDir, $io);
+
+ // ask if the permissions should be changed
+ if ($io->isInteractive()) {
+ $validator = function ($arg) {
+ if (in_array($arg, ['Y', 'y', 'N', 'n'])) {
+ return $arg;
+ }
+ throw new Exception('This is not a valid answer. Please choose Y or n.');
+ };
+ $setFolderPermissions = $io->askAndValidate(
+ 'Set Folder Permissions ? (Default to Y) [Y,n ]? ',
+ $validator,
+ 10,
+ 'Y'
+ );
+
+ if (in_array($setFolderPermissions, ['Y', 'y'])) {
+ static::setFolderPermissions($rootDir, $io);
+ }
+ } else {
+ static::setFolderPermissions($rootDir, $io);
+ }
+
+ static::setSecuritySalt($rootDir, $io);
+
+ $class = 'Cake\Codeception\Console\Installer';
+ if (class_exists($class)) {
+ $class::customizeCodeceptionBinary($event);
+ }
+ }
+
+ /**
+ * Create the config/app.php file if it does not exist.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createAppConfig($dir, $io)
+ {
+ $appConfig = $dir . '/config/app.php';
+ $defaultConfig = $dir . '/config/app.default.php';
+ if (!file_exists($appConfig)) {
+ copy($defaultConfig, $appConfig);
+ $io->write('Created `config/app.php` file');
+ }
+ }
+
+ /**
+ * Create the `logs` and `tmp` directories.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function createWritableDirectories($dir, $io)
+ {
+ foreach (static::WRITABLE_DIRS as $path) {
+ $path = $dir . '/' . $path;
+ if (!file_exists($path)) {
+ mkdir($path);
+ $io->write('Created `' . $path . '` directory');
+ }
+ }
+ }
+
+ /**
+ * Set globally writable permissions on the "tmp" and "logs" directory.
+ *
+ * This is not the most secure default, but it gets people up and running quickly.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setFolderPermissions($dir, $io)
+ {
+ // Change the permissions on a path and output the results.
+ $changePerms = function ($path) use ($io) {
+ $currentPerms = fileperms($path) & 0777;
+ $worldWritable = $currentPerms | 0007;
+ if ($worldWritable == $currentPerms) {
+ return;
+ }
+
+ $res = chmod($path, $worldWritable);
+ if ($res) {
+ $io->write('Permissions set on ' . $path);
+ } else {
+ $io->write('Failed to set permissions on ' . $path);
+ }
+ };
+
+ $walker = function ($dir) use (&$walker, $changePerms) {
+ $files = array_diff(scandir($dir), ['.', '..']);
+ foreach ($files as $file) {
+ $path = $dir . '/' . $file;
+
+ if (!is_dir($path)) {
+ continue;
+ }
+
+ $changePerms($path);
+ $walker($path);
+ }
+ };
+
+ $walker($dir . '/tmp');
+ $changePerms($dir . '/tmp');
+ $changePerms($dir . '/logs');
+ }
+
+ /**
+ * Set the security.salt value in the application's config file.
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @return void
+ */
+ public static function setSecuritySalt($dir, $io)
+ {
+ $newKey = hash('sha256', Security::randomBytes(64));
+ static::setSecuritySaltInFile($dir, $io, $newKey, 'app.php');
+ }
+
+ /**
+ * Set the security.salt value in a given file
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @param string $newKey key to set in the file
+ * @param string $file A path to a file relative to the application's root
+ * @return void
+ */
+ public static function setSecuritySaltInFile($dir, $io, $newKey, $file)
+ {
+ $config = $dir . '/config/' . $file;
+ $content = file_get_contents($config);
+
+ $content = str_replace('__SALT__', $newKey, $content, $count);
+
+ if ($count == 0) {
+ $io->write('No Security.salt placeholder to replace.');
+
+ return;
+ }
+
+ $result = file_put_contents($config, $content);
+ if ($result) {
+ $io->write('Updated Security.salt value in config/' . $file);
+
+ return;
+ }
+ $io->write('Unable to update Security.salt value.');
+ }
+
+ /**
+ * Set the APP_NAME value in a given file
+ *
+ * @param string $dir The application's root directory.
+ * @param \Composer\IO\IOInterface $io IO interface to write to console.
+ * @param string $appName app name to set in the file
+ * @param string $file A path to a file relative to the application's root
+ * @return void
+ */
+ public static function setAppNameInFile($dir, $io, $appName, $file)
+ {
+ $config = $dir . '/config/' . $file;
+ $content = file_get_contents($config);
+ $content = str_replace('__APP_NAME__', $appName, $content, $count);
+
+ if ($count == 0) {
+ $io->write('No __APP_NAME__ placeholder to replace.');
+
+ return;
+ }
+
+ $result = file_put_contents($config, $content);
+ if ($result) {
+ $io->write('Updated __APP_NAME__ value in config/' . $file);
+
+ return;
+ }
+ $io->write('Unable to update __APP_NAME__ value.');
+ }
+}
diff --git a/community_server/src/Controller/AddressTypesController.php b/community_server/src/Controller/AddressTypesController.php
new file mode 100644
index 000000000..348a8e9e6
--- /dev/null
+++ b/community_server/src/Controller/AddressTypesController.php
@@ -0,0 +1,107 @@
+paginate($this->AddressTypes);
+
+ $this->set(compact('addressTypes'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Address Type id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $addressType = $this->AddressTypes->get($id, [
+ 'contain' => ['StateGroupAddresses', 'TransactionGroupAddaddress']
+ ]);
+
+ $this->set('addressType', $addressType);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $addressType = $this->AddressTypes->newEntity();
+ if ($this->request->is('post')) {
+ $addressType = $this->AddressTypes->patchEntity($addressType, $this->request->getData());
+ if ($this->AddressTypes->save($addressType)) {
+ $this->Flash->success(__('The address type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The address type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('addressType'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Address Type id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $addressType = $this->AddressTypes->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $addressType = $this->AddressTypes->patchEntity($addressType, $this->request->getData());
+ if ($this->AddressTypes->save($addressType)) {
+ $this->Flash->success(__('The address type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The address type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('addressType'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Address Type id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $addressType = $this->AddressTypes->get($id);
+ if ($this->AddressTypes->delete($addressType)) {
+ $this->Flash->success(__('The address type has been deleted.'));
+ } else {
+ $this->Flash->error(__('The address type could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/AdminErrorsController.php b/community_server/src/Controller/AdminErrorsController.php
new file mode 100644
index 000000000..a9688008e
--- /dev/null
+++ b/community_server/src/Controller/AdminErrorsController.php
@@ -0,0 +1,111 @@
+paginate = [
+ 'contain' => ['StateUsers']
+ ];
+ $adminErrors = $this->paginate($this->AdminErrors);
+
+ $this->set(compact('adminErrors'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Admin Error id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $adminError = $this->AdminErrors->get($id, [
+ 'contain' => ['StateUsers']
+ ]);
+
+ $this->set('adminError', $adminError);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $adminError = $this->AdminErrors->newEntity();
+ if ($this->request->is('post')) {
+ $adminError = $this->AdminErrors->patchEntity($adminError, $this->request->getData());
+ if ($this->AdminErrors->save($adminError)) {
+ $this->Flash->success(__('The admin error has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The admin error could not be saved. Please, try again.'));
+ }
+ $stateUsers = $this->AdminErrors->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('adminError', 'stateUsers'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Admin Error id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $adminError = $this->AdminErrors->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $adminError = $this->AdminErrors->patchEntity($adminError, $this->request->getData());
+ if ($this->AdminErrors->save($adminError)) {
+ $this->Flash->success(__('The admin error has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The admin error could not be saved. Please, try again.'));
+ }
+ $stateUsers = $this->AdminErrors->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('adminError', 'stateUsers'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Admin Error id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $adminError = $this->AdminErrors->get($id);
+ if ($this->AdminErrors->delete($adminError)) {
+ $this->Flash->success(__('The admin error has been deleted.'));
+ } else {
+ $this->Flash->error(__('The admin error could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/AppController.php b/community_server/src/Controller/AppController.php
new file mode 100644
index 000000000..2c59a17e0
--- /dev/null
+++ b/community_server/src/Controller/AppController.php
@@ -0,0 +1,341 @@
+loadComponent('Security');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ parent::initialize();
+
+ $this->loadComponent('RequestHandler', [
+ 'enableBeforeRedirect' => false,
+ ]);
+ $this->loadComponent('Flash');
+
+ $this->loadComponent('Auth', [
+ 'loginAction' => [
+ 'controller' => 'ServerUsers',
+ 'action' => 'login'
+ ],
+ 'loginRedirect' => [
+ 'controller' => 'Transactions',
+ 'action' => 'index'
+ ],
+ 'logoutRedirect' => [
+ 'controller' => 'Pages',
+ 'action' => 'display',
+ 'gradido'
+ ],
+ 'authenticate' => [
+ 'all' => ['userModel' => 'ServerUsers'],
+ 'Form' => [
+ 'userModel' => 'ServerUsers',
+ ]
+ ]
+ ]);
+
+ $this->Auth->deny(['index']);
+
+ /*
+ * Enable the following component for recommended CakePHP security settings.
+ * see https://book.cakephp.org/3.0/en/controllers/components/security.html
+ */
+ //$this->loadComponent('Security');
+
+
+ // load current balance
+ $session = $this->getRequest()->getSession();
+ $state_user_id = $session->read('StateUser.id');
+ if ($state_user_id) {
+ $stateBalancesTable = TableRegistry::getTableLocator()->get('stateBalances');
+ $stateBalanceQuery = $stateBalancesTable
+ ->find('all')
+ ->select('amount')
+ ->contain(false)
+ ->where(['state_user_id' => $state_user_id]);
+ if ($stateBalanceQuery->count() == 1) {
+ //var_dump($stateBalanceEntry->first());
+ $session->write('StateUser.balance', $stateBalanceQuery->first()->amount);
+ //echo "stateUser.balance: " . $session->read('StateUser.balance');
+ }
+ }
+
+ // load error count
+ if ($state_user_id) {
+ $stateErrorsTable = TableRegistry::getTableLocator()->get('stateErrors');
+ $stateErrorQuery = $stateErrorsTable
+ ->find('all')
+ ->select('id')
+ ->contain(false)
+ ->where(['state_user_id' => $state_user_id]);
+ $session->write('StateUser.errorCount', $stateErrorQuery->count());
+ }
+ //echo "initialize";
+
+
+ // put current page into global for navi
+ $GLOBALS["passed"] = null;
+ $side = $this->request->getParam('controller');
+ $GLOBALS["side"] = $side;
+ $subside = $this->request->getParam('action');
+ $passedArguments = $this->request->getParam('pass');
+ if ($passedArguments) {
+ $GLOBALS["passed"] = $passedArguments[0];
+ }
+ $GLOBALS["subside"] = $subside;
+
+ // server login
+ if ($this->Auth->user('id')) {
+ $GLOBALS['ServerUser'] = $this->Auth->user();
+ }
+
+ // login server url
+ $loginServer = Configure::read('LoginServer');
+ if ($loginServer && isset($loginServer['url'])) {
+ $this->loginServerUrl = $loginServer['url'] . '/';
+ } else {
+ $this->loginServerUrl = Router::url('/', true);
+ }
+ }
+
+ protected function requestLogin($session_id = 0)
+ {
+ $session = $this->getRequest()->getSession();
+ // check login
+ // disable encryption for cookies
+ //$this->Cookie->configKey('User', 'encryption', false);
+ if(!$session_id) {
+ $session_id = intval($this->request->getCookie('GRADIDO_LOGIN', ''));
+ }
+ $ip = $this->request->clientIp();
+ if (!$session->check('client_ip')) {
+ $session->write('client_ip', $ip);
+ }
+ // login server cannot detect host ip
+ // TODO: update login server, recognize nginx real ip header
+ $loginServer = Configure::read('LoginServer');
+
+ if ($session_id != 0) {
+ $userStored = $session->read('StateUser');
+
+
+ $transactionPendings = $session->read('Transaction.pending');
+ $transactionExecutings = $session->read('Transaction.executing');
+ if ($session->read('session_id') != $session_id ||
+ ( $userStored && (!isset($userStored['id']) || !$userStored['email_checked'])) ||
+ intval($transactionPendings) > 0 ||
+ intval($transactionExecutings) > 0) {
+ $http = new Client();
+
+ try {
+ $url = $loginServer['host'] . ':' . $loginServer['port'];
+
+ $response = $http->get($url . '/login', ['session_id' => $session_id]);
+ $json = $response->getJson();
+
+ if (isset($json) && count($json) > 0) {
+ if ($json['state'] === 'success') {
+ //echo "email checked: " . $json['user']['email_checked'] . "; ";
+ if ($session->read('session_id') != $session_id ||
+ ( $userStored && !isset($userStored['id']))) {
+ $session->destroy();
+ }
+ foreach ($json['user'] as $key => $value) {
+ $session->write('StateUser.' . $key, $value);
+ }
+ //var_dump($json);
+ $transactionPendings = $json['Transaction.pending'];
+ $transactionExecuting = $json['Transaction.executing'];
+ //echo "read transaction pending: $transactionPendings ";
+ $session->write('Transaction.pending', $transactionPendings);
+ $session->write('Transaction.executing', $transactionExecuting);
+ $session->write('session_id', $session_id);
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+
+ if (isset($json['user']['public_hex']) && $json['user']['public_hex'] != '') {
+ $public_key_bin = hex2bin($json['user']['public_hex']);
+ $stateUserQuery = $stateUserTable
+ ->find('all')
+ ->where(['public_key' => $public_key_bin])
+ ->contain(['StateBalances']);
+ if ($stateUserQuery->count() == 1) {
+ $stateUser = $stateUserQuery->first();
+ if ($stateUser->first_name != $json['user']['first_name'] ||
+ $stateUser->last_name != $json['user']['last_name'] ||
+ $stateUser->disabled != intval($json['user']['disabled']) ||
+ //$stateUser->username != $json['user']['username'] ||
+ // -> throws error
+ $stateUser->email != $json['user']['email']
+ ) {
+ $stateUser->first_name = $json['user']['first_name'];
+ $stateUser->last_name = $json['user']['last_name'];
+ $stateUser->disabled = intval($json['user']['disabled']);
+ //$stateUser->username = $json['user']['username'];
+ $stateUser->email = $json['user']['email'];
+ if (!$stateUserTable->save($stateUser)) {
+ $this->Flash->error(__('error updating state user ' . json_encode($stateUser->errors())));
+ }
+ }
+ //var_dump($stateUser);
+ if (count($stateUser->state_balances) > 0) {
+ $session->write('StateUser.balance', $stateUser->state_balances[0]->amount);
+ }
+ $session->write('StateUser.id', $stateUser->id);
+ //echo $stateUser['id'];
+ } else {
+ $newStateUser = $stateUserTable->newEntity();
+ $newStateUser->public_key = $public_key_bin;
+ $newStateUser->first_name = $json['user']['first_name'];
+ $newStateUser->last_name = $json['user']['last_name'];
+ $newStateUser->disabled = intval($json['user']['disabled']);
+ //$newStateUser->username = $json['user']['username'];
+ $newStateUser->email = $json['user']['email'];
+ if (!$stateUserTable->save($newStateUser)) {
+ $this->Flash->error(__('error saving state user ' . json_encode($newStateUser->errors())));
+ }
+ $session->write('StateUser.id', $newStateUser->id);
+ //echo $newStateUser->id;
+ }
+ } else {
+ // we haven't get a pubkey? something seems to gone wrong on the login-server
+ $this->Flash->error(__('no pubkey'));
+ //var_dump($json);
+ return $this->redirect($this->loginServerUrl . 'account/error500/noPubkey', 303);
+ }
+ } else {
+ if ($json['state'] === 'not found') {
+ $this->Flash->error(__('invalid session'));
+ } else {
+ $this->Flash->error(__('Konto ist nicht aktiviert!'));
+ }
+ //die(json_encode($json));
+ return $this->redirect($this->loginServerUrl . 'account/', 303);
+ }
+ }
+ } catch (\Exception $e) {
+ $msg = $e->getMessage();
+ $this->Flash->error(__('error http request: ') . $msg);
+ return $this->redirect(['controller' => 'Dashboard', 'action' => 'errorHttpRequest']);
+ //continue;
+ }
+ }
+ } else {
+ // no login
+ //die("no login");
+ if (isset($loginServer['path'])) {
+ return $this->redirect($loginServer['path'], 303);
+ } else {
+ return $this->redirect($this->loginServerUrl . 'account/', 303);
+ }
+ }
+ return true;
+ }
+
+ /*
+ public function beforeFilter(Event $event)
+ {
+ //$this->Auth->allow(['display']);
+ }
+ */
+
+ public function addAdminError($controller, $action, array $returnTable, $state_user_id)
+ {
+ if (!is_array($returnTable)) {
+ $this->addAdminError('AppController', 'addAdminError', ['state' => 'error', 'msg' => 'returnTable isn\'t array', 'details' => gettype($returnTable)], $state_user_id);
+ return false;
+ }
+ $adminErrorTable = TableRegistry::getTableLocator()->get('AdminErrors');
+ $adminErrorEntity = $adminErrorTable->newEntity();
+ $adminErrorEntity->state_user_id = $state_user_id;
+ $adminErrorEntity->controller = $controller;
+ $adminErrorEntity->action = $action;
+ $adminErrorEntity->state = $returnTable['state'];
+ if (isset($returnTable['msg'])) {
+ $adminErrorEntity->msg = $returnTable['msg'];
+ } else {
+ $adminErrorEntity->msg = __('(Leere Message)');
+ }
+ if (isset($returnTable['details'])) {
+ $adminErrorEntity->details = $returnTable['details'];
+ } else {
+ $adminErrorEntity->details = __('(Leere Details)');
+ }
+ if (!$adminErrorTable->save($adminErrorEntity)) {
+ $this->Flash->error(
+ __('Serious error, couldn\'t save to db, please write the admin: ' . $this->getAdminEmailLink()),
+ ['escape' => false]
+ );
+ }
+ return true;
+ }
+
+ public function getAdminEmailLink($text = '')
+ {
+ $serverAdminEmail = Configure::read('ServerAdminEmail');
+ return ''. $serverAdminEmail . ' ';
+ }
+
+ public function returnJsonEncoded($json)
+ {
+ $this->autoRender = false;
+ $response = $this->response->withType('application/json');
+ return $response->withStringBody($json);
+ }
+
+ public function returnJson($array)
+ {
+ $this->autoRender = false;
+ $response = $this->response->withType('application/json');
+ return $response->withStringBody(json_encode($array));
+ }
+
+ public function getStartEndForMonth($month, $year)
+ {
+ $timeString = $year . '-' . $month . '-01 00:00';
+ $firstDay = new Time($timeString);
+ $lastDay = new Time($timeString);
+ $lastDay = $lastDay->addMonth(1);
+ return [$firstDay, $lastDay];
+ }
+}
diff --git a/community_server/src/Controller/CommunityProfilesController.php b/community_server/src/Controller/CommunityProfilesController.php
new file mode 100644
index 000000000..c807da72c
--- /dev/null
+++ b/community_server/src/Controller/CommunityProfilesController.php
@@ -0,0 +1,106 @@
+paginate($this->CommunityProfiles);
+
+ $this->set(compact('communityProfiles'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Community Profile id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $communityProfile = $this->CommunityProfiles->get($id, [
+ 'contain' => [],
+ ]);
+
+ $this->set('communityProfile', $communityProfile);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $communityProfile = $this->CommunityProfiles->newEntity();
+ if ($this->request->is('post')) {
+ $communityProfile = $this->CommunityProfiles->patchEntity($communityProfile, $this->request->getData());
+ if ($this->CommunityProfiles->save($communityProfile)) {
+ $this->Flash->success(__('The community profile has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The community profile could not be saved. Please, try again.'));
+ }
+ $this->set(compact('communityProfile'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Community Profile id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $communityProfile = $this->CommunityProfiles->get($id, [
+ 'contain' => [],
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $communityProfile = $this->CommunityProfiles->patchEntity($communityProfile, $this->request->getData());
+ if ($this->CommunityProfiles->save($communityProfile)) {
+ $this->Flash->success(__('The community profile has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The community profile could not be saved. Please, try again.'));
+ }
+ $this->set(compact('communityProfile'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Community Profile id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $communityProfile = $this->CommunityProfiles->get($id);
+ if ($this->CommunityProfiles->delete($communityProfile)) {
+ $this->Flash->success(__('The community profile has been deleted.'));
+ } else {
+ $this->Flash->error(__('The community profile could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/Component/GradidoNumberComponent.php b/community_server/src/Controller/Component/GradidoNumberComponent.php
new file mode 100644
index 000000000..5db208c3a
--- /dev/null
+++ b/community_server/src/Controller/Component/GradidoNumberComponent.php
@@ -0,0 +1,33 @@
+ 'error', 'type' => 'parameter error', 'msg' => 'session_id isn\'t numeric'];
+ }
+ if(!is_numeric($user_balance) || intval($user_balance) < 0) {
+ return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'user_balance invalid'];
+ }
+ if(is_array($base64Message)) {
+ foreach($base64Message as $singleMessage) {
+ if(!$this->is_base64($singleMessage)) {
+ return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'at least one base64Message contain invalid base64 characters'];
+ }
+ }
+ } else if(!$this->is_base64($base64Message)) {
+ return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'base64Message contain invalid base64 characters'];
+ }
+
+ return $this->sendRequest(json_encode([
+ 'session_id' => $session_id,
+ 'transaction_base64' => $base64Message,
+ 'balance' => $user_balance
+ ]), '/checkTransaction');
+
+ }
+
+ public function getRunningUserTasks($email)
+ {
+ if($email == "") {
+ return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'email is empty'];
+ }
+ if(!GenericValidation::email($email, [])) {
+ return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'email is invalid'];
+ }
+
+ return $this->sendRequest(json_encode([
+ 'email' => $email
+ ]), '/getRunningUserTasks');
+ }
+
+ public function getUsers($session_id, $searchString)
+ {
+ if($searchString == "") {
+ return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'search string is empty'];
+ }
+ if(!is_numeric($session_id)) {
+ return ['state' => 'error', 'type' => 'parameter error', 'msg' => 'session_id isn\'t numeric'];
+ }
+
+ return $this->sendRequest(json_encode([
+ 'session_id' => $session_id,
+ 'search' => $searchString
+ ]), '/getUsers');
+ }
+
+ public function sendRequest($transactionBody, $url_last_part) {
+ $http = new Client();
+
+ $response = $http->post($this->getLoginServerUrl() . $url_last_part, $transactionBody, ['type' => 'json']);
+ $responseStatus = $response->getStatusCode();
+ if($responseStatus != 200) {
+ return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response status code isn\'t 200', 'details' => $responseStatus];
+ }
+ //$responseType = $response->getType();
+ //if($responseType != 'application/json') {
+// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType];
+// }
+ $json = $response->getJson();
+ if($json == null) {
+ //$responseType = $response->getType();
+ return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json'];
+ }
+ return ['state' => 'success', 'data' => $json];
+ }
+
+ public function sendRequestGDT($transactionBody, $url) {
+
+ $http = new Client();
+ $gdtServerHost = $this->getGDTServerUrl();
+ if(!$gdtServerHost) {
+ return ['state' => 'warning', 'msg' => 'gdt server not configured'];
+ }
+ $fullUrl = $gdtServerHost . DS . $url;
+ $response = $http->post($this->getGDTServerUrl() . DS . $url, $transactionBody, ['type' => 'json']);
+ $responseStatus = $response->getStatusCode();
+ if($responseStatus != 200) {
+ return [
+ 'state' => 'error',
+ 'type' => 'request error',
+ 'msg' => 'server response status code isn\'t 200',
+ 'details' => $responseStatus,
+ 'fullUrl' => $fullUrl
+ ];
+ }
+ //$responseType = $response->getType();
+ //if($responseType != 'application/json') {
+// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType];
+// }
+ $json = $response->getJson();
+ if($json == null) {
+ //$responseType = $response->getType();
+ return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json'];
+ }
+ return ['state' => 'success', 'data' => $json];
+ }
+
+ static public function getLoginServerUrl()
+ {
+ $loginServer = Configure::read('LoginServer');
+ return $loginServer['host'] . ':' . $loginServer['port'];
+ }
+
+ static public function getGDTServerUrl()
+ {
+ $gdtServer = Configure::read('GDTServer');
+ if(isset($gdtServer['host'])) {
+ return $gdtServer['host'];
+ }
+ return false;
+ }
+
+ static public function is_base64($s)
+ {
+ return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
+ }
+
+}
diff --git a/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php b/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php
new file mode 100644
index 000000000..d5ca72808
--- /dev/null
+++ b/community_server/src/Controller/Component/JsonRpcRequestClientComponent.php
@@ -0,0 +1,71 @@
+rpcClient = new JsonRpcClient();
+ }
+
+ // @param id: if id = 0 call rand for it
+ public function request($method, $params = [], $id = 0)
+ {
+
+ if(0 == $id) {
+ $id = random_int(1, 12000);
+ }
+ $this->rpcClient->query($id, $method, $params);
+
+ $message = $this->rpcClient->encode();
+ return $this->sendRequest($message);
+ // message: {"jsonrpc":"2.0","method":"add","params":[1,2],"id":1}
+ }
+
+ public function sendRequest($message) {
+ $http = new Client();
+
+ $response = $http->post($this->getGradidoNodeUrl(), $message, ['type' => 'json']);
+ $responseStatus = $response->getStatusCode();
+ if($responseStatus != 200) {
+ return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response status code isn\'t 200', 'details' => $responseStatus];
+ }
+ //$responseType = $response->getType();
+ //if($responseType != 'application/json') {
+// return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t json', 'details' => $responseType];
+// }
+ $json = $response->getJson();
+ if($json == null) {
+ //$responseType = $response->getType();
+ return ['state' => 'error', 'type' => 'request error', 'msg' => 'server response isn\'t valid json'];
+ }
+ return $json;
+ //return ['state' => 'success', 'data' => $json];
+ }
+
+ static public function getGradidoNodeUrl()
+ {
+ $gradidoNode = Configure::read('GradidoNode');
+ return $gradidoNode['host'] . ':' . $gradidoNode['port'];
+ }
+
+
+}
+
+
diff --git a/community_server/src/Controller/DashboardController.php b/community_server/src/Controller/DashboardController.php
new file mode 100644
index 000000000..e25374821
--- /dev/null
+++ b/community_server/src/Controller/DashboardController.php
@@ -0,0 +1,78 @@
+Auth->allow(['add', 'edit']);
+ $this->Auth->allow(['index', 'errorHttpRequest']);
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', true))
+ );
+ }
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ $serverUser = $this->Auth->user('id');
+ if($serverUser) {
+ $adminErrorsTable = TableRegistry::getTableLocator()->get('AdminErrors');
+ $adminErrorCount = $adminErrorsTable->find('all')->count();
+ $this->set('adminErrorCount', $adminErrorCount);
+ }
+
+ $this->set('user', $user);
+ $this->set('serverUser', $serverUser);
+ $this->set('timeUsed', microtime(true) - $startTime);
+
+ }
+
+ public function serverIndex()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $adminErrorsTable = TableRegistry::getTableLocator()->get('AdminErrors');
+ $adminErrorCount = $adminErrorsTable->find('all')->count();
+
+ $this->set('adminErrorCount', $adminErrorCount);
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+
+ public function errorHttpRequest()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+
+}
diff --git a/community_server/src/Controller/ElopageBuysController.php b/community_server/src/Controller/ElopageBuysController.php
new file mode 100644
index 000000000..e097eddbb
--- /dev/null
+++ b/community_server/src/Controller/ElopageBuysController.php
@@ -0,0 +1,165 @@
+paginate = [
+ 'contain' => false,
+ ];
+ $elopageBuys = $this->paginate($this->ElopageBuys);
+
+ $this->set(compact('elopageBuys'));
+ }
+
+ public function statistics()
+ {
+ $this->viewBuilder()->setLayout('frontend');
+ $connection = ConnectionManager::get('loginServer');
+ $dates = $connection->execute('SELECT success_date FROM elopage_buys group by CAST(success_date as DATE)')->fetchAll('assoc');
+
+ $datesTree = [];
+ foreach($dates as $i => $date) {
+
+ $date = new Time($date['success_date']);
+ if(!isset($datesTree[$date->year])) {
+ $datesTree[$date->year] = [];
+ }
+ if(!isset($datesTree[$date->year][$date->month])) {
+ $datesTree[$date->year][$date->month] = true;
+ }
+ }
+ //var_dump($datesTree);
+
+ $now = Time::now();
+ $lastDay = Time::now();
+ $lastDay->day = 1;
+ $now->day = 1;
+ $lastDay->setTime(0,0,0,0);
+ $now->setTime(0,0,0,0);
+ // only for test
+ $now->month = 11;
+ $lastDay->month = 11;
+ $now->year = 2019;
+ $lastDay->year = 2019;
+// var_dump($now);
+
+ $lastDay = $lastDay->addMonth(1);
+ $sortDate = $this->getStartEndForMonth(11, 2019);
+ $elopageBuys = $this->ElopageBuys
+ ->find('all')
+ ->where(['success_date >=' => $sortDate[0], 'success_date <' => $sortDate[1]]);
+ $users = [];
+ foreach($elopageBuys as $elopageEntry) {
+ array_push($users, $elopageEntry->payer_email);
+ }
+ $unique_users = array_unique($users);
+
+ $userTable = TableRegistry::getTableLocator()->get('Users');
+ $users = $userTable->find('all')
+ ->where(['created >=' => $sortDate[0], 'created <' => $sortDate[1]]);
+
+ $this->set(compact('elopageBuys', 'users'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Elopage Buy id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $elopageBuy = $this->ElopageBuys->get($id, [
+ 'contain' => false,
+ ]);
+
+ $this->set('elopageBuy', $elopageBuy);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $elopageBuy = $this->ElopageBuys->newEntity();
+ if ($this->request->is('post')) {
+ $elopageBuy = $this->ElopageBuys->patchEntity($elopageBuy, $this->request->getData());
+ if ($this->ElopageBuys->save($elopageBuy)) {
+ $this->Flash->success(__('The elopage buy has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The elopage buy could not be saved. Please, try again.'));
+ }
+
+ $this->set(compact('elopageBuy'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Elopage Buy id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $elopageBuy = $this->ElopageBuys->get($id, [
+ 'contain' => false,
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $elopageBuy = $this->ElopageBuys->patchEntity($elopageBuy, $this->request->getData());
+ if ($this->ElopageBuys->save($elopageBuy)) {
+ $this->Flash->success(__('The elopage buy has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The elopage buy could not be saved. Please, try again.'));
+ }
+ $this->set(compact('elopageBuy'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Elopage Buy id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $elopageBuy = $this->ElopageBuys->get($id);
+ if ($this->ElopageBuys->delete($elopageBuy)) {
+ $this->Flash->success(__('The elopage buy has been deleted.'));
+ } else {
+ $this->Flash->error(__('The elopage buy could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/ElopageWebhookController.php b/community_server/src/Controller/ElopageWebhookController.php
new file mode 100644
index 000000000..4e806fa69
--- /dev/null
+++ b/community_server/src/Controller/ElopageWebhookController.php
@@ -0,0 +1,51 @@
+Auth->allow(['put']);
+
+ }
+
+ public function put()
+ {
+ $this->autoRender = false;
+ $data = $this->request->getData();
+ $response = $this->response->withType('text/plain');
+
+ $dataString = http_build_query($data);
+ //$this->recursiveArrayToString($data, $dataString);
+ // %5B => [
+ // %5D => ]
+ $dataString = preg_replace(['/\%5B/', '/\%5D/'], ['[', ']'], $dataString);
+ //var_dump($dataString);
+
+ //2020-02-27T13:52:32+01:00
+ $dateString = date('c');
+ $fh = fopen('/etc/grd_login/php_elopage_requests.txt', 'a');
+ if($fh === FALSE) {
+ return $response->withStringBody('400 ERROR');
+ }
+ fwrite($fh, $dateString);
+ fwrite($fh, "\n");
+ fwrite($fh, $dataString);
+ fwrite($fh, "\n");
+ fclose($fh);
+
+
+ return $response->withStringBody('200 OK');
+
+ }
+}
diff --git a/community_server/src/Controller/ErrorController.php b/community_server/src/Controller/ErrorController.php
new file mode 100644
index 000000000..43bd2fb52
--- /dev/null
+++ b/community_server/src/Controller/ErrorController.php
@@ -0,0 +1,70 @@
+loadComponent('RequestHandler', [
+ 'enableBeforeRedirect' => false,
+ ]);
+ }
+
+ /**
+ * beforeFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Http\Response|null|void
+ */
+ public function beforeFilter(Event $event)
+ {
+ }
+
+ /**
+ * beforeRender callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Http\Response|null|void
+ */
+ public function beforeRender(Event $event)
+ {
+ parent::beforeRender($event);
+
+ $this->viewBuilder()->setTemplatePath('Error');
+ }
+
+ /**
+ * afterFilter callback.
+ *
+ * @param \Cake\Event\Event $event Event.
+ * @return \Cake\Http\Response|null|void
+ */
+ public function afterFilter(Event $event)
+ {
+ }
+}
diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php
new file mode 100644
index 000000000..e5823397e
--- /dev/null
+++ b/community_server/src/Controller/JsonRequestHandlerController.php
@@ -0,0 +1,261 @@
+loadComponent('JsonRequestClient');
+ //$this->Auth->allow(['add', 'edit']);
+ $this->Auth->allow('index');
+ }
+
+
+ public function index()
+ {
+ if($this->request->is('get')) {
+ $method = $this->request->getQuery('method');
+ switch($method) {
+ case 'getRunningUserTasks': return $this->getRunningUserTasks();
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for get', 'details' => $method]);
+ }
+ else if($this->request->is('post')) {
+ $jsonData = $this->request->input('json_decode');
+ //var_dump($jsonData);
+ if($jsonData == NULL || !isset($jsonData->method)) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']);
+ }
+ $method = $jsonData->method;
+
+ switch($method) {
+ case 'putTransaction':
+ if(!isset($jsonData->transaction)) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'parameter error']);
+ } else {
+ return $this->putTransaction($jsonData->transaction);
+ }
+ case 'userDelete': return $this->userDelete($jsonData->user);
+ case 'moveTransaction': return $this->moveTransaction($jsonData->pubkeys, $jsonData->memo, $jsonData->session_id);
+ case 'checkUser': return $this->checkUser($jsonData->email, $jsonData->last_name);
+ case 'getUsers' : return $this->getUsers($jsonData->page, $jsonData->limit);
+ case 'getUserBalance': return $this->getUserBalance($jsonData->email, $jsonData->last_name);
+ case 'errorInTransaction': return $this->errorInTransaction($jsonData->created, $jsonData->transactionGenericHash, $jsonData->error, $jsonData->errorMessage);
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'unknown method for post', 'details' => $method]);
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post or get']);
+ }
+
+ //! \param $transactionCreated creation of transaction in timestamp in seconds
+ //! -1 if transaction couldn't decode
+ //! \param $transactionBodyBase64Sha256 generic hash from transaction body serialized and converted to base64
+ //! using sodium_crypto_generichash to calculate
+ // hash also in base64 format
+ //! \param $error short error name in user language
+ //! \param $errorDetails more detailed error message in user language
+ private function errorInTransaction($transactionCreated, $transactionBodyBase64GenericHash, $error, $errorDetails) {
+ /*
+ * payload.set("created", created);
+ * payload.set("id", task_model->getID());
+ * payload.set("public_key", user_model->getPublicKeyHex());
+ * payload.set("error", error);
+ * payload.set("errorMessage", errorDetails);
+ */
+ }
+
+ private function putTransaction($transactionBase64) {
+ $transaction = new Transaction($transactionBase64);
+ //echo "after new transaction ";
+ if($transaction->hasErrors()) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'error parsing transaction', 'details' => $transaction->getErrors()]);
+ }
+ //echo "after check on errors ";
+ if(!$transaction->validate()) {
+ return $this->returnJsonSaveError($transaction, ['state' => 'error', 'msg' => 'error validate transaction', 'details' => $transaction->getErrors()]);
+ }
+ //echo "after validate ";
+
+ if ($transaction->save()) {
+
+
+ // success
+ return $this->returnJson(['state' => 'success']);
+ } else {
+ return $this->returnJsonSaveError($transaction, [
+ 'state' => 'error',
+ 'msg' => 'error saving transaction in db',
+ 'details' => json_encode($transaction->getErrors())
+ ]);
+ }
+
+ return $this->returnJson(['state' => 'success']);
+ }
+
+ private function moveTransaction($pubkeys, $memo, $session_id) {
+ //$pubkeys->sender
+ //$pubkeys->receiver
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($pubkeys->sender)])->contain(['StateBalances']);
+ if(!$user->count()) {
+ return $this->returnJson(['state' => 'not found', 'msg' => 'user not found or empty balance']);
+ }
+ $amountCent = $user->first()->state_balances[0]->amount;
+ //var_dump($user->first());
+ $builderResult = TransactionTransfer::build(
+ $amountCent,
+ $memo,
+ $pubkeys->receiver,
+ $pubkeys->sender
+ );
+ if($builderResult['state'] === 'success') {
+
+ $http = new Client();
+ try {
+ $loginServer = Configure::read('LoginServer');
+ $url = $loginServer['host'] . ':' . $loginServer['port'];
+
+ $response = $http->post($url . '/checkTransaction', json_encode([
+ 'session_id' => $session_id,
+ 'transaction_base64' => base64_encode($builderResult['transactionBody']->serializeToString()),
+ 'balance' => $amountCent
+ ]), ['type' => 'json']);
+ $json = $response->getJson();
+ if($json['state'] != 'success') {
+ if($json['msg'] == 'session not found') {
+ return $this->returnJson(['state' => 'error', 'msg' => 'session not found']);
+ } else {
+ //$this->Flash->error(__('login server return error: ' . json_encode($json)));
+ return $this->returnJson(['state' => 'error', 'msg' => 'login server return error', 'details' => $json]);
+ }
+ } else {
+ return $this->returnJson(['state' => 'success']);
+ }
+
+ } catch(\Exception $e) {
+ $msg = $e->getMessage();
+ //$this->Flash->error(__('error http request: ') . $msg);
+ return $this->returnJson(['state' => 'error', 'msg' => 'error http request', 'details' => $msg]);
+ }
+
+ } else {
+ return $this->returnJson(['state' => 'error', 'msg' => 'error building transaction']);
+ }
+ }
+
+ private function userDelete($userPubkeyHex) {
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($userPubkeyHex)]);
+ if(!$user || $user->count == 0) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'user not found']);
+ }
+
+ }
+
+ private function checkUser($email, $last_name) {
+ $userTable = TableRegistry::getTableLocator()->get('Users');
+ $user = $userTable->find('all')
+ ->where(['email' => $email])
+ ->contain([])
+ ->select(['first_name', 'last_name', 'email']);
+ if(!$user->count()) {
+ return $this->returnJson(['state' => 'not found', 'msg' => 'user not found']);
+ }
+ if($user->count() == 1 && $user->first()->last_name == $last_name) {
+ return $this->returnJson(['state' => 'success']);
+ }
+ return $this->returnJson(['state' => 'not identical', 'user' => $user->toArray()]);
+ }
+
+ private function getUserBalance($email, $last_name) {
+
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $stateUsers = $stateUserTable->find('all')->where(['OR' => ['email' => $email, 'last_name' => $last_name]])->contain(['StateBalances']);
+ $gdds = [];
+ foreach($stateUsers as $stateUser) {
+ foreach($stateUser->state_balances as $stateBalance) {
+ if(!isset($gdds[$stateUser->email])) {
+ $gdds[$stateUser->email] = [];
+ }
+ if(!isset($gdds[$stateUser->email][$stateUser->last_name])) {
+ $gdds[$stateUser->email][$stateUser->last_name] = 0;
+ }
+ $gdds[$stateUser->email][$stateUser->last_name] += $stateBalance->amount;
+ }
+ }
+ return $this->returnJson(['state' => 'success', 'gdds' => $gdds]);
+ }
+
+ private function getUsers($page, $count) {
+
+ $userTable = TableRegistry::getTableLocator()->get('Users');
+ $this->paginate = [
+ 'limit' => $count,
+ 'page' => $page
+ ];
+ $usersQuery = $userTable->find('all')
+ ->select(['first_name', 'last_name', 'email'])
+ ->order(['id']);
+ try {
+ return $this->returnJson(['state' => 'success', 'users' => $this->paginate($usersQuery)]);
+ } catch (Exception $ex) {
+ return $this->returnJson(['state' => 'exception', 'msg' => 'error paginate users', 'details' => $ex->getMessage()]);
+ }
+
+
+ //return $this->returnJson(['state' => 'success', 'users' => $users->toArray()]);
+
+ }
+
+ private function getRunningUserTasks() {
+ $session = $this->getRequest()->getSession();
+ $state_user_email = $session->read('StateUser.email');
+ $requestResult = $this->JsonRequestClient->getRunningUserTasks($state_user_email);;
+ return $this->returnJson($requestResult);
+ }
+
+
+ private function returnJsonSaveError($transaction, $errorArray) {
+ $json = json_encode($errorArray);
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $pub = $transaction->getFirstPublic();
+ $stateUserQuery = $stateUserTable
+ ->find('all')
+ ->where(['public_key' => $pub])
+ ->contain(false);
+ if($stateUserQuery->count() == 1) {
+ $stateErrorsTable = TableRegistry::getTableLocator()->get('StateErrors');
+ $stateErrorEntity = $stateErrorsTable->newEntity();
+ $stateErrorEntity->state_user_id = $stateUserQuery->first()->id;
+ $stateErrorEntity->transaction_type_id = $transaction->getTransactionBody()->getTransactionTypeId();
+ $stateErrorEntity->message_json = $json;
+ $stateErrorsTable->save($stateErrorEntity);
+ } else {
+ $errorArray['user_error'] = "user with $pub not found";
+ $json = json_encode($errorArray);
+ }
+
+ return $this->returnJsonEncoded($json);
+ }
+
+
+
+}
diff --git a/community_server/src/Controller/OperatorTypesController.php b/community_server/src/Controller/OperatorTypesController.php
new file mode 100644
index 000000000..41db53f53
--- /dev/null
+++ b/community_server/src/Controller/OperatorTypesController.php
@@ -0,0 +1,106 @@
+paginate($this->OperatorTypes);
+
+ $this->set(compact('operatorTypes'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Operator Type id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $operatorType = $this->OperatorTypes->get($id, [
+ 'contain' => ['Operators']
+ ]);
+
+ $this->set('operatorType', $operatorType);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $operatorType = $this->OperatorTypes->newEntity();
+ if ($this->request->is('post')) {
+ $operatorType = $this->OperatorTypes->patchEntity($operatorType, $this->request->getData());
+ if ($this->OperatorTypes->save($operatorType)) {
+ $this->Flash->success(__('The operator type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The operator type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('operatorType'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Operator Type id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $operatorType = $this->OperatorTypes->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $operatorType = $this->OperatorTypes->patchEntity($operatorType, $this->request->getData());
+ if ($this->OperatorTypes->save($operatorType)) {
+ $this->Flash->success(__('The operator type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The operator type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('operatorType'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Operator Type id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $operatorType = $this->OperatorTypes->get($id);
+ if ($this->OperatorTypes->delete($operatorType)) {
+ $this->Flash->success(__('The operator type has been deleted.'));
+ } else {
+ $this->Flash->error(__('The operator type could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/OperatorsController.php b/community_server/src/Controller/OperatorsController.php
new file mode 100644
index 000000000..974151a7b
--- /dev/null
+++ b/community_server/src/Controller/OperatorsController.php
@@ -0,0 +1,236 @@
+Auth->allow(['ajaxSave', 'ajaxLoad', 'ajaxDelete']);
+ }
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $this->paginate = [
+ 'contain' => ['OperatorTypes']
+ ];
+ $operators = $this->paginate($this->Operators);
+
+ $this->set(compact('operators'));
+ }
+
+ public function ajaxSave()
+ {
+ if ($this->request->is('post')) {
+
+ $operatorTypeName = $this->request->getData('operator_type_name');
+ $username = $this->request->getData('username');
+ $pubkey_bin = base64_decode($this->request->getData('user_pubkey'));
+ $data = base64_decode($this->request->getData('data_base64'));
+ $sign = base64_decode($this->request->getData('sign'));
+
+ //$publicKey_hex = bin2hex($pubkey_bin);
+ //$signature_hex = bin2hex($sign);
+
+ if(!sodium_crypto_sign_verify_detached($sign, $data, $pubkey_bin)) {
+ return $this->returnJson([
+ 'state' => 'wrong signature',
+ /* 'details' => [
+ 'pubkey' => $publicKey_hex,
+ 'sign' => $signature_hex,
+ 'data' => bin2hex($data)
+ ]
+*/
+ ]);
+ }
+
+ $operatorTypeId = $this->Operators->OperatorTypes->
+ find()
+ ->where(['name' => $operatorTypeName])
+ ->select(['id'])
+ ->first();
+
+ // load operator from db if already exist
+ $operator = $this->Operators
+ ->find()
+ ->where([
+ 'operator_type_id' => $operatorTypeId->id,
+ 'username' => $username,
+ 'user_pubkey' => $pubkey_bin])
+ ->first();
+ if(!$operator) {
+ // create new entity
+ $operator = $this->Operators->newEntity();
+ } else {
+ // check if request has valid signature
+
+ }
+
+ $operator = $this->Operators->patchEntity($operator, $this->request->getData());
+ $operator->user_pubkey = $pubkey_bin;
+ $operator->operator_type_id = $operatorTypeId->id;
+ if ($this->Operators->save($operator)) {
+ return $this->returnJson(['state' => 'success']);
+ }
+ return $this->returnJson(['state' => 'error', 'details' => $operator->getErrors()]);
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ public function ajaxLoad()
+ {
+ if ($this->request->is('get')) {
+ $username = $this->request->getQuery('username');
+ $operators = $this->Operators
+ ->find()
+ ->where(['username' => $username])
+ ->contain(['OperatorTypes'])
+ ->select(['data_base64', 'OperatorTypes.name'])
+ ->toArray();
+ ;
+ if($operators) {
+ return $this->returnJson(['state' => 'success', 'operators' => $operators]);
+ } else {
+ return $this->returnJson(['state' => 'not found']);
+ }
+
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ function ajaxDelete() {
+ if ($this->request->is('delete')) {
+ $operatorTypeName = $this->request->getData('operator_type_name');
+ $username = $this->request->getData('username');
+ $pubkey_bin = base64_decode($this->request->getData('user_pubkey'));
+ $sign = base64_decode($this->request->getData('sign'));
+
+ $operatorTypeId = $this->Operators->OperatorTypes->
+ find()
+ ->where(['name' => $operatorTypeName])
+ ->select(['id'])
+ ->first();
+
+ // load operator from db if already exist
+ $operator = $this->Operators
+ ->find()
+ ->where([
+ 'operator_type_id' => $operatorTypeId->id,
+ 'username' => $username,
+ 'user_pubkey' => $pubkey_bin])
+ ->first();
+ if(!$operator) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not found']);
+ } else {
+ $data = base64_decode($operator->data_base64);
+ // check if request has valid signature
+ if(!sodium_crypto_sign_verify_detached($sign, $data, $pubkey_bin)) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'wrong signature']);
+ }
+ }
+ if ($this->Operators->delete($operator)) {
+ return $this->returnJson(['state' => 'success']);
+ }
+ return $this->returnJson(['state' => 'error', 'details' => $operator->getErrors()]);
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Operator id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $operator = $this->Operators->get($id, [
+ 'contain' => ['OperatorTypes']
+ ]);
+
+ $this->set('operator', $operator);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $operator = $this->Operators->newEntity();
+ if ($this->request->is('post')) {
+ $operator = $this->Operators->patchEntity($operator, $this->request->getData());
+ if ($this->Operators->save($operator)) {
+ $this->Flash->success(__('The operator has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The operator could not be saved. Please, try again.'));
+ }
+ $operatorTypes = $this->Operators->OperatorTypes->find('list', ['limit' => 200]);
+ $this->set(compact('operator', 'operatorTypes'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Operator id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $operator = $this->Operators->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $operator = $this->Operators->patchEntity($operator, $this->request->getData());
+ if ($this->Operators->save($operator)) {
+ $this->Flash->success(__('The operator has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The operator could not be saved. Please, try again.'));
+ }
+ $operatorTypes = $this->Operators->OperatorTypes->find('list', ['limit' => 200]);
+ $this->set(compact('operator', 'operatorTypes'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Operator id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $operator = $this->Operators->get($id);
+ if ($this->Operators->delete($operator)) {
+ $this->Flash->success(__('The operator has been deleted.'));
+ } else {
+ $this->Flash->error(__('The operator could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/PagesController.php b/community_server/src/Controller/PagesController.php
new file mode 100644
index 000000000..94508ad8b
--- /dev/null
+++ b/community_server/src/Controller/PagesController.php
@@ -0,0 +1,75 @@
+Auth->allow(['display']);
+ }
+
+ /**
+ * Displays a view
+ *
+ * @param array ...$path Path segments.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Http\Exception\ForbiddenException When a directory traversal attempt.
+ * @throws \Cake\Http\Exception\NotFoundException When the view file could not
+ * be found or \Cake\View\Exception\MissingTemplateException in debug mode.
+ */
+ public function display(...$path)
+ {
+ $count = count($path);
+ if (!$count) {
+ return $this->redirect('/');
+ }
+ if (in_array('..', $path, true) || in_array('.', $path, true)) {
+ throw new ForbiddenException();
+ }
+ $page = $subpage = null;
+
+ if (!empty($path[0])) {
+ $page = $path[0];
+ }
+ if (!empty($path[1])) {
+ $subpage = $path[1];
+ }
+ $this->set(compact('page', 'subpage'));
+
+ try {
+ $this->render(implode('/', $path));
+ } catch (MissingTemplateException $exception) {
+ if (Configure::read('debug')) {
+ throw $exception;
+ }
+ throw new NotFoundException();
+ }
+ }
+}
diff --git a/community_server/src/Controller/ProfileController.php b/community_server/src/Controller/ProfileController.php
new file mode 100644
index 000000000..2a378e076
--- /dev/null
+++ b/community_server/src/Controller/ProfileController.php
@@ -0,0 +1,206 @@
+loadComponent('JsonRequestClient');
+ $this->Auth->allow(['index', 'edit']);
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->
+ add(new NaviHierarchyEntry(__('Mein Profil'), 'Profile', 'index', true))
+ );
+ }
+ /**
+ * Get binary file data from request data
+ *
+ * @return binary data
+ */
+ protected function getFileData($requestData)
+ {
+ $binaryFileData = null;
+ // Get a list of UploadedFile objects
+ $file = $requestData['profile_img'];
+ // Read the file data.
+ $type = $file['type'];
+ $error = $file['error'];
+ if ($error === 0 && strpos($type, 'image/') === 0) {
+ $path = new File($file['tmp_name']);
+ $binaryFileData = $path->read(true, 'r');
+ $this->log("binaryFileData: ".$binaryFileData, 'debug');
+ }
+ return $binaryFileData;
+ }
+ /**
+ * Update Profile Data
+ *
+ * ...which is spread over two tables, plus needs to be promoted to the Login Server.
+ *
+ * @throws Exception
+ */
+ protected function updateProfileData($requestData, $userId, $communityProfile)
+ {
+ // Update Profile with Form Data!
+ $usersTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $stateUserQuery = $usersTable
+ ->find('all')
+ ->select(['id', 'first_name', 'last_name'])
+ ->where(['id' => $userId]);
+
+ if ($stateUserQuery->count() == 1) {
+ $stateUser = $stateUserQuery->first();
+ $stateUser = $usersTable->patchEntity($stateUser, $requestData);
+
+ $profilesTable = TableRegistry::getTableLocator()->get('CommunityProfiles');
+ // Save old binary data, because the file input is always empty, in HTML!
+ $oldBinaryData = $communityProfile['profile_img'];
+
+ $communityProfile = $profilesTable->patchEntity($communityProfile, $requestData);
+ $communityProfile['state_user_id'] = $userId;
+
+ $binaryFileData = $this->getFileData($requestData);
+ if ($binaryFileData !== null) {
+ $this->log("CommunityProfile: Writing binary img data.", 'debug');
+ $communityProfile['profile_img'] = $binaryFileData;
+ } else {
+ $this->log("CommunityProfile: Nothing uploaded!", 'debug');
+ $communityProfile['profile_img'] = $oldBinaryData;
+ }
+ if ($profilesTable->save($communityProfile) &&
+ $usersTable->save($stateUser)
+ ) {
+ $session = $this->getRequest()->getSession();
+ $session_id = $session->read('session_id');
+ $email = $session->read('StateUser.email');
+ $this->returnJson(
+ $this->JsonRequestClient->sendRequest(
+ json_encode(
+ [
+ 'session_id' => $session_id,
+ 'email' => $email,
+ 'update' => [
+ 'User.first_name' => $requestData['first_name'],
+ 'User.last_name' => $requestData['last_name']
+ ]
+ ]
+ ),
+ '/updateUserInfos'
+ )
+ );
+ $this->Flash->success(__('Dein Profil wurde aktualisiert!'));
+ }
+ } else {
+ $this->Flash->error(__("Non-recoverable database problem - state_user doesn't exist or not unique!"));
+ }
+ return [$stateUser, $communityProfile];
+ }
+ /**
+ * Get or create CommunityProfile
+ *
+ * @return \Cake\ORM\CommunityProfile
+ */
+ protected function getCommunityProfile($userId)
+ {
+ $profilesTable = TableRegistry::getTableLocator()->get('CommunityProfiles');
+ $communityProfileQuery = $profilesTable
+ ->find('all')
+ ->select(['id', 'profile_img', 'profile_desc'])
+ ->where(['state_user_id' => $userId]);
+ if ($communityProfileQuery->count() != 1) {
+ $communityProfile = $profilesTable->newEntity();
+ if ($profilesTable->save($communityProfile)) {
+ $this->log("CommunityProfile created.", 'debug');
+ }
+ } else {
+ $communityProfile = $communityProfileQuery->first();
+ }
+ return $communityProfile;
+ }
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ $communityProfile = $session->read('CommunityProfile');
+ if (!$communityProfile) {
+ $this->log("CommunityProfile not found in session! Loading or creating new one.", 'debug');
+ $session->write('CommunityProfile', $this->getCommunityProfile($user['id']));
+ }
+ $this->set('user', $user);
+ $this->set('communityProfile', $communityProfile);
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+ /**
+ * Edit method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function edit()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+
+ $user = $session->read('StateUser');
+ $communityProfile = $session->read('CommunityProfile');
+ if (!$user) {
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ }
+ if (!$communityProfile) {
+ $this->log("CommunityProfile not found in session! Loading or creating new one.", 'debug');
+ $session->write('CommunityProfile', $this->getCommunityProfile($user['id']));
+ }
+
+ $profileForm = new ProfileForm();
+ if ($this->request->is('post')) {
+ $requestData = $this->request->getData();
+ if ($profileForm->validate($requestData)) {
+ [$stateUser, $communityProfile] = $this->updateProfileData($requestData, $user['id'], $communityProfile);
+ $user['first_name'] = $stateUser['first_name'];
+ $user['last_name'] = $stateUser['last_name'];
+ $session->write('StateUser.first_name', $stateUser['first_name']);
+ $session->write('StateUser.last_name', $stateUser['last_name']);
+ $session->write('CommunityProfile', $communityProfile);
+ return $this->redirect(['action' => 'index']);
+ } else {
+ $this->Flash->error(__('Something was invalid, please try again!'));
+ }
+ }
+ $this->set('user', $user);
+ $this->set('communityProfile', $communityProfile);
+ $this->set('profileForm', $profileForm);
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+}
diff --git a/community_server/src/Controller/ServerUsersController.php b/community_server/src/Controller/ServerUsersController.php
new file mode 100644
index 000000000..236e35b7f
--- /dev/null
+++ b/community_server/src/Controller/ServerUsersController.php
@@ -0,0 +1,131 @@
+Auth->allow(['add', 'edit']);
+ $this->Auth->deny('index');
+ }
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $serverUsers = $this->paginate($this->ServerUsers);
+ $this->set(compact('serverUsers'));
+ }
+
+ public function login()
+ {
+ $startTime = microtime(true);
+ if ($this->request->is('post')) {
+ $user = $this->Auth->identify();
+ if ($user) {
+ $this->Auth->setUser($user);
+ return $this->redirect($this->Auth->redirectUrl());
+ }
+ $this->Flash->error(__('Invalid username or password, try again'));
+ }
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+
+ public function logout()
+ {
+ return $this->redirect($this->Auth->logout());
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Server User id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $serverUser = $this->ServerUsers->get($id, [
+ 'contain' => []
+ ]);
+
+ $this->set('serverUser', $serverUser);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $serverUser = $this->ServerUsers->newEntity();
+ if ($this->request->is('post')) {
+ $serverUser = $this->ServerUsers->patchEntity($serverUser, $this->request->getData());
+ if ($this->ServerUsers->save($serverUser)) {
+ $this->Flash->success(__('The server user has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The server user could not be saved. Please, try again.'));
+ }
+ $this->set(compact('serverUser'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Server User id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $serverUser = $this->ServerUsers->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $serverUser = $this->ServerUsers->patchEntity($serverUser, $this->request->getData());
+ if ($this->ServerUsers->save($serverUser)) {
+ $this->Flash->success(__('The server user has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The server user could not be saved. Please, try again.'));
+ }
+ $this->set(compact('serverUser'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Server User id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $serverUser = $this->ServerUsers->get($id);
+ if ($this->ServerUsers->delete($serverUser)) {
+ $this->Flash->success(__('The server user has been deleted.'));
+ } else {
+ $this->Flash->error(__('The server user could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateBalancesController.php b/community_server/src/Controller/StateBalancesController.php
new file mode 100644
index 000000000..5164dce4b
--- /dev/null
+++ b/community_server/src/Controller/StateBalancesController.php
@@ -0,0 +1,477 @@
+Auth->allow(['add', 'edit']);
+ $this->Auth->allow(['overview', 'overviewGdt', 'ajaxGetBalance']);
+ $this->loadComponent('JsonRequestClient');
+ }
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $this->paginate = [
+ 'contain' => ['StateUsers']
+ ];
+ $stateBalances = $this->paginate($this->StateBalances);
+
+ $this->set(compact('stateBalances'));
+ }
+
+
+
+ public function overview()
+ {
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->
+ add(new NaviHierarchyEntry(__('Kontoübersicht'), 'StateBalances', 'overview', true))
+ );
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ // sendRequestGDT
+ // listPerEmailApi
+
+ $gdtSum = 0;
+ //if('admin' === $user['role']) {
+ $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi');
+ //var_dump($gdtEntries);
+ if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) {
+ $gdtSum = intval($gdtEntries['data']['sum']);
+ } else {
+ if($user) {
+ $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id']);
+ } else {
+ $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, 0);
+ }
+ }
+ //}
+ //
+ //
+
+ $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations');
+ $creationTransactions = $creationsTable
+ ->find('all')
+ ->where(['state_user_id' => $user['id']])
+ ->contain(['Transactions']);
+
+ $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins');
+ $transferTransactions = $transferTable
+ ->find('all')
+ ->where(['OR' => ['state_user_id' => $user['id'], 'receiver_user_id' => $user['id']]])
+ ->contain(['Transactions']);
+
+ $involvedUserIds = [];
+
+ foreach ($transferTransactions as $sendCoins) {
+ //var_dump($sendCoins);
+ if ($sendCoins->state_user_id != $user['id']) {
+ array_push($involvedUserIds, intval($sendCoins->state_user_id));
+ } elseif ($sendCoins->receiver_user_id != $user['id']) {
+ array_push($involvedUserIds, intval($sendCoins->receiver_user_id));
+ }
+ }
+
+ /*echo "state user from sendCoins: $sendCoins->state_user_id ";
+ echo "receiver user from sendCoins: $sendCoins->receiver_user_id ";
+ echo "user id from logged in user: ".$user['id']. ' ';
+ */
+ //var_dump($involvedUserIds);
+ // exchange key with values and drop duplicates
+ $involvedUser_temp = array_flip($involvedUserIds);
+ // exchange back
+ $involvedUserIds = array_flip($involvedUser_temp);
+ $userTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $involvedUser = $userTable->find('all', [
+ 'contain' => false,
+ 'where' => ['id IN' => $involvedUserIds],
+ 'fields' => ['id', 'first_name', 'last_name', 'email']
+ ]);
+ //var_dump($involvedUser->toArray());
+ $involvedUserIndices = [];
+ foreach ($involvedUser as $involvedUser) {
+ $involvedUserIndices[$involvedUser->id] = $involvedUser;
+ }
+
+ // sender or receiver when user has sended money
+ // group name if creation
+ // type: gesendet / empfangen / geschöpft
+ // transaktion nr / id
+ // date
+ // balance
+
+ $transactions = [];
+ foreach ($creationTransactions as $creation) {
+ //var_dump($creation);
+ array_push($transactions, [
+ 'name' => 'Gradido Akademie',
+ 'type' => 'creation',
+ 'transaction_id' => $creation->transaction_id,
+ 'date' => $creation->transaction->received,
+ 'balance' => $creation->amount,
+ 'memo' => $creation->transaction->memo
+ ]);
+ }
+
+ foreach ($transferTransactions as $sendCoins) {
+ $type = '';
+ $otherUser = null;
+ if ($sendCoins->state_user_id == $user['id']) {
+ $type = 'send';
+
+ if(isset($involvedUserIndices[$sendCoins->receiver_user_id])) {
+ $otherUser = $involvedUserIndices[$sendCoins->receiver_user_id];
+ }
+ } else if ($sendCoins->receiver_user_id == $user['id']) {
+ $type = 'receive';
+ if(isset($involvedUserIndices[$sendCoins->state_user_id])) {
+ $otherUser = $involvedUserIndices[$sendCoins->state_user_id];
+ }
+ }
+ if(null == $otherUser) {
+ $otherUser = $this->StateBalances->StateUsers->newEntity();
+ }
+ array_push($transactions, [
+ 'name' => $otherUser->first_name . ' ' . $otherUser->last_name,
+ 'email' => $otherUser->email,
+ 'type' => $type,
+ 'transaction_id' => $sendCoins->transaction_id,
+ 'date' => $sendCoins->transaction->received,
+ 'balance' => $sendCoins->amount,
+ 'memo' => $sendCoins->transaction->memo
+ ]);
+ }
+ uasort($transactions, array($this, 'sortTransactions'));
+ $this->set('transactions', $transactions);
+ $this->set('transactionExecutingCount', $session->read('Transaction.executing'));
+ $this->set('balance', $session->read('StateUser.balance'));
+ $this->set('timeUsed', microtime(true) - $startTime);
+ $this->set('gdtSum', $gdtSum);
+ }
+
+ public function ajaxGetBalance($session_id)
+ {
+ if(!isset($session_id) || !$session_id) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $startTime = microtime(true);
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin($session_id);
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'session not found']);
+ }
+ $user = $session->read('StateUser');
+ //var_dump($user);
+ return $this->returnJson(['state' => 'success', 'balance' => $user['balance']]);
+
+ }
+
+ public function ajaxListTransactions($session_id, $page, $count)
+ {
+ if(!isset($session_id) || !$session_id) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $startTime = microtime(true);
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin($session_id);
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'session not found']);
+ }
+ $user = $session->read('StateUser');
+
+ $gdtSum = 0;
+
+ $gdtEntries = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'sumPerEmailApi');
+
+ if('success' == $gdtEntries['state'] && 'success' == $gdtEntries['data']['state']) {
+ $gdtSum = intval($gdtEntries['data']['sum']);
+ } else {
+ if($user) {
+
+ $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, $user['id']);
+ } else {
+ $this->addAdminError('StateBalancesController', 'overview', $gdtEntries, 0);
+ }
+ }
+
+
+ $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations');
+ $creationTransactions = $creationsTable
+ ->find('all')
+ ->where(['state_user_id' => $user['id']])
+ ->contain(['Transactions']);
+
+ $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins');
+ $transferTransactions = $transferTable
+ ->find('all')
+ ->where(['OR' => ['state_user_id' => $user['id'], 'receiver_user_id' => $user['id']]])
+ ->contain(['Transactions']);
+
+ $involvedUserIds = [];
+
+ foreach ($transferTransactions as $sendCoins) {
+ //var_dump($sendCoins);
+ if ($sendCoins->state_user_id != $user['id']) {
+ array_push($involvedUserIds, intval($sendCoins->state_user_id));
+ } elseif ($sendCoins->receiver_user_id != $user['id']) {
+ array_push($involvedUserIds, intval($sendCoins->receiver_user_id));
+ }
+ }
+
+ /*echo "state user from sendCoins: $sendCoins->state_user_id ";
+ echo "receiver user from sendCoins: $sendCoins->receiver_user_id ";
+ echo "user id from logged in user: ".$user['id']. ' ';
+ */
+ //var_dump($involvedUserIds);
+ // exchange key with values and drop duplicates
+ $involvedUser_temp = array_flip($involvedUserIds);
+ // exchange back
+ $involvedUserIds = array_flip($involvedUser_temp);
+ $userTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $involvedUser = $userTable->find('all', [
+ 'contain' => false,
+ 'where' => ['id IN' => $involvedUserIds],
+ 'fields' => ['id', 'first_name', 'last_name', 'email']
+ ]);
+ //var_dump($involvedUser->toArray());
+ $involvedUserIndices = [];
+ foreach ($involvedUser as $involvedUser) {
+ $involvedUserIndices[$involvedUser->id] = $involvedUser;
+ }
+
+ // sender or receiver when user has sended money
+ // group name if creation
+ // type: gesendet / empfangen / geschöpft
+ // transaktion nr / id
+ // date
+ // balance
+
+ $transactions = [];
+ foreach ($creationTransactions as $creation) {
+ //var_dump($creation);
+ array_push($transactions, [
+ 'name' => 'Gradido Akademie',
+ 'type' => 'creation',
+ 'transaction_id' => $creation->transaction_id,
+ 'date' => $creation->transaction->received,
+ 'balance' => $creation->amount,
+ 'memo' => $creation->transaction->memo
+ ]);
+ }
+
+ foreach ($transferTransactions as $sendCoins) {
+ $type = '';
+ $otherUser = null;
+ if ($sendCoins->state_user_id == $user['id']) {
+ $type = 'send';
+
+ if(isset($involvedUserIndices[$sendCoins->receiver_user_id])) {
+ $otherUser = $involvedUserIndices[$sendCoins->receiver_user_id];
+ }
+ } else if ($sendCoins->receiver_user_id == $user['id']) {
+ $type = 'receive';
+ if(isset($involvedUserIndices[$sendCoins->state_user_id])) {
+ $otherUser = $involvedUserIndices[$sendCoins->state_user_id];
+ }
+ }
+ if(null == $otherUser) {
+ $otherUser = $this->StateBalances->StateUsers->newEntity();
+ }
+ array_push($transactions, [
+ 'name' => $otherUser->first_name . ' ' . $otherUser->last_name,
+ 'email' => $otherUser->email,
+ 'type' => $type,
+ 'transaction_id' => $sendCoins->transaction_id,
+ 'date' => $sendCoins->transaction->received,
+ 'balance' => $sendCoins->amount,
+ 'memo' => $sendCoins->transaction->memo
+ ]);
+ }
+ uasort($transactions, array($this, 'sortTransactions'));
+ return $this->returnJson([
+ 'state' => 'success',
+ 'transactions' => $transactions,
+ 'transactionExecutingCount' => $session->read('Transaction.executing'),
+ 'count' => count($transactions),
+ 'gdtSum' => $gdtSum,
+ 'timeUsed' => microtime(true) - $startTime
+ ]);
+ }
+
+ public function overviewGdt()
+ {
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->
+ add(new NaviHierarchyEntry(__('GDT Kontoübersicht'), 'StateBalances', 'overviewGdt', true))
+ );
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ $requestResult = $this->JsonRequestClient->sendRequestGDT(['email' => $user['email']], 'GdtEntries' . DS . 'listPerEmailApi');
+
+ //var_dump($requestResult);
+ if('success' === $requestResult['state'] && 'success' === $requestResult['data']['state']) {
+
+ //var_dump(array_keys($requestResult['data']));
+ $ownEntries = $requestResult['data']['ownEntries'];
+ //$gdtEntries = $requestResult['data']['entries'];
+
+ $gdtSum = 0;
+ foreach ($ownEntries as $i => $gdtEntry) {
+ $gdtSum += $gdtEntry['gdt'];
+ //echo "index: $i ";
+ //var_dump($gdtEntry);
+ }
+ if (isset($requestResult['data']['connectEntrys'])) {
+ $connectEntries = $requestResult['data']['connectEntrys'];
+
+ foreach ($connectEntries as $entry) {
+ //if(!$count) var_dump($entry);
+ //$count++;
+ $gdtSum += $entry['connect']['gdt_entry']['gdt'];
+ }
+ $this->set('connectEntries', $connectEntries);
+ }
+
+ //echo "gdtSum: $gdtSum ";
+ $this->set('gdtSum', $gdtSum);
+ $this->set('ownEntries', $ownEntries);
+ $this->set('gdtSumPerEmail', $requestResult['data']['gdtSumPerEmail']);
+ $this->set('moreEntrysAsShown', $requestResult['data']['moreEntrysAsShown']);
+ $this->set('user', $user);
+
+ if (isset($requestResult['data']['publishers'])) {
+ $publishers = $requestResult['data']['publishers'];
+ $this->set('publishers', $publishers);
+ }
+ } else {
+ $this->addAdminError('StateBalancesController', 'overviewGdt', $requestResult, $user['id']);
+ $this->Flash->error(__('Fehler beim GDT Server, bitte abwarten oder den Admin benachrichtigen!'));
+ }
+ }
+
+ public function sortTransactions($a, $b)
+ {
+ if ($a['date'] == $b['date']) {
+ return 0;
+ }
+ return ($a['date'] > $b['date']) ? -1 : 1;
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id State Balance id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateBalance = $this->StateBalances->get($id, [
+ 'contain' => ['StateUsers']
+ ]);
+
+ $this->set('stateBalance', $stateBalance);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateBalance = $this->StateBalances->newEntity();
+ if ($this->request->is('post')) {
+ $stateBalance = $this->StateBalances->patchEntity($stateBalance, $this->request->getData());
+ if ($this->StateBalances->save($stateBalance)) {
+ $this->Flash->success(__('The state balance has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state balance could not be saved. Please, try again.'));
+ }
+ $stateUsers = $this->StateBalances->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('stateBalance', 'stateUsers'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State Balance id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateBalance = $this->StateBalances->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateBalance = $this->StateBalances->patchEntity($stateBalance, $this->request->getData());
+ if ($this->StateBalances->save($stateBalance)) {
+ $this->Flash->success(__('The state balance has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state balance could not be saved. Please, try again.'));
+ }
+ $stateUsers = $this->StateBalances->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('stateBalance', 'stateUsers'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State Balance id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateBalance = $this->StateBalances->get($id);
+ if ($this->StateBalances->delete($stateBalance)) {
+ $this->Flash->success(__('The state balance has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state balance could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateCreatedController.php b/community_server/src/Controller/StateCreatedController.php
new file mode 100644
index 000000000..b66f1b7c1
--- /dev/null
+++ b/community_server/src/Controller/StateCreatedController.php
@@ -0,0 +1,113 @@
+paginate = [
+ 'contain' => ['Transactions', 'StateUsers']
+ ];
+ $stateCreated = $this->paginate($this->StateCreated);
+
+ $this->set(compact('stateCreated'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id State Created id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateCreated = $this->StateCreated->get($id, [
+ 'contain' => ['Transactions', 'StateUsers']
+ ]);
+
+ $this->set('stateCreated', $stateCreated);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateCreated = $this->StateCreated->newEntity();
+ if ($this->request->is('post')) {
+ $stateCreated = $this->StateCreated->patchEntity($stateCreated, $this->request->getData());
+ if ($this->StateCreated->save($stateCreated)) {
+ $this->Flash->success(__('The state created has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state created could not be saved. Please, try again.'));
+ }
+ $transactions = $this->StateCreated->Transactions->find('list', ['limit' => 200]);
+ $stateUsers = $this->StateCreated->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('stateCreated', 'transactions', 'stateUsers'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State Created id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateCreated = $this->StateCreated->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateCreated = $this->StateCreated->patchEntity($stateCreated, $this->request->getData());
+ if ($this->StateCreated->save($stateCreated)) {
+ $this->Flash->success(__('The state created has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state created could not be saved. Please, try again.'));
+ }
+ $transactions = $this->StateCreated->Transactions->find('list', ['limit' => 200]);
+ $stateUsers = $this->StateCreated->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('stateCreated', 'transactions', 'stateUsers'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State Created id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateCreated = $this->StateCreated->get($id);
+ if ($this->StateCreated->delete($stateCreated)) {
+ $this->Flash->success(__('The state created has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state created could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateErrorsController.php b/community_server/src/Controller/StateErrorsController.php
new file mode 100644
index 000000000..0c91d93e3
--- /dev/null
+++ b/community_server/src/Controller/StateErrorsController.php
@@ -0,0 +1,173 @@
+Auth->allow(['showForUser', 'deleteForUser']);
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->
+ add(new NaviHierarchyEntry(__('Fehler'), 'StateErrors', 'ShowForUser', true))
+ );
+ }
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $this->paginate = [
+ 'contain' => ['StateUsers', 'TransactionTypes']
+ ];
+ $stateErrors = $this->paginate($this->StateErrors);
+
+ $this->set(compact('stateErrors'));
+ }
+
+ public function showForUser()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $user = $session->read('StateUser');
+ if(!$user) {
+ $result = $this->requestLogin();
+ if($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ }
+
+ $errors = $this->StateErrors->find('all')->where(['state_user_id' => $user['id']])->contain(false);
+ $transactionTypes = $this->StateErrors->TransactionTypes->find('all')->select(['id', 'name', 'text'])->order(['id']);
+
+ $this->set('errors', $errors);
+ $this->set('transactionTypes', $transactionTypes->toList());
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+
+ public function deleteForUser($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete', 'get']);
+ $stateError = $this->StateErrors->get($id);
+ $session = $this->getRequest()->getSession();
+ $user = $session->read('StateUser');
+ if($user['id'] != $stateError->state_user_id) {
+ $this->Flash->error(__('Error belongs to another User, cannot delete'));
+ }
+ else if ($this->StateErrors->delete($stateError)) {
+ $this->Flash->success(__('The state error has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state error could not be deleted. Please, try again.'));
+ }
+ $errors = $this->StateErrors->find('all')->where(['state_user_id' => $user['id']])->contain(false);
+ if($errors->count() == 0) {
+ return $this->redirect(['controller' => 'Dashboard']);
+ }
+ return $this->redirect(['action' => 'showForUser']);
+ }
+
+
+ /**
+ * View method
+ *
+ * @param string|null $id State Error id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateError = $this->StateErrors->get($id, [
+ 'contain' => ['StateUsers', 'TransactionTypes']
+ ]);
+
+ $this->set('stateError', $stateError);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateError = $this->StateErrors->newEntity();
+ if ($this->request->is('post')) {
+ $stateError = $this->StateErrors->patchEntity($stateError, $this->request->getData());
+ if ($this->StateErrors->save($stateError)) {
+ $this->Flash->success(__('The state error has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state error could not be saved. Please, try again.'));
+ }
+ $stateUsers = $this->StateErrors->StateUsers->find('list', ['limit' => 200]);
+ $transactionTypes = $this->StateErrors->TransactionTypes->find('list', ['limit' => 200]);
+ $this->set(compact('stateError', 'stateUsers', 'transactionTypes'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State Error id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateError = $this->StateErrors->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateError = $this->StateErrors->patchEntity($stateError, $this->request->getData());
+ if ($this->StateErrors->save($stateError)) {
+ $this->Flash->success(__('The state error has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state error could not be saved. Please, try again.'));
+ }
+ $stateUsers = $this->StateErrors->StateUsers->find('list', ['limit' => 200]);
+ $transactionTypes = $this->StateErrors->TransactionTypes->find('list', ['limit' => 200]);
+ $this->set(compact('stateError', 'stateUsers', 'transactionTypes'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State Error id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateError = $this->StateErrors->get($id);
+ if ($this->StateErrors->delete($stateError)) {
+ $this->Flash->success(__('The state error has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state error could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateGroupAddressesController.php b/community_server/src/Controller/StateGroupAddressesController.php
new file mode 100644
index 000000000..13f2b1f78
--- /dev/null
+++ b/community_server/src/Controller/StateGroupAddressesController.php
@@ -0,0 +1,113 @@
+paginate = [
+ 'contain' => ['StateGroups', 'AddressTypes']
+ ];
+ $stateGroupAddresses = $this->paginate($this->StateGroupAddresses);
+
+ $this->set(compact('stateGroupAddresses'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id State Group Address id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateGroupAddress = $this->StateGroupAddresses->get($id, [
+ 'contain' => ['StateGroups', 'AddressTypes']
+ ]);
+
+ $this->set('stateGroupAddress', $stateGroupAddress);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateGroupAddress = $this->StateGroupAddresses->newEntity();
+ if ($this->request->is('post')) {
+ $stateGroupAddress = $this->StateGroupAddresses->patchEntity($stateGroupAddress, $this->request->getData());
+ if ($this->StateGroupAddresses->save($stateGroupAddress)) {
+ $this->Flash->success(__('The state group address has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state group address could not be saved. Please, try again.'));
+ }
+ $stateGroups = $this->StateGroupAddresses->StateGroups->find('list', ['limit' => 200]);
+ $addressTypes = $this->StateGroupAddresses->AddressTypes->find('list', ['limit' => 200]);
+ $this->set(compact('stateGroupAddress', 'stateGroups', 'addressTypes'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State Group Address id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateGroupAddress = $this->StateGroupAddresses->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateGroupAddress = $this->StateGroupAddresses->patchEntity($stateGroupAddress, $this->request->getData());
+ if ($this->StateGroupAddresses->save($stateGroupAddress)) {
+ $this->Flash->success(__('The state group address has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state group address could not be saved. Please, try again.'));
+ }
+ $stateGroups = $this->StateGroupAddresses->StateGroups->find('list', ['limit' => 200]);
+ $addressTypes = $this->StateGroupAddresses->AddressTypes->find('list', ['limit' => 200]);
+ $this->set(compact('stateGroupAddress', 'stateGroups', 'addressTypes'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State Group Address id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateGroupAddress = $this->StateGroupAddresses->get($id);
+ if ($this->StateGroupAddresses->delete($stateGroupAddress)) {
+ $this->Flash->success(__('The state group address has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state group address could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateGroupRelationshipsController.php b/community_server/src/Controller/StateGroupRelationshipsController.php
new file mode 100644
index 000000000..631ca13d1
--- /dev/null
+++ b/community_server/src/Controller/StateGroupRelationshipsController.php
@@ -0,0 +1,115 @@
+paginate = [
+ 'contain' => ['StateGroup1s', 'StateGroup2s', 'StateRelationships']
+ ];
+ $stateGroupRelationships = $this->paginate($this->StateGroupRelationships);
+
+ $this->set(compact('stateGroupRelationships'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id State Group Relationship id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateGroupRelationship = $this->StateGroupRelationships->get($id, [
+ 'contain' => ['StateGroup1s', 'StateGroup2s', 'StateRelationships']
+ ]);
+
+ $this->set('stateGroupRelationship', $stateGroupRelationship);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateGroupRelationship = $this->StateGroupRelationships->newEntity();
+ if ($this->request->is('post')) {
+ $stateGroupRelationship = $this->StateGroupRelationships->patchEntity($stateGroupRelationship, $this->request->getData());
+ if ($this->StateGroupRelationships->save($stateGroupRelationship)) {
+ $this->Flash->success(__('The state group relationship has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state group relationship could not be saved. Please, try again.'));
+ }
+ $stateGroup1s = $this->StateGroupRelationships->StateGroup1s->find('list', ['limit' => 200]);
+ $stateGroup2s = $this->StateGroupRelationships->StateGroup2s->find('list', ['limit' => 200]);
+ $stateRelationships = $this->StateGroupRelationships->StateRelationships->find('list', ['limit' => 200]);
+ $this->set(compact('stateGroupRelationship', 'stateGroup1s', 'stateGroup2s', 'stateRelationships'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State Group Relationship id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateGroupRelationship = $this->StateGroupRelationships->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateGroupRelationship = $this->StateGroupRelationships->patchEntity($stateGroupRelationship, $this->request->getData());
+ if ($this->StateGroupRelationships->save($stateGroupRelationship)) {
+ $this->Flash->success(__('The state group relationship has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state group relationship could not be saved. Please, try again.'));
+ }
+ $stateGroup1s = $this->StateGroupRelationships->StateGroup1s->find('list', ['limit' => 200]);
+ $stateGroup2s = $this->StateGroupRelationships->StateGroup2s->find('list', ['limit' => 200]);
+ $stateRelationships = $this->StateGroupRelationships->StateRelationships->find('list', ['limit' => 200]);
+ $this->set(compact('stateGroupRelationship', 'stateGroup1s', 'stateGroup2s', 'stateRelationships'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State Group Relationship id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateGroupRelationship = $this->StateGroupRelationships->get($id);
+ if ($this->StateGroupRelationships->delete($stateGroupRelationship)) {
+ $this->Flash->success(__('The state group relationship has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state group relationship could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateGroupsController.php b/community_server/src/Controller/StateGroupsController.php
new file mode 100644
index 000000000..36969671d
--- /dev/null
+++ b/community_server/src/Controller/StateGroupsController.php
@@ -0,0 +1,111 @@
+paginate = [
+ 'contain' => ['Indices']
+ ];
+ $stateGroups = $this->paginate($this->StateGroups);
+
+ $this->set(compact('stateGroups'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id State Group id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateGroup = $this->StateGroups->get($id, [
+ 'contain' => ['Indices', 'StateGroupAddresses', 'StateUsers', 'TransactionGroupCreates', 'Transactions']
+ ]);
+
+ $this->set('stateGroup', $stateGroup);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateGroup = $this->StateGroups->newEntity();
+ if ($this->request->is('post')) {
+ $stateGroup = $this->StateGroups->patchEntity($stateGroup, $this->request->getData());
+ if ($this->StateGroups->save($stateGroup)) {
+ $this->Flash->success(__('The state group has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state group could not be saved. Please, try again.'));
+ }
+ $indices = $this->StateGroups->Indices->find('list', ['limit' => 200]);
+ $this->set(compact('stateGroup', 'indices'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State Group id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateGroup = $this->StateGroups->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateGroup = $this->StateGroups->patchEntity($stateGroup, $this->request->getData());
+ if ($this->StateGroups->save($stateGroup)) {
+ $this->Flash->success(__('The state group has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state group could not be saved. Please, try again.'));
+ }
+ $indices = $this->StateGroups->Indices->find('list', ['limit' => 200]);
+ $this->set(compact('stateGroup', 'indices'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State Group id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateGroup = $this->StateGroups->get($id);
+ if ($this->StateGroups->delete($stateGroup)) {
+ $this->Flash->success(__('The state group has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state group could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateRelationshipTypesController.php b/community_server/src/Controller/StateRelationshipTypesController.php
new file mode 100644
index 000000000..954b594e2
--- /dev/null
+++ b/community_server/src/Controller/StateRelationshipTypesController.php
@@ -0,0 +1,106 @@
+paginate($this->StateRelationshipTypes);
+
+ $this->set(compact('stateRelationshipTypes'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id State Relationship Type id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateRelationshipType = $this->StateRelationshipTypes->get($id, [
+ 'contain' => []
+ ]);
+
+ $this->set('stateRelationshipType', $stateRelationshipType);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateRelationshipType = $this->StateRelationshipTypes->newEntity();
+ if ($this->request->is('post')) {
+ $stateRelationshipType = $this->StateRelationshipTypes->patchEntity($stateRelationshipType, $this->request->getData());
+ if ($this->StateRelationshipTypes->save($stateRelationshipType)) {
+ $this->Flash->success(__('The state relationship type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state relationship type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('stateRelationshipType'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State Relationship Type id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateRelationshipType = $this->StateRelationshipTypes->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateRelationshipType = $this->StateRelationshipTypes->patchEntity($stateRelationshipType, $this->request->getData());
+ if ($this->StateRelationshipTypes->save($stateRelationshipType)) {
+ $this->Flash->success(__('The state relationship type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state relationship type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('stateRelationshipType'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State Relationship Type id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateRelationshipType = $this->StateRelationshipTypes->get($id);
+ if ($this->StateRelationshipTypes->delete($stateRelationshipType)) {
+ $this->Flash->success(__('The state relationship type has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state relationship type could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/StateUsersController.php b/community_server/src/Controller/StateUsersController.php
new file mode 100644
index 000000000..d85f8b449
--- /dev/null
+++ b/community_server/src/Controller/StateUsersController.php
@@ -0,0 +1,568 @@
+loadComponent('GradidoNumber');
+ $this->loadComponent('JsonRequestClient');
+ $this->Auth->allow([
+ 'search', 'ajaxCopyLoginToCommunity', 'ajaxCopyCommunityToLogin',
+ 'ajaxDelete', 'ajaxCountTransactions', 'ajaxVerificationEmailResend',
+ 'ajaxGetUserEmailVerificationCode', 'ajaxGetCSFRToken'
+ ]);
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Benutzer suchen'), 'StateUsers', 'search', true))
+ );
+ }
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $this->paginate = [
+ 'contain' => []
+ ];
+ $stateUsers = $this->paginate($this->StateUsers);
+
+ $this->set(compact('stateUsers'));
+ }
+
+ public function listIdentHashes()
+ {
+ $stateUsers = $this->StateUsers->find('all')->toArray();
+ foreach ($stateUsers as $i => $user) {
+ $stateUsers[$i]->identHash = TransactionCreation::DRMakeStringHash($user->email);
+ }
+ $this->set('stateUsers', $stateUsers);
+ }
+
+ public function search()
+ {
+ $startTime = microtime(true);
+ I18n::setLocale('de_DE');
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ if ($user['role'] != 'admin') {
+ return $this->redirect(['controller' => 'dashboard', 'action' => 'index']);
+ }
+
+ $searchForm = new UserSearchForm();
+
+ $timeUsed = microtime(true) - $startTime;
+ //$this->set('timeUsed', $timeUsed);
+ $csfr_token = $this->request->getParam('_csrfToken');
+ $this->set(compact('timeUsed', 'searchForm', 'csfr_token'));
+
+ if ($this->request->is('post')) {
+ $requestData = $this->request->getData();
+
+ if ($searchForm->validate($requestData)) {
+ //var_dump($requestData);
+ $searchString = $requestData['search'];
+ $searchType = 'unknown';
+ if (GenericValidation::email($searchString, [])) {
+ $searchType = 'email';
+ }
+ // find users on login server
+ $resultJson = $this->JsonRequestClient->getUsers($session->read('session_id'), $searchString);
+ $loginServerUser = [];
+ if ($resultJson['state'] == 'success') {
+ $dataJson = $resultJson['data'];
+ if ($dataJson['state'] != 'success') {
+ if ($dataJson['msg'] == 'session not found') {
+ $session->destroy();
+ return $this->redirect(Router::url('/', true) . 'account', 303);
+ }
+ }
+ //var_dump($dataJson);
+ if (isset($dataJson['users'])) {
+ $loginServerUser = $dataJson['users'];
+ }
+ }
+ $pubkeySorted = [];
+ $emptyPubkeys = [];
+ foreach ($loginServerUser as $u) {
+ if (!isset($u['public_hex']) || $u['public_hex'] == '') {
+ array_push($emptyPubkeys, $u);
+ } else {
+ if (!isset($pubkeySorted[$u['public_hex']])) {
+ $pubkeySorted[$u['public_hex']] = ['login' => [], 'community' => []];
+ }
+ array_push($pubkeySorted[$u['public_hex']]['login'], $u);
+ }
+ }
+ // find user on community server db
+ $globalSearch = '%' . $searchString . '%';
+ $communityUsers = $this->StateUsers
+ ->find('all')
+ ->contain(['StateBalances' => ['fields' => ['amount', 'state_user_id']]]);
+
+ $communityUsers->where(['OR' => [
+ 'first_name LIKE' => $globalSearch,
+ 'last_name LIKE' => $globalSearch,
+ //'username LIKE' => $globalSearch,
+ 'email LIKE' => $globalSearch
+ ]]);
+
+ //var_dump($communityUsers->toArray());
+ foreach ($communityUsers as $u) {
+ $pubkey_hex = bin2hex(stream_get_contents($u->public_key));
+ $u->public_hex = $pubkey_hex;
+ if (!isset($pubkeySorted[$pubkey_hex])) {
+ $pubkeySorted[$pubkey_hex] = ['login' => [], 'community' => []];
+ }
+ array_push($pubkeySorted[$pubkey_hex]['community'], $u);
+ }
+ $finalUserEntrys = [];
+ // detect states
+ foreach ($pubkeySorted as $pubhex => $user) {
+ $finalUser = [];
+ $state = 'account created';
+ $color = 'secondary';
+ $finalUser['balance'] = 0;
+ $finalUser['pubkeyhex'] = $pubhex;
+ $finalUser['created'] = null;
+
+ if (count($user['community']) == 1) {
+ if (isset($user['community'][0]->state_balances) &&
+ isset($user['community'][0]->state_balances[0]['amount'])) {
+ $finalUser['balance'] = $user['community'][0]->state_balances[0]->amount;
+ }
+ }
+
+ if (count($user['login']) == 0) {
+ $state = 'account not on login-server';
+ $color = 'danger';
+ if (count($user['community']) == 1) {
+ $c_user = $user['community'][0];
+ $finalUser['name'] = $c_user->first_name . ' ' . $c_user->last_name;
+ $finalUser['first_name'] = $c_user->first_name;
+ $finalUser['last_name'] = $c_user->last_name;
+ //$finalUser['username'] = $c_user->username;
+ $finalUser['email'] = $c_user->email;
+ }
+ } elseif (count($user['login']) == 1) {
+ if ($user['login'][0]['email_checked'] == true) {
+ $state = 'email activated';
+ $color = 'primary';
+
+ if (count($user['community']) == 1) {
+ $state = 'account copied to community';
+ $color = 'success';
+ //var_dump($user['community'][0]->state_balances[0]['amount']);
+ }
+ } else {
+ $state = 'email not activated';
+ $color = 'warning';
+ }
+
+ $l_user = $user['login'][0];
+ $finalUser['name'] = $l_user['first_name'] . ' ' . $l_user['last_name'];
+ $finalUser['first_name'] = $l_user['first_name'];
+ $finalUser['last_name'] = $l_user['last_name'];
+ //$finalUser['username'] = $l_user['username'];
+ $finalUser['email'] = $l_user['email'];
+ $finalUser['created'] = new FrozenTime($l_user['created']);
+ } else {
+ $state = 'account multiple times on login-server';
+ $color = 'danger';
+ }
+ $finalUser['indicator'] = ['name' => $state, 'color' => $color];
+ array_push($finalUserEntrys, $finalUser);
+ }
+
+ foreach ($emptyPubkeys as $user) {
+ $finalUser = [];
+ $state = 'account not on community server';
+ $color = 'secondary';
+ if ($user['email_checked'] == false) {
+ $state = 'email not activated';
+ $color = 'warning';
+ } else {
+ $state = 'no keys';
+ $color = 'warning';
+ }
+ $finalUser['balance'] = 0;
+ $finalUser['pubkeyhex'] = '';
+ $finalUser['name'] = $user['first_name'] . ' ' . $user['last_name'];
+ $finalUser['first_name'] = $user['first_name'];
+ $finalUser['last_name'] = $user['last_name'];
+ //$finalUser['username'] = $user['username'];
+ $finalUser['email'] = $user['email'];
+ $finalUser['created'] = new FrozenTime($user['created']);
+ $finalUser['indicator'] = ['name' => $state, 'color' => $color];
+ array_push($finalUserEntrys, $finalUser);
+ }
+ //var_dump($pubkeySorted);
+ } else {
+ $this->Flash->error(__('Something was invalid, please try again!'));
+ }
+
+ $this->set('finalUserEntrys', $finalUserEntrys);
+ }
+ $timeUsed = microtime(true) - $startTime;
+ $this->set('timeUsed', $timeUsed);
+ }
+
+ public function ajaxCopyCommunityToLogin()
+ {
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $user = $session->read('StateUser');
+ if ($user['role'] != 'admin') {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']);
+ }
+ if ($this->request->is('post')) {
+ $jsonData = $this->request->input('json_decode', true);
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ public function ajaxCopyLoginToCommunity()
+ {
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $user = $session->read('StateUser');
+ if ($user['role'] != 'admin') {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']);
+ }
+
+ if ($this->request->is('post')) {
+ $jsonData = $this->request->input('json_decode', true);
+ //$user = $jsonData['user'];
+ //var_dump($jsonData);
+
+ $newStateUser = $this->StateUsers->newEntity();
+ $this->StateUsers->patchEntity($newStateUser, $jsonData);
+ $newStateUser->public_key = hex2bin($jsonData['pubkeyhex']);
+
+ if (!$this->StateUsers->save($newStateUser)) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'error by saving', 'details' => json_encode($newStateUser->errors())]);
+ }
+
+ return $this->returnJson(['state' => 'success']);
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ public function ajaxVerificationEmailResend()
+ {
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $user = $session->read('StateUser');
+ if ($user['role'] != 'admin') {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']);
+ }
+ if ($this->request->is('post')) {
+ $jsonData = $this->request->input('json_decode', true);
+ $email = $jsonData['email'];
+ $session_id = $session->read('session_id');
+
+ return $this->returnJson($this->JsonRequestClient->sendRequest(json_encode([
+ 'session_id' => $session_id,
+ 'email' => $email
+ ]), '/adminEmailVerificationResend'));
+ /*return $this->sendRequest(json_encode([
+ 'session_id' => $session_id,
+ 'search' => $searchString
+ ]), '/getUsers');*/
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ public function ajaxGetUserEmailVerificationCode()
+ {
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $user = $session->read('StateUser');
+ if ($user['role'] != 'admin') {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']);
+ }
+ if ($this->request->is('post')) {
+ $jsonData = $this->request->input('json_decode', true);
+ $email = $jsonData['email'];
+ $session_id = $session->read('session_id');
+
+ return $this->returnJson($this->JsonRequestClient->sendRequest(json_encode([
+ 'session_id' => $session_id,
+ 'email' => $email,
+ 'ask' => ['EmailVerificationCode.Register', 'loginServer.path']
+ ]), '/getUserInfos'));
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+
+ public function ajaxDelete()
+ {
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $user = $session->read('StateUser');
+ if ($user['role'] != 'admin') {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']);
+ }
+
+ if ($this->request->is('post')) {
+ $jsonData = $this->request->input('json_decode', true);
+ //$user = $jsonData['user'];
+ //var_dump($jsonData);
+ $pubkey = hex2bin($jsonData['pubkeyhex']);
+ $stateUsers = $this->StateUsers->find('all')->where(['public_key' => $pubkey]);
+ if ($stateUsers->count() != 1) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']);
+ }
+
+ if ($this->StateUsers->delete($stateUsers->first())) {
+ return $this->returnJson(['state' => 'success']);
+ } else {
+ return $this->returnJson(['state' => 'error', 'msg' => 'error by deleting', 'details' => json_encode($stateUser->errors())]);
+ }
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ public function ajaxCountTransactions()
+ {
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid session']);
+ }
+ $user = $session->read('StateUser');
+ if ($user['role'] != 'admin') {
+ return $this->returnJson(['state' => 'error', 'msg' => 'not an admin']);
+ }
+
+ if ($this->request->is('post')) {
+ $jsonData = $this->request->input('json_decode', true);
+ //$user = $jsonData['user'];
+ //var_dump($jsonData);
+ $pubkey = hex2bin($jsonData['pubkeyhex']);
+ $stateUsers = $this->StateUsers
+ ->find('all')
+ ->where(['public_key' => $pubkey])
+ ->select(['id']);
+ if ($stateUsers->count() != 1) {
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']);
+ }
+ $stateUser = $stateUsers->first();
+ //var_dump($stateUser);
+ //var_dump($stateUser->toArray());
+ $creationsTable = TableRegistry::getTableLocator()->get('TransactionCreations');
+ $creationTransactions = $creationsTable
+ ->find('all')
+ ->select(['id'])
+ ->where(['state_user_id' => $stateUser->id]);
+
+ $transferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins');
+ $transferTransactions = $transferTable
+ ->find('all')
+ ->where(['OR' => ['state_user_id' => $stateUser->id, 'receiver_user_id' => $stateUser->id]])
+ ->select(['state_user_id', 'receiver_user_id']);
+ $counts = ['creation' => $creationTransactions->count(), 'receive' => 0, 'sended' => 0];
+ foreach ($transferTransactions as $transfer) {
+ //var_dump($transfer);
+ if ($transfer->state_user_id == $stateUser->id) {
+ $counts['sended']++;
+ }
+ if ($transfer->receiver_user_id == $stateUser->id) {
+ $counts['receive']++;
+ }
+ }
+ return $this->returnJson(['state' => 'success', 'counts' => $counts]);
+ }
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request']);
+ }
+
+ public function ajaxGetCSFRToken($session_id)
+ {
+ if(!isset($session_id) || $session_id == 0) {
+ $this->returnJson(['state' => 'error', 'msg' => 'no session id']);
+ }
+
+ $client_ip = $this->request->clientIp();
+
+ $loginServer = Configure::read('LoginServer');
+ $url = $loginServer['host'] . ':' . $loginServer['port'];
+
+ $http = new Client();
+ $response = $http->get($url . '/login', ['session_id' => $session_id]);
+ $json = $response->getJson();
+
+ if (isset($json) && count($json) > 0) {
+ if ($json['state'] === 'success') {
+ if($json['clientIP'] == $client_ip) {
+ return $this->returnJson(['state' => 'success', 'csfr' => $this->request->getParam('_csrfToken')]);
+ } else {
+ return $this->returnJson([
+ 'state' => 'error',
+ 'msg' => 'client ip mismatch',
+ 'details' => ['login_server' => $json['clientIP'], 'caller' => $client_ip]]);
+ }
+ } else {
+ return $this->returnJson($json);
+ }
+ } else {
+ return $this->returnJson(['state' => 'error', 'invalid response form logins server']);
+ }
+
+ }
+ /*
+
+ getField(vnode, 'receive'),
+
+ getField(vnode, 'sended'),
+
+ getField(vnode, 'creation'),
+ */
+
+ /**
+ * View method
+ *
+ * @param string|null $id State User id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $stateUser = $this->StateUsers->get($id, [
+ 'contain' => [
+ 'StateBalances',
+ 'TransactionCreations' => ['Transactions'],
+ 'TransactionSendCoins' => ['Transactions', 'ReceiverUsers'],
+ 'TransactionReceivedCoins' => ['Transactions', 'StateUsers']]
+ ]);
+
+ $this->set('stateUser', $stateUser);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $stateUser = $this->StateUsers->newEntity();
+ if ($this->request->is('post')) {
+ $stateUser = $this->StateUsers->patchEntity($stateUser, $this->request->getData());
+ if ($this->StateUsers->save($stateUser)) {
+ $this->Flash->success(__('The state user has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state user could not be saved. Please, try again.'));
+ }
+ $indices = $this->StateUsers->Indices->find('list', ['limit' => 200]);
+ $stateGroups = $this->StateUsers->StateGroups->find('list', ['limit' => 200]);
+ $this->set(compact('stateUser', 'indices', 'stateGroups'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id State User id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $stateUser = $this->StateUsers->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $stateUser = $this->StateUsers->patchEntity($stateUser, $this->request->getData());
+ if ($this->StateUsers->save($stateUser)) {
+ $this->Flash->success(__('The state user has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The state user could not be saved. Please, try again.'));
+ }
+
+ $stateGroups = $this->StateUsers->StateGroups->find('list', ['limit' => 200]);
+ $this->set(compact('stateUser', 'stateGroups'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id State User id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $stateUser = $this->StateUsers->get($id);
+ if ($this->StateUsers->delete($stateUser)) {
+ $this->Flash->success(__('The state user has been deleted.'));
+ } else {
+ $this->Flash->error(__('The state user could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionCreationsController.php b/community_server/src/Controller/TransactionCreationsController.php
new file mode 100644
index 000000000..9b05c1782
--- /dev/null
+++ b/community_server/src/Controller/TransactionCreationsController.php
@@ -0,0 +1,518 @@
+loadComponent('GradidoNumber');
+ $this->loadComponent('JsonRequestClient');
+ //$this->Auth->allow(['add', 'edit']);
+ //$this->Auth->allow('create');
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Gradido schöpfen'), 'TransactionCreations', 'create-multi', true))
+ );
+ }
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $this->paginate = [
+ 'contain' => ['Transactions', 'StateUsers']
+ ];
+ $transactionCreations = $this->paginate($this->TransactionCreations);
+ $identHashes = [];
+ foreach ($transactionCreations as $creation) {
+ $identHash = TransactionCreation::DRMakeStringHash($creation->state_user->email);
+ $identHashes[$creation->state_user->id] = $identHash;
+ }
+
+ $this->set(compact('transactionCreations', 'identHashes'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction Creation id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transactionCreation = $this->TransactionCreations->get($id, [
+ 'contain' => ['Transactions', 'StateUsers']
+ ]);
+
+ $this->set('transactionCreation', $transactionCreation);
+ }
+
+ public function create()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $user = $session->read('StateUser');
+ if (!$user) {
+ $result = $this->requestLogin();
+ if ($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ }
+ $creationForm = new CreationForm();
+ $transactionCreation = $this->TransactionCreations->newEntity();
+ $transactionCreation->state_user_id = $user['id'];
+
+ // adding possible addresses + input field for copy
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $stateUsers = $stateUserTable->find('all')->contain(false);
+ $receiverProposal = [];
+ foreach ($stateUsers as $stateUser) {
+ $name = $stateUser->email;
+ $keyHex = bin2hex(stream_get_contents($stateUser->public_key));
+ if ($name === null) {
+ $name = $stateUser->first_name . ' ' . $stateUser->last_name;
+ }
+ array_push($receiverProposal, ['name' => $name, 'key' => $keyHex, 'email' => $stateUser->email]);
+ //$stateUser->public_key
+ }
+ $timeUsed = microtime(true) - $startTime;
+ $this->set(compact('transactionCreation', 'timeUsed', 'receiverProposal', 'creationForm'));
+
+ if ($this->request->is('post')) {
+ $requestData = $this->request->getData();
+ $mode = 'next';
+ if (isset($requestData['add'])) {
+ $mode = 'add';
+ }
+ if ($creationForm->validate($requestData)) {
+ $pubKeyHex = '';
+ $identHash = '';
+ $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']);
+ $receiverIndex = intval($requestData['receiver'])-1;
+
+ if (count($receiverProposal) > $receiverIndex) {
+ $pubKeyHex = $receiverProposal[$receiverIndex]['key'];
+ $identHash = TransactionCreation::DRMakeStringHash($receiverProposal[$receiverIndex]['email']);
+ }
+ $builderResult = TransactionCreation::build(
+ $amountCent,
+ $requestData['memo'],
+ $pubKeyHex,
+ $identHash
+ );
+ if ($builderResult['state'] == 'success') {
+ $user_balance = 0;
+ if (isset($user['balance'])) {
+ $user_balance = $user['balance'];
+ }
+ // $session_id, $base64Message, $user_balance = 0
+ $requestResult = $this->JsonRequestClient->sendTransaction(
+ $session->read('session_id'),
+ base64_encode($builderResult['transactionBody']->serializeToString()),
+ $user_balance
+ );
+ if ($requestResult['state'] != 'success') {
+ $this->addAdminError('TransactionCreations', 'create', $requestResult, $user['id']);
+ if ($requestResult['type'] == 'request error') {
+ $this->Flash->error(__('Error by requesting LoginServer, please try again'));
+ } else {
+ $this->Flash->error(__('Error, please wait for the admin to fix it'));
+ }
+ } else {
+ $json = $requestResult['data'];
+ if ($json['state'] != 'success') {
+ if ($json['msg'] == 'session not found') {
+ $session->destroy();
+ return $this->redirect($this->loginServerUrl . 'account', 303);
+ } else {
+ $this->addAdminError('TransactionCreations', 'create', $json, $user['id']);
+ $this->Flash->error(__('Login Server Error, please wait for the admin to fix it'));
+ }
+ } else {
+ $pendingTransactionCount = $session->read('Transactions.pending');
+ if ($pendingTransactionCount == null) {
+ $pendingTransactionCount = 1;
+ } else {
+ $pendingTransactionCount++;
+ }
+ $session->write('Transactions.pending', $pendingTransactionCount);
+ if ($mode === 'next') {
+ return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303);
+ } else {
+ $this->Flash->success(__('Transaction submitted for review.'));
+ }
+ }
+ }
+ } else {
+ $this->Flash->error(__('Building transaction failed'));
+ }
+ // */
+ } else {
+ $this->Flash->error(__('Something was invalid, please try again!'));
+ }
+ }
+ }
+
+ public function createMulti($page = 0)
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $result = $this->requestLogin();
+ $limit = 200;
+ if ($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+
+ $connection = ConnectionManager::get('default');
+ $transactionActiveMonth = $connection->execute(
+ 'SELECT id, received FROM transactions '
+ . 'where received >= date_sub(date_add(curdate(), interval 1 - day(curdate()) day), interval 2 month) '
+ . 'AND '
+ . 'received < date_add(date_add(curdate(), interval 1 - day(curdate()) day), interval 2 month) '
+ . 'AND '
+ . 'transaction_type_id = 1'
+ )->fetchAll('assoc');
+ $transactionActiveMonthSortedById = [];
+ foreach ($transactionActiveMonth as $t) {
+ $transactionActiveMonthSortedById[$t['id']] = $t['received'];
+ }
+ $firstDayLastMonth = new FrozenDate();
+ $firstDayLastMonth = $firstDayLastMonth->day(1)->subMonth(1);
+ $transactionsLastMonthTargeDate = $this->TransactionCreations
+ ->find('all')
+ //->select(['state_user_id', 'target_date', 'amount'])
+ ->where(['EXTRACT(YEAR_MONTH FROM target_date) LIKE' => $firstDayLastMonth->format('Ym')])
+ ->group(['state_user_id'])
+ ->contain([]);
+ $transactionsLastMonthTargeDate->select([
+ 'state_user_id',
+ 'sum_amount' => $transactionsLastMonthTargeDate->func()->sum('amount')
+ ]);
+
+ $transactionsLastMonthTargetDateSortedByStateUserId = [];
+ foreach ($transactionsLastMonthTargeDate as $transactionCreation) {
+ $transactionsLastMonthTargetDateSortedByStateUserId[$transactionCreation->state_user_id] = $transactionCreation->sum_amount;
+ }
+
+ $requestData = $this->request->getData();
+ if ($this->request->is('post') &&
+ isset($requestData['searchButton']) &&
+ isset($requestData['searchText']) &&
+ !empty($requestData['searchText'])
+ ) {
+ $mode = 'search';
+ $page = 0;
+ $this->log("search for text: ".$requestData['searchText'], 'debug');
+ $stateUsers = $stateUserTable
+ ->find('all')
+ ->select(['id', 'first_name', 'last_name', 'email'])
+ ->order(['first_name', 'last_name'])
+ ->where(
+ ['AND' => [
+ 'disabled' => 0,
+ 'OR' => [
+ 'LOWER(first_name) LIKE' => '%'.strtolower($requestData['searchText']).'%',
+ 'LOWER(last_name) LIKE' => '%'.strtolower($requestData['searchText']).'%',
+ 'LOWER(email) LIKE' => '%'.strtolower($requestData['searchText']).'%'
+ ]
+ ]
+ ]
+ )
+ ->contain(['TransactionCreations' => [
+ 'fields' => [
+ 'TransactionCreations.amount',
+ 'TransactionCreations.transaction_id',
+ 'TransactionCreations.state_user_id'
+ ]
+ ]]);
+ $this->log("search query: ".$stateUsers, 'debug');
+ } else {
+ $stateUsers = $stateUserTable
+ ->find('all')
+ ->select(['id', 'first_name', 'last_name', 'email'])
+ //->order(['id'])
+ ->where(['disabled' => 0])
+ ->order(['first_name', 'last_name'])
+ ->contain(['TransactionCreations' => [
+ 'fields' => [
+ 'TransactionCreations.amount',
+ 'TransactionCreations.transaction_id',
+ 'TransactionCreations.state_user_id'
+ ]
+ ]]);
+ }
+
+ //var_dump($stateUsers->toArray());
+ $possibleReceivers = [];
+ $countUsers = 0;
+ foreach ($stateUsers as $i => $stateUser) {
+ $countUsers++;
+ if ($i < $page * $limit || $i >= ($page + 1) * $limit) {
+ continue;
+ }
+ $sumAmount = 0;
+ $sumAmount2 = 0;
+ if (isset($transactionsLastMonthTargetDateSortedByStateUserId[$stateUser->id])) {
+ $sumAmount2 = $transactionsLastMonthTargetDateSortedByStateUserId[$stateUser->id];
+ }
+ foreach ($stateUser->transaction_creations as $transactionCreation) {
+ //var_dump($transactionCreation);
+ if (isset($transactionActiveMonthSortedById[$transactionCreation->transaction_id])) {
+ $sumAmount += $transactionCreation->amount;
+ }
+ }
+
+ //if($sumAmount < 20000000) {
+ array_push($possibleReceivers, [
+ 'name' => $stateUser->first_name . ' ' . $stateUser->last_name,
+ 'id' => $stateUser->id,
+ 'email' => $stateUser->email,
+ 'amount' => $sumAmount,
+ 'amount2' => $sumAmount2
+ ]);
+ /*} else {
+ $this->Flash->error(__('Creation above 2.000 GDD for 2 last two month'));
+ }*/
+ }
+ // usort($possibleReceivers, function ($a, $b) {
+ // return (strtolower($a['name']) <=> strtolower($b['name']));
+ // });
+ // -> replaced by SQL "order by" above
+ $creationForm = new CreationForm();
+
+ $timeUsed = microtime(true) - $startTime;
+ $this->set(compact('timeUsed', 'stateUsers', 'creationForm', 'possibleReceivers'));
+
+ $this->set('firstDayLastMonth', $firstDayLastMonth);
+ $this->set('activeUser', $user);
+ $this->set('creationForm', $creationForm);
+ $this->set('transactionExecutingCount', $session->read('Transaction.executing'));
+ $this->set('timeUsed', microtime(true) - $startTime);
+ $this->set('countUsers', $countUsers);
+ $this->set('limit', $limit);
+ $this->set('page', $page);
+
+ if ($this->request->is('post') && (!isset($mode) || !($mode === 'search'))) {
+ $this->log("real POST", 'debug');
+ $mode = 'next';
+ if (isset($requestData['add'])) {
+ $mode = 'add';
+ }
+ $memo = $requestData['memo'];
+ $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']);
+ //$targetDate = $requestData['target_date'];
+ if (!isset($requestData['user']) || count($requestData['user']) == 0) {
+ $this->Flash->error(__('No user selected'));
+ } else {
+ $users = $requestData['user'];
+ if (isset($requestData['user_pending'])) {
+ $pendings = $requestData['user_pending'];
+ } else {
+ $pendings = [];
+ }
+ $receiverUsers = $stateUserTable
+ ->find('all')
+ ->where(['id IN' => array_keys($users)])
+ ->select(['public_key', 'email', 'id'])
+ ->contain(false);
+ $transactions = [];
+ foreach ($receiverUsers as $receiverUser) {
+ $localAmountCent = $amountCent;
+ //$localTargetDate = $targetDate;
+ $id = $receiverUser->id;
+ if ($requestData['user_amount'][$id] != '') {
+ $localAmountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['user_amount'][$id]);
+ }
+ if (isset($requestData['user_target_date']) && isset($requestData['user_target_date'][$id])) {
+ $localTargetDate = $requestData['user_target_date'][$id];
+ }
+ if (isset($pendings[$id])) {
+ $pendings[$id] += $localAmountCent;
+ } else {
+ $pendings[$id] = $localAmountCent;
+ }
+ $pubKeyHex = bin2hex(stream_get_contents($receiverUser->public_key));
+ $identHash = TransactionCreation::DRMakeStringHash($receiverUser->email);
+ $localTargetDateFrozen = FrozenDate::now();
+ $localTargetDateFrozen = $localTargetDateFrozen
+ ->year($localTargetDate['year'])
+ ->month($localTargetDate['month'])
+ ->day($localTargetDate['day']);
+ //echo "input: "; var_dump($localTargetDate);echo " ";
+ //echo "output: "; var_dump($localTargetDateFrozen);
+ //die('a');
+ $builderResult = TransactionCreation::build(
+ $localAmountCent,
+ $memo,
+ $pubKeyHex,
+ $identHash,
+ $localTargetDateFrozen
+ );
+ if ($builderResult['state'] == 'success') {
+ array_push($transactions, base64_encode($builderResult['transactionBody']->serializeToString()));
+ }
+ }
+ /*echo "pendings: ";
+ var_dump($pendings);
+ echo " ";*/
+ foreach ($possibleReceivers as $i => $possibleReceiver) {
+ $id = $possibleReceiver['id'];
+ if (isset($pendings[$id])) {
+ $possibleReceivers[$i]['pending'] = $pendings[$id];
+ }
+ }
+ $this->set('possibleReceivers', $possibleReceivers);
+ $creationTransactionCount = count($transactions);
+ if ($creationTransactionCount > 0) {
+ $user_balance = 0;
+ if (isset($user['balance'])) {
+ $user_balance = $user['balance'];
+ }
+ // $session_id, $base64Message, $user_balance = 0
+ $requestResult = $this->JsonRequestClient->sendTransaction(
+ $session->read('session_id'),
+ $transactions,
+ $user_balance
+ );
+ if ($requestResult['state'] != 'success') {
+ $this->addAdminError('TransactionCreations', 'createMulti', $requestResult, $user['id']);
+ if ($requestResult['type'] == 'request error') {
+ $this->Flash->error(__('Error by requesting LoginServer, please try again'));
+ } else {
+ $this->Flash->error(__('Error, please wait for the admin to fix it'));
+ }
+ } else {
+ $json = $requestResult['data'];
+ if ($json['state'] != 'success') {
+ if ($json['msg'] == 'session not found') {
+ $session->destroy();
+ return $this->redirect($this->loginServerUrl . 'account', 303);
+ } else {
+ $this->addAdminError('TransactionCreations', 'createMulti', $json, $user['id']);
+ $this->Flash->error(__('Login Server Error, please wait for the admin to fix it'));
+ }
+ } else {
+ $pendingTransactionCount = $session->read('Transactions.pending');
+ if ($pendingTransactionCount == null) {
+ $pendingTransactionCount = $creationTransactionCount;
+ } else {
+ $pendingTransactionCount += $creationTransactionCount;
+ }
+ $session->write('Transactions.pending', $pendingTransactionCount);
+ if ($mode === 'next') {
+ return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303);
+ } else {
+ $this->Flash->success(__('Transaction submitted for review.'));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+
+ $transactionCreation = $this->TransactionCreations->newEntity();
+ if ($this->request->is('post')) {
+ $transactionCreation = $this->TransactionCreations->patchEntity($transactionCreation, $this->request->getData());
+ if ($this->TransactionCreations->save($transactionCreation)) {
+ $this->Flash->success(__('The transaction creation has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction creation could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionCreations->Transactions->find('list', ['limit' => 200]);
+ $stateUsers = $this->TransactionCreations->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('transactionCreation', 'transactions', 'stateUsers'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction Creation id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transactionCreation = $this->TransactionCreations->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transactionCreation = $this->TransactionCreations->patchEntity($transactionCreation, $this->request->getData());
+ if ($this->TransactionCreations->save($transactionCreation)) {
+ $this->Flash->success(__('The transaction creation has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction creation could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionCreations->Transactions->find('list', ['limit' => 200]);
+ $stateUsers = $this->TransactionCreations->StateUsers->find('list', ['limit' => 200]);
+ $this->set(compact('transactionCreation', 'transactions', 'stateUsers'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction Creation id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transactionCreation = $this->TransactionCreations->get($id);
+ if ($this->TransactionCreations->delete($transactionCreation)) {
+ $this->Flash->success(__('The transaction creation has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction creation could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionGroupAddaddressController.php b/community_server/src/Controller/TransactionGroupAddaddressController.php
new file mode 100644
index 000000000..fc23c111b
--- /dev/null
+++ b/community_server/src/Controller/TransactionGroupAddaddressController.php
@@ -0,0 +1,113 @@
+paginate = [
+ 'contain' => ['Transactions', 'AddressTypes']
+ ];
+ $transactionGroupAddaddress = $this->paginate($this->TransactionGroupAddaddress);
+
+ $this->set(compact('transactionGroupAddaddress'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction Group Addaddres id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id, [
+ 'contain' => ['Transactions', 'AddressTypes']
+ ]);
+
+ $this->set('transactionGroupAddaddres', $transactionGroupAddaddres);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $transactionGroupAddaddres = $this->TransactionGroupAddaddress->newEntity();
+ if ($this->request->is('post')) {
+ $transactionGroupAddaddres = $this->TransactionGroupAddaddress->patchEntity($transactionGroupAddaddres, $this->request->getData());
+ if ($this->TransactionGroupAddaddress->save($transactionGroupAddaddres)) {
+ $this->Flash->success(__('The transaction group addaddres has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction group addaddres could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionGroupAddaddress->Transactions->find('list', ['limit' => 200]);
+ $addressTypes = $this->TransactionGroupAddaddress->AddressTypes->find('list', ['limit' => 200]);
+ $this->set(compact('transactionGroupAddaddres', 'transactions', 'addressTypes'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction Group Addaddres id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transactionGroupAddaddres = $this->TransactionGroupAddaddress->patchEntity($transactionGroupAddaddres, $this->request->getData());
+ if ($this->TransactionGroupAddaddress->save($transactionGroupAddaddres)) {
+ $this->Flash->success(__('The transaction group addaddres has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction group addaddres could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionGroupAddaddress->Transactions->find('list', ['limit' => 200]);
+ $addressTypes = $this->TransactionGroupAddaddress->AddressTypes->find('list', ['limit' => 200]);
+ $this->set(compact('transactionGroupAddaddres', 'transactions', 'addressTypes'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction Group Addaddres id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transactionGroupAddaddres = $this->TransactionGroupAddaddress->get($id);
+ if ($this->TransactionGroupAddaddress->delete($transactionGroupAddaddres)) {
+ $this->Flash->success(__('The transaction group addaddres has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction group addaddres could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionGroupAllowtradesController.php b/community_server/src/Controller/TransactionGroupAllowtradesController.php
new file mode 100644
index 000000000..0b83332c6
--- /dev/null
+++ b/community_server/src/Controller/TransactionGroupAllowtradesController.php
@@ -0,0 +1,113 @@
+paginate = [
+ 'contain' => ['Transactions', 'Groups']
+ ];
+ $transactionGroupAllowtrades = $this->paginate($this->TransactionGroupAllowtrades);
+
+ $this->set(compact('transactionGroupAllowtrades'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction Group Allowtrade id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id, [
+ 'contain' => ['Transactions', 'Groups']
+ ]);
+
+ $this->set('transactionGroupAllowtrade', $transactionGroupAllowtrade);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->newEntity();
+ if ($this->request->is('post')) {
+ $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->patchEntity($transactionGroupAllowtrade, $this->request->getData());
+ if ($this->TransactionGroupAllowtrades->save($transactionGroupAllowtrade)) {
+ $this->Flash->success(__('The transaction group allowtrade has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction group allowtrade could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionGroupAllowtrades->Transactions->find('list', ['limit' => 200]);
+ $groups = $this->TransactionGroupAllowtrades->Groups->find('list', ['limit' => 200]);
+ $this->set(compact('transactionGroupAllowtrade', 'transactions', 'groups'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction Group Allowtrade id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->patchEntity($transactionGroupAllowtrade, $this->request->getData());
+ if ($this->TransactionGroupAllowtrades->save($transactionGroupAllowtrade)) {
+ $this->Flash->success(__('The transaction group allowtrade has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction group allowtrade could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionGroupAllowtrades->Transactions->find('list', ['limit' => 200]);
+ $groups = $this->TransactionGroupAllowtrades->Groups->find('list', ['limit' => 200]);
+ $this->set(compact('transactionGroupAllowtrade', 'transactions', 'groups'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction Group Allowtrade id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transactionGroupAllowtrade = $this->TransactionGroupAllowtrades->get($id);
+ if ($this->TransactionGroupAllowtrades->delete($transactionGroupAllowtrade)) {
+ $this->Flash->success(__('The transaction group allowtrade has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction group allowtrade could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionGroupCreatesController.php b/community_server/src/Controller/TransactionGroupCreatesController.php
new file mode 100644
index 000000000..57e5c7d8f
--- /dev/null
+++ b/community_server/src/Controller/TransactionGroupCreatesController.php
@@ -0,0 +1,113 @@
+paginate = [
+ 'contain' => ['Transactions', 'StateGroups']
+ ];
+ $transactionGroupCreates = $this->paginate($this->TransactionGroupCreates);
+
+ $this->set(compact('transactionGroupCreates'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction Group Create id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transactionGroupCreate = $this->TransactionGroupCreates->get($id, [
+ 'contain' => ['Transactions', 'StateGroups']
+ ]);
+
+ $this->set('transactionGroupCreate', $transactionGroupCreate);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $transactionGroupCreate = $this->TransactionGroupCreates->newEntity();
+ if ($this->request->is('post')) {
+ $transactionGroupCreate = $this->TransactionGroupCreates->patchEntity($transactionGroupCreate, $this->request->getData());
+ if ($this->TransactionGroupCreates->save($transactionGroupCreate)) {
+ $this->Flash->success(__('The transaction group create has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction group create could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionGroupCreates->Transactions->find('list', ['limit' => 200]);
+ $stateGroups = $this->TransactionGroupCreates->StateGroups->find('list', ['limit' => 200]);
+ $this->set(compact('transactionGroupCreate', 'transactions', 'stateGroups'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction Group Create id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transactionGroupCreate = $this->TransactionGroupCreates->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transactionGroupCreate = $this->TransactionGroupCreates->patchEntity($transactionGroupCreate, $this->request->getData());
+ if ($this->TransactionGroupCreates->save($transactionGroupCreate)) {
+ $this->Flash->success(__('The transaction group create has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction group create could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionGroupCreates->Transactions->find('list', ['limit' => 200]);
+ $stateGroups = $this->TransactionGroupCreates->StateGroups->find('list', ['limit' => 200]);
+ $this->set(compact('transactionGroupCreate', 'transactions', 'stateGroups'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction Group Create id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transactionGroupCreate = $this->TransactionGroupCreates->get($id);
+ if ($this->TransactionGroupCreates->delete($transactionGroupCreate)) {
+ $this->Flash->success(__('The transaction group create has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction group create could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionSendCoinsController.php b/community_server/src/Controller/TransactionSendCoinsController.php
new file mode 100644
index 000000000..40cccb90e
--- /dev/null
+++ b/community_server/src/Controller/TransactionSendCoinsController.php
@@ -0,0 +1,358 @@
+loadComponent('GradidoNumber');
+ $this->loadComponent('JsonRequestClient');
+ //$this->Auth->allow(['add', 'edit']);
+ $this->Auth->allow('create');
+ $this->Auth->allow('createRaw');
+ $this->set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->
+ add(new NaviHierarchyEntry(__('Überweisung'), 'TransactionSendCoins', 'create', true))
+ );
+ }
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $this->paginate = [
+ 'contain' => ['Transactions', 'StateUsers', 'ReceiverUsers']
+ ];
+ $transactionSendCoins = $this->paginate($this->TransactionSendCoins);
+
+ $this->set(compact('transactionSendCoins'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction Send Coin id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transactionSendCoin = $this->TransactionSendCoins->get($id, [
+ 'contain' => ['Transactions', 'StateUsers', 'ReceiverUsers']
+ ]);
+
+ $this->set('transactionSendCoin', $transactionSendCoin);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $transactionSendCoin = $this->TransactionSendCoins->newEntity();
+ if ($this->request->is('post')) {
+ $transactionSendCoin = $this->TransactionSendCoins->patchEntity($transactionSendCoin, $this->request->getData());
+ if ($this->TransactionSendCoins->save($transactionSendCoin)) {
+ $this->Flash->success(__('The transaction send coin has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction send coin could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionSendCoins->Transactions->find('list', ['limit' => 200]);
+ $stateUsers = $this->TransactionSendCoins->StateUsers->find('list', ['limit' => 200]);
+ $receiverUsers = $this->TransactionSendCoins->ReceiverUsers->find('list', ['limit' => 200]);
+ $this->set(compact('transactionSendCoin', 'transactions', 'stateUsers', 'receiverUsers'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction Send Coin id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transactionSendCoin = $this->TransactionSendCoins->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transactionSendCoin = $this->TransactionSendCoins->patchEntity($transactionSendCoin, $this->request->getData());
+ if ($this->TransactionSendCoins->save($transactionSendCoin)) {
+ $this->Flash->success(__('The transaction send coin has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction send coin could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionSendCoins->Transactions->find('list', ['limit' => 200]);
+ $stateUsers = $this->TransactionSendCoins->StateUsers->find('list', ['limit' => 200]);
+ $receiverUsers = $this->TransactionSendCoins->ReceiverUsers->find('list', ['limit' => 200]);
+ $this->set(compact('transactionSendCoin', 'transactions', 'stateUsers', 'receiverUsers'));
+ }
+
+ public function create()
+ {
+ /*$locale = I18n::getLocale();
+ $defaultLocale = I18n::getDefaultLocale();
+ echo "locale: $locale, default locale: $defaultLocale ";
+ * */
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $session = $this->getRequest()->getSession();
+ $user = $session->read('StateUser');
+// var_dump($user);
+ if(!$user) {
+ //return $this->redirect(Router::url('/', true) . 'account/', 303);
+ $result = $this->requestLogin();
+ if($result !== true) {
+ return $result;
+ }
+ $user = $session->read('StateUser');
+ }
+
+ $transferForm = new TransferForm();
+ $this->set('transferForm', $transferForm);
+ $this->set('timeUsed', microtime(true) - $startTime);
+
+ if ($this->request->is('post')) {
+ //$this->Flash->error(__('Wird zurzeit noch entwickelt!'));
+
+ $requestData = $this->request->getData();
+ $mode = 'next';
+ if(isset($requestData['add'])) {$mode = 'add'; }
+ if($transferForm->validate($requestData)) {
+
+ $receiverPubKeyHex = '';
+ $senderPubKeyHex = $user['public_hex'];
+ $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']);
+
+ if(!isset($user['balance']) || $amountCent > $user['balance']) {
+ $this->Flash->error(__('Du hast nicht genug Geld!'));
+ return;
+ }
+
+ $receiverEmail = $requestData['email'];
+ if($receiverEmail === $user['email']) {
+ $this->Flash->error(__('Du kannst dir leider nicht selbst Geld schicken!'));
+ return;
+ }
+ $receiverPubkeyHex ='';
+ $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([
+ 'session_id' => $session->read('session_id'),
+ 'email' => $receiverEmail,
+ 'ask' => ['user.pubkeyhex', 'user.disabled']
+ ]), '/getUserInfos');
+ if('success' == $requestAnswear['state'] && 'success' == $requestAnswear['data']['state']) {
+ // will be allways 64 byte long, even if it is empty
+ $receiverPubKeyHex = $requestAnswear['data']['userData']['pubkeyhex'];
+ } else {
+ $this->addAdminError('TransactionSendCoins', 'create', $requestAnswear, $user['id']);
+ $this->Flash->error(__('Der Empfänger wurde nicht auf dem Login-Server gefunden, hat er sein Konto schon angelegt?'));
+ $this->set('timeUsed', microtime(true) - $startTime);
+ return;
+ }
+ if($requestAnswear['data']['userData']['disabled']) {
+ $this->Flash->error(__('Der Empfänger ist deaktiviert, daher können ihm zurzeit keine Gradidos gesendet werden.'));
+ $this->set('timeUsed', microtime(true) - $startTime);
+ return;
+ }
+
+
+ if(0 == ord($receiverPubKeyHex)) {
+ $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers');
+ $receiverUser = $stateUserTable
+ ->find('all')
+ ->select(['public_key'])
+ ->contain(false)
+ ->where(['email' => $receiverEmail]);
+
+
+ if(!$receiverUser) {
+ $this->Flash->error(__('Diese E-Mail ist mir nicht bekannt, hat dein Empfänger denn schon ein Gradido-Konto?'));
+ $this->set('timeUsed', microtime(true) - $startTime);
+ return;
+ }
+
+ if(isset($receiverUser->public_key)) {
+ $receiverPubKeyHex = bin2hex(stream_get_contents($receiverUser->public_key));
+ } else {
+ $this->Flash->error(__('Das Konto mit der E-Mail: ' . $receiverEmail . ' wurde noch nicht aktiviert und kann noch keine GDD empfangen!'));
+ $this->set('timeUsed', microtime(true) - $startTime);
+ return;
+ }
+
+ }
+ //var_dump($sessionStateUser);
+
+ $builderResult = TransactionTransfer::build(
+ $amountCent,
+ $requestData['memo'],
+ $receiverPubKeyHex,
+ $senderPubKeyHex
+ );
+ if($builderResult['state'] === 'success') {
+
+ $http = new Client();
+ try {
+ $loginServer = Configure::read('LoginServer');
+ $url = $loginServer['host'] . ':' . $loginServer['port'];
+ $session_id = $session->read('session_id');
+ /*
+ *
+ * $response = $http->post(
+ * 'http://example.com/tasks',
+ * json_encode($data),
+ * ['type' => 'json']
+ * );
+ */
+ $response = $http->post($url . '/checkTransaction', json_encode([
+ 'session_id' => $session_id,
+ 'transaction_base64' => base64_encode($builderResult['transactionBody']->serializeToString()),
+ 'balance' => $user['balance']
+ ]), ['type' => 'json']);
+ $json = $response->getJson();
+ if($json['state'] != 'success') {
+ if($json['msg'] == 'session not found') {
+ $session->destroy();
+ return $this->redirect($this->loginServerUrl . 'account', 303);
+ //$this->Flash->error(__('session not found, please login again'));
+ } else {
+ $this->Flash->error(__('login server return error: ' . json_encode($json)));
+ }
+ } else {
+ $pendingTransactionCount = $session->read('Transactions.pending');
+ if($pendingTransactionCount == null) {
+ $pendingTransactionCount = 1;
+ } else {
+ $pendingTransactionCount++;
+ }
+ $session->write('Transactions.pending', $pendingTransactionCount);
+ //echo "pending: " . $pendingTransactionCount;
+ if($mode === 'next') {
+ return $this->redirect($this->loginServerUrl . 'account/checkTransactions', 303);
+ } else {
+ $this->Flash->success(__('Transaction submitted for review.'));
+ }
+ }
+
+ } catch(\Exception $e) {
+ $msg = $e->getMessage();
+ $this->Flash->error(__('error http request: ') . $msg);
+ }
+
+ } else {
+ $this->Flash->error(__('No Valid Receiver Public given: ' . $receiverPubKeyHex));
+ }
+
+// */
+ } else {
+ $this->Flash->error(__('Something was invalid, please try again!'));
+ }
+ }
+
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+
+ public function createRaw()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+
+ $transferRawForm = new TransferRawForm();
+ $this->set('transferRawForm', $transferRawForm);
+
+ if ($this->request->is('post')) {
+ $requestData = $this->request->getData();
+ if($transferRawForm->validate($requestData)) {
+ $amountCent = $this->GradidoNumber->parseInputNumberToCentNumber($requestData['amount']);
+ $sender = ['priv' => $requestData['sender_privkey_hex'], 'pub' => $requestData['sender_pubkey_hex']];
+ $reciver = ['pub' => $requestData['receiver_pubkey_hex']];
+
+ $builderResult = TransactionTransfer::build(
+ $amountCent,
+ $requestData['memo'],
+ $reciver['pub'],
+ $sender['pub']
+ );
+ if($builderResult['state'] === 'success') {
+ $protoTransaction = Transaction::build($builderResult['transactionBody'], $sender);
+ $transaction = new Transaction($protoTransaction);
+ if(!$transaction->validate()) {
+ $this->Flash->error(__('Error validating transaction'));
+ } else {
+ if(!$transaction->save()) {
+ $this->Flash->error(__('Error saving transaction'));
+ } else {
+ $this->Flash->success(__('Gradidos erfolgreich überwiesen!'));
+ }
+ }
+ } else {
+ $this->Flash->error(__('Error building transaction'));
+ }
+
+ }
+ //var_dump($requestData);
+ //
+ //var_dump($data);
+
+ }
+
+ $this->set('timeUsed', microtime(true) - $startTime);
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction Send Coin id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transactionSendCoin = $this->TransactionSendCoins->get($id);
+ if ($this->TransactionSendCoins->delete($transactionSendCoin)) {
+ $this->Flash->success(__('The transaction send coin has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction send coin could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionSignaturesController.php b/community_server/src/Controller/TransactionSignaturesController.php
new file mode 100644
index 000000000..91aea9558
--- /dev/null
+++ b/community_server/src/Controller/TransactionSignaturesController.php
@@ -0,0 +1,111 @@
+paginate = [
+ 'contain' => ['Transactions']
+ ];
+ $transactionSignatures = $this->paginate($this->TransactionSignatures);
+
+ $this->set(compact('transactionSignatures'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction Signature id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transactionSignature = $this->TransactionSignatures->get($id, [
+ 'contain' => ['Transactions']
+ ]);
+
+ $this->set('transactionSignature', $transactionSignature);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $transactionSignature = $this->TransactionSignatures->newEntity();
+ if ($this->request->is('post')) {
+ $transactionSignature = $this->TransactionSignatures->patchEntity($transactionSignature, $this->request->getData());
+ if ($this->TransactionSignatures->save($transactionSignature)) {
+ $this->Flash->success(__('The transaction signature has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction signature could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionSignatures->Transactions->find('list', ['limit' => 200]);
+ $this->set(compact('transactionSignature', 'transactions'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction Signature id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transactionSignature = $this->TransactionSignatures->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transactionSignature = $this->TransactionSignatures->patchEntity($transactionSignature, $this->request->getData());
+ if ($this->TransactionSignatures->save($transactionSignature)) {
+ $this->Flash->success(__('The transaction signature has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction signature could not be saved. Please, try again.'));
+ }
+ $transactions = $this->TransactionSignatures->Transactions->find('list', ['limit' => 200]);
+ $this->set(compact('transactionSignature', 'transactions'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction Signature id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transactionSignature = $this->TransactionSignatures->get($id);
+ if ($this->TransactionSignatures->delete($transactionSignature)) {
+ $this->Flash->success(__('The transaction signature has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction signature could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionTypesController.php b/community_server/src/Controller/TransactionTypesController.php
new file mode 100644
index 000000000..8256b22eb
--- /dev/null
+++ b/community_server/src/Controller/TransactionTypesController.php
@@ -0,0 +1,106 @@
+paginate($this->TransactionTypes);
+
+ $this->set(compact('transactionTypes'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction Type id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transactionType = $this->TransactionTypes->get($id, [
+ 'contain' => ['Transactions']
+ ]);
+
+ $this->set('transactionType', $transactionType);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $transactionType = $this->TransactionTypes->newEntity();
+ if ($this->request->is('post')) {
+ $transactionType = $this->TransactionTypes->patchEntity($transactionType, $this->request->getData());
+ if ($this->TransactionTypes->save($transactionType)) {
+ $this->Flash->success(__('The transaction type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('transactionType'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction Type id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transactionType = $this->TransactionTypes->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transactionType = $this->TransactionTypes->patchEntity($transactionType, $this->request->getData());
+ if ($this->TransactionTypes->save($transactionType)) {
+ $this->Flash->success(__('The transaction type has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction type could not be saved. Please, try again.'));
+ }
+ $this->set(compact('transactionType'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction Type id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transactionType = $this->TransactionTypes->get($id);
+ if ($this->TransactionTypes->delete($transactionType)) {
+ $this->Flash->success(__('The transaction type has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction type could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/TransactionsController.php b/community_server/src/Controller/TransactionsController.php
new file mode 100644
index 000000000..2f0bc2747
--- /dev/null
+++ b/community_server/src/Controller/TransactionsController.php
@@ -0,0 +1,259 @@
+loadComponent('GradidoNumber');
+ $this->loadComponent('JsonRpcRequestClient');
+ $this->Auth->allow(['decode']);
+
+ }
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $this->paginate = [
+ 'contain' => ['TransactionTypes']
+ ];
+ $transactions = $this->paginate($this->Transactions);
+
+ $this->set(compact('transactions'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id Transaction id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $transaction = $this->Transactions->get($id, [
+ 'contain' => ['TransactionTypes', 'TransactionCreations', 'TransactionGroupAddaddress', 'TransactionGroupAllowtrades', 'TransactionGroupCreates', 'TransactionSendCoins', 'TransactionSignatures']
+ ]);
+
+ $this->set('transaction', $transaction);
+ }
+
+ public function decode()
+ {
+ $this->viewBuilder()->setLayout('frontend');
+ if ($this->request->is('post')) {
+ $base64 = $this->request->getData('base64');
+ if(!$base64 || $base64 == '') {
+ $this->Flash->error(__('No valid data given, please try again.'));
+ } else {
+ try {
+ $transactionBin = sodium_base642bin($base64, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING);
+ } catch(Exception $ex) {
+ var_dump($ex);
+ }
+ $transaction = new TransactionBody($transactionBin);
+ if($transaction->hasErrors()) {
+ $this->set('errors', $transaction->getErrors());
+ } else {
+ //$transaction->validate();
+ if($transaction->hasErrors()) {
+ $this->set('errors', $transaction->getErrors());
+ }
+ //var_dump($transaction);
+ echo " bin: ";
+ var_dump($transactionBin);
+ echo " ";
+ $this->set('transaction', $transaction);
+ }
+
+ }
+ }
+
+ }
+
+ public function sendToNode() {
+ $this->viewBuilder()->setLayout('frontend');
+ $startTime = microtime(true);
+
+ //$loginServer = Configure::read('LoginServer');
+
+ $jsonRpcResult = $this->JsonRpcRequestClient->request('getlasttransaction', []);
+ $result = $jsonRpcResult['result'];
+ //var_dump($result);
+ if($result['state'] != 'success') {
+ $this->Flash->error(__('error retriving last saved transaction from gradido node.'));
+ $timeUsed = microtime(true) - $startTime;
+ $this->set('timeUsed', $timeUsed);
+ return;
+ }
+
+ $firstId = 1;
+ if($result['transaction'] != '') {
+ $lastKnowTransaction = new Transaction($result['transaction']);
+ $firstId = $lastKnowTransaction->getId()+1;
+ }
+
+ $transactionIDEntities = $this->Transactions
+ ->find('all')
+ ->select(['id'])
+ ->where(['id >=' => $firstId])
+ ;
+ $transactionIDs = [];
+ foreach($transactionIDEntities as $entity) {
+ array_push($transactionIDs, $entity->id);
+ }
+
+ $csfr_token = $this->request->getParam('_csrfToken');
+ $this->set('csfr_token', $csfr_token);
+ $this->set('transactionIds', $transactionIDs);
+
+ $timeUsed = microtime(true) - $startTime;
+ $this->set('timeUsed', $timeUsed);
+
+ if ($this->request->is('post')) {
+ $host = $this->request->getData('host');
+ $port = $this->request->getData('port');
+ //$gradidod = new JsonRpcClient($host . ':' . $port);
+
+
+ //var_dump($transactionIDs);
+
+ //$result = $this->JsonRpcRequestClient->request('puttransaction', ['group' => 'Hallo', 'transaction' => 'Hallo2' ]);
+
+ //$result = $gradidod->putTransaction(['group' => 'Hallo', 'transaction' => 'Hallo2' ]);
+ //var_dump($result);
+
+ $timeUsed = microtime(true) - $startTime;
+ $this->set('timeUsed', $timeUsed);
+ }
+ }
+
+ public function ajaxPutTransactionToGradidoNode()
+ {
+ $startTime = microtime(true);
+ if($this->request->is('post')) {
+ //$jsonData = $this->request->input('json_decode', true);
+ $data = $this->request->getData();
+ //$user = $jsonData['user'];
+ //var_dump($data);
+ $transactionId = $data['transaction_id'];
+ if($transactionId == null || $transactionId < 1) {
+ $timeUsed = microtime(true) - $startTime;
+ return $this->returnJson(['state' => 'error', 'msg' => 'invalid transaction id', 'timeUsed' => $timeUsed]);
+ }
+ try {
+ $transaction = Transaction::fromTable($transactionId);
+ } catch(Exception $e) {
+ echo "exception: ";
+ var_dump($e);
+ }
+ if(is_array($transaction)) {
+ $timeUsed = microtime(true) - $startTime;
+ $transaction['timeUsed'] = $timeUsed;
+ return $this->returnJson($transaction);
+ } else {
+ $transactionBase64 = base64_encode($transaction->serializeToString());
+ //echo "base64: $transactionBase64 ";
+
+ $result = $this->JsonRpcRequestClient->request('puttransaction', [
+ 'group' => 'd502c4254defe1842d71c484dc35f56983ce938e3c22058795c7520b62ab9123',
+ 'transaction' => $transactionBase64
+ ]);
+
+ $timeUsed = microtime(true) - $startTime;
+ $result['timeUsed'] = $timeUsed;
+ return $this->returnJson($result);
+ }
+ //return $this->returnJson(['state' => 'success', 'timeUsed' => $timeUsed]);
+ }
+ $timeUsed = microtime(true) - $startTime;
+ return $this->returnJson(['state' => 'error', 'msg' => 'no post request', 'timeUsed' => $timeUsed]);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $transaction = $this->Transactions->newEntity();
+ if ($this->request->is('post')) {
+ $transaction = $this->Transactions->patchEntity($transaction, $this->request->getData());
+ if ($this->Transactions->save($transaction)) {
+ $this->Flash->success(__('The transaction has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction could not be saved. Please, try again.'));
+ }
+ $stateGroups = $this->Transactions->StateGroups->find('list', ['limit' => 200]);
+ $transactionTypes = $this->Transactions->TransactionTypes->find('list', ['limit' => 200]);
+ $this->set(compact('transaction', 'stateGroups', 'transactionTypes'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id Transaction id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $transaction = $this->Transactions->get($id, [
+ 'contain' => []
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $transaction = $this->Transactions->patchEntity($transaction, $this->request->getData());
+ if ($this->Transactions->save($transaction)) {
+ $this->Flash->success(__('The transaction has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The transaction could not be saved. Please, try again.'));
+ }
+ $stateGroups = $this->Transactions->StateGroups->find('list', ['limit' => 200]);
+ $transactionTypes = $this->Transactions->TransactionTypes->find('list', ['limit' => 200]);
+ $this->set(compact('transaction', 'stateGroups', 'transactionTypes'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id Transaction id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $transaction = $this->Transactions->get($id);
+ if ($this->Transactions->delete($transaction)) {
+ $this->Flash->success(__('The transaction has been deleted.'));
+ } else {
+ $this->Flash->error(__('The transaction could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Controller/UsersController.php b/community_server/src/Controller/UsersController.php
new file mode 100644
index 000000000..f6b0472d3
--- /dev/null
+++ b/community_server/src/Controller/UsersController.php
@@ -0,0 +1,167 @@
+set(
+ 'naviHierarchy',
+ (new NaviHierarchy())->
+ add(new NaviHierarchyEntry(__('Startseite'), 'Dashboard', 'index', false))->add(new NaviHierarchyEntry(__('Benutzerstatistiken'), 'Users', 'statistics', true))
+ );
+ }
+
+ /**
+ * Index method
+ *
+ * @return \Cake\Http\Response|null
+ */
+ public function index()
+ {
+ $users = $this->paginate($this->Users);
+
+ $this->set(compact('users'));
+ }
+
+ public function statistics()
+ {
+ $startTime = microtime(true);
+ $this->viewBuilder()->setLayout('frontend');
+ $users = $this->Users->find('all')->select(['id']);
+
+ //$newUsersThisMonth
+ $now = new Time();
+ $sortDate = $this->getStartEndForMonth($now->month, $now->year);
+ $newUsersThisMonth = $this->Users->find('all')
+ ->select(['id'])
+ ->where(['created >=' => $sortDate[0], 'created <' => $sortDate[1]]);
+ $lastMonth = new Time();
+ $lastMonth = $lastMonth->subMonth(1);
+ $prevSortDate = $this->getStartEndForMonth($lastMonth->month, $lastMonth->year);
+ $newUsersLastMonth = $this->Users->find('all')
+ ->select(['id'])
+ ->where(['created >=' => $prevSortDate[0], 'created <' => $prevSortDate[1]]);
+
+ // new user sorted after date
+ $connection = ConnectionManager::get('loginServer');
+ $newAccountsPerDay = $connection->execute('SELECT count(id) as count, created FROM users GROUP BY CAST(created as DATE) ORDER BY created DESC ')->fetchAll('assoc');
+
+ $newAccountsTree = [];
+ foreach($newAccountsPerDay as $entry) {
+ $created = new Time($entry['created']);
+ if(!isset($newAccountsTree[$created->year])) {
+ $newAccountsTree[$created->year] = [];
+ }
+ if(!isset($newAccountsTree[$created->year][$created->month])) {
+ $newAccountsTree[$created->year][$created->month] = ['count' => 0, 'days' => []];
+ }
+ array_push($newAccountsTree[$created->year][$created->month]['days'], $entry);
+ $newAccountsTree[$created->year][$created->month]['count'] += intval($entry['count']);
+ }
+
+ // last 5 new users
+ $lastUsers = $this->Users->find('all')->order(['created DESC'])->limit(5);
+
+ $timeUsed = microtime(true) - $startTime;
+
+ $this->set(compact(
+ 'users', 'newUsersThisMonth', 'newUsersLastMonth',
+ 'timeUsed', 'newAccountsTree', 'lastUsers'));
+ }
+
+ /**
+ * View method
+ *
+ * @param string|null $id User id.
+ * @return \Cake\Http\Response|null
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function view($id = null)
+ {
+ $user = $this->Users->get($id, [
+ 'contain' => ['EmailOptIn', 'UserBackups', 'UserRoles'],
+ ]);
+
+ $this->set('user', $user);
+ }
+
+ /**
+ * Add method
+ *
+ * @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
+ */
+ public function add()
+ {
+ $user = $this->Users->newEntity();
+ if ($this->request->is('post')) {
+ $user = $this->Users->patchEntity($user, $this->request->getData());
+ if ($this->Users->save($user)) {
+ $this->Flash->success(__('The user has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The user could not be saved. Please, try again.'));
+ }
+ $this->set(compact('user'));
+ }
+
+ /**
+ * Edit method
+ *
+ * @param string|null $id User id.
+ * @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function edit($id = null)
+ {
+ $user = $this->Users->get($id, [
+ 'contain' => [],
+ ]);
+ if ($this->request->is(['patch', 'post', 'put'])) {
+ $user = $this->Users->patchEntity($user, $this->request->getData());
+ if ($this->Users->save($user)) {
+ $this->Flash->success(__('The user has been saved.'));
+
+ return $this->redirect(['action' => 'index']);
+ }
+ $this->Flash->error(__('The user could not be saved. Please, try again.'));
+ }
+ $this->set(compact('user'));
+ }
+
+ /**
+ * Delete method
+ *
+ * @param string|null $id User id.
+ * @return \Cake\Http\Response|null Redirects to index.
+ * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
+ */
+ public function delete($id = null)
+ {
+ $this->request->allowMethod(['post', 'delete']);
+ $user = $this->Users->get($id);
+ if ($this->Users->delete($user)) {
+ $this->Flash->success(__('The user has been deleted.'));
+ } else {
+ $this->Flash->error(__('The user could not be deleted. Please, try again.'));
+ }
+
+ return $this->redirect(['action' => 'index']);
+ }
+}
diff --git a/community_server/src/Form/CreationForm.php b/community_server/src/Form/CreationForm.php
new file mode 100644
index 000000000..70b4fce40
--- /dev/null
+++ b/community_server/src/Form/CreationForm.php
@@ -0,0 +1,73 @@
+addField('receiver_pubkey_hex', ['type' => 'string'])
+ ->addField('receiver', ['type' => 'select'])
+ ->addField('amount', ['type' => 'decimal', 'precision' => 2])
+ ->addField('target_date', ['type' => 'date'])
+ ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]);
+ }
+
+ function validationDefault(Validator $validator)
+ {
+ $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation');
+ /*
+ $validator->add('receiver_pubkey_hex', 'length', [
+ 'rule' => ['length', 64],
+ 'message' => 'a valid pubkey in hex format is required (64 character)'
+ ])->add('receiver_pubkey_hex_select', 'length', [
+ 'rule' => ['length', 64],
+ 'message' => 'a valid pubkey in hex format is required (64 character)',
+ ]);
+*/
+ // TODO: add validation for used character to prevent hacking attempts
+ $validator->add('memo', 'length', [
+ 'rule' => ['maxLength', 150],
+ 'message' => 'max 150 character'
+ ])
+ //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed'))
+ ->add('memo', 'custom', [
+ 'rule' => 'alphaNumeric',
+ 'provider' => 'custom',
+ //'message' => __('Only Alpha Numeric Character allowed')
+ 'message' => __('No HTML Tags like > or < please.')
+ ])
+ ->allowEmptyString('memo', null, 'create')
+ /*->add('receiver_pubkey_hex', 'custom', [
+ 'rule' => 'hexKey64',
+ 'provider' => 'custom',
+ 'message' => 'a valid pubkey in hex format is required (64 character)'
+ ])
+ ->allowEmptyString('receiver_pubkey_hex', null, 'create')*/
+ ->add('amount', 'custom', [
+ 'rule' => 'amount',
+ 'provider' => 'custom',
+ 'message' => __('Please give a valid number with maximal 2 decimal places')
+ ]);
+ return $validator;
+ }
+ /*
+ * $validator->add('title', 'custom', [
+ 'rule' => 'customRule',
+ 'provider' => 'custom',
+ 'message' => 'The title is not unique enough'
+]);
+ */
+
+ protected function _execute(array $data)
+ {
+ // Send an email.
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Form/DecodeTransaction.php b/community_server/src/Form/DecodeTransaction.php
new file mode 100644
index 000000000..3ac00faa6
--- /dev/null
+++ b/community_server/src/Form/DecodeTransaction.php
@@ -0,0 +1,8 @@
+addField('first_name', ['type' => 'string'])
+ ->addField('last_name', ['type' => 'string'])
+ ->addField('profile_img', ['type' => 'string'])
+ ->addField('profile_desc', ['type' =>'text', 'default' => '', 'rows' => 10, 'maxlength' => 2000]);
+ }
+
+ function validationDefault(Validator $validator)
+ {
+ $validator->setProvider('generic', 'App\Model\Validation\GenericValidation');
+ $validator->add('first_name', 'length', [
+ 'rule' => ['maxLength', 255],
+ 'message' => __('The first name should contain max 255 characters')
+ ])
+ ->add('last_name', 'length', [
+ 'rule' => ['maxLength', 255],
+ 'message' => __('The last name should contain max 255 characters')
+ ])
+ ->add('profile_desc', 'length', [
+ 'rule' => ['maxLength', 2000],
+ 'message' => __('The description should contain max 2000 characters')
+ ])
+ ->add('profile_desc', 'generic', [
+ 'rule' => 'alphaNumeric',
+ 'provider' => 'generic',
+ 'message' => __('No HTML Tags like > or < please.')
+ ])
+ ->allowEmptyString('profile_img', null, 'create')
+ ->allowEmptyString('profile_desc', null, 'create')
+ ;
+ return $validator;
+ }
+
+ protected function _execute(array $data)
+ {
+ // Send an email. (??? xxx)
+ return true;
+ }
+}
diff --git a/community_server/src/Form/TransferForm.php b/community_server/src/Form/TransferForm.php
new file mode 100644
index 000000000..5572ddaf9
--- /dev/null
+++ b/community_server/src/Form/TransferForm.php
@@ -0,0 +1,75 @@
+addField('email', ['type' => 'string'])
+ ->addField('amount', ['type' => 'decimal', 'precision' => 2])
+ ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]);
+ }
+
+ function validationDefault(Validator $validator)
+ {
+ $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation');
+ /*
+ $validator->add('receiver_pubkey_hex', 'length', [
+ 'rule' => ['length', 64],
+ 'message' => 'a valid pubkey in hex format is required (64 character)'
+ ])->add('receiver_pubkey_hex_select', 'length', [
+ 'rule' => ['length', 64],
+ 'message' => 'a valid pubkey in hex format is required (64 character)',
+ ]);
+*/
+ // TODO: add validation for used character to prevent hacking attempts
+ $validator->add('email', 'format', [
+ 'rule' => 'email',
+ 'message' => __('A valid email address is required')
+ ])
+ ->add('memo', 'length', [
+ 'rule' => ['maxLength', 150],
+ 'message' => __('The memo should contain max 150 character')
+ ])
+ //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed'))
+ ->add('memo', 'custom', [
+ 'rule' => 'alphaNumeric',
+ 'provider' => 'custom',
+ //'message' => __('Only Alpha Numeric Character allowed')
+ 'message' => __('No HTML Tags like > or < please.')
+ ])
+ ->allowEmptyString('memo', null, 'create')
+ /*->add('receiver_pubkey_hex', 'custom', [
+ 'rule' => 'hexKey64',
+ 'provider' => 'custom',
+ 'message' => 'a valid pubkey in hex format is required (64 character)'
+ ])
+ ->allowEmptyString('receiver_pubkey_hex', null, 'create')*/
+ ->add('amount', 'custom', [
+ 'rule' => 'amount',
+ 'provider' => 'custom',
+ 'message' => __('Please give a valid positive number with maximal 2 decimal places')
+ ]);
+ return $validator;
+ }
+ /*
+ * $validator->add('title', 'custom', [
+ 'rule' => 'customRule',
+ 'provider' => 'custom',
+ 'message' => 'The title is not unique enough'
+]);
+ */
+
+ protected function _execute(array $data)
+ {
+ // Send an email.
+ return true;
+ }
+}
diff --git a/community_server/src/Form/TransferRawForm.php b/community_server/src/Form/TransferRawForm.php
new file mode 100644
index 000000000..50c548ec5
--- /dev/null
+++ b/community_server/src/Form/TransferRawForm.php
@@ -0,0 +1,73 @@
+addField('sender_privkey_hex', ['type' => 'string'])
+ ->addField('sender_pubkey_hex', ['type' => 'string'])
+ ->addField('receiver_pubkey_hex', ['type' => 'string'])
+ ->addField('amount', ['type' => 'decimal', 'precision' => 2])
+ ->addField('memo', ['type' =>'text', 'default' => '', 'rows' => 3, 'maxlength' => 150]);
+ }
+
+ function validationDefault(Validator $validator)
+ {
+ $validator->setProvider('custom', 'App\Model\Validation\TransactionValidation');
+
+ $validator
+ ->add('memo', 'length', [
+ 'rule' => ['maxLength', 150],
+ 'message' => __('The memo should contain max 150 character')
+ ])
+ ->add('memo', 'custom', [
+ 'rule' => 'alphaNumeric',
+ 'provider' => 'custom',
+ //'message' => __('Only Alpha Numeric Character allowed')
+ 'message' => __('No HTML Tags like > or < please.')
+ ])
+ ->allowEmptyString('memo', null, 'create')
+ ->add('receiver_pubkey_hex', 'custom', [
+ 'rule' => 'hexKey64',
+ 'provider' => 'custom',
+ 'message' => 'a valid pubkey in hex format is required (64 character)'
+ ])
+ ->add('sender_privkey_hex', 'custom', [
+ 'rule' => 'hexKey128',
+ 'provider' => 'custom',
+ 'message' => 'a valid privkey in hex format is required (128 character)'
+ ])
+ ->add('sender_pubkey_hex', 'custom', [
+ 'rule' => 'hexKey64',
+ 'provider' => 'custom',
+ 'message' => 'a valid pubkey in hex format is required (64 character)'
+ ])
+ ->add('amount', 'custom', [
+ 'rule' => 'amount',
+ 'provider' => 'custom',
+ 'message' => __('Please give a valid positive number with maximal 2 decimal places')
+ ]);
+ return $validator;
+ }
+ /*
+ * $validator->add('title', 'custom', [
+ 'rule' => 'customRule',
+ 'provider' => 'custom',
+ 'message' => 'The title is not unique enough'
+]);
+ */
+
+ protected function _execute(array $data)
+ {
+ // Send an email.
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Form/UserSearchForm.php b/community_server/src/Form/UserSearchForm.php
new file mode 100644
index 000000000..e2955e244
--- /dev/null
+++ b/community_server/src/Form/UserSearchForm.php
@@ -0,0 +1,56 @@
+addField('search', ['type' => 'string']);
+ }
+
+ function validationDefault(Validator $validator)
+ {
+ $validator->setProvider('custom', 'App\Model\Validation\GenericValidation');
+ /*
+ $validator->add('receiver_pubkey_hex', 'length', [
+ 'rule' => ['length', 64],
+ 'message' => 'a valid pubkey in hex format is required (64 character)'
+ ])->add('receiver_pubkey_hex_select', 'length', [
+ 'rule' => ['length', 64],
+ 'message' => 'a valid pubkey in hex format is required (64 character)',
+ ]);
+*/
+ // TODO: add validation for used character to prevent hacking attempts
+ $validator->add('search', 'length', [
+ 'rule' => ['maxLength', 50],
+ 'message' => __('The search text should contain max 50 character')
+ ])
+ //->alphaNumeric('memo', __('Only Alpha Numeric Character allowed'))
+ ->add('search', 'custom', [
+ 'rule' => 'alphaNumeric',
+ 'provider' => 'custom',
+ //'message' => __('Only Alpha Numeric Character allowed')
+ 'message' => __('No HTML Tags like < or > please.')
+ ]);
+ return $validator;
+ }
+ /*
+ * $validator->add('title', 'custom', [
+ 'rule' => 'customRule',
+ 'provider' => 'custom',
+ 'message' => 'The title is not unique enough'
+]);
+ */
+
+ protected function _execute(array $data)
+ {
+ // Send an email.
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Locale/cake.pot b/community_server/src/Locale/cake.pot
new file mode 100644
index 000000000..7d317194e
--- /dev/null
+++ b/community_server/src/Locale/cake.pot
@@ -0,0 +1,29 @@
+# LANGUAGE translation of CakePHP Application
+# Copyright YEAR NAME
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"POT-Creation-Date: 2019-11-12 14:40+0000\n"
+"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
+"Last-Translator: NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: Template/Error/error400.ctp:36
+#: Template/Error/error500.ctp:41
+msgid "Error"
+msgstr ""
+
+#: Template/Error/error400.ctp:37
+msgid "The requested address {0} was not found on this server."
+msgstr ""
+
+#: Template/Error/error500.ctp:39
+msgid "An Internal Error Has Occurred"
+msgstr ""
+
diff --git a/community_server/src/Locale/de_DE/default.mo b/community_server/src/Locale/de_DE/default.mo
new file mode 100644
index 000000000..024e2f28d
Binary files /dev/null and b/community_server/src/Locale/de_DE/default.mo differ
diff --git a/community_server/src/Locale/de_DE/default.po b/community_server/src/Locale/de_DE/default.po
new file mode 100644
index 000000000..90d3c053d
--- /dev/null
+++ b/community_server/src/Locale/de_DE/default.po
@@ -0,0 +1,2223 @@
+# LANGUAGE translation of CakePHP Application
+# Copyright YEAR NAME
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"POT-Creation-Date: 2020-01-17 18:44+0000\n"
+"PO-Revision-Date: 2020-01-17 19:48+0100\n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.2.4\n"
+"Last-Translator: \n"
+"Language: de_DE\n"
+
+#: Controller/AddressTypesController.php:55
+#: Controller/AddressTypesController.php:79
+msgid "The address type has been saved."
+msgstr ""
+
+#: Controller/AddressTypesController.php:59
+#: Controller/AddressTypesController.php:83
+msgid "The address type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/AddressTypesController.php:100
+msgid "The address type has been deleted."
+msgstr ""
+
+#: Controller/AddressTypesController.php:102
+msgid "The address type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:57
+#: Controller/AdminErrorsController.php:82
+msgid "The admin error has been saved."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:61
+#: Controller/AdminErrorsController.php:86
+msgid "The admin error could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:104
+msgid "The admin error has been deleted."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:106
+msgid "The admin error could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/AppController.php:196
+msgid "error updating state user "
+msgstr ""
+
+#: Controller/AppController.php:212
+msgid "error saving state user "
+msgstr ""
+
+#: Controller/AppController.php:220
+msgid "invalid session"
+msgstr ""
+
+#: Controller/AppController.php:227
+#: Controller/TransactionSendCoinsController.php:222
+msgid "error http request: "
+msgstr ""
+
+#: Controller/AppController.php:264
+msgid "Serious error, couldn't save to db, please write the admin: "
+msgstr ""
+
+#: Controller/OperatorTypesController.php:54
+#: Controller/OperatorTypesController.php:78
+msgid "The operator type has been saved."
+msgstr ""
+
+#: Controller/OperatorTypesController.php:58
+#: Controller/OperatorTypesController.php:82
+msgid "The operator type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/OperatorTypesController.php:99
+msgid "The operator type has been deleted."
+msgstr ""
+
+#: Controller/OperatorTypesController.php:101
+msgid "The operator type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/OperatorsController.php:182
+#: Controller/OperatorsController.php:207
+msgid "The operator has been saved."
+msgstr ""
+
+#: Controller/OperatorsController.php:186
+#: Controller/OperatorsController.php:211
+msgid "The operator could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/OperatorsController.php:229
+msgid "The operator has been deleted."
+msgstr ""
+
+#: Controller/OperatorsController.php:231
+msgid "The operator could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/ServerUsersController.php:42
+msgid "Invalid username or password, try again"
+msgstr ""
+
+#: Controller/ServerUsersController.php:78
+#: Controller/ServerUsersController.php:102
+msgid "The server user has been saved."
+msgstr ""
+
+#: Controller/ServerUsersController.php:82
+#: Controller/ServerUsersController.php:106
+msgid "The server user could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/ServerUsersController.php:123
+msgid "The server user has been deleted."
+msgstr ""
+
+#: Controller/ServerUsersController.php:125
+msgid "The server user could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateBalancesController.php:175
+#: Controller/StateBalancesController.php:200
+msgid "The state balance has been saved."
+msgstr ""
+
+#: Controller/StateBalancesController.php:179
+#: Controller/StateBalancesController.php:204
+msgid "The state balance could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateBalancesController.php:222
+msgid "The state balance has been deleted."
+msgstr ""
+
+#: Controller/StateBalancesController.php:224
+msgid "The state balance could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateCreatedController.php:57
+#: Controller/StateCreatedController.php:83
+msgid "The state created has been saved."
+msgstr ""
+
+#: Controller/StateCreatedController.php:61
+#: Controller/StateCreatedController.php:87
+msgid "The state created could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateCreatedController.php:106
+msgid "The state created has been deleted."
+msgstr ""
+
+#: Controller/StateCreatedController.php:108
+msgid "The state created could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateErrorsController.php:66
+msgid "Error belongs to another User, cannot delete"
+msgstr ""
+
+#: Controller/StateErrorsController.php:69
+#: Controller/StateErrorsController.php:157
+msgid "The state error has been deleted."
+msgstr ""
+
+#: Controller/StateErrorsController.php:71
+#: Controller/StateErrorsController.php:159
+msgid "The state error could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateErrorsController.php:108
+#: Controller/StateErrorsController.php:134
+msgid "The state error has been saved."
+msgstr ""
+
+#: Controller/StateErrorsController.php:112
+#: Controller/StateErrorsController.php:138
+msgid "The state error could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:57
+#: Controller/StateGroupAddressesController.php:83
+msgid "The state group address has been saved."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:61
+#: Controller/StateGroupAddressesController.php:87
+msgid "The state group address could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:106
+msgid "The state group address has been deleted."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:108
+msgid "The state group address could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:57
+#: Controller/StateGroupRelationshipsController.php:84
+msgid "The state group relationship has been saved."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:61
+#: Controller/StateGroupRelationshipsController.php:88
+msgid "The state group relationship could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:108
+msgid "The state group relationship has been deleted."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:110
+msgid "The state group relationship could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupsController.php:57
+#: Controller/StateGroupsController.php:82
+msgid "The state group has been saved."
+msgstr ""
+
+#: Controller/StateGroupsController.php:61
+#: Controller/StateGroupsController.php:86
+msgid "The state group could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupsController.php:104
+msgid "The state group has been deleted."
+msgstr ""
+
+#: Controller/StateGroupsController.php:106
+msgid "The state group could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:54
+#: Controller/StateRelationshipTypesController.php:78
+msgid "The state relationship type has been saved."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:58
+#: Controller/StateRelationshipTypesController.php:82
+msgid "The state relationship type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:99
+msgid "The state relationship type has been deleted."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:101
+msgid "The state relationship type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateUsersController.php:13
+msgid "account created"
+msgstr "Konto angelegt"
+
+#: Controller/StateUsersController.php:14
+msgid "account not on login-server"
+msgstr "Konto nicht auf Login-Server"
+
+#: Controller/StateUsersController.php:15
+msgid "email activated"
+msgstr "Konto aktiviert"
+
+#: Controller/StateUsersController.php:16
+msgid "account copied to community"
+msgstr "Konto kopiert nach Community-Server"
+
+#: Controller/StateUsersController.php:17
+msgid "email not activated"
+msgstr "Konto nicht aktiviert"
+
+#: Controller/StateUsersController.php:18
+msgid "account multiple times on login-server"
+msgstr "Konto mehrfach vorhanden"
+
+#: Controller/StateUsersController.php:19
+msgid "account not on community server"
+msgstr "Konto nicht auf Community-Server"
+
+#: Controller/StateUsersController.php:20
+msgid "no keys"
+msgstr "Keine Schlüssel generiert"
+
+#: Controller/StateUsersController.php:209
+#: Controller/TransactionCreationsController.php:174
+#: Controller/TransactionSendCoinsController.php:231
+msgid "Something was invalid, please try again!"
+msgstr ""
+
+#: Controller/StateUsersController.php:244
+#: Controller/StateUsersController.php:270
+msgid "The state user has been saved."
+msgstr ""
+
+#: Controller/StateUsersController.php:248
+#: Controller/StateUsersController.php:274
+msgid "The state user could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateUsersController.php:293
+msgid "The state user has been deleted."
+msgstr ""
+
+#: Controller/StateUsersController.php:295
+msgid "The state user could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:139
+#: Controller/TransactionCreationsController.php:326
+msgid "Error by requesting LoginServer, please try again"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:141
+#: Controller/TransactionCreationsController.php:328
+msgid "Error, please wait for the admin to fix it"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:151
+#: Controller/TransactionCreationsController.php:338
+msgid "Login Server Error, please wait for the admin to fix it"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:165
+#: Controller/TransactionCreationsController.php:352
+#: Controller/TransactionSendCoinsController.php:216
+msgid "Transaction submitted for review."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:170
+msgid "Building transaction failed"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:262
+msgid "No user selected"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:373
+#: Controller/TransactionCreationsController.php:399
+msgid "The transaction creation has been saved."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:377
+#: Controller/TransactionCreationsController.php:403
+msgid "The transaction creation could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:422
+msgid "The transaction creation has been deleted."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:424
+msgid "The transaction creation could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:57
+#: Controller/TransactionGroupAddaddressController.php:83
+msgid "The transaction group addaddres has been saved."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:61
+#: Controller/TransactionGroupAddaddressController.php:87
+msgid "The transaction group addaddres could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:106
+msgid "The transaction group addaddres has been deleted."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:108
+msgid ""
+"The transaction group addaddres could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:57
+#: Controller/TransactionGroupAllowtradesController.php:83
+msgid "The transaction group allowtrade has been saved."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:61
+#: Controller/TransactionGroupAllowtradesController.php:87
+msgid "The transaction group allowtrade could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:106
+msgid "The transaction group allowtrade has been deleted."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:108
+msgid ""
+"The transaction group allowtrade could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:57
+#: Controller/TransactionGroupCreatesController.php:83
+msgid "The transaction group create has been saved."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:61
+#: Controller/TransactionGroupCreatesController.php:87
+msgid "The transaction group create could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:106
+msgid "The transaction group create has been deleted."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:108
+msgid "The transaction group create could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:73
+#: Controller/TransactionSendCoinsController.php:100
+msgid "The transaction send coin has been saved."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:77
+#: Controller/TransactionSendCoinsController.php:104
+msgid "The transaction send coin could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:145
+msgid "Du hast nicht genug Geld!"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:151
+msgid "Du kannst dir leider nicht selbst Geld schicken!"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:163
+msgid ""
+"Diese E-Mail ist mir nicht bekannt, hat dein Empfänger denn schon ein "
+"Gradido-Konto?"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:202
+msgid "login server return error: "
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:226
+msgid "No Valid Receiver Public given"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:250
+msgid "The transaction send coin has been deleted."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:252
+msgid "The transaction send coin could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:57
+#: Controller/TransactionSignaturesController.php:82
+msgid "The transaction signature has been saved."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:61
+#: Controller/TransactionSignaturesController.php:86
+msgid "The transaction signature could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:104
+msgid "The transaction signature has been deleted."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:106
+msgid "The transaction signature could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:54
+#: Controller/TransactionTypesController.php:78
+msgid "The transaction type has been saved."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:58
+#: Controller/TransactionTypesController.php:82
+msgid "The transaction type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:99
+msgid "The transaction type has been deleted."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:101
+msgid "The transaction type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionsController.php:63
+msgid "No valid data given, please try again."
+msgstr ""
+
+#: Controller/TransactionsController.php:101
+#: Controller/TransactionsController.php:127
+msgid "The transaction has been saved."
+msgstr ""
+
+#: Controller/TransactionsController.php:105
+#: Controller/TransactionsController.php:131
+msgid "The transaction could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionsController.php:150
+msgid "The transaction has been deleted."
+msgstr ""
+
+#: Controller/TransactionsController.php:152
+msgid "The transaction could not be deleted. Please, try again."
+msgstr ""
+
+#: Form/CreationForm.php:43 Form/TransferForm.php:46
+msgid "No HTML Tags like > or < please."
+msgstr ""
+
+#: Form/CreationForm.php:55
+msgid "Please give a valid number with maximal 2 decimal places"
+msgstr ""
+
+#: Form/TransferForm.php:35
+msgid "A valid email address is required"
+msgstr ""
+
+#: Form/TransferForm.php:39
+msgid "The memo should contain max 150 character"
+msgstr ""
+
+#: Form/TransferForm.php:58
+msgid "Please give a valid positive number with maximal 2 decimal places"
+msgstr ""
+
+#: Form/UserSearchForm.php:32
+msgid "The search text should contain max 50 character"
+msgstr ""
+
+#: Form/UserSearchForm.php:39
+msgid "No HTML Tags like < or > please."
+msgstr ""
+
+#: Model/Table/ServerUsersTable.php:58
+msgid "Please give a username"
+msgstr ""
+
+#: Model/Table/ServerUsersTable.php:64
+msgid "Please give a password"
+msgstr ""
+
+#: Model/Table/ServerUsersTable.php:69
+msgid "Please give a email"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:9 Template/AddressTypes/edit.ctp:9
+#: Template/AddressTypes/index.ctp:9 Template/AddressTypes/index.ctp:25
+#: Template/AddressTypes/view.ctp:9 Template/AddressTypes/view.ctp:45
+#: Template/AddressTypes/view.ctp:72 Template/AdminErrors/add.ctp:9
+#: Template/AdminErrors/edit.ctp:9 Template/AdminErrors/index.ctp:9
+#: Template/AdminErrors/index.ctp:28 Template/AdminErrors/view.ctp:9
+#: Template/OperatorTypes/add.ctp:9 Template/OperatorTypes/edit.ctp:9
+#: Template/OperatorTypes/index.ctp:9 Template/OperatorTypes/index.ctp:23
+#: Template/OperatorTypes/view.ctp:9 Template/OperatorTypes/view.ctp:43
+#: Template/Operators/add.ctp:9 Template/Operators/edit.ctp:9
+#: Template/Operators/index.ctp:9 Template/Operators/index.ctp:24
+#: Template/Operators/view.ctp:9 Template/ServerUsers/add.ctp:9
+#: Template/ServerUsers/edit.ctp:9 Template/ServerUsers/index.ctp:9
+#: Template/ServerUsers/index.ctp:26 Template/ServerUsers/view.ctp:9
+#: Template/StateBalances/add.ctp:9 Template/StateBalances/edit.ctp:9
+#: Template/StateBalances/index.ctp:9 Template/StateBalances/index.ctp:24
+#: Template/StateBalances/view.ctp:9 Template/StateCreated/add.ctp:9
+#: Template/StateCreated/edit.ctp:9 Template/StateCreated/index.ctp:9
+#: Template/StateCreated/index.ctp:29 Template/StateCreated/view.ctp:9
+#: Template/StateErrors/add.ctp:9 Template/StateErrors/edit.ctp:9
+#: Template/StateErrors/index.ctp:9 Template/StateErrors/index.ctp:26
+#: Template/StateErrors/view.ctp:9 Template/StateGroupAddresses/add.ctp:9
+#: Template/StateGroupAddresses/edit.ctp:9
+#: Template/StateGroupAddresses/index.ctp:9
+#: Template/StateGroupAddresses/index.ctp:25
+#: Template/StateGroupAddresses/view.ctp:9
+#: Template/StateGroupRelationships/add.ctp:9
+#: Template/StateGroupRelationships/edit.ctp:9
+#: Template/StateGroupRelationships/index.ctp:9
+#: Template/StateGroupRelationships/index.ctp:22
+#: Template/StateGroupRelationships/view.ctp:9 Template/StateGroups/add.ctp:9
+#: Template/StateGroups/edit.ctp:9 Template/StateGroups/index.ctp:9
+#: Template/StateGroups/index.ctp:29 Template/StateGroups/view.ctp:9
+#: Template/StateGroups/view.ctp:49 Template/StateGroups/view.ctp:76
+#: Template/StateGroups/view.ctp:104 Template/StateGroups/view.ctp:133
+#: Template/StateRelationshipTypes/add.ctp:9
+#: Template/StateRelationshipTypes/edit.ctp:9
+#: Template/StateRelationshipTypes/index.ctp:9
+#: Template/StateRelationshipTypes/index.ctp:21
+#: Template/StateRelationshipTypes/view.ctp:9 Template/StateUsers/add.ctp:9
+#: Template/StateUsers/edit.ctp:9 Template/StateUsers/index.ctp:9
+#: Template/StateUsers/index.ctp:34 Template/StateUsers/view.ctp:9
+#: Template/StateUsers/view.ctp:51 Template/StateUsers/view.ctp:81
+#: Template/StateUsers/view.ctp:112 Template/StateUsers/view.ctp:143
+#: Template/TransactionCreations/add.ctp:9
+#: Template/TransactionCreations/edit.ctp:9
+#: Template/TransactionCreations/index.ctp:9
+#: Template/TransactionCreations/index.ctp:26
+#: Template/TransactionCreations/view.ctp:9
+#: Template/TransactionGroupAddaddress/add.ctp:9
+#: Template/TransactionGroupAddaddress/edit.ctp:9
+#: Template/TransactionGroupAddaddress/index.ctp:9
+#: Template/TransactionGroupAddaddress/index.ctp:25
+#: Template/TransactionGroupAddaddress/view.ctp:9
+#: Template/TransactionGroupAllowtrades/add.ctp:9
+#: Template/TransactionGroupAllowtrades/edit.ctp:9
+#: Template/TransactionGroupAllowtrades/index.ctp:9
+#: Template/TransactionGroupAllowtrades/index.ctp:24
+#: Template/TransactionGroupAllowtrades/view.ctp:9
+#: Template/TransactionGroupCreates/add.ctp:9
+#: Template/TransactionGroupCreates/edit.ctp:9
+#: Template/TransactionGroupCreates/index.ctp:9
+#: Template/TransactionGroupCreates/index.ctp:26
+#: Template/TransactionGroupCreates/view.ctp:9
+#: Template/TransactionSendCoins/add.ctp:9
+#: Template/TransactionSendCoins/edit.ctp:9
+#: Template/TransactionSendCoins/index.ctp:9
+#: Template/TransactionSendCoins/index.ctp:27
+#: Template/TransactionSendCoins/view.ctp:9
+#: Template/TransactionSignatures/add.ctp:9
+#: Template/TransactionSignatures/edit.ctp:9
+#: Template/TransactionSignatures/index.ctp:9
+#: Template/TransactionSignatures/index.ctp:22
+#: Template/TransactionSignatures/view.ctp:9
+#: Template/TransactionTypes/add.ctp:9 Template/TransactionTypes/edit.ctp:9
+#: Template/TransactionTypes/index.ctp:9 Template/TransactionTypes/index.ctp:23
+#: Template/TransactionTypes/view.ctp:9 Template/TransactionTypes/view.ctp:44
+#: Template/Transactions/add.ctp:9 Template/Transactions/edit.ctp:9
+#: Template/Transactions/index.ctp:9 Template/Transactions/index.ctp:40
+#: Template/Transactions/view.ctp:9 Template/Transactions/view.ctp:66
+#: Template/Transactions/view.ctp:97 Template/Transactions/view.ctp:125
+#: Template/Transactions/view.ctp:152 Template/Transactions/view.ctp:180
+#: Template/Transactions/view.ctp:211 Template/Transactions/view.ctp:241
+msgid "Actions"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:10 Template/AddressTypes/edit.ctp:16
+#: Template/AddressTypes/view.ctp:12 Template/StateGroupAddresses/add.ctp:13
+#: Template/StateGroupAddresses/edit.ctp:19
+#: Template/StateGroupAddresses/index.ctp:13
+#: Template/StateGroupAddresses/view.ctp:16
+#: Template/TransactionGroupAddaddress/add.ctp:13
+#: Template/TransactionGroupAddaddress/edit.ctp:19
+#: Template/TransactionGroupAddaddress/index.ctp:13
+#: Template/TransactionGroupAddaddress/view.ctp:16
+msgid "List Address Types"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:11 Template/AddressTypes/edit.ctp:17
+#: Template/AddressTypes/index.ctp:11 Template/AddressTypes/view.ctp:14
+#: Template/StateGroupAddresses/add.ctp:10
+#: Template/StateGroupAddresses/edit.ctp:16
+#: Template/StateGroupAddresses/view.ctp:12 Template/StateGroups/add.ctp:11
+#: Template/StateGroups/edit.ctp:17 Template/StateGroups/index.ctp:11
+#: Template/StateGroups/view.ctp:14
+msgid "List State Group Addresses"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:12 Template/AddressTypes/edit.ctp:18
+#: Template/AddressTypes/index.ctp:12 Template/AddressTypes/view.ctp:15
+#: Template/StateGroupAddresses/index.ctp:10
+#: Template/StateGroupAddresses/view.ctp:13 Template/StateGroups/add.ctp:12
+#: Template/StateGroups/edit.ctp:18 Template/StateGroups/index.ctp:12
+#: Template/StateGroups/view.ctp:15
+msgid "New State Group Address"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:13 Template/AddressTypes/edit.ctp:19
+#: Template/AddressTypes/index.ctp:13 Template/AddressTypes/view.ctp:16
+#: Template/TransactionGroupAddaddress/add.ctp:10
+#: Template/TransactionGroupAddaddress/edit.ctp:16
+#: Template/TransactionGroupAddaddress/view.ctp:12
+#: Template/Transactions/add.ctp:19 Template/Transactions/edit.ctp:25
+#: Template/Transactions/index.ctp:19 Template/Transactions/view.ctp:22
+msgid "List Transaction Group Addaddress"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:14 Template/AddressTypes/edit.ctp:20
+#: Template/AddressTypes/index.ctp:14 Template/AddressTypes/view.ctp:17
+#: Template/TransactionGroupAddaddress/index.ctp:10
+#: Template/TransactionGroupAddaddress/view.ctp:13
+#: Template/Transactions/add.ctp:20 Template/Transactions/edit.ctp:26
+#: Template/Transactions/index.ctp:20 Template/Transactions/view.ctp:23
+msgid "New Transaction Group Addaddres"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:20
+msgid "Add Address Type"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:26 Template/AddressTypes/edit.ctp:32
+#: Template/AdminErrors/add.ctp:28 Template/AdminErrors/edit.ctp:34
+#: Template/OperatorTypes/add.ctp:24 Template/OperatorTypes/edit.ctp:30
+#: Template/Operators/add.ctp:24 Template/Operators/edit.ctp:30
+#: Template/ServerUsers/add.ctp:24 Template/ServerUsers/edit.ctp:32
+#: Template/StateBalances/add.ctp:24 Template/StateBalances/edit.ctp:30
+#: Template/StateCreated/add.ctp:29 Template/StateCreated/edit.ctp:35
+#: Template/StateErrors/add.ctp:27 Template/StateErrors/edit.ctp:33
+#: Template/StateGroupAddresses/add.ctp:26
+#: Template/StateGroupAddresses/edit.ctp:32
+#: Template/StateGroupRelationships/add.ctp:23
+#: Template/StateGroupRelationships/edit.ctp:29 Template/StateGroups/add.ctp:30
+#: Template/StateGroups/edit.ctp:36 Template/StateRelationshipTypes/add.ctp:22
+#: Template/StateRelationshipTypes/edit.ctp:28 Template/StateUsers/add.ctp:32
+#: Template/StateUsers/edit.ctp:38 Template/TransactionCreations/add.ctp:27
+#: Template/TransactionCreations/edit.ctp:33
+#: Template/TransactionGroupAddaddress/add.ctp:26
+#: Template/TransactionGroupAddaddress/edit.ctp:32
+#: Template/TransactionGroupAllowtrades/add.ctp:25
+#: Template/TransactionGroupAllowtrades/edit.ctp:31
+#: Template/TransactionGroupCreates/add.ctp:27
+#: Template/TransactionGroupCreates/edit.ctp:33
+#: Template/TransactionSendCoins/add.ctp:28
+#: Template/TransactionSendCoins/edit.ctp:34
+#: Template/TransactionSignatures/add.ctp:23
+#: Template/TransactionSignatures/edit.ctp:29
+#: Template/TransactionTypes/add.ctp:24 Template/TransactionTypes/edit.ctp:30
+#: Template/Transactions/add.ctp:41 Template/Transactions/edit.ctp:47
+msgid "Submit"
+msgstr ""
+
+#: Template/AddressTypes/edit.ctp:11 Template/AddressTypes/index.ctp:37
+#: Template/AddressTypes/view.ctp:56 Template/AddressTypes/view.ctp:83
+#: Template/AdminErrors/edit.ctp:11 Template/AdminErrors/index.ctp:45
+#: Template/OperatorTypes/edit.ctp:11 Template/OperatorTypes/index.ctp:35
+#: Template/OperatorTypes/view.ctp:54 Template/Operators/edit.ctp:11
+#: Template/Operators/index.ctp:40 Template/ServerUsers/edit.ctp:11
+#: Template/ServerUsers/index.ctp:43 Template/StateBalances/edit.ctp:11
+#: Template/StateBalances/index.ctp:37 Template/StateCreated/edit.ctp:11
+#: Template/StateCreated/index.ctp:45 Template/StateErrors/edit.ctp:11
+#: Template/StateErrors/index.ctp:39 Template/StateErrors/show_for_user.ctp:43
+#: Template/StateGroupAddresses/edit.ctp:11
+#: Template/StateGroupAddresses/index.ctp:37
+#: Template/StateGroupRelationships/edit.ctp:11
+#: Template/StateGroupRelationships/index.ctp:35
+#: Template/StateGroups/edit.ctp:11 Template/StateGroups/index.ctp:41
+#: Template/StateGroups/view.ctp:60 Template/StateGroups/view.ctp:87
+#: Template/StateGroups/view.ctp:116 Template/StateGroups/view.ctp:145
+#: Template/StateRelationshipTypes/edit.ctp:11
+#: Template/StateRelationshipTypes/index.ctp:33 Template/StateUsers/edit.ctp:11
+#: Template/StateUsers/index.ctp:49 Template/StateUsers/view.ctp:62
+#: Template/StateUsers/view.ctp:95 Template/StateUsers/view.ctp:124
+#: Template/StateUsers/view.ctp:157 Template/TransactionCreations/edit.ctp:11
+#: Template/TransactionCreations/index.ctp:39
+#: Template/TransactionGroupAddaddress/edit.ctp:11
+#: Template/TransactionGroupAddaddress/index.ctp:37
+#: Template/TransactionGroupAllowtrades/edit.ctp:11
+#: Template/TransactionGroupAllowtrades/index.ctp:37
+#: Template/TransactionGroupCreates/edit.ctp:11
+#: Template/TransactionGroupCreates/index.ctp:39
+#: Template/TransactionSendCoins/edit.ctp:11
+#: Template/TransactionSendCoins/index.ctp:41
+#: Template/TransactionSignatures/edit.ctp:11
+#: Template/TransactionSignatures/index.ctp:33
+#: Template/TransactionTypes/edit.ctp:11 Template/TransactionTypes/index.ctp:35
+#: Template/TransactionTypes/view.ctp:56 Template/Transactions/edit.ctp:11
+#: Template/Transactions/index.ctp:53 Template/Transactions/view.ctp:80
+#: Template/Transactions/view.ctp:109 Template/Transactions/view.ctp:136
+#: Template/Transactions/view.ctp:163 Template/Transactions/view.ctp:192
+#: Template/Transactions/view.ctp:225 Template/Transactions/view.ctp:252
+msgid "Delete"
+msgstr ""
+
+#: Template/AddressTypes/edit.ctp:13 Template/AddressTypes/index.ctp:37
+#: Template/AddressTypes/view.ctp:11 Template/AddressTypes/view.ctp:56
+#: Template/AddressTypes/view.ctp:83 Template/AdminErrors/edit.ctp:13
+#: Template/AdminErrors/index.ctp:45 Template/AdminErrors/view.ctp:11
+#: Template/OperatorTypes/edit.ctp:13 Template/OperatorTypes/index.ctp:35
+#: Template/OperatorTypes/view.ctp:11 Template/OperatorTypes/view.ctp:54
+#: Template/Operators/edit.ctp:13 Template/Operators/index.ctp:40
+#: Template/Operators/view.ctp:11 Template/ServerUsers/edit.ctp:13
+#: Template/ServerUsers/index.ctp:43 Template/ServerUsers/view.ctp:11
+#: Template/StateBalances/edit.ctp:13 Template/StateBalances/index.ctp:37
+#: Template/StateBalances/view.ctp:11 Template/StateCreated/edit.ctp:13
+#: Template/StateCreated/index.ctp:45 Template/StateCreated/view.ctp:11
+#: Template/StateErrors/edit.ctp:13 Template/StateErrors/index.ctp:39
+#: Template/StateErrors/view.ctp:11 Template/StateGroupAddresses/edit.ctp:13
+#: Template/StateGroupAddresses/index.ctp:37
+#: Template/StateGroupAddresses/view.ctp:11
+#: Template/StateGroupRelationships/edit.ctp:13
+#: Template/StateGroupRelationships/index.ctp:35
+#: Template/StateGroupRelationships/view.ctp:11
+#: Template/StateGroups/edit.ctp:13 Template/StateGroups/index.ctp:41
+#: Template/StateGroups/view.ctp:11 Template/StateGroups/view.ctp:60
+#: Template/StateGroups/view.ctp:87 Template/StateGroups/view.ctp:116
+#: Template/StateGroups/view.ctp:145
+#: Template/StateRelationshipTypes/edit.ctp:13
+#: Template/StateRelationshipTypes/index.ctp:33
+#: Template/StateRelationshipTypes/view.ctp:11 Template/StateUsers/edit.ctp:13
+#: Template/StateUsers/index.ctp:49 Template/StateUsers/view.ctp:11
+#: Template/StateUsers/view.ctp:62 Template/StateUsers/view.ctp:95
+#: Template/StateUsers/view.ctp:124 Template/StateUsers/view.ctp:157
+#: Template/TransactionCreations/edit.ctp:13
+#: Template/TransactionCreations/index.ctp:39
+#: Template/TransactionCreations/view.ctp:11
+#: Template/TransactionGroupAddaddress/edit.ctp:13
+#: Template/TransactionGroupAddaddress/index.ctp:37
+#: Template/TransactionGroupAddaddress/view.ctp:11
+#: Template/TransactionGroupAllowtrades/edit.ctp:13
+#: Template/TransactionGroupAllowtrades/index.ctp:37
+#: Template/TransactionGroupAllowtrades/view.ctp:11
+#: Template/TransactionGroupCreates/edit.ctp:13
+#: Template/TransactionGroupCreates/index.ctp:39
+#: Template/TransactionGroupCreates/view.ctp:11
+#: Template/TransactionSendCoins/edit.ctp:13
+#: Template/TransactionSendCoins/index.ctp:41
+#: Template/TransactionSendCoins/view.ctp:11
+#: Template/TransactionSignatures/edit.ctp:13
+#: Template/TransactionSignatures/index.ctp:33
+#: Template/TransactionSignatures/view.ctp:11
+#: Template/TransactionTypes/edit.ctp:13 Template/TransactionTypes/index.ctp:35
+#: Template/TransactionTypes/view.ctp:11 Template/TransactionTypes/view.ctp:56
+#: Template/Transactions/edit.ctp:13 Template/Transactions/index.ctp:53
+#: Template/Transactions/view.ctp:11 Template/Transactions/view.ctp:80
+#: Template/Transactions/view.ctp:109 Template/Transactions/view.ctp:136
+#: Template/Transactions/view.ctp:163 Template/Transactions/view.ctp:192
+#: Template/Transactions/view.ctp:225 Template/Transactions/view.ctp:252
+msgid "Are you sure you want to delete # {0}?"
+msgstr ""
+
+#: Template/AddressTypes/edit.ctp:26 Template/AddressTypes/view.ctp:10
+msgid "Edit Address Type"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:10 Template/AddressTypes/view.ctp:13
+#: Template/StateGroupAddresses/add.ctp:14
+#: Template/StateGroupAddresses/edit.ctp:20
+#: Template/StateGroupAddresses/index.ctp:14
+#: Template/StateGroupAddresses/view.ctp:17
+#: Template/TransactionGroupAddaddress/add.ctp:14
+#: Template/TransactionGroupAddaddress/edit.ctp:20
+#: Template/TransactionGroupAddaddress/index.ctp:14
+#: Template/TransactionGroupAddaddress/view.ctp:17
+msgid "New Address Type"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:18
+msgid "Address Types"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:35 Template/AddressTypes/view.ctp:54
+#: Template/AddressTypes/view.ctp:81 Template/AdminErrors/index.ctp:43
+#: Template/OperatorTypes/index.ctp:33 Template/OperatorTypes/view.ctp:52
+#: Template/Operators/index.ctp:38 Template/ServerUsers/index.ctp:41
+#: Template/StateBalances/index.ctp:35 Template/StateCreated/index.ctp:43
+#: Template/StateErrors/index.ctp:37 Template/StateGroupAddresses/index.ctp:35
+#: Template/StateGroupRelationships/index.ctp:33
+#: Template/StateGroups/index.ctp:39 Template/StateGroups/view.ctp:58
+#: Template/StateGroups/view.ctp:85 Template/StateGroups/view.ctp:114
+#: Template/StateGroups/view.ctp:143
+#: Template/StateRelationshipTypes/index.ctp:31
+#: Template/StateUsers/index.ctp:47 Template/StateUsers/view.ctp:60
+#: Template/StateUsers/view.ctp:93 Template/StateUsers/view.ctp:122
+#: Template/StateUsers/view.ctp:155 Template/TransactionCreations/index.ctp:37
+#: Template/TransactionGroupAddaddress/index.ctp:35
+#: Template/TransactionGroupAllowtrades/index.ctp:35
+#: Template/TransactionGroupCreates/index.ctp:37
+#: Template/TransactionSendCoins/index.ctp:39
+#: Template/TransactionSignatures/index.ctp:31
+#: Template/TransactionTypes/index.ctp:33 Template/TransactionTypes/view.ctp:54
+#: Template/Transactions/index.ctp:51 Template/Transactions/view.ctp:78
+#: Template/Transactions/view.ctp:107 Template/Transactions/view.ctp:134
+#: Template/Transactions/view.ctp:161 Template/Transactions/view.ctp:190
+#: Template/Transactions/view.ctp:223 Template/Transactions/view.ctp:250
+msgid "View"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:36 Template/AddressTypes/view.ctp:55
+#: Template/AddressTypes/view.ctp:82 Template/AdminErrors/index.ctp:44
+#: Template/OperatorTypes/index.ctp:34 Template/OperatorTypes/view.ctp:53
+#: Template/Operators/index.ctp:39 Template/ServerUsers/index.ctp:42
+#: Template/StateBalances/index.ctp:36 Template/StateCreated/index.ctp:44
+#: Template/StateErrors/index.ctp:38 Template/StateGroupAddresses/index.ctp:36
+#: Template/StateGroupRelationships/index.ctp:34
+#: Template/StateGroups/index.ctp:40 Template/StateGroups/view.ctp:59
+#: Template/StateGroups/view.ctp:86 Template/StateGroups/view.ctp:115
+#: Template/StateGroups/view.ctp:144
+#: Template/StateRelationshipTypes/index.ctp:32
+#: Template/StateUsers/index.ctp:48 Template/StateUsers/view.ctp:61
+#: Template/StateUsers/view.ctp:94 Template/StateUsers/view.ctp:123
+#: Template/StateUsers/view.ctp:156 Template/TransactionCreations/index.ctp:38
+#: Template/TransactionGroupAddaddress/index.ctp:36
+#: Template/TransactionGroupAllowtrades/index.ctp:36
+#: Template/TransactionGroupCreates/index.ctp:38
+#: Template/TransactionSendCoins/index.ctp:40
+#: Template/TransactionSignatures/index.ctp:32
+#: Template/TransactionTypes/index.ctp:34 Template/TransactionTypes/view.ctp:55
+#: Template/Transactions/index.ctp:52 Template/Transactions/view.ctp:79
+#: Template/Transactions/view.ctp:108 Template/Transactions/view.ctp:135
+#: Template/Transactions/view.ctp:162 Template/Transactions/view.ctp:191
+#: Template/Transactions/view.ctp:224 Template/Transactions/view.ctp:251
+msgid "Edit"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:45 Template/AdminErrors/index.ctp:53
+#: Template/OperatorTypes/index.ctp:43 Template/Operators/index.ctp:48
+#: Template/ServerUsers/index.ctp:51 Template/StateBalances/index.ctp:45
+#: Template/StateCreated/index.ctp:53 Template/StateErrors/index.ctp:47
+#: Template/StateGroupAddresses/index.ctp:45
+#: Template/StateGroupRelationships/index.ctp:43
+#: Template/StateGroups/index.ctp:49
+#: Template/StateRelationshipTypes/index.ctp:41
+#: Template/StateUsers/index.ctp:57 Template/TransactionCreations/index.ctp:47
+#: Template/TransactionGroupAddaddress/index.ctp:45
+#: Template/TransactionGroupAllowtrades/index.ctp:45
+#: Template/TransactionGroupCreates/index.ctp:47
+#: Template/TransactionSendCoins/index.ctp:49
+#: Template/TransactionSignatures/index.ctp:41
+#: Template/TransactionTypes/index.ctp:43 Template/Transactions/index.ctp:61
+msgid "first"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:46 Template/AdminErrors/index.ctp:54
+#: Template/OperatorTypes/index.ctp:44 Template/Operators/index.ctp:49
+#: Template/ServerUsers/index.ctp:52 Template/StateBalances/index.ctp:46
+#: Template/StateCreated/index.ctp:54 Template/StateErrors/index.ctp:48
+#: Template/StateGroupAddresses/index.ctp:46
+#: Template/StateGroupRelationships/index.ctp:44
+#: Template/StateGroups/index.ctp:50
+#: Template/StateRelationshipTypes/index.ctp:42
+#: Template/StateUsers/index.ctp:58 Template/TransactionCreations/index.ctp:48
+#: Template/TransactionGroupAddaddress/index.ctp:46
+#: Template/TransactionGroupAllowtrades/index.ctp:46
+#: Template/TransactionGroupCreates/index.ctp:48
+#: Template/TransactionSendCoins/index.ctp:50
+#: Template/TransactionSignatures/index.ctp:42
+#: Template/TransactionTypes/index.ctp:44 Template/Transactions/index.ctp:62
+msgid "previous"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:48 Template/AdminErrors/index.ctp:56
+#: Template/OperatorTypes/index.ctp:46 Template/Operators/index.ctp:51
+#: Template/ServerUsers/index.ctp:54 Template/StateBalances/index.ctp:48
+#: Template/StateCreated/index.ctp:56 Template/StateErrors/index.ctp:50
+#: Template/StateGroupAddresses/index.ctp:48
+#: Template/StateGroupRelationships/index.ctp:46
+#: Template/StateGroups/index.ctp:52
+#: Template/StateRelationshipTypes/index.ctp:44
+#: Template/StateUsers/index.ctp:60 Template/TransactionCreations/index.ctp:50
+#: Template/TransactionGroupAddaddress/index.ctp:48
+#: Template/TransactionGroupAllowtrades/index.ctp:48
+#: Template/TransactionGroupCreates/index.ctp:50
+#: Template/TransactionSendCoins/index.ctp:52
+#: Template/TransactionSignatures/index.ctp:44
+#: Template/TransactionTypes/index.ctp:46 Template/Transactions/index.ctp:64
+msgid "next"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:49 Template/AdminErrors/index.ctp:57
+#: Template/OperatorTypes/index.ctp:47 Template/Operators/index.ctp:52
+#: Template/ServerUsers/index.ctp:55 Template/StateBalances/index.ctp:49
+#: Template/StateCreated/index.ctp:57 Template/StateErrors/index.ctp:51
+#: Template/StateGroupAddresses/index.ctp:49
+#: Template/StateGroupRelationships/index.ctp:47
+#: Template/StateGroups/index.ctp:53
+#: Template/StateRelationshipTypes/index.ctp:45
+#: Template/StateUsers/index.ctp:61 Template/TransactionCreations/index.ctp:51
+#: Template/TransactionGroupAddaddress/index.ctp:49
+#: Template/TransactionGroupAllowtrades/index.ctp:49
+#: Template/TransactionGroupCreates/index.ctp:51
+#: Template/TransactionSendCoins/index.ctp:53
+#: Template/TransactionSignatures/index.ctp:45
+#: Template/TransactionTypes/index.ctp:47 Template/Transactions/index.ctp:65
+msgid "last"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:51 Template/AdminErrors/index.ctp:59
+#: Template/OperatorTypes/index.ctp:49 Template/Operators/index.ctp:54
+#: Template/ServerUsers/index.ctp:57 Template/StateBalances/index.ctp:51
+#: Template/StateCreated/index.ctp:59 Template/StateErrors/index.ctp:53
+#: Template/StateGroupAddresses/index.ctp:51
+#: Template/StateGroupRelationships/index.ctp:49
+#: Template/StateGroups/index.ctp:55
+#: Template/StateRelationshipTypes/index.ctp:47
+#: Template/StateUsers/index.ctp:63 Template/TransactionCreations/index.ctp:53
+#: Template/TransactionGroupAddaddress/index.ctp:51
+#: Template/TransactionGroupAllowtrades/index.ctp:51
+#: Template/TransactionGroupCreates/index.ctp:53
+#: Template/TransactionSendCoins/index.ctp:55
+#: Template/TransactionSignatures/index.ctp:47
+#: Template/TransactionTypes/index.ctp:49 Template/Transactions/index.ctp:67
+msgid ""
+"Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} "
+"total"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:11
+msgid "Delete Address Type"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:24 Template/OperatorTypes/view.ctp:22
+#: Template/StateGroups/view.ctp:28 Template/StateGroups/view.ctp:103
+#: Template/StateRelationshipTypes/view.ctp:20
+#: Template/TransactionGroupCreates/view.ctp:32
+#: Template/TransactionTypes/view.ctp:22 Template/Transactions/view.ctp:179
+msgid "Name"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:28 Template/OperatorTypes/view.ctp:26
+#: Template/StateRelationshipTypes/view.ctp:24
+#: Template/TransactionTypes/view.ctp:26
+msgid "Text"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:32 Template/AddressTypes/view.ctp:41
+#: Template/AddressTypes/view.ctp:68 Template/AdminErrors/view.ctp:46
+#: Template/OperatorTypes/view.ctp:30 Template/OperatorTypes/view.ctp:39
+#: Template/Operators/view.ctp:32 Template/ServerUsers/view.ctp:36
+#: Template/StateBalances/view.ctp:26 Template/StateCreated/view.ctp:32
+#: Template/StateErrors/view.ctp:32 Template/StateGroupAddresses/view.ctp:32
+#: Template/StateGroupRelationships/view.ctp:20
+#: Template/StateGroups/view.ctp:32 Template/StateGroups/view.ctp:45
+#: Template/StateGroups/view.ctp:72 Template/StateGroups/view.ctp:99
+#: Template/StateGroups/view.ctp:128
+#: Template/StateRelationshipTypes/view.ctp:28 Template/StateUsers/view.ctp:34
+#: Template/StateUsers/view.ctp:47 Template/StateUsers/view.ctp:74
+#: Template/StateUsers/view.ctp:107 Template/StateUsers/view.ctp:136
+#: Template/TransactionCreations/view.ctp:32
+#: Template/TransactionGroupAddaddress/view.ctp:32
+#: Template/TransactionGroupAllowtrades/view.ctp:26
+#: Template/TransactionGroupCreates/view.ctp:36
+#: Template/TransactionSendCoins/view.ctp:32
+#: Template/TransactionSignatures/view.ctp:26
+#: Template/TransactionTypes/view.ctp:30 Template/TransactionTypes/view.ctp:39
+#: Template/Transactions/view.ctp:46 Template/Transactions/view.ctp:59
+#: Template/Transactions/view.ctp:92 Template/Transactions/view.ctp:121
+#: Template/Transactions/view.ctp:148 Template/Transactions/view.ctp:175
+#: Template/Transactions/view.ctp:204 Template/Transactions/view.ctp:237
+msgid "Id"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:37 Template/StateGroups/view.ctp:41
+msgid "Related State Group Addresses"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:42 Template/StateGroups/view.ctp:46
+#: Template/StateGroups/view.ctp:74 Template/StateGroups/view.ctp:102
+#: Template/StateGroups/view.ctp:129 Template/TransactionTypes/view.ctp:40
+#: Template/Transactions/view.ctp:178
+msgid "State Group Id"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:43 Template/AddressTypes/view.ctp:71
+#: Template/StateGroups/view.ctp:47 Template/StateGroups/view.ctp:75
+#: Template/Transactions/view.ctp:124
+msgid "Public Key"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:44 Template/AddressTypes/view.ctp:70
+#: Template/StateGroups/view.ctp:48 Template/Transactions/view.ctp:123
+msgid "Address Type Id"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:64 Template/Transactions/view.ctp:117
+msgid "Related Transaction Group Addaddress"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:69 Template/StateGroups/view.ctp:100
+#: Template/StateUsers/view.ctp:75 Template/StateUsers/view.ctp:108
+#: Template/StateUsers/view.ctp:137 Template/Transactions/view.ctp:60
+#: Template/Transactions/view.ctp:93 Template/Transactions/view.ctp:122
+#: Template/Transactions/view.ctp:149 Template/Transactions/view.ctp:176
+#: Template/Transactions/view.ctp:205 Template/Transactions/view.ctp:238
+msgid "Transaction Id"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:10 Template/AdminErrors/edit.ctp:16
+#: Template/AdminErrors/view.ctp:12
+msgid "List Admin Errors"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:11 Template/AdminErrors/edit.ctp:17
+#: Template/AdminErrors/index.ctp:11 Template/AdminErrors/view.ctp:14
+#: Template/StateBalances/add.ctp:11 Template/StateBalances/edit.ctp:17
+#: Template/StateBalances/index.ctp:11 Template/StateBalances/view.ctp:14
+#: Template/StateCreated/add.ctp:13 Template/StateCreated/edit.ctp:19
+#: Template/StateCreated/index.ctp:13 Template/StateCreated/view.ctp:16
+#: Template/StateErrors/add.ctp:11 Template/StateErrors/edit.ctp:17
+#: Template/StateErrors/index.ctp:11 Template/StateErrors/view.ctp:14
+#: Template/StateGroups/add.ctp:13 Template/StateGroups/edit.ctp:19
+#: Template/StateGroups/index.ctp:13 Template/StateGroups/view.ctp:16
+#: Template/StateUsers/add.ctp:10 Template/StateUsers/edit.ctp:16
+#: Template/StateUsers/view.ctp:12 Template/TransactionCreations/add.ctp:13
+#: Template/TransactionCreations/edit.ctp:19
+#: Template/TransactionCreations/index.ctp:13
+#: Template/TransactionCreations/view.ctp:16
+#: Template/TransactionSendCoins/add.ctp:13
+#: Template/TransactionSendCoins/edit.ctp:19
+#: Template/TransactionSendCoins/index.ctp:13
+#: Template/TransactionSendCoins/view.ctp:16
+msgid "List State Users"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:12 Template/AdminErrors/edit.ctp:18
+#: Template/AdminErrors/index.ctp:12 Template/AdminErrors/view.ctp:15
+#: Template/StateBalances/add.ctp:12 Template/StateBalances/edit.ctp:18
+#: Template/StateBalances/index.ctp:12 Template/StateBalances/view.ctp:15
+#: Template/StateCreated/add.ctp:14 Template/StateCreated/edit.ctp:20
+#: Template/StateCreated/index.ctp:14 Template/StateCreated/view.ctp:17
+#: Template/StateErrors/add.ctp:12 Template/StateErrors/edit.ctp:18
+#: Template/StateErrors/index.ctp:12 Template/StateErrors/view.ctp:15
+#: Template/StateGroups/add.ctp:14 Template/StateGroups/edit.ctp:20
+#: Template/StateGroups/index.ctp:14 Template/StateGroups/view.ctp:17
+#: Template/StateUsers/index.ctp:10 Template/StateUsers/view.ctp:13
+#: Template/TransactionCreations/add.ctp:14
+#: Template/TransactionCreations/edit.ctp:20
+#: Template/TransactionCreations/index.ctp:14
+#: Template/TransactionCreations/view.ctp:17
+#: Template/TransactionSendCoins/add.ctp:14
+#: Template/TransactionSendCoins/edit.ctp:20
+#: Template/TransactionSendCoins/index.ctp:14
+#: Template/TransactionSendCoins/view.ctp:17
+msgid "New State User"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:18
+msgid "Add Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/edit.ctp:24 Template/AdminErrors/view.ctp:10
+msgid "Edit Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/index.ctp:10 Template/AdminErrors/view.ctp:13
+msgid "New Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/index.ctp:16
+msgid "Admin Errors"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:11
+msgid "Delete Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:22 Template/StateBalances/view.ctp:22
+#: Template/StateCreated/view.ctp:28 Template/StateErrors/view.ctp:24
+#: Template/TransactionCreations/view.ctp:28
+#: Template/TransactionSendCoins/view.ctp:28
+msgid "State User"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:26
+msgid "Controller"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:30
+msgid "Action"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:34
+msgid "State"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:38
+msgid "Msg"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:42
+msgid "Details"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:50 Template/ServerUsers/view.ctp:44
+#: Template/StateCreated/view.ctp:48 Template/StateErrors/view.ctp:36
+#: Template/StateUsers/view.ctp:79 Template/Transactions/view.ctp:64
+msgid "Created"
+msgstr ""
+
+#: Template/Dashboard/error_http_request.ctp:9
+msgid "Error, Please try again"
+msgstr ""
+
+#: Template/Dashboard/error_http_request.ctp:13 Template/Layout/error.ctp:43
+msgid "Back"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:12 Template/Dashboard/server_index.ctp:9
+msgid "Willkommen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:22
+msgid "übersicht"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:27
+msgid "überweisen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:34
+msgid "löschen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:40 Template/Dashboard/server_index.ctp:16
+msgid "einzeln schöpfen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:45 Template/Dashboard/server_index.ctp:21
+msgid "viele schöpfen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:51 Template/Dashboard/server_index.ctp:27
+#: Template/Element/navi_header.ctp:33
+msgid "Fehler"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:59 Template/StateUsers/search.ctp:9
+msgid "Benutzer suchen"
+msgstr ""
+
+#: Template/Element/navi.ctp:25 Template/StateBalances/overview.ctp:8
+msgid "Kontoübersicht"
+msgstr ""
+
+#: Template/Element/navi.ctp:35 Template/Layout/frontend.ctp:69
+#: Template/Layout/frontend_ripple.ctp:105
+msgid "Startseite"
+msgstr ""
+
+#: Template/Element/navi.ctp:36 Template/TransactionSendCoins/create.ctp:9
+msgid "Überweisung"
+msgstr ""
+
+#: Template/Element/navi.ctp:44
+msgid "Abmelden"
+msgstr ""
+
+#: Template/Element/navi_header.ctp:38
+msgid "Transaktionen sind noch zu unterzeichnen"
+msgstr ""
+
+#: Template/Element/Flash/success.ctp:9
+msgid "Info:"
+msgstr ""
+
+#: Template/Layout/default.ctp:45 Template/Layout/frontend.ctp:78
+msgid "Logout"
+msgstr ""
+
+#: Template/Layout/error.ctp:35 Template/Error/error400.ctp:36
+#: Template/Error/error500.ctp:41
+msgid "Error"
+msgstr ""
+
+#: Template/Layout/frontend.ctp:60
+msgid "Fehler "
+msgstr ""
+
+#: Template/Layout/frontend.ctp:70
+msgid "Kontostand"
+msgstr ""
+
+#: Template/Layout/frontend.ctp:74
+msgid "Transaktionen unterzeichnen"
+msgstr ""
+
+#: Template/Layout/frontend_ripple.ctp:44
+msgid "Community Server in Entwicklung"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:10 Template/OperatorTypes/edit.ctp:16
+#: Template/OperatorTypes/view.ctp:12
+msgid "List Operator Types"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:11 Template/OperatorTypes/edit.ctp:17
+#: Template/OperatorTypes/index.ctp:11 Template/OperatorTypes/view.ctp:14
+#: Template/Operators/add.ctp:10 Template/Operators/edit.ctp:16
+#: Template/Operators/view.ctp:12
+msgid "List Operators"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:12 Template/OperatorTypes/edit.ctp:18
+#: Template/OperatorTypes/index.ctp:12 Template/OperatorTypes/view.ctp:15
+#: Template/Operators/index.ctp:10 Template/Operators/view.ctp:13
+msgid "New Operator"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:18
+msgid "Add Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/edit.ctp:24 Template/OperatorTypes/view.ctp:10
+msgid "Edit Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/index.ctp:10 Template/OperatorTypes/view.ctp:13
+msgid "New Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/index.ctp:16
+msgid "Operator Types"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:11
+msgid "Delete Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:35
+msgid "Related Operators"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:40 Template/Operators/view.ctp:20
+#: Template/ServerUsers/view.ctp:20
+msgid "Username"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:41 Template/Operators/view.ctp:36
+msgid "Operator Type Id"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:42 Template/Operators/view.ctp:28
+msgid "Data Base64"
+msgstr ""
+
+#: Template/Operators/add.ctp:16
+msgid "Add Operator"
+msgstr ""
+
+#: Template/Operators/edit.ctp:22 Template/Operators/view.ctp:10
+msgid "Edit Operator"
+msgstr ""
+
+#: Template/Operators/index.ctp:14
+msgid "Operators"
+msgstr ""
+
+#: Template/Operators/view.ctp:11
+msgid "Delete Operator"
+msgstr ""
+
+#: Template/Operators/view.ctp:24
+msgid "User Pubkey"
+msgstr ""
+
+#: Template/ServerUsers/add.ctp:10 Template/ServerUsers/edit.ctp:16
+#: Template/ServerUsers/view.ctp:12
+msgid "List Server Users"
+msgstr ""
+
+#: Template/ServerUsers/add.ctp:16
+msgid "Add Server User"
+msgstr ""
+
+#: Template/ServerUsers/edit.ctp:22 Template/ServerUsers/view.ctp:10
+msgid "Edit Server User"
+msgstr ""
+
+#: Template/ServerUsers/index.ctp:10 Template/ServerUsers/view.ctp:13
+msgid "New Server User"
+msgstr ""
+
+#: Template/ServerUsers/index.ctp:14
+msgid "Server Users"
+msgstr ""
+
+#: Template/ServerUsers/login.ctp:13
+msgid "Please enter your username and password"
+msgstr ""
+
+#: Template/ServerUsers/login.ctp:17
+msgid "Login"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:11
+msgid "Delete Server User"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:24
+msgid "Password"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:28
+msgid "Email"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:32
+msgid "Role"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:40
+msgid "Last Login"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:48 Template/StateBalances/view.ctp:34
+#: Template/StateUsers/view.ctp:49
+msgid "Modified"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:52
+msgid "Activated"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:53
+#: Template/TransactionGroupAllowtrades/view.ctp:35
+msgid "Yes"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:53
+#: Template/TransactionGroupAllowtrades/view.ctp:35
+msgid "No"
+msgstr ""
+
+#: Template/StateBalances/add.ctp:10 Template/StateBalances/edit.ctp:16
+#: Template/StateBalances/view.ctp:12 Template/StateUsers/add.ctp:13
+#: Template/StateUsers/edit.ctp:19 Template/StateUsers/index.ctp:13
+#: Template/StateUsers/view.ctp:16
+msgid "List State Balances"
+msgstr ""
+
+#: Template/StateBalances/add.ctp:18
+msgid "Add State Balance"
+msgstr ""
+
+#: Template/StateBalances/edit.ctp:24 Template/StateBalances/view.ctp:10
+msgid "Edit State Balance"
+msgstr ""
+
+#: Template/StateBalances/index.ctp:10 Template/StateBalances/view.ctp:13
+#: Template/StateUsers/add.ctp:14 Template/StateUsers/edit.ctp:20
+#: Template/StateUsers/index.ctp:14 Template/StateUsers/view.ctp:17
+msgid "New State Balance"
+msgstr ""
+
+#: Template/StateBalances/index.ctp:16
+msgid "State Balances"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:15
+msgid "Aktueller Kontostand: "
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:42
+msgid "Absender"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:43
+#: Template/TransactionSendCoins/create.ctp:30
+msgid "Verwendungszweck"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:44
+msgid "Datum"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:45
+msgid "Betrag"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:46
+msgid "Transaktions Nr."
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:46
+msgid "Nr"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:79
+msgid "Geschöpft"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:81
+msgid "Gesendet"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:83
+msgid "Empfangen"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:118
+#: Template/TransactionCreations/create_multi.ctp:167
+msgid "Laufende Transaktion"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:120
+#: Template/TransactionCreations/create_multi.ctp:169
+msgid "Laufende Transaktionen"
+msgstr ""
+
+#: Template/StateBalances/view.ctp:11
+msgid "Delete State Balance"
+msgstr ""
+
+#: Template/StateBalances/view.ctp:30 Template/StateUsers/view.ctp:50
+#: Template/StateUsers/view.ctp:110 Template/StateUsers/view.ctp:141
+#: Template/TransactionCreations/view.ctp:36
+#: Template/TransactionSendCoins/view.ctp:36 Template/Transactions/view.ctp:95
+#: Template/Transactions/view.ctp:209
+msgid "Amount"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:10 Template/StateCreated/edit.ctp:16
+#: Template/StateCreated/view.ctp:12 Template/StateUsers/add.ctp:15
+#: Template/StateUsers/edit.ctp:21 Template/StateUsers/index.ctp:15
+#: Template/StateUsers/view.ctp:18 Template/Transactions/add.ctp:15
+#: Template/Transactions/edit.ctp:21 Template/Transactions/index.ctp:15
+#: Template/Transactions/view.ctp:18
+msgid "List State Created"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:11 Template/StateCreated/edit.ctp:17
+#: Template/StateCreated/index.ctp:11 Template/StateCreated/view.ctp:14
+#: Template/StateGroups/add.ctp:17 Template/StateGroups/edit.ctp:23
+#: Template/StateGroups/index.ctp:17 Template/StateGroups/view.ctp:20
+#: Template/TransactionCreations/add.ctp:11
+#: Template/TransactionCreations/edit.ctp:17
+#: Template/TransactionCreations/index.ctp:11
+#: Template/TransactionCreations/view.ctp:14
+#: Template/TransactionGroupAddaddress/add.ctp:11
+#: Template/TransactionGroupAddaddress/edit.ctp:17
+#: Template/TransactionGroupAddaddress/index.ctp:11
+#: Template/TransactionGroupAddaddress/view.ctp:14
+#: Template/TransactionGroupAllowtrades/add.ctp:11
+#: Template/TransactionGroupAllowtrades/edit.ctp:17
+#: Template/TransactionGroupAllowtrades/index.ctp:11
+#: Template/TransactionGroupAllowtrades/view.ctp:14
+#: Template/TransactionGroupCreates/add.ctp:11
+#: Template/TransactionGroupCreates/edit.ctp:17
+#: Template/TransactionGroupCreates/index.ctp:11
+#: Template/TransactionGroupCreates/view.ctp:14
+#: Template/TransactionSendCoins/add.ctp:11
+#: Template/TransactionSendCoins/edit.ctp:17
+#: Template/TransactionSendCoins/index.ctp:11
+#: Template/TransactionSendCoins/view.ctp:14
+#: Template/TransactionSignatures/add.ctp:11
+#: Template/TransactionSignatures/edit.ctp:17
+#: Template/TransactionSignatures/index.ctp:11
+#: Template/TransactionSignatures/view.ctp:14
+#: Template/TransactionTypes/add.ctp:11 Template/TransactionTypes/edit.ctp:17
+#: Template/TransactionTypes/index.ctp:11 Template/TransactionTypes/view.ctp:14
+#: Template/Transactions/add.ctp:10 Template/Transactions/edit.ctp:16
+#: Template/Transactions/view.ctp:12
+msgid "List Transactions"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:12 Template/StateCreated/edit.ctp:18
+#: Template/StateCreated/index.ctp:12 Template/StateCreated/view.ctp:15
+#: Template/StateGroups/add.ctp:18 Template/StateGroups/edit.ctp:24
+#: Template/StateGroups/index.ctp:18 Template/StateGroups/view.ctp:21
+#: Template/TransactionCreations/add.ctp:12
+#: Template/TransactionCreations/edit.ctp:18
+#: Template/TransactionCreations/index.ctp:12
+#: Template/TransactionCreations/view.ctp:15
+#: Template/TransactionGroupAddaddress/add.ctp:12
+#: Template/TransactionGroupAddaddress/edit.ctp:18
+#: Template/TransactionGroupAddaddress/index.ctp:12
+#: Template/TransactionGroupAddaddress/view.ctp:15
+#: Template/TransactionGroupAllowtrades/add.ctp:12
+#: Template/TransactionGroupAllowtrades/edit.ctp:18
+#: Template/TransactionGroupAllowtrades/index.ctp:12
+#: Template/TransactionGroupAllowtrades/view.ctp:15
+#: Template/TransactionGroupCreates/add.ctp:12
+#: Template/TransactionGroupCreates/edit.ctp:18
+#: Template/TransactionGroupCreates/index.ctp:12
+#: Template/TransactionGroupCreates/view.ctp:15
+#: Template/TransactionSendCoins/add.ctp:12
+#: Template/TransactionSendCoins/edit.ctp:18
+#: Template/TransactionSendCoins/index.ctp:12
+#: Template/TransactionSendCoins/view.ctp:15
+#: Template/TransactionSignatures/add.ctp:12
+#: Template/TransactionSignatures/edit.ctp:18
+#: Template/TransactionSignatures/index.ctp:12
+#: Template/TransactionSignatures/view.ctp:15
+#: Template/TransactionTypes/add.ctp:12 Template/TransactionTypes/edit.ctp:18
+#: Template/TransactionTypes/index.ctp:12 Template/TransactionTypes/view.ctp:15
+#: Template/Transactions/index.ctp:10 Template/Transactions/view.ctp:13
+msgid "New Transaction"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:20
+msgid "Add State Created"
+msgstr ""
+
+#: Template/StateCreated/edit.ctp:26 Template/StateCreated/view.ctp:10
+msgid "Edit State Created"
+msgstr ""
+
+#: Template/StateCreated/index.ctp:10 Template/StateCreated/view.ctp:13
+#: Template/StateUsers/add.ctp:16 Template/StateUsers/edit.ctp:22
+#: Template/StateUsers/index.ctp:16 Template/StateUsers/view.ctp:19
+#: Template/Transactions/add.ctp:16 Template/Transactions/edit.ctp:22
+#: Template/Transactions/index.ctp:16 Template/Transactions/view.ctp:19
+msgid "New State Created"
+msgstr ""
+
+#: Template/StateCreated/index.ctp:18
+msgid "State Created"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:11
+msgid "Delete State Created"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:24 Template/TransactionCreations/view.ctp:24
+#: Template/TransactionGroupAddaddress/view.ctp:24
+#: Template/TransactionGroupAllowtrades/view.ctp:22
+#: Template/TransactionGroupCreates/view.ctp:24
+#: Template/TransactionSendCoins/view.ctp:24
+#: Template/TransactionSignatures/view.ctp:22
+msgid "Transaction"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:36 Template/StateUsers/view.ctp:76
+#: Template/Transactions/view.ctp:61
+msgid "Month"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:40 Template/StateUsers/view.ctp:77
+#: Template/Transactions/view.ctp:62
+msgid "Year"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:44 Template/StateUsers/view.ctp:80
+#: Template/Transactions/view.ctp:65
+msgid "Short Ident Hash"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:10 Template/StateErrors/edit.ctp:16
+#: Template/StateErrors/view.ctp:12
+msgid "List State Errors"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:13 Template/StateErrors/edit.ctp:19
+#: Template/StateErrors/index.ctp:13 Template/StateErrors/view.ctp:16
+#: Template/TransactionTypes/add.ctp:10 Template/TransactionTypes/edit.ctp:16
+#: Template/TransactionTypes/view.ctp:12 Template/Transactions/add.ctp:13
+#: Template/Transactions/edit.ctp:19 Template/Transactions/index.ctp:13
+#: Template/Transactions/view.ctp:16
+msgid "List Transaction Types"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:14 Template/StateErrors/edit.ctp:20
+#: Template/StateErrors/index.ctp:14 Template/StateErrors/view.ctp:17
+#: Template/TransactionTypes/index.ctp:10 Template/TransactionTypes/view.ctp:13
+#: Template/Transactions/add.ctp:14 Template/Transactions/edit.ctp:20
+#: Template/Transactions/index.ctp:14 Template/Transactions/view.ctp:17
+msgid "New Transaction Type"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:20
+msgid "Add State Error"
+msgstr ""
+
+#: Template/StateErrors/edit.ctp:26 Template/StateErrors/view.ctp:10
+msgid "Edit State Error"
+msgstr ""
+
+#: Template/StateErrors/index.ctp:10 Template/StateErrors/view.ctp:13
+msgid "New State Error"
+msgstr ""
+
+#: Template/StateErrors/index.ctp:18
+msgid "State Errors"
+msgstr ""
+
+#: Template/StateErrors/show_for_user.ctp:9
+msgid "Fehlermeldungen"
+msgstr ""
+
+#: Template/StateErrors/view.ctp:11
+msgid "Delete State Error"
+msgstr ""
+
+#: Template/StateErrors/view.ctp:28 Template/Transactions/view.ctp:42
+msgid "Transaction Type"
+msgstr ""
+
+#: Template/StateErrors/view.ctp:41
+msgid "Message Json"
+msgstr ""
+
+#: Template/StateGroupAddresses/add.ctp:11
+#: Template/StateGroupAddresses/edit.ctp:17
+#: Template/StateGroupAddresses/index.ctp:11
+#: Template/StateGroupAddresses/view.ctp:14 Template/StateGroups/add.ctp:10
+#: Template/StateGroups/edit.ctp:16 Template/StateGroups/view.ctp:12
+#: Template/StateUsers/add.ctp:11 Template/StateUsers/edit.ctp:17
+#: Template/StateUsers/index.ctp:11 Template/StateUsers/view.ctp:14
+#: Template/TransactionGroupCreates/add.ctp:13
+#: Template/TransactionGroupCreates/edit.ctp:19
+#: Template/TransactionGroupCreates/index.ctp:13
+#: Template/TransactionGroupCreates/view.ctp:16
+#: Template/Transactions/add.ctp:11 Template/Transactions/edit.ctp:17
+#: Template/Transactions/index.ctp:11 Template/Transactions/view.ctp:14
+msgid "List State Groups"
+msgstr ""
+
+#: Template/StateGroupAddresses/add.ctp:12
+#: Template/StateGroupAddresses/edit.ctp:18
+#: Template/StateGroupAddresses/index.ctp:12
+#: Template/StateGroupAddresses/view.ctp:15 Template/StateGroups/index.ctp:10
+#: Template/StateGroups/view.ctp:13 Template/StateUsers/add.ctp:12
+#: Template/StateUsers/edit.ctp:18 Template/StateUsers/index.ctp:12
+#: Template/StateUsers/view.ctp:15 Template/TransactionGroupCreates/add.ctp:14
+#: Template/TransactionGroupCreates/edit.ctp:20
+#: Template/TransactionGroupCreates/index.ctp:14
+#: Template/TransactionGroupCreates/view.ctp:17
+#: Template/Transactions/add.ctp:12 Template/Transactions/edit.ctp:18
+#: Template/Transactions/index.ctp:12 Template/Transactions/view.ctp:15
+msgid "New State Group"
+msgstr ""
+
+#: Template/StateGroupAddresses/add.ctp:20
+msgid "Add State Group Address"
+msgstr ""
+
+#: Template/StateGroupAddresses/edit.ctp:26
+#: Template/StateGroupAddresses/view.ctp:10
+msgid "Edit State Group Address"
+msgstr ""
+
+#: Template/StateGroupAddresses/index.ctp:18
+msgid "State Group Addresses"
+msgstr ""
+
+#: Template/StateGroupAddresses/view.ctp:11
+msgid "Delete State Group Address"
+msgstr ""
+
+#: Template/StateGroupAddresses/view.ctp:24 Template/StateUsers/view.ctp:30
+#: Template/TransactionGroupCreates/view.ctp:28
+#: Template/Transactions/view.ctp:38
+msgid "State Group"
+msgstr ""
+
+#: Template/StateGroupAddresses/view.ctp:28
+#: Template/TransactionGroupAddaddress/view.ctp:28
+msgid "Address Type"
+msgstr ""
+
+#: Template/StateGroupRelationships/add.ctp:10
+#: Template/StateGroupRelationships/edit.ctp:16
+#: Template/StateGroupRelationships/view.ctp:12
+msgid "List State Group Relationships"
+msgstr ""
+
+#: Template/StateGroupRelationships/add.ctp:16
+msgid "Add State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/edit.ctp:22
+#: Template/StateGroupRelationships/view.ctp:10
+msgid "Edit State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/index.ctp:10
+#: Template/StateGroupRelationships/view.ctp:13
+msgid "New State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/index.ctp:14
+msgid "State Group Relationships"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:11
+msgid "Delete State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:24
+msgid "State Group1 Id"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:28
+msgid "State Group2 Id"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:32
+msgid "State Relationship Id"
+msgstr ""
+
+#: Template/StateGroups/add.ctp:15 Template/StateGroups/edit.ctp:21
+#: Template/StateGroups/index.ctp:15 Template/StateGroups/view.ctp:18
+#: Template/TransactionGroupCreates/add.ctp:10
+#: Template/TransactionGroupCreates/edit.ctp:16
+#: Template/TransactionGroupCreates/view.ctp:12
+#: Template/Transactions/add.ctp:23 Template/Transactions/edit.ctp:29
+#: Template/Transactions/index.ctp:23 Template/Transactions/view.ctp:26
+msgid "List Transaction Group Creates"
+msgstr ""
+
+#: Template/StateGroups/add.ctp:16 Template/StateGroups/edit.ctp:22
+#: Template/StateGroups/index.ctp:16 Template/StateGroups/view.ctp:19
+#: Template/TransactionGroupCreates/index.ctp:10
+#: Template/TransactionGroupCreates/view.ctp:13
+#: Template/Transactions/add.ctp:24 Template/Transactions/edit.ctp:30
+#: Template/Transactions/index.ctp:24 Template/Transactions/view.ctp:27
+msgid "New Transaction Group Create"
+msgstr ""
+
+#: Template/StateGroups/add.ctp:24
+msgid "Add State Group"
+msgstr ""
+
+#: Template/StateGroups/edit.ctp:30 Template/StateGroups/view.ctp:10
+msgid "Edit State Group"
+msgstr ""
+
+#: Template/StateGroups/index.ctp:22
+msgid "State Groups"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:11
+msgid "Delete State Group"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:36
+msgid "User Count"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:68
+msgid "Related State Users"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:73 Template/StateUsers/view.ctp:38
+msgid "Index Id"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:95 Template/Transactions/view.ctp:171
+msgid "Related Transaction Group Creates"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:101 Template/Transactions/view.ctp:177
+msgid "Group Public Key"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:124 Template/TransactionTypes/view.ctp:35
+msgid "Related Transactions"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:130 Template/TransactionTypes/view.ctp:41
+msgid "Transaction Type Id"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:131 Template/TransactionTypes/view.ctp:42
+msgid "Tx Hash"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:132 Template/TransactionTypes/view.ctp:43
+#: Template/Transactions/view.ctp:50
+msgid "Received"
+msgstr ""
+
+#: Template/StateRelationshipTypes/add.ctp:10
+#: Template/StateRelationshipTypes/edit.ctp:16
+#: Template/StateRelationshipTypes/view.ctp:12
+msgid "List State Relationship Types"
+msgstr ""
+
+#: Template/StateRelationshipTypes/add.ctp:16
+msgid "Add State Relationship Type"
+msgstr ""
+
+#: Template/StateRelationshipTypes/edit.ctp:22
+#: Template/StateRelationshipTypes/view.ctp:10
+msgid "Edit State Relationship Type"
+msgstr ""
+
+#: Template/StateRelationshipTypes/index.ctp:10
+#: Template/StateRelationshipTypes/view.ctp:13
+msgid "New State Relationship Type"
+msgstr ""
+
+#: Template/StateRelationshipTypes/index.ctp:14
+msgid "State Relationship Types"
+msgstr ""
+
+#: Template/StateRelationshipTypes/view.ctp:11
+msgid "Delete State Relationship Type"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:17 Template/StateUsers/edit.ctp:23
+#: Template/StateUsers/index.ctp:17 Template/StateUsers/view.ctp:20
+#: Template/TransactionCreations/add.ctp:10
+#: Template/TransactionCreations/edit.ctp:16
+#: Template/TransactionCreations/view.ctp:12 Template/Transactions/add.ctp:17
+#: Template/Transactions/edit.ctp:23 Template/Transactions/index.ctp:17
+#: Template/Transactions/view.ctp:20
+msgid "List Transaction Creations"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:18 Template/StateUsers/edit.ctp:24
+#: Template/StateUsers/index.ctp:18 Template/StateUsers/view.ctp:21
+#: Template/TransactionCreations/index.ctp:10
+#: Template/TransactionCreations/view.ctp:13 Template/Transactions/add.ctp:18
+#: Template/Transactions/edit.ctp:24 Template/Transactions/index.ctp:18
+#: Template/Transactions/view.ctp:21
+msgid "New Transaction Creation"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:19 Template/StateUsers/edit.ctp:25
+#: Template/StateUsers/index.ctp:19 Template/StateUsers/view.ctp:22
+#: Template/TransactionSendCoins/add.ctp:10
+#: Template/TransactionSendCoins/edit.ctp:16
+#: Template/TransactionSendCoins/view.ctp:12 Template/Transactions/add.ctp:25
+#: Template/Transactions/edit.ctp:31 Template/Transactions/index.ctp:25
+#: Template/Transactions/view.ctp:28
+msgid "List Transaction Send Coins"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:20 Template/StateUsers/edit.ctp:26
+#: Template/StateUsers/index.ctp:20 Template/StateUsers/view.ctp:23
+#: Template/TransactionSendCoins/index.ctp:10
+#: Template/TransactionSendCoins/view.ctp:13 Template/Transactions/add.ctp:26
+#: Template/Transactions/edit.ctp:32 Template/Transactions/index.ctp:26
+#: Template/Transactions/view.ctp:29
+msgid "New Transaction Send Coin"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:26
+msgid "Add State User"
+msgstr ""
+
+#: Template/StateUsers/edit.ctp:32 Template/StateUsers/view.ctp:10
+msgid "Edit State User"
+msgstr ""
+
+#: Template/StateUsers/index.ctp:24
+msgid "State Users"
+msgstr ""
+
+#: Template/StateUsers/search.ctp:24
+msgid "Vorname oder Nachname oder E-Mail"
+msgstr ""
+
+#: Template/StateUsers/search.ctp:25
+msgid "Datenbank durchsuchen"
+msgstr ""
+
+#: Template/StateUsers/search.ctp:38
+msgid "Benutzer gefunden"
+msgstr ""
+
+#: Template/StateUsers/search.ctp:73
+msgid "Keine Benutzer gefunden"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:11
+msgid "Delete State User"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:43
+msgid "Related State Balances"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:48 Template/StateUsers/view.ctp:78
+#: Template/StateUsers/view.ctp:109 Template/StateUsers/view.ctp:138
+#: Template/Transactions/view.ctp:63 Template/Transactions/view.ctp:94
+#: Template/Transactions/view.ctp:206
+msgid "State User Id"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:70 Template/Transactions/view.ctp:55
+msgid "Related State Created"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:103 Template/Transactions/view.ctp:88
+msgid "Related Transaction Creations"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:111 Template/Transactions/view.ctp:96
+msgid "Ident Hash"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:132 Template/Transactions/view.ctp:200
+msgid "Related Transaction Send Coins"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:139 Template/Transactions/view.ctp:207
+msgid "Receiver Public Key"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:140 Template/Transactions/view.ctp:208
+msgid "Receiver User Id"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:142 Template/TransactionSendCoins/view.ctp:40
+#: Template/Transactions/view.ctp:210
+msgid "Sender Final Balance"
+msgstr ""
+
+#: Template/TransactionCreations/add.ctp:20
+msgid "Add Transaction Creation"
+msgstr ""
+
+#: Template/TransactionCreations/create.ctp:17
+#: Template/TransactionCreations/create_multi.ctp:17
+msgid "Schöpfungstransaktion"
+msgstr ""
+
+#: Template/TransactionCreations/create.ctp:28
+#: Template/TransactionCreations/create_multi.ctp:107
+msgid "Transaktion(n) abschließen"
+msgstr ""
+
+#: Template/TransactionCreations/create.ctp:29
+#: Template/TransactionCreations/create_multi.ctp:108
+#: Template/TransactionSendCoins/create.ctp:33
+msgid "Weitere Transaktion erstellen"
+msgstr ""
+
+#: Template/TransactionCreations/create_multi.ctp:85
+msgid "Für benutzerdefinierten Betrag"
+msgstr ""
+
+#: Template/TransactionCreations/create_multi.ctp:172
+msgid "Alle Transaktionen abgeschlossen!"
+msgstr ""
+
+#: Template/TransactionCreations/edit.ctp:26
+#: Template/TransactionCreations/view.ctp:10
+msgid "Edit Transaction Creation"
+msgstr ""
+
+#: Template/TransactionCreations/index.ctp:18
+msgid "Transaction Creations"
+msgstr ""
+
+#: Template/TransactionCreations/view.ctp:11
+msgid "Delete Transaction Creation"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/add.ctp:20
+msgid "Add Transaction Group Addaddres"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/edit.ctp:26
+#: Template/TransactionGroupAddaddress/view.ctp:10
+msgid "Edit Transaction Group Addaddres"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/index.ctp:18
+msgid "Transaction Group Addaddress"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/view.ctp:11
+msgid "Delete Transaction Group Addaddres"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/add.ctp:10
+#: Template/TransactionGroupAllowtrades/edit.ctp:16
+#: Template/TransactionGroupAllowtrades/view.ctp:12
+#: Template/Transactions/add.ctp:21 Template/Transactions/edit.ctp:27
+#: Template/Transactions/index.ctp:21 Template/Transactions/view.ctp:24
+msgid "List Transaction Group Allowtrades"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/add.ctp:18
+msgid "Add Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/edit.ctp:24
+#: Template/TransactionGroupAllowtrades/view.ctp:10
+msgid "Edit Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/index.ctp:10
+#: Template/TransactionGroupAllowtrades/view.ctp:13
+#: Template/Transactions/add.ctp:22 Template/Transactions/edit.ctp:28
+#: Template/Transactions/index.ctp:22 Template/Transactions/view.ctp:25
+msgid "New Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/index.ctp:16
+msgid "Transaction Group Allowtrades"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/view.ctp:11
+msgid "Delete Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/view.ctp:30
+#: Template/Transactions/view.ctp:150
+msgid "Group Id"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/view.ctp:34
+#: Template/Transactions/view.ctp:151
+msgid "Allow"
+msgstr ""
+
+#: Template/TransactionGroupCreates/add.ctp:20
+msgid "Add Transaction Group Create"
+msgstr ""
+
+#: Template/TransactionGroupCreates/edit.ctp:26
+#: Template/TransactionGroupCreates/view.ctp:10
+msgid "Edit Transaction Group Create"
+msgstr ""
+
+#: Template/TransactionGroupCreates/index.ctp:18
+msgid "Transaction Group Creates"
+msgstr ""
+
+#: Template/TransactionGroupCreates/view.ctp:11
+msgid "Delete Transaction Group Create"
+msgstr ""
+
+#: Template/TransactionSendCoins/add.ctp:20
+msgid "Add Transaction Send Coin"
+msgstr ""
+
+#: Template/TransactionSendCoins/create.ctp:29
+msgid "Betrag in GDD"
+msgstr ""
+
+#: Template/TransactionSendCoins/create.ctp:31
+msgid "Empfänger"
+msgstr ""
+
+#: Template/TransactionSendCoins/create.ctp:32
+msgid "Transaktion abschließen"
+msgstr ""
+
+#: Template/TransactionSendCoins/edit.ctp:26
+#: Template/TransactionSendCoins/view.ctp:10
+msgid "Edit Transaction Send Coin"
+msgstr ""
+
+#: Template/TransactionSendCoins/index.ctp:18
+msgid "Transaction Send Coins"
+msgstr ""
+
+#: Template/TransactionSendCoins/view.ctp:11
+msgid "Delete Transaction Send Coin"
+msgstr ""
+
+#: Template/TransactionSignatures/add.ctp:10
+#: Template/TransactionSignatures/edit.ctp:16
+#: Template/TransactionSignatures/view.ctp:12 Template/Transactions/add.ctp:27
+#: Template/Transactions/edit.ctp:33 Template/Transactions/index.ctp:27
+#: Template/Transactions/view.ctp:30
+msgid "List Transaction Signatures"
+msgstr ""
+
+#: Template/TransactionSignatures/add.ctp:18
+msgid "Add Transaction Signature"
+msgstr ""
+
+#: Template/TransactionSignatures/edit.ctp:24
+#: Template/TransactionSignatures/view.ctp:10
+msgid "Edit Transaction Signature"
+msgstr ""
+
+#: Template/TransactionSignatures/index.ctp:10
+#: Template/TransactionSignatures/view.ctp:13 Template/Transactions/add.ctp:28
+#: Template/Transactions/edit.ctp:34 Template/Transactions/index.ctp:28
+#: Template/Transactions/view.ctp:31
+msgid "New Transaction Signature"
+msgstr ""
+
+#: Template/TransactionSignatures/index.ctp:16
+msgid "Transaction Signatures"
+msgstr ""
+
+#: Template/TransactionSignatures/view.ctp:11
+msgid "Delete Transaction Signature"
+msgstr ""
+
+#: Template/TransactionTypes/add.ctp:18
+msgid "Add Transaction Type"
+msgstr ""
+
+#: Template/TransactionTypes/edit.ctp:24 Template/TransactionTypes/view.ctp:10
+msgid "Edit Transaction Type"
+msgstr ""
+
+#: Template/TransactionTypes/index.ctp:16
+msgid "Transaction Types"
+msgstr ""
+
+#: Template/TransactionTypes/view.ctp:11
+msgid "Delete Transaction Type"
+msgstr ""
+
+#: Template/Transactions/add.ctp:34
+msgid "Add Transaction"
+msgstr ""
+
+#: Template/Transactions/edit.ctp:40 Template/Transactions/view.ctp:10
+msgid "Edit Transaction"
+msgstr ""
+
+#: Template/Transactions/index.ctp:32
+msgid "Transactions"
+msgstr ""
+
+#: Template/Transactions/view.ctp:11
+msgid "Delete Transaction"
+msgstr ""
+
+#: Template/Transactions/view.ctp:144
+msgid "Related Transaction Group Allowtrades"
+msgstr ""
+
+#: Template/Transactions/view.ctp:233
+msgid "Related Transaction Signatures"
+msgstr ""
+
+#: Template/Transactions/view.ctp:239
+msgid "Signature"
+msgstr ""
+
+#: Template/Transactions/view.ctp:240
+msgid "Pubkey"
+msgstr ""
+
+#: Template/Error/error400.ctp:37
+msgid "The requested address {0} was not found on this server."
+msgstr ""
+
+#: Template/Error/error500.ctp:39
+msgid "An Internal Error Has Occurred"
+msgstr ""
diff --git a/community_server/src/Locale/default.pot b/community_server/src/Locale/default.pot
new file mode 100644
index 000000000..af483fad6
--- /dev/null
+++ b/community_server/src/Locale/default.pot
@@ -0,0 +1,2666 @@
+# LANGUAGE translation of CakePHP Application
+# Copyright YEAR NAME
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"POT-Creation-Date: 2020-02-10 10:20+0000\n"
+"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
+"Last-Translator: NAME \n"
+"Language-Team: LANGUAGE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: Controller/AddressTypesController.php:55
+#: Controller/AddressTypesController.php:79
+msgid "The address type has been saved."
+msgstr ""
+
+#: Controller/AddressTypesController.php:59
+#: Controller/AddressTypesController.php:83
+msgid "The address type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/AddressTypesController.php:100
+msgid "The address type has been deleted."
+msgstr ""
+
+#: Controller/AddressTypesController.php:102
+msgid "The address type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:57
+#: Controller/AdminErrorsController.php:82
+msgid "The admin error has been saved."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:61
+#: Controller/AdminErrorsController.php:86
+msgid "The admin error could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:104
+msgid "The admin error has been deleted."
+msgstr ""
+
+#: Controller/AdminErrorsController.php:106
+msgid "The admin error could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/AppController.php:197
+msgid "error updating state user "
+msgstr ""
+
+#: Controller/AppController.php:213
+msgid "error saving state user "
+msgstr ""
+
+#: Controller/AppController.php:220
+msgid "no pubkey"
+msgstr ""
+
+#: Controller/AppController.php:226
+msgid "invalid session"
+msgstr ""
+
+#: Controller/AppController.php:233
+#: Controller/TransactionSendCoinsController.php:222
+msgid "error http request: "
+msgstr ""
+
+#: Controller/AppController.php:270
+msgid "Serious error, couldn't save to db, please write the admin: "
+msgstr ""
+
+#: Controller/OperatorTypesController.php:54
+#: Controller/OperatorTypesController.php:78
+msgid "The operator type has been saved."
+msgstr ""
+
+#: Controller/OperatorTypesController.php:58
+#: Controller/OperatorTypesController.php:82
+msgid "The operator type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/OperatorTypesController.php:99
+msgid "The operator type has been deleted."
+msgstr ""
+
+#: Controller/OperatorTypesController.php:101
+msgid "The operator type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/OperatorsController.php:182
+#: Controller/OperatorsController.php:207
+msgid "The operator has been saved."
+msgstr ""
+
+#: Controller/OperatorsController.php:186
+#: Controller/OperatorsController.php:211
+msgid "The operator could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/OperatorsController.php:229
+msgid "The operator has been deleted."
+msgstr ""
+
+#: Controller/OperatorsController.php:231
+msgid "The operator could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/ServerUsersController.php:42
+msgid "Invalid username or password, try again"
+msgstr ""
+
+#: Controller/ServerUsersController.php:78
+#: Controller/ServerUsersController.php:102
+msgid "The server user has been saved."
+msgstr ""
+
+#: Controller/ServerUsersController.php:82
+#: Controller/ServerUsersController.php:106
+msgid "The server user could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/ServerUsersController.php:123
+msgid "The server user has been deleted."
+msgstr ""
+
+#: Controller/ServerUsersController.php:125
+msgid "The server user could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateBalancesController.php:175
+#: Controller/StateBalancesController.php:200
+msgid "The state balance has been saved."
+msgstr ""
+
+#: Controller/StateBalancesController.php:179
+#: Controller/StateBalancesController.php:204
+msgid "The state balance could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateBalancesController.php:222
+msgid "The state balance has been deleted."
+msgstr ""
+
+#: Controller/StateBalancesController.php:224
+msgid "The state balance could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateCreatedController.php:57
+#: Controller/StateCreatedController.php:83
+msgid "The state created has been saved."
+msgstr ""
+
+#: Controller/StateCreatedController.php:61
+#: Controller/StateCreatedController.php:87
+msgid "The state created could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateCreatedController.php:106
+msgid "The state created has been deleted."
+msgstr ""
+
+#: Controller/StateCreatedController.php:108
+msgid "The state created could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateErrorsController.php:66
+msgid "Error belongs to another User, cannot delete"
+msgstr ""
+
+#: Controller/StateErrorsController.php:69
+#: Controller/StateErrorsController.php:157
+msgid "The state error has been deleted."
+msgstr ""
+
+#: Controller/StateErrorsController.php:71
+#: Controller/StateErrorsController.php:159
+msgid "The state error could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateErrorsController.php:108
+#: Controller/StateErrorsController.php:134
+msgid "The state error has been saved."
+msgstr ""
+
+#: Controller/StateErrorsController.php:112
+#: Controller/StateErrorsController.php:138
+msgid "The state error could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:57
+#: Controller/StateGroupAddressesController.php:83
+msgid "The state group address has been saved."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:61
+#: Controller/StateGroupAddressesController.php:87
+msgid "The state group address could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:106
+msgid "The state group address has been deleted."
+msgstr ""
+
+#: Controller/StateGroupAddressesController.php:108
+msgid "The state group address could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:57
+#: Controller/StateGroupRelationshipsController.php:84
+msgid "The state group relationship has been saved."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:61
+#: Controller/StateGroupRelationshipsController.php:88
+msgid "The state group relationship could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:108
+msgid "The state group relationship has been deleted."
+msgstr ""
+
+#: Controller/StateGroupRelationshipsController.php:110
+msgid "The state group relationship could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupsController.php:57
+#: Controller/StateGroupsController.php:82
+msgid "The state group has been saved."
+msgstr ""
+
+#: Controller/StateGroupsController.php:61
+#: Controller/StateGroupsController.php:86
+msgid "The state group could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateGroupsController.php:104
+msgid "The state group has been deleted."
+msgstr ""
+
+#: Controller/StateGroupsController.php:106
+msgid "The state group could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:54
+#: Controller/StateRelationshipTypesController.php:78
+msgid "The state relationship type has been saved."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:58
+#: Controller/StateRelationshipTypesController.php:82
+msgid "The state relationship type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:99
+msgid "The state relationship type has been deleted."
+msgstr ""
+
+#: Controller/StateRelationshipTypesController.php:101
+msgid "The state relationship type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/StateUsersController.php:15
+msgid "account created"
+msgstr ""
+
+#: Controller/StateUsersController.php:16
+msgid "account not on login-server"
+msgstr ""
+
+#: Controller/StateUsersController.php:17
+msgid "email activated"
+msgstr ""
+
+#: Controller/StateUsersController.php:18
+msgid "account copied to community"
+msgstr ""
+
+#: Controller/StateUsersController.php:19
+msgid "email not activated"
+msgstr ""
+
+#: Controller/StateUsersController.php:20
+msgid "account multiple times on login-server"
+msgstr ""
+
+#: Controller/StateUsersController.php:21
+msgid "account not on community server"
+msgstr ""
+
+#: Controller/StateUsersController.php:22
+msgid "no keys"
+msgstr ""
+
+#: Controller/StateUsersController.php:219
+#: Controller/TransactionCreationsController.php:179
+#: Controller/TransactionSendCoinsController.php:231
+msgid "Something was invalid, please try again!"
+msgstr ""
+
+#: Controller/StateUsersController.php:275
+#: Controller/StateUsersController.php:301
+msgid "The state user has been saved."
+msgstr ""
+
+#: Controller/StateUsersController.php:279
+#: Controller/StateUsersController.php:305
+msgid "The state user could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/StateUsersController.php:324
+msgid "The state user has been deleted."
+msgstr ""
+
+#: Controller/StateUsersController.php:326
+msgid "The state user could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:144
+#: Controller/TransactionCreationsController.php:331
+msgid "Error by requesting LoginServer, please try again"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:146
+#: Controller/TransactionCreationsController.php:333
+msgid "Error, please wait for the admin to fix it"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:156
+#: Controller/TransactionCreationsController.php:343
+msgid "Login Server Error, please wait for the admin to fix it"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:170
+#: Controller/TransactionCreationsController.php:357
+#: Controller/TransactionSendCoinsController.php:216
+msgid "Transaction submitted for review."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:175
+msgid "Building transaction failed"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:267
+msgid "No user selected"
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:378
+#: Controller/TransactionCreationsController.php:404
+msgid "The transaction creation has been saved."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:382
+#: Controller/TransactionCreationsController.php:408
+msgid "The transaction creation could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:427
+msgid "The transaction creation has been deleted."
+msgstr ""
+
+#: Controller/TransactionCreationsController.php:429
+msgid "The transaction creation could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:57
+#: Controller/TransactionGroupAddaddressController.php:83
+msgid "The transaction group addaddres has been saved."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:61
+#: Controller/TransactionGroupAddaddressController.php:87
+msgid "The transaction group addaddres could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:106
+msgid "The transaction group addaddres has been deleted."
+msgstr ""
+
+#: Controller/TransactionGroupAddaddressController.php:108
+msgid "The transaction group addaddres could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:57
+#: Controller/TransactionGroupAllowtradesController.php:83
+msgid "The transaction group allowtrade has been saved."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:61
+#: Controller/TransactionGroupAllowtradesController.php:87
+msgid "The transaction group allowtrade could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:106
+msgid "The transaction group allowtrade has been deleted."
+msgstr ""
+
+#: Controller/TransactionGroupAllowtradesController.php:108
+msgid "The transaction group allowtrade could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:57
+#: Controller/TransactionGroupCreatesController.php:83
+msgid "The transaction group create has been saved."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:61
+#: Controller/TransactionGroupCreatesController.php:87
+msgid "The transaction group create could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:106
+msgid "The transaction group create has been deleted."
+msgstr ""
+
+#: Controller/TransactionGroupCreatesController.php:108
+msgid "The transaction group create could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:73
+#: Controller/TransactionSendCoinsController.php:100
+msgid "The transaction send coin has been saved."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:77
+#: Controller/TransactionSendCoinsController.php:104
+msgid "The transaction send coin could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:145
+msgid "Du hast nicht genug Geld!"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:151
+msgid "Du kannst dir leider nicht selbst Geld schicken!"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:163
+msgid "Diese E-Mail ist mir nicht bekannt, hat dein Empfänger denn schon ein Gradido-Konto?"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:202
+msgid "login server return error: "
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:226
+msgid "No Valid Receiver Public given"
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:250
+msgid "The transaction send coin has been deleted."
+msgstr ""
+
+#: Controller/TransactionSendCoinsController.php:252
+msgid "The transaction send coin could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:57
+#: Controller/TransactionSignaturesController.php:82
+msgid "The transaction signature has been saved."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:61
+#: Controller/TransactionSignaturesController.php:86
+msgid "The transaction signature could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:104
+msgid "The transaction signature has been deleted."
+msgstr ""
+
+#: Controller/TransactionSignaturesController.php:106
+msgid "The transaction signature could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:54
+#: Controller/TransactionTypesController.php:78
+msgid "The transaction type has been saved."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:58
+#: Controller/TransactionTypesController.php:82
+msgid "The transaction type could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:99
+msgid "The transaction type has been deleted."
+msgstr ""
+
+#: Controller/TransactionTypesController.php:101
+msgid "The transaction type could not be deleted. Please, try again."
+msgstr ""
+
+#: Controller/TransactionsController.php:66
+msgid "No valid data given, please try again."
+msgstr ""
+
+#: Controller/TransactionsController.php:103
+msgid "error retriving last saved transaction from gradido node."
+msgstr ""
+
+#: Controller/TransactionsController.php:197
+#: Controller/TransactionsController.php:223
+msgid "The transaction has been saved."
+msgstr ""
+
+#: Controller/TransactionsController.php:201
+#: Controller/TransactionsController.php:227
+msgid "The transaction could not be saved. Please, try again."
+msgstr ""
+
+#: Controller/TransactionsController.php:246
+msgid "The transaction has been deleted."
+msgstr ""
+
+#: Controller/TransactionsController.php:248
+msgid "The transaction could not be deleted. Please, try again."
+msgstr ""
+
+#: Form/CreationForm.php:43
+#: Form/TransferForm.php:46
+msgid "No HTML Tags like > or < please."
+msgstr ""
+
+#: Form/CreationForm.php:55
+msgid "Please give a valid number with maximal 2 decimal places"
+msgstr ""
+
+#: Form/TransferForm.php:35
+msgid "A valid email address is required"
+msgstr ""
+
+#: Form/TransferForm.php:39
+msgid "The memo should contain max 150 character"
+msgstr ""
+
+#: Form/TransferForm.php:58
+msgid "Please give a valid positive number with maximal 2 decimal places"
+msgstr ""
+
+#: Form/UserSearchForm.php:32
+msgid "The search text should contain max 50 character"
+msgstr ""
+
+#: Form/UserSearchForm.php:39
+msgid "No HTML Tags like < or > please."
+msgstr ""
+
+#: Model/Table/ServerUsersTable.php:58
+msgid "Please give a username"
+msgstr ""
+
+#: Model/Table/ServerUsersTable.php:64
+msgid "Please give a password"
+msgstr ""
+
+#: Model/Table/ServerUsersTable.php:69
+msgid "Please give a email"
+msgstr ""
+
+#: Model/Transactions/TransactionCreation.php:177
+msgid "Gradido Schöpfung erhalten"
+msgstr ""
+
+#: Model/Transactions/TransactionTransfer.php:239
+msgid "Gradidos erhalten"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:9
+#: Template/AddressTypes/edit.ctp:9
+#: Template/AddressTypes/index.ctp:9
+#: Template/AddressTypes/index.ctp:25
+#: Template/AddressTypes/view.ctp:9
+#: Template/AddressTypes/view.ctp:45
+#: Template/AddressTypes/view.ctp:72
+#: Template/AdminErrors/add.ctp:9
+#: Template/AdminErrors/edit.ctp:9
+#: Template/AdminErrors/index.ctp:9
+#: Template/AdminErrors/index.ctp:28
+#: Template/AdminErrors/view.ctp:9
+#: Template/OperatorTypes/add.ctp:9
+#: Template/OperatorTypes/edit.ctp:9
+#: Template/OperatorTypes/index.ctp:9
+#: Template/OperatorTypes/index.ctp:23
+#: Template/OperatorTypes/view.ctp:9
+#: Template/OperatorTypes/view.ctp:43
+#: Template/Operators/add.ctp:9
+#: Template/Operators/edit.ctp:9
+#: Template/Operators/index.ctp:9
+#: Template/Operators/index.ctp:24
+#: Template/Operators/view.ctp:9
+#: Template/ServerUsers/add.ctp:9
+#: Template/ServerUsers/edit.ctp:9
+#: Template/ServerUsers/index.ctp:9
+#: Template/ServerUsers/index.ctp:26
+#: Template/ServerUsers/view.ctp:9
+#: Template/StateBalances/add.ctp:9
+#: Template/StateBalances/edit.ctp:9
+#: Template/StateBalances/index.ctp:9
+#: Template/StateBalances/index.ctp:24
+#: Template/StateBalances/view.ctp:9
+#: Template/StateCreated/add.ctp:9
+#: Template/StateCreated/edit.ctp:9
+#: Template/StateCreated/index.ctp:9
+#: Template/StateCreated/index.ctp:29
+#: Template/StateCreated/view.ctp:9
+#: Template/StateErrors/add.ctp:9
+#: Template/StateErrors/edit.ctp:9
+#: Template/StateErrors/index.ctp:9
+#: Template/StateErrors/index.ctp:26
+#: Template/StateErrors/view.ctp:9
+#: Template/StateGroupAddresses/add.ctp:9
+#: Template/StateGroupAddresses/edit.ctp:9
+#: Template/StateGroupAddresses/index.ctp:9
+#: Template/StateGroupAddresses/index.ctp:25
+#: Template/StateGroupAddresses/view.ctp:9
+#: Template/StateGroupRelationships/add.ctp:9
+#: Template/StateGroupRelationships/edit.ctp:9
+#: Template/StateGroupRelationships/index.ctp:9
+#: Template/StateGroupRelationships/index.ctp:22
+#: Template/StateGroupRelationships/view.ctp:9
+#: Template/StateGroups/add.ctp:9
+#: Template/StateGroups/edit.ctp:9
+#: Template/StateGroups/index.ctp:9
+#: Template/StateGroups/index.ctp:29
+#: Template/StateGroups/view.ctp:9
+#: Template/StateGroups/view.ctp:49
+#: Template/StateGroups/view.ctp:76
+#: Template/StateGroups/view.ctp:104
+#: Template/StateGroups/view.ctp:133
+#: Template/StateRelationshipTypes/add.ctp:9
+#: Template/StateRelationshipTypes/edit.ctp:9
+#: Template/StateRelationshipTypes/index.ctp:9
+#: Template/StateRelationshipTypes/index.ctp:21
+#: Template/StateRelationshipTypes/view.ctp:9
+#: Template/StateUsers/add.ctp:9
+#: Template/StateUsers/edit.ctp:9
+#: Template/StateUsers/index.ctp:9
+#: Template/StateUsers/index.ctp:34
+#: Template/StateUsers/view.ctp:9
+#: Template/StateUsers/view.ctp:51
+#: Template/StateUsers/view.ctp:81
+#: Template/StateUsers/view.ctp:112
+#: Template/StateUsers/view.ctp:143
+#: Template/TransactionCreations/add.ctp:9
+#: Template/TransactionCreations/edit.ctp:9
+#: Template/TransactionCreations/index.ctp:9
+#: Template/TransactionCreations/index.ctp:27
+#: Template/TransactionCreations/view.ctp:9
+#: Template/TransactionGroupAddaddress/add.ctp:9
+#: Template/TransactionGroupAddaddress/edit.ctp:9
+#: Template/TransactionGroupAddaddress/index.ctp:9
+#: Template/TransactionGroupAddaddress/index.ctp:25
+#: Template/TransactionGroupAddaddress/view.ctp:9
+#: Template/TransactionGroupAllowtrades/add.ctp:9
+#: Template/TransactionGroupAllowtrades/edit.ctp:9
+#: Template/TransactionGroupAllowtrades/index.ctp:9
+#: Template/TransactionGroupAllowtrades/index.ctp:24
+#: Template/TransactionGroupAllowtrades/view.ctp:9
+#: Template/TransactionGroupCreates/add.ctp:9
+#: Template/TransactionGroupCreates/edit.ctp:9
+#: Template/TransactionGroupCreates/index.ctp:9
+#: Template/TransactionGroupCreates/index.ctp:26
+#: Template/TransactionGroupCreates/view.ctp:9
+#: Template/TransactionSendCoins/add.ctp:9
+#: Template/TransactionSendCoins/edit.ctp:9
+#: Template/TransactionSendCoins/index.ctp:9
+#: Template/TransactionSendCoins/index.ctp:27
+#: Template/TransactionSendCoins/view.ctp:9
+#: Template/TransactionSignatures/add.ctp:9
+#: Template/TransactionSignatures/edit.ctp:9
+#: Template/TransactionSignatures/index.ctp:9
+#: Template/TransactionSignatures/index.ctp:22
+#: Template/TransactionSignatures/view.ctp:9
+#: Template/TransactionTypes/add.ctp:9
+#: Template/TransactionTypes/edit.ctp:9
+#: Template/TransactionTypes/index.ctp:9
+#: Template/TransactionTypes/index.ctp:23
+#: Template/TransactionTypes/view.ctp:9
+#: Template/TransactionTypes/view.ctp:44
+#: Template/Transactions/add.ctp:9
+#: Template/Transactions/edit.ctp:9
+#: Template/Transactions/index.ctp:9
+#: Template/Transactions/view.ctp:9
+#: Template/Transactions/view.ctp:66
+#: Template/Transactions/view.ctp:97
+#: Template/Transactions/view.ctp:125
+#: Template/Transactions/view.ctp:152
+#: Template/Transactions/view.ctp:180
+#: Template/Transactions/view.ctp:211
+#: Template/Transactions/view.ctp:241
+msgid "Actions"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:10
+#: Template/AddressTypes/edit.ctp:16
+#: Template/AddressTypes/view.ctp:12
+#: Template/StateGroupAddresses/add.ctp:13
+#: Template/StateGroupAddresses/edit.ctp:19
+#: Template/StateGroupAddresses/index.ctp:13
+#: Template/StateGroupAddresses/view.ctp:16
+#: Template/TransactionGroupAddaddress/add.ctp:13
+#: Template/TransactionGroupAddaddress/edit.ctp:19
+#: Template/TransactionGroupAddaddress/index.ctp:13
+#: Template/TransactionGroupAddaddress/view.ctp:16
+msgid "List Address Types"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:11
+#: Template/AddressTypes/edit.ctp:17
+#: Template/AddressTypes/index.ctp:11
+#: Template/AddressTypes/view.ctp:14
+#: Template/StateGroupAddresses/add.ctp:10
+#: Template/StateGroupAddresses/edit.ctp:16
+#: Template/StateGroupAddresses/view.ctp:12
+#: Template/StateGroups/add.ctp:11
+#: Template/StateGroups/edit.ctp:17
+#: Template/StateGroups/index.ctp:11
+#: Template/StateGroups/view.ctp:14
+msgid "List State Group Addresses"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:12
+#: Template/AddressTypes/edit.ctp:18
+#: Template/AddressTypes/index.ctp:12
+#: Template/AddressTypes/view.ctp:15
+#: Template/StateGroupAddresses/index.ctp:10
+#: Template/StateGroupAddresses/view.ctp:13
+#: Template/StateGroups/add.ctp:12
+#: Template/StateGroups/edit.ctp:18
+#: Template/StateGroups/index.ctp:12
+#: Template/StateGroups/view.ctp:15
+msgid "New State Group Address"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:13
+#: Template/AddressTypes/edit.ctp:19
+#: Template/AddressTypes/index.ctp:13
+#: Template/AddressTypes/view.ctp:16
+#: Template/TransactionGroupAddaddress/add.ctp:10
+#: Template/TransactionGroupAddaddress/edit.ctp:16
+#: Template/TransactionGroupAddaddress/view.ctp:12
+#: Template/Transactions/add.ctp:19
+#: Template/Transactions/edit.ctp:25
+#: Template/Transactions/index.ctp:19
+#: Template/Transactions/view.ctp:22
+msgid "List Transaction Group Addaddress"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:14
+#: Template/AddressTypes/edit.ctp:20
+#: Template/AddressTypes/index.ctp:14
+#: Template/AddressTypes/view.ctp:17
+#: Template/TransactionGroupAddaddress/index.ctp:10
+#: Template/TransactionGroupAddaddress/view.ctp:13
+#: Template/Transactions/add.ctp:20
+#: Template/Transactions/edit.ctp:26
+#: Template/Transactions/index.ctp:20
+#: Template/Transactions/view.ctp:23
+msgid "New Transaction Group Addaddres"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:20
+msgid "Add Address Type"
+msgstr ""
+
+#: Template/AddressTypes/add.ctp:26
+#: Template/AddressTypes/edit.ctp:32
+#: Template/AdminErrors/add.ctp:28
+#: Template/AdminErrors/edit.ctp:34
+#: Template/OperatorTypes/add.ctp:24
+#: Template/OperatorTypes/edit.ctp:30
+#: Template/Operators/add.ctp:24
+#: Template/Operators/edit.ctp:30
+#: Template/ServerUsers/add.ctp:24
+#: Template/ServerUsers/edit.ctp:32
+#: Template/StateBalances/add.ctp:24
+#: Template/StateBalances/edit.ctp:30
+#: Template/StateCreated/add.ctp:29
+#: Template/StateCreated/edit.ctp:35
+#: Template/StateErrors/add.ctp:27
+#: Template/StateErrors/edit.ctp:33
+#: Template/StateGroupAddresses/add.ctp:26
+#: Template/StateGroupAddresses/edit.ctp:32
+#: Template/StateGroupRelationships/add.ctp:23
+#: Template/StateGroupRelationships/edit.ctp:29
+#: Template/StateGroups/add.ctp:30
+#: Template/StateGroups/edit.ctp:36
+#: Template/StateRelationshipTypes/add.ctp:22
+#: Template/StateRelationshipTypes/edit.ctp:28
+#: Template/StateUsers/add.ctp:32
+#: Template/StateUsers/edit.ctp:38
+#: Template/TransactionCreations/add.ctp:27
+#: Template/TransactionCreations/edit.ctp:33
+#: Template/TransactionGroupAddaddress/add.ctp:26
+#: Template/TransactionGroupAddaddress/edit.ctp:32
+#: Template/TransactionGroupAllowtrades/add.ctp:25
+#: Template/TransactionGroupAllowtrades/edit.ctp:31
+#: Template/TransactionGroupCreates/add.ctp:27
+#: Template/TransactionGroupCreates/edit.ctp:33
+#: Template/TransactionSendCoins/add.ctp:28
+#: Template/TransactionSendCoins/edit.ctp:34
+#: Template/TransactionSignatures/add.ctp:23
+#: Template/TransactionSignatures/edit.ctp:29
+#: Template/TransactionTypes/add.ctp:24
+#: Template/TransactionTypes/edit.ctp:30
+#: Template/Transactions/add.ctp:41
+#: Template/Transactions/edit.ctp:47
+msgid "Submit"
+msgstr ""
+
+#: Template/AddressTypes/edit.ctp:11
+#: Template/AddressTypes/index.ctp:37
+#: Template/AddressTypes/view.ctp:56
+#: Template/AddressTypes/view.ctp:83
+#: Template/AdminErrors/edit.ctp:11
+#: Template/AdminErrors/index.ctp:45
+#: Template/OperatorTypes/edit.ctp:11
+#: Template/OperatorTypes/index.ctp:35
+#: Template/OperatorTypes/view.ctp:54
+#: Template/Operators/edit.ctp:11
+#: Template/Operators/index.ctp:40
+#: Template/ServerUsers/edit.ctp:11
+#: Template/ServerUsers/index.ctp:43
+#: Template/StateBalances/edit.ctp:11
+#: Template/StateBalances/index.ctp:37
+#: Template/StateCreated/edit.ctp:11
+#: Template/StateCreated/index.ctp:45
+#: Template/StateErrors/edit.ctp:11
+#: Template/StateErrors/index.ctp:39
+#: Template/StateErrors/show_for_user.ctp:43
+#: Template/StateGroupAddresses/edit.ctp:11
+#: Template/StateGroupAddresses/index.ctp:37
+#: Template/StateGroupRelationships/edit.ctp:11
+#: Template/StateGroupRelationships/index.ctp:35
+#: Template/StateGroups/edit.ctp:11
+#: Template/StateGroups/index.ctp:41
+#: Template/StateGroups/view.ctp:60
+#: Template/StateGroups/view.ctp:87
+#: Template/StateGroups/view.ctp:116
+#: Template/StateGroups/view.ctp:145
+#: Template/StateRelationshipTypes/edit.ctp:11
+#: Template/StateRelationshipTypes/index.ctp:33
+#: Template/StateUsers/edit.ctp:11
+#: Template/StateUsers/index.ctp:49
+#: Template/StateUsers/view.ctp:62
+#: Template/StateUsers/view.ctp:95
+#: Template/StateUsers/view.ctp:124
+#: Template/StateUsers/view.ctp:157
+#: Template/TransactionCreations/edit.ctp:11
+#: Template/TransactionCreations/index.ctp:41
+#: Template/TransactionGroupAddaddress/edit.ctp:11
+#: Template/TransactionGroupAddaddress/index.ctp:37
+#: Template/TransactionGroupAllowtrades/edit.ctp:11
+#: Template/TransactionGroupAllowtrades/index.ctp:37
+#: Template/TransactionGroupCreates/edit.ctp:11
+#: Template/TransactionGroupCreates/index.ctp:39
+#: Template/TransactionSendCoins/edit.ctp:11
+#: Template/TransactionSendCoins/index.ctp:41
+#: Template/TransactionSignatures/edit.ctp:11
+#: Template/TransactionSignatures/index.ctp:33
+#: Template/TransactionTypes/edit.ctp:11
+#: Template/TransactionTypes/index.ctp:35
+#: Template/TransactionTypes/view.ctp:56
+#: Template/Transactions/edit.ctp:11
+#: Template/Transactions/view.ctp:80
+#: Template/Transactions/view.ctp:109
+#: Template/Transactions/view.ctp:136
+#: Template/Transactions/view.ctp:163
+#: Template/Transactions/view.ctp:192
+#: Template/Transactions/view.ctp:225
+#: Template/Transactions/view.ctp:252
+msgid "Delete"
+msgstr ""
+
+#: Template/AddressTypes/edit.ctp:13
+#: Template/AddressTypes/index.ctp:37
+#: Template/AddressTypes/view.ctp:11
+#: Template/AddressTypes/view.ctp:56
+#: Template/AddressTypes/view.ctp:83
+#: Template/AdminErrors/edit.ctp:13
+#: Template/AdminErrors/index.ctp:45
+#: Template/AdminErrors/view.ctp:11
+#: Template/OperatorTypes/edit.ctp:13
+#: Template/OperatorTypes/index.ctp:35
+#: Template/OperatorTypes/view.ctp:11
+#: Template/OperatorTypes/view.ctp:54
+#: Template/Operators/edit.ctp:13
+#: Template/Operators/index.ctp:40
+#: Template/Operators/view.ctp:11
+#: Template/ServerUsers/edit.ctp:13
+#: Template/ServerUsers/index.ctp:43
+#: Template/ServerUsers/view.ctp:11
+#: Template/StateBalances/edit.ctp:13
+#: Template/StateBalances/index.ctp:37
+#: Template/StateBalances/view.ctp:11
+#: Template/StateCreated/edit.ctp:13
+#: Template/StateCreated/index.ctp:45
+#: Template/StateCreated/view.ctp:11
+#: Template/StateErrors/edit.ctp:13
+#: Template/StateErrors/index.ctp:39
+#: Template/StateErrors/view.ctp:11
+#: Template/StateGroupAddresses/edit.ctp:13
+#: Template/StateGroupAddresses/index.ctp:37
+#: Template/StateGroupAddresses/view.ctp:11
+#: Template/StateGroupRelationships/edit.ctp:13
+#: Template/StateGroupRelationships/index.ctp:35
+#: Template/StateGroupRelationships/view.ctp:11
+#: Template/StateGroups/edit.ctp:13
+#: Template/StateGroups/index.ctp:41
+#: Template/StateGroups/view.ctp:11
+#: Template/StateGroups/view.ctp:60
+#: Template/StateGroups/view.ctp:87
+#: Template/StateGroups/view.ctp:116
+#: Template/StateGroups/view.ctp:145
+#: Template/StateRelationshipTypes/edit.ctp:13
+#: Template/StateRelationshipTypes/index.ctp:33
+#: Template/StateRelationshipTypes/view.ctp:11
+#: Template/StateUsers/edit.ctp:13
+#: Template/StateUsers/index.ctp:49
+#: Template/StateUsers/view.ctp:11
+#: Template/StateUsers/view.ctp:62
+#: Template/StateUsers/view.ctp:95
+#: Template/StateUsers/view.ctp:124
+#: Template/StateUsers/view.ctp:157
+#: Template/TransactionCreations/edit.ctp:13
+#: Template/TransactionCreations/index.ctp:41
+#: Template/TransactionCreations/view.ctp:11
+#: Template/TransactionGroupAddaddress/edit.ctp:13
+#: Template/TransactionGroupAddaddress/index.ctp:37
+#: Template/TransactionGroupAddaddress/view.ctp:11
+#: Template/TransactionGroupAllowtrades/edit.ctp:13
+#: Template/TransactionGroupAllowtrades/index.ctp:37
+#: Template/TransactionGroupAllowtrades/view.ctp:11
+#: Template/TransactionGroupCreates/edit.ctp:13
+#: Template/TransactionGroupCreates/index.ctp:39
+#: Template/TransactionGroupCreates/view.ctp:11
+#: Template/TransactionSendCoins/edit.ctp:13
+#: Template/TransactionSendCoins/index.ctp:41
+#: Template/TransactionSendCoins/view.ctp:11
+#: Template/TransactionSignatures/edit.ctp:13
+#: Template/TransactionSignatures/index.ctp:33
+#: Template/TransactionSignatures/view.ctp:11
+#: Template/TransactionTypes/edit.ctp:13
+#: Template/TransactionTypes/index.ctp:35
+#: Template/TransactionTypes/view.ctp:11
+#: Template/TransactionTypes/view.ctp:56
+#: Template/Transactions/edit.ctp:13
+#: Template/Transactions/view.ctp:11
+#: Template/Transactions/view.ctp:80
+#: Template/Transactions/view.ctp:109
+#: Template/Transactions/view.ctp:136
+#: Template/Transactions/view.ctp:163
+#: Template/Transactions/view.ctp:192
+#: Template/Transactions/view.ctp:225
+#: Template/Transactions/view.ctp:252
+msgid "Are you sure you want to delete # {0}?"
+msgstr ""
+
+#: Template/AddressTypes/edit.ctp:26
+#: Template/AddressTypes/view.ctp:10
+msgid "Edit Address Type"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:10
+#: Template/AddressTypes/view.ctp:13
+#: Template/StateGroupAddresses/add.ctp:14
+#: Template/StateGroupAddresses/edit.ctp:20
+#: Template/StateGroupAddresses/index.ctp:14
+#: Template/StateGroupAddresses/view.ctp:17
+#: Template/TransactionGroupAddaddress/add.ctp:14
+#: Template/TransactionGroupAddaddress/edit.ctp:20
+#: Template/TransactionGroupAddaddress/index.ctp:14
+#: Template/TransactionGroupAddaddress/view.ctp:17
+msgid "New Address Type"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:18
+msgid "Address Types"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:35
+#: Template/AddressTypes/view.ctp:54
+#: Template/AddressTypes/view.ctp:81
+#: Template/AdminErrors/index.ctp:43
+#: Template/OperatorTypes/index.ctp:33
+#: Template/OperatorTypes/view.ctp:52
+#: Template/Operators/index.ctp:38
+#: Template/ServerUsers/index.ctp:41
+#: Template/StateBalances/index.ctp:35
+#: Template/StateCreated/index.ctp:43
+#: Template/StateErrors/index.ctp:37
+#: Template/StateGroupAddresses/index.ctp:35
+#: Template/StateGroupRelationships/index.ctp:33
+#: Template/StateGroups/index.ctp:39
+#: Template/StateGroups/view.ctp:58
+#: Template/StateGroups/view.ctp:85
+#: Template/StateGroups/view.ctp:114
+#: Template/StateGroups/view.ctp:143
+#: Template/StateRelationshipTypes/index.ctp:31
+#: Template/StateUsers/index.ctp:47
+#: Template/StateUsers/view.ctp:60
+#: Template/StateUsers/view.ctp:93
+#: Template/StateUsers/view.ctp:122
+#: Template/StateUsers/view.ctp:155
+#: Template/TransactionCreations/index.ctp:39
+#: Template/TransactionGroupAddaddress/index.ctp:35
+#: Template/TransactionGroupAllowtrades/index.ctp:35
+#: Template/TransactionGroupCreates/index.ctp:37
+#: Template/TransactionSendCoins/index.ctp:39
+#: Template/TransactionSignatures/index.ctp:31
+#: Template/TransactionTypes/index.ctp:33
+#: Template/TransactionTypes/view.ctp:54
+#: Template/Transactions/view.ctp:78
+#: Template/Transactions/view.ctp:107
+#: Template/Transactions/view.ctp:134
+#: Template/Transactions/view.ctp:161
+#: Template/Transactions/view.ctp:190
+#: Template/Transactions/view.ctp:223
+#: Template/Transactions/view.ctp:250
+msgid "View"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:36
+#: Template/AddressTypes/view.ctp:55
+#: Template/AddressTypes/view.ctp:82
+#: Template/AdminErrors/index.ctp:44
+#: Template/OperatorTypes/index.ctp:34
+#: Template/OperatorTypes/view.ctp:53
+#: Template/Operators/index.ctp:39
+#: Template/ServerUsers/index.ctp:42
+#: Template/StateBalances/index.ctp:36
+#: Template/StateCreated/index.ctp:44
+#: Template/StateErrors/index.ctp:38
+#: Template/StateGroupAddresses/index.ctp:36
+#: Template/StateGroupRelationships/index.ctp:34
+#: Template/StateGroups/index.ctp:40
+#: Template/StateGroups/view.ctp:59
+#: Template/StateGroups/view.ctp:86
+#: Template/StateGroups/view.ctp:115
+#: Template/StateGroups/view.ctp:144
+#: Template/StateRelationshipTypes/index.ctp:32
+#: Template/StateUsers/index.ctp:48
+#: Template/StateUsers/view.ctp:61
+#: Template/StateUsers/view.ctp:94
+#: Template/StateUsers/view.ctp:123
+#: Template/StateUsers/view.ctp:156
+#: Template/TransactionCreations/index.ctp:40
+#: Template/TransactionGroupAddaddress/index.ctp:36
+#: Template/TransactionGroupAllowtrades/index.ctp:36
+#: Template/TransactionGroupCreates/index.ctp:38
+#: Template/TransactionSendCoins/index.ctp:40
+#: Template/TransactionSignatures/index.ctp:32
+#: Template/TransactionTypes/index.ctp:34
+#: Template/TransactionTypes/view.ctp:55
+#: Template/Transactions/view.ctp:79
+#: Template/Transactions/view.ctp:108
+#: Template/Transactions/view.ctp:135
+#: Template/Transactions/view.ctp:162
+#: Template/Transactions/view.ctp:191
+#: Template/Transactions/view.ctp:224
+#: Template/Transactions/view.ctp:251
+msgid "Edit"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:45
+#: Template/AdminErrors/index.ctp:53
+#: Template/OperatorTypes/index.ctp:43
+#: Template/Operators/index.ctp:48
+#: Template/ServerUsers/index.ctp:51
+#: Template/StateBalances/index.ctp:45
+#: Template/StateCreated/index.ctp:53
+#: Template/StateErrors/index.ctp:47
+#: Template/StateGroupAddresses/index.ctp:45
+#: Template/StateGroupRelationships/index.ctp:43
+#: Template/StateGroups/index.ctp:49
+#: Template/StateRelationshipTypes/index.ctp:41
+#: Template/StateUsers/index.ctp:57
+#: Template/TransactionCreations/index.ctp:49
+#: Template/TransactionGroupAddaddress/index.ctp:45
+#: Template/TransactionGroupAllowtrades/index.ctp:45
+#: Template/TransactionGroupCreates/index.ctp:47
+#: Template/TransactionSendCoins/index.ctp:49
+#: Template/TransactionSignatures/index.ctp:41
+#: Template/TransactionTypes/index.ctp:43
+#: Template/Transactions/index.ctp:56
+msgid "first"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:46
+#: Template/AdminErrors/index.ctp:54
+#: Template/OperatorTypes/index.ctp:44
+#: Template/Operators/index.ctp:49
+#: Template/ServerUsers/index.ctp:52
+#: Template/StateBalances/index.ctp:46
+#: Template/StateCreated/index.ctp:54
+#: Template/StateErrors/index.ctp:48
+#: Template/StateGroupAddresses/index.ctp:46
+#: Template/StateGroupRelationships/index.ctp:44
+#: Template/StateGroups/index.ctp:50
+#: Template/StateRelationshipTypes/index.ctp:42
+#: Template/StateUsers/index.ctp:58
+#: Template/TransactionCreations/index.ctp:50
+#: Template/TransactionGroupAddaddress/index.ctp:46
+#: Template/TransactionGroupAllowtrades/index.ctp:46
+#: Template/TransactionGroupCreates/index.ctp:48
+#: Template/TransactionSendCoins/index.ctp:50
+#: Template/TransactionSignatures/index.ctp:42
+#: Template/TransactionTypes/index.ctp:44
+#: Template/Transactions/index.ctp:57
+msgid "previous"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:48
+#: Template/AdminErrors/index.ctp:56
+#: Template/OperatorTypes/index.ctp:46
+#: Template/Operators/index.ctp:51
+#: Template/ServerUsers/index.ctp:54
+#: Template/StateBalances/index.ctp:48
+#: Template/StateCreated/index.ctp:56
+#: Template/StateErrors/index.ctp:50
+#: Template/StateGroupAddresses/index.ctp:48
+#: Template/StateGroupRelationships/index.ctp:46
+#: Template/StateGroups/index.ctp:52
+#: Template/StateRelationshipTypes/index.ctp:44
+#: Template/StateUsers/index.ctp:60
+#: Template/TransactionCreations/index.ctp:52
+#: Template/TransactionGroupAddaddress/index.ctp:48
+#: Template/TransactionGroupAllowtrades/index.ctp:48
+#: Template/TransactionGroupCreates/index.ctp:50
+#: Template/TransactionSendCoins/index.ctp:52
+#: Template/TransactionSignatures/index.ctp:44
+#: Template/TransactionTypes/index.ctp:46
+#: Template/Transactions/index.ctp:59
+msgid "next"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:49
+#: Template/AdminErrors/index.ctp:57
+#: Template/OperatorTypes/index.ctp:47
+#: Template/Operators/index.ctp:52
+#: Template/ServerUsers/index.ctp:55
+#: Template/StateBalances/index.ctp:49
+#: Template/StateCreated/index.ctp:57
+#: Template/StateErrors/index.ctp:51
+#: Template/StateGroupAddresses/index.ctp:49
+#: Template/StateGroupRelationships/index.ctp:47
+#: Template/StateGroups/index.ctp:53
+#: Template/StateRelationshipTypes/index.ctp:45
+#: Template/StateUsers/index.ctp:61
+#: Template/TransactionCreations/index.ctp:53
+#: Template/TransactionGroupAddaddress/index.ctp:49
+#: Template/TransactionGroupAllowtrades/index.ctp:49
+#: Template/TransactionGroupCreates/index.ctp:51
+#: Template/TransactionSendCoins/index.ctp:53
+#: Template/TransactionSignatures/index.ctp:45
+#: Template/TransactionTypes/index.ctp:47
+#: Template/Transactions/index.ctp:60
+msgid "last"
+msgstr ""
+
+#: Template/AddressTypes/index.ctp:51
+#: Template/AdminErrors/index.ctp:59
+#: Template/OperatorTypes/index.ctp:49
+#: Template/Operators/index.ctp:54
+#: Template/ServerUsers/index.ctp:57
+#: Template/StateBalances/index.ctp:51
+#: Template/StateCreated/index.ctp:59
+#: Template/StateErrors/index.ctp:53
+#: Template/StateGroupAddresses/index.ctp:51
+#: Template/StateGroupRelationships/index.ctp:49
+#: Template/StateGroups/index.ctp:55
+#: Template/StateRelationshipTypes/index.ctp:47
+#: Template/StateUsers/index.ctp:63
+#: Template/TransactionCreations/index.ctp:55
+#: Template/TransactionGroupAddaddress/index.ctp:51
+#: Template/TransactionGroupAllowtrades/index.ctp:51
+#: Template/TransactionGroupCreates/index.ctp:53
+#: Template/TransactionSendCoins/index.ctp:55
+#: Template/TransactionSignatures/index.ctp:47
+#: Template/TransactionTypes/index.ctp:49
+#: Template/Transactions/index.ctp:62
+msgid "Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:11
+msgid "Delete Address Type"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:24
+#: Template/OperatorTypes/view.ctp:22
+#: Template/StateGroups/view.ctp:28
+#: Template/StateGroups/view.ctp:103
+#: Template/StateRelationshipTypes/view.ctp:20
+#: Template/TransactionGroupCreates/view.ctp:32
+#: Template/TransactionTypes/view.ctp:22
+#: Template/Transactions/view.ctp:179
+msgid "Name"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:28
+#: Template/OperatorTypes/view.ctp:26
+#: Template/StateRelationshipTypes/view.ctp:24
+#: Template/TransactionTypes/view.ctp:26
+msgid "Text"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:32
+#: Template/AddressTypes/view.ctp:41
+#: Template/AddressTypes/view.ctp:68
+#: Template/AdminErrors/view.ctp:46
+#: Template/OperatorTypes/view.ctp:30
+#: Template/OperatorTypes/view.ctp:39
+#: Template/Operators/view.ctp:32
+#: Template/ServerUsers/view.ctp:36
+#: Template/StateBalances/view.ctp:26
+#: Template/StateCreated/view.ctp:32
+#: Template/StateErrors/view.ctp:32
+#: Template/StateGroupAddresses/view.ctp:32
+#: Template/StateGroupRelationships/view.ctp:20
+#: Template/StateGroups/view.ctp:32
+#: Template/StateGroups/view.ctp:45
+#: Template/StateGroups/view.ctp:72
+#: Template/StateGroups/view.ctp:99
+#: Template/StateGroups/view.ctp:128
+#: Template/StateRelationshipTypes/view.ctp:28
+#: Template/StateUsers/view.ctp:34
+#: Template/StateUsers/view.ctp:47
+#: Template/StateUsers/view.ctp:74
+#: Template/StateUsers/view.ctp:107
+#: Template/StateUsers/view.ctp:136
+#: Template/TransactionCreations/view.ctp:32
+#: Template/TransactionGroupAddaddress/view.ctp:32
+#: Template/TransactionGroupAllowtrades/view.ctp:26
+#: Template/TransactionGroupCreates/view.ctp:36
+#: Template/TransactionSendCoins/view.ctp:32
+#: Template/TransactionSignatures/view.ctp:26
+#: Template/TransactionTypes/view.ctp:30
+#: Template/TransactionTypes/view.ctp:39
+#: Template/Transactions/view.ctp:46
+#: Template/Transactions/view.ctp:59
+#: Template/Transactions/view.ctp:92
+#: Template/Transactions/view.ctp:121
+#: Template/Transactions/view.ctp:148
+#: Template/Transactions/view.ctp:175
+#: Template/Transactions/view.ctp:204
+#: Template/Transactions/view.ctp:237
+msgid "Id"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:37
+#: Template/StateGroups/view.ctp:41
+msgid "Related State Group Addresses"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:42
+#: Template/StateGroups/view.ctp:46
+#: Template/StateGroups/view.ctp:74
+#: Template/StateGroups/view.ctp:102
+#: Template/StateGroups/view.ctp:129
+#: Template/TransactionTypes/view.ctp:40
+#: Template/Transactions/view.ctp:178
+msgid "State Group Id"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:43
+#: Template/AddressTypes/view.ctp:71
+#: Template/StateGroups/view.ctp:47
+#: Template/StateGroups/view.ctp:75
+#: Template/Transactions/view.ctp:124
+msgid "Public Key"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:44
+#: Template/AddressTypes/view.ctp:70
+#: Template/StateGroups/view.ctp:48
+#: Template/Transactions/view.ctp:123
+msgid "Address Type Id"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:64
+#: Template/Transactions/view.ctp:117
+msgid "Related Transaction Group Addaddress"
+msgstr ""
+
+#: Template/AddressTypes/view.ctp:69
+#: Template/StateGroups/view.ctp:100
+#: Template/StateUsers/view.ctp:75
+#: Template/StateUsers/view.ctp:108
+#: Template/StateUsers/view.ctp:137
+#: Template/Transactions/view.ctp:60
+#: Template/Transactions/view.ctp:93
+#: Template/Transactions/view.ctp:122
+#: Template/Transactions/view.ctp:149
+#: Template/Transactions/view.ctp:176
+#: Template/Transactions/view.ctp:205
+#: Template/Transactions/view.ctp:238
+msgid "Transaction Id"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:10
+#: Template/AdminErrors/edit.ctp:16
+#: Template/AdminErrors/view.ctp:12
+msgid "List Admin Errors"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:11
+#: Template/AdminErrors/edit.ctp:17
+#: Template/AdminErrors/index.ctp:11
+#: Template/AdminErrors/view.ctp:14
+#: Template/StateBalances/add.ctp:11
+#: Template/StateBalances/edit.ctp:17
+#: Template/StateBalances/index.ctp:11
+#: Template/StateBalances/view.ctp:14
+#: Template/StateCreated/add.ctp:13
+#: Template/StateCreated/edit.ctp:19
+#: Template/StateCreated/index.ctp:13
+#: Template/StateCreated/view.ctp:16
+#: Template/StateErrors/add.ctp:11
+#: Template/StateErrors/edit.ctp:17
+#: Template/StateErrors/index.ctp:11
+#: Template/StateErrors/view.ctp:14
+#: Template/StateGroups/add.ctp:13
+#: Template/StateGroups/edit.ctp:19
+#: Template/StateGroups/index.ctp:13
+#: Template/StateGroups/view.ctp:16
+#: Template/StateUsers/add.ctp:10
+#: Template/StateUsers/edit.ctp:16
+#: Template/StateUsers/view.ctp:12
+#: Template/TransactionCreations/add.ctp:13
+#: Template/TransactionCreations/edit.ctp:19
+#: Template/TransactionCreations/index.ctp:13
+#: Template/TransactionCreations/view.ctp:16
+#: Template/TransactionSendCoins/add.ctp:13
+#: Template/TransactionSendCoins/edit.ctp:19
+#: Template/TransactionSendCoins/index.ctp:13
+#: Template/TransactionSendCoins/view.ctp:16
+msgid "List State Users"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:12
+#: Template/AdminErrors/edit.ctp:18
+#: Template/AdminErrors/index.ctp:12
+#: Template/AdminErrors/view.ctp:15
+#: Template/StateBalances/add.ctp:12
+#: Template/StateBalances/edit.ctp:18
+#: Template/StateBalances/index.ctp:12
+#: Template/StateBalances/view.ctp:15
+#: Template/StateCreated/add.ctp:14
+#: Template/StateCreated/edit.ctp:20
+#: Template/StateCreated/index.ctp:14
+#: Template/StateCreated/view.ctp:17
+#: Template/StateErrors/add.ctp:12
+#: Template/StateErrors/edit.ctp:18
+#: Template/StateErrors/index.ctp:12
+#: Template/StateErrors/view.ctp:15
+#: Template/StateGroups/add.ctp:14
+#: Template/StateGroups/edit.ctp:20
+#: Template/StateGroups/index.ctp:14
+#: Template/StateGroups/view.ctp:17
+#: Template/StateUsers/index.ctp:10
+#: Template/StateUsers/view.ctp:13
+#: Template/TransactionCreations/add.ctp:14
+#: Template/TransactionCreations/edit.ctp:20
+#: Template/TransactionCreations/index.ctp:14
+#: Template/TransactionCreations/view.ctp:17
+#: Template/TransactionSendCoins/add.ctp:14
+#: Template/TransactionSendCoins/edit.ctp:20
+#: Template/TransactionSendCoins/index.ctp:14
+#: Template/TransactionSendCoins/view.ctp:17
+msgid "New State User"
+msgstr ""
+
+#: Template/AdminErrors/add.ctp:18
+msgid "Add Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/edit.ctp:24
+#: Template/AdminErrors/view.ctp:10
+msgid "Edit Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/index.ctp:10
+#: Template/AdminErrors/view.ctp:13
+msgid "New Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/index.ctp:16
+msgid "Admin Errors"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:11
+msgid "Delete Admin Error"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:22
+#: Template/StateBalances/view.ctp:22
+#: Template/StateCreated/view.ctp:28
+#: Template/StateErrors/view.ctp:24
+#: Template/TransactionCreations/view.ctp:28
+#: Template/TransactionSendCoins/view.ctp:28
+msgid "State User"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:26
+msgid "Controller"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:30
+msgid "Action"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:34
+msgid "State"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:38
+msgid "Msg"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:42
+msgid "Details"
+msgstr ""
+
+#: Template/AdminErrors/view.ctp:50
+#: Template/ServerUsers/view.ctp:44
+#: Template/StateCreated/view.ctp:48
+#: Template/StateErrors/view.ctp:36
+#: Template/StateUsers/view.ctp:79
+#: Template/Transactions/view.ctp:64
+msgid "Created"
+msgstr ""
+
+#: Template/Dashboard/error_http_request.ctp:9
+msgid "Error, Please try again"
+msgstr ""
+
+#: Template/Dashboard/error_http_request.ctp:13
+#: Template/Layout/error.ctp:43
+msgid "Back"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:12
+#: Template/Dashboard/server_index.ctp:9
+msgid "Willkommen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:22
+msgid "übersicht"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:27
+msgid "überweisen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:34
+msgid "löschen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:40
+#: Template/Dashboard/server_index.ctp:16
+msgid "einzeln schöpfen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:45
+#: Template/Dashboard/server_index.ctp:21
+msgid "viele schöpfen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:51
+#: Template/Dashboard/server_index.ctp:27
+#: Template/Element/navi_header.ctp:33
+msgid "Fehler"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:59
+#: Template/StateUsers/search.ctp:9
+msgid "Benutzer suchen"
+msgstr ""
+
+#: Template/Dashboard/index.ctp:64
+msgid "Benutzer hinzufügen"
+msgstr ""
+
+#: Template/Element/navi.ctp:25
+#: Template/StateBalances/overview.ctp:8
+msgid "Kontoübersicht"
+msgstr ""
+
+#: Template/Element/navi.ctp:35
+#: Template/Layout/frontend.ctp:69
+#: Template/Layout/frontend_ripple.ctp:105
+msgid "Startseite"
+msgstr ""
+
+#: Template/Element/navi.ctp:36
+#: Template/TransactionSendCoins/create.ctp:9
+msgid "Überweisung"
+msgstr ""
+
+#: Template/Element/navi.ctp:44
+msgid "Abmelden"
+msgstr ""
+
+#: Template/Element/navi_header.ctp:38
+msgid "Transaktionen sind noch zu unterzeichnen"
+msgstr ""
+
+#: Template/Element/Flash/success.ctp:9
+msgid "Info:"
+msgstr ""
+
+#: Template/Email/text/notification_creation.ctp:8
+msgid "Gradido Schöpfung"
+msgstr ""
+
+#: Template/Email/text/notification_creation.ctp:9
+#: Template/Email/text/notification_transfer.ctp:11
+msgid "Hallo"
+msgstr ""
+
+#: Template/Email/text/notification_creation.ctp:11
+msgid "Für dich wurden soeben {0} geschöpft."
+msgstr ""
+
+#: Template/Email/text/notification_creation.ctp:16
+msgid "Bitte antworte nicht auf diese E-Mail!"
+msgstr ""
+
+#: Template/Email/text/notification_creation.ctp:18
+#: Template/Email/text/notification_transfer.ctp:20
+msgid "Mit freundlichen Grüßen"
+msgstr ""
+
+#: Template/Email/text/notification_transfer.ctp:8
+msgid "Gradido Überweisung"
+msgstr ""
+
+#: Template/Email/text/notification_transfer.ctp:13
+msgid "Du hast soeben {0} von {1} erhalten."
+msgstr ""
+
+#: Template/Email/text/notification_transfer.ctp:14
+msgid "{0} schreibt:"
+msgstr ""
+
+#: Template/Email/text/notification_transfer.ctp:18
+msgid "Du kannst {0} eine Nachricht schreiben, indem du auf diese E-Mail antwortest"
+msgstr ""
+
+#: Template/Layout/default.ctp:45
+#: Template/Layout/frontend.ctp:78
+msgid "Logout"
+msgstr ""
+
+#: Template/Layout/error.ctp:35
+msgid "Error"
+msgstr ""
+
+#: Template/Layout/frontend.ctp:60
+msgid "Fehler "
+msgstr ""
+
+#: Template/Layout/frontend.ctp:70
+msgid "Kontostand"
+msgstr ""
+
+#: Template/Layout/frontend.ctp:74
+msgid "Transaktionen unterzeichnen"
+msgstr ""
+
+#: Template/Layout/frontend_ripple.ctp:44
+msgid "Community Server in Entwicklung"
+msgstr ""
+
+#: Template/Layout/frontend_ripple.ctp:121
+msgid "Datenschutzerklärung"
+msgstr ""
+
+#: Template/Layout/frontend_ripple.ctp:122
+msgid "Impressum"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:10
+#: Template/OperatorTypes/edit.ctp:16
+#: Template/OperatorTypes/view.ctp:12
+msgid "List Operator Types"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:11
+#: Template/OperatorTypes/edit.ctp:17
+#: Template/OperatorTypes/index.ctp:11
+#: Template/OperatorTypes/view.ctp:14
+#: Template/Operators/add.ctp:10
+#: Template/Operators/edit.ctp:16
+#: Template/Operators/view.ctp:12
+msgid "List Operators"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:12
+#: Template/OperatorTypes/edit.ctp:18
+#: Template/OperatorTypes/index.ctp:12
+#: Template/OperatorTypes/view.ctp:15
+#: Template/Operators/index.ctp:10
+#: Template/Operators/view.ctp:13
+msgid "New Operator"
+msgstr ""
+
+#: Template/OperatorTypes/add.ctp:18
+msgid "Add Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/edit.ctp:24
+#: Template/OperatorTypes/view.ctp:10
+msgid "Edit Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/index.ctp:10
+#: Template/OperatorTypes/view.ctp:13
+msgid "New Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/index.ctp:16
+msgid "Operator Types"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:11
+msgid "Delete Operator Type"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:35
+msgid "Related Operators"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:40
+#: Template/Operators/view.ctp:20
+#: Template/ServerUsers/view.ctp:20
+msgid "Username"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:41
+#: Template/Operators/view.ctp:36
+msgid "Operator Type Id"
+msgstr ""
+
+#: Template/OperatorTypes/view.ctp:42
+#: Template/Operators/view.ctp:28
+msgid "Data Base64"
+msgstr ""
+
+#: Template/Operators/add.ctp:16
+msgid "Add Operator"
+msgstr ""
+
+#: Template/Operators/edit.ctp:22
+#: Template/Operators/view.ctp:10
+msgid "Edit Operator"
+msgstr ""
+
+#: Template/Operators/index.ctp:14
+msgid "Operators"
+msgstr ""
+
+#: Template/Operators/view.ctp:11
+msgid "Delete Operator"
+msgstr ""
+
+#: Template/Operators/view.ctp:24
+msgid "User Pubkey"
+msgstr ""
+
+#: Template/ServerUsers/add.ctp:10
+#: Template/ServerUsers/edit.ctp:16
+#: Template/ServerUsers/view.ctp:12
+msgid "List Server Users"
+msgstr ""
+
+#: Template/ServerUsers/add.ctp:16
+msgid "Add Server User"
+msgstr ""
+
+#: Template/ServerUsers/edit.ctp:22
+#: Template/ServerUsers/view.ctp:10
+msgid "Edit Server User"
+msgstr ""
+
+#: Template/ServerUsers/index.ctp:10
+#: Template/ServerUsers/view.ctp:13
+msgid "New Server User"
+msgstr ""
+
+#: Template/ServerUsers/index.ctp:14
+msgid "Server Users"
+msgstr ""
+
+#: Template/ServerUsers/login.ctp:13
+msgid "Please enter your username and password"
+msgstr ""
+
+#: Template/ServerUsers/login.ctp:17
+msgid "Login"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:11
+msgid "Delete Server User"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:24
+msgid "Password"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:28
+msgid "Email"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:32
+msgid "Role"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:40
+msgid "Last Login"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:48
+#: Template/StateBalances/view.ctp:34
+#: Template/StateUsers/view.ctp:49
+msgid "Modified"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:52
+msgid "Activated"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:53
+#: Template/TransactionGroupAllowtrades/view.ctp:35
+msgid "Yes"
+msgstr ""
+
+#: Template/ServerUsers/view.ctp:53
+#: Template/TransactionGroupAllowtrades/view.ctp:35
+msgid "No"
+msgstr ""
+
+#: Template/StateBalances/add.ctp:10
+#: Template/StateBalances/edit.ctp:16
+#: Template/StateBalances/view.ctp:12
+#: Template/StateUsers/add.ctp:13
+#: Template/StateUsers/edit.ctp:19
+#: Template/StateUsers/index.ctp:13
+#: Template/StateUsers/view.ctp:16
+msgid "List State Balances"
+msgstr ""
+
+#: Template/StateBalances/add.ctp:18
+msgid "Add State Balance"
+msgstr ""
+
+#: Template/StateBalances/edit.ctp:24
+#: Template/StateBalances/view.ctp:10
+msgid "Edit State Balance"
+msgstr ""
+
+#: Template/StateBalances/index.ctp:10
+#: Template/StateBalances/view.ctp:13
+#: Template/StateUsers/add.ctp:14
+#: Template/StateUsers/edit.ctp:20
+#: Template/StateUsers/index.ctp:14
+#: Template/StateUsers/view.ctp:17
+msgid "New State Balance"
+msgstr ""
+
+#: Template/StateBalances/index.ctp:16
+msgid "State Balances"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:15
+msgid "Aktueller Kontostand: "
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:42
+msgid "Absender"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:43
+#: Template/TransactionSendCoins/create.ctp:30
+msgid "Verwendungszweck"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:44
+msgid "Datum"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:45
+msgid "Betrag"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:46
+msgid "Transaktions Nr."
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:46
+msgid "Nr"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:79
+msgid "Geschöpft"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:81
+msgid "Gesendet"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:83
+msgid "Empfangen"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:118
+#: Template/TransactionCreations/create_multi.ctp:167
+msgid "Laufende Transaktion"
+msgstr ""
+
+#: Template/StateBalances/overview.ctp:120
+#: Template/TransactionCreations/create_multi.ctp:169
+msgid "Laufende Transaktionen"
+msgstr ""
+
+#: Template/StateBalances/view.ctp:11
+msgid "Delete State Balance"
+msgstr ""
+
+#: Template/StateBalances/view.ctp:30
+#: Template/StateUsers/view.ctp:50
+#: Template/StateUsers/view.ctp:110
+#: Template/StateUsers/view.ctp:141
+#: Template/TransactionCreations/view.ctp:36
+#: Template/TransactionSendCoins/view.ctp:36
+#: Template/Transactions/view.ctp:95
+#: Template/Transactions/view.ctp:209
+msgid "Amount"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:10
+#: Template/StateCreated/edit.ctp:16
+#: Template/StateCreated/view.ctp:12
+#: Template/StateUsers/add.ctp:15
+#: Template/StateUsers/edit.ctp:21
+#: Template/StateUsers/index.ctp:15
+#: Template/StateUsers/view.ctp:18
+#: Template/Transactions/add.ctp:15
+#: Template/Transactions/edit.ctp:21
+#: Template/Transactions/index.ctp:15
+#: Template/Transactions/view.ctp:18
+msgid "List State Created"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:11
+#: Template/StateCreated/edit.ctp:17
+#: Template/StateCreated/index.ctp:11
+#: Template/StateCreated/view.ctp:14
+#: Template/StateGroups/add.ctp:17
+#: Template/StateGroups/edit.ctp:23
+#: Template/StateGroups/index.ctp:17
+#: Template/StateGroups/view.ctp:20
+#: Template/TransactionCreations/add.ctp:11
+#: Template/TransactionCreations/edit.ctp:17
+#: Template/TransactionCreations/index.ctp:11
+#: Template/TransactionCreations/view.ctp:14
+#: Template/TransactionGroupAddaddress/add.ctp:11
+#: Template/TransactionGroupAddaddress/edit.ctp:17
+#: Template/TransactionGroupAddaddress/index.ctp:11
+#: Template/TransactionGroupAddaddress/view.ctp:14
+#: Template/TransactionGroupAllowtrades/add.ctp:11
+#: Template/TransactionGroupAllowtrades/edit.ctp:17
+#: Template/TransactionGroupAllowtrades/index.ctp:11
+#: Template/TransactionGroupAllowtrades/view.ctp:14
+#: Template/TransactionGroupCreates/add.ctp:11
+#: Template/TransactionGroupCreates/edit.ctp:17
+#: Template/TransactionGroupCreates/index.ctp:11
+#: Template/TransactionGroupCreates/view.ctp:14
+#: Template/TransactionSendCoins/add.ctp:11
+#: Template/TransactionSendCoins/edit.ctp:17
+#: Template/TransactionSendCoins/index.ctp:11
+#: Template/TransactionSendCoins/view.ctp:14
+#: Template/TransactionSignatures/add.ctp:11
+#: Template/TransactionSignatures/edit.ctp:17
+#: Template/TransactionSignatures/index.ctp:11
+#: Template/TransactionSignatures/view.ctp:14
+#: Template/TransactionTypes/add.ctp:11
+#: Template/TransactionTypes/edit.ctp:17
+#: Template/TransactionTypes/index.ctp:11
+#: Template/TransactionTypes/view.ctp:14
+#: Template/Transactions/add.ctp:10
+#: Template/Transactions/edit.ctp:16
+#: Template/Transactions/view.ctp:12
+msgid "List Transactions"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:12
+#: Template/StateCreated/edit.ctp:18
+#: Template/StateCreated/index.ctp:12
+#: Template/StateCreated/view.ctp:15
+#: Template/StateGroups/add.ctp:18
+#: Template/StateGroups/edit.ctp:24
+#: Template/StateGroups/index.ctp:18
+#: Template/StateGroups/view.ctp:21
+#: Template/TransactionCreations/add.ctp:12
+#: Template/TransactionCreations/edit.ctp:18
+#: Template/TransactionCreations/index.ctp:12
+#: Template/TransactionCreations/view.ctp:15
+#: Template/TransactionGroupAddaddress/add.ctp:12
+#: Template/TransactionGroupAddaddress/edit.ctp:18
+#: Template/TransactionGroupAddaddress/index.ctp:12
+#: Template/TransactionGroupAddaddress/view.ctp:15
+#: Template/TransactionGroupAllowtrades/add.ctp:12
+#: Template/TransactionGroupAllowtrades/edit.ctp:18
+#: Template/TransactionGroupAllowtrades/index.ctp:12
+#: Template/TransactionGroupAllowtrades/view.ctp:15
+#: Template/TransactionGroupCreates/add.ctp:12
+#: Template/TransactionGroupCreates/edit.ctp:18
+#: Template/TransactionGroupCreates/index.ctp:12
+#: Template/TransactionGroupCreates/view.ctp:15
+#: Template/TransactionSendCoins/add.ctp:12
+#: Template/TransactionSendCoins/edit.ctp:18
+#: Template/TransactionSendCoins/index.ctp:12
+#: Template/TransactionSendCoins/view.ctp:15
+#: Template/TransactionSignatures/add.ctp:12
+#: Template/TransactionSignatures/edit.ctp:18
+#: Template/TransactionSignatures/index.ctp:12
+#: Template/TransactionSignatures/view.ctp:15
+#: Template/TransactionTypes/add.ctp:12
+#: Template/TransactionTypes/edit.ctp:18
+#: Template/TransactionTypes/index.ctp:12
+#: Template/TransactionTypes/view.ctp:15
+#: Template/Transactions/index.ctp:10
+#: Template/Transactions/view.ctp:13
+msgid "New Transaction"
+msgstr ""
+
+#: Template/StateCreated/add.ctp:20
+msgid "Add State Created"
+msgstr ""
+
+#: Template/StateCreated/edit.ctp:26
+#: Template/StateCreated/view.ctp:10
+msgid "Edit State Created"
+msgstr ""
+
+#: Template/StateCreated/index.ctp:10
+#: Template/StateCreated/view.ctp:13
+#: Template/StateUsers/add.ctp:16
+#: Template/StateUsers/edit.ctp:22
+#: Template/StateUsers/index.ctp:16
+#: Template/StateUsers/view.ctp:19
+#: Template/Transactions/add.ctp:16
+#: Template/Transactions/edit.ctp:22
+#: Template/Transactions/index.ctp:16
+#: Template/Transactions/view.ctp:19
+msgid "New State Created"
+msgstr ""
+
+#: Template/StateCreated/index.ctp:18
+msgid "State Created"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:11
+msgid "Delete State Created"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:24
+#: Template/TransactionCreations/view.ctp:24
+#: Template/TransactionGroupAddaddress/view.ctp:24
+#: Template/TransactionGroupAllowtrades/view.ctp:22
+#: Template/TransactionGroupCreates/view.ctp:24
+#: Template/TransactionSendCoins/view.ctp:24
+#: Template/TransactionSignatures/view.ctp:22
+msgid "Transaction"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:36
+#: Template/StateUsers/view.ctp:76
+#: Template/Transactions/view.ctp:61
+msgid "Month"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:40
+#: Template/StateUsers/view.ctp:77
+#: Template/Transactions/view.ctp:62
+msgid "Year"
+msgstr ""
+
+#: Template/StateCreated/view.ctp:44
+#: Template/StateUsers/view.ctp:80
+#: Template/Transactions/view.ctp:65
+msgid "Short Ident Hash"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:10
+#: Template/StateErrors/edit.ctp:16
+#: Template/StateErrors/view.ctp:12
+msgid "List State Errors"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:13
+#: Template/StateErrors/edit.ctp:19
+#: Template/StateErrors/index.ctp:13
+#: Template/StateErrors/view.ctp:16
+#: Template/TransactionTypes/add.ctp:10
+#: Template/TransactionTypes/edit.ctp:16
+#: Template/TransactionTypes/view.ctp:12
+#: Template/Transactions/add.ctp:13
+#: Template/Transactions/edit.ctp:19
+#: Template/Transactions/index.ctp:13
+#: Template/Transactions/view.ctp:16
+msgid "List Transaction Types"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:14
+#: Template/StateErrors/edit.ctp:20
+#: Template/StateErrors/index.ctp:14
+#: Template/StateErrors/view.ctp:17
+#: Template/TransactionTypes/index.ctp:10
+#: Template/TransactionTypes/view.ctp:13
+#: Template/Transactions/add.ctp:14
+#: Template/Transactions/edit.ctp:20
+#: Template/Transactions/index.ctp:14
+#: Template/Transactions/view.ctp:17
+msgid "New Transaction Type"
+msgstr ""
+
+#: Template/StateErrors/add.ctp:20
+msgid "Add State Error"
+msgstr ""
+
+#: Template/StateErrors/edit.ctp:26
+#: Template/StateErrors/view.ctp:10
+msgid "Edit State Error"
+msgstr ""
+
+#: Template/StateErrors/index.ctp:10
+#: Template/StateErrors/view.ctp:13
+msgid "New State Error"
+msgstr ""
+
+#: Template/StateErrors/index.ctp:18
+msgid "State Errors"
+msgstr ""
+
+#: Template/StateErrors/show_for_user.ctp:9
+msgid "Fehlermeldungen"
+msgstr ""
+
+#: Template/StateErrors/view.ctp:11
+msgid "Delete State Error"
+msgstr ""
+
+#: Template/StateErrors/view.ctp:28
+#: Template/Transactions/view.ctp:42
+msgid "Transaction Type"
+msgstr ""
+
+#: Template/StateErrors/view.ctp:41
+msgid "Message Json"
+msgstr ""
+
+#: Template/StateGroupAddresses/add.ctp:11
+#: Template/StateGroupAddresses/edit.ctp:17
+#: Template/StateGroupAddresses/index.ctp:11
+#: Template/StateGroupAddresses/view.ctp:14
+#: Template/StateGroups/add.ctp:10
+#: Template/StateGroups/edit.ctp:16
+#: Template/StateGroups/view.ctp:12
+#: Template/StateUsers/add.ctp:11
+#: Template/StateUsers/edit.ctp:17
+#: Template/StateUsers/index.ctp:11
+#: Template/StateUsers/view.ctp:14
+#: Template/TransactionGroupCreates/add.ctp:13
+#: Template/TransactionGroupCreates/edit.ctp:19
+#: Template/TransactionGroupCreates/index.ctp:13
+#: Template/TransactionGroupCreates/view.ctp:16
+#: Template/Transactions/add.ctp:11
+#: Template/Transactions/edit.ctp:17
+#: Template/Transactions/index.ctp:11
+#: Template/Transactions/view.ctp:14
+msgid "List State Groups"
+msgstr ""
+
+#: Template/StateGroupAddresses/add.ctp:12
+#: Template/StateGroupAddresses/edit.ctp:18
+#: Template/StateGroupAddresses/index.ctp:12
+#: Template/StateGroupAddresses/view.ctp:15
+#: Template/StateGroups/index.ctp:10
+#: Template/StateGroups/view.ctp:13
+#: Template/StateUsers/add.ctp:12
+#: Template/StateUsers/edit.ctp:18
+#: Template/StateUsers/index.ctp:12
+#: Template/StateUsers/view.ctp:15
+#: Template/TransactionGroupCreates/add.ctp:14
+#: Template/TransactionGroupCreates/edit.ctp:20
+#: Template/TransactionGroupCreates/index.ctp:14
+#: Template/TransactionGroupCreates/view.ctp:17
+#: Template/Transactions/add.ctp:12
+#: Template/Transactions/edit.ctp:18
+#: Template/Transactions/index.ctp:12
+#: Template/Transactions/view.ctp:15
+msgid "New State Group"
+msgstr ""
+
+#: Template/StateGroupAddresses/add.ctp:20
+msgid "Add State Group Address"
+msgstr ""
+
+#: Template/StateGroupAddresses/edit.ctp:26
+#: Template/StateGroupAddresses/view.ctp:10
+msgid "Edit State Group Address"
+msgstr ""
+
+#: Template/StateGroupAddresses/index.ctp:18
+msgid "State Group Addresses"
+msgstr ""
+
+#: Template/StateGroupAddresses/view.ctp:11
+msgid "Delete State Group Address"
+msgstr ""
+
+#: Template/StateGroupAddresses/view.ctp:24
+#: Template/StateUsers/view.ctp:30
+#: Template/TransactionGroupCreates/view.ctp:28
+#: Template/Transactions/view.ctp:38
+msgid "State Group"
+msgstr ""
+
+#: Template/StateGroupAddresses/view.ctp:28
+#: Template/TransactionGroupAddaddress/view.ctp:28
+msgid "Address Type"
+msgstr ""
+
+#: Template/StateGroupRelationships/add.ctp:10
+#: Template/StateGroupRelationships/edit.ctp:16
+#: Template/StateGroupRelationships/view.ctp:12
+msgid "List State Group Relationships"
+msgstr ""
+
+#: Template/StateGroupRelationships/add.ctp:16
+msgid "Add State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/edit.ctp:22
+#: Template/StateGroupRelationships/view.ctp:10
+msgid "Edit State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/index.ctp:10
+#: Template/StateGroupRelationships/view.ctp:13
+msgid "New State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/index.ctp:14
+msgid "State Group Relationships"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:11
+msgid "Delete State Group Relationship"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:24
+msgid "State Group1 Id"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:28
+msgid "State Group2 Id"
+msgstr ""
+
+#: Template/StateGroupRelationships/view.ctp:32
+msgid "State Relationship Id"
+msgstr ""
+
+#: Template/StateGroups/add.ctp:15
+#: Template/StateGroups/edit.ctp:21
+#: Template/StateGroups/index.ctp:15
+#: Template/StateGroups/view.ctp:18
+#: Template/TransactionGroupCreates/add.ctp:10
+#: Template/TransactionGroupCreates/edit.ctp:16
+#: Template/TransactionGroupCreates/view.ctp:12
+#: Template/Transactions/add.ctp:23
+#: Template/Transactions/edit.ctp:29
+#: Template/Transactions/index.ctp:23
+#: Template/Transactions/view.ctp:26
+msgid "List Transaction Group Creates"
+msgstr ""
+
+#: Template/StateGroups/add.ctp:16
+#: Template/StateGroups/edit.ctp:22
+#: Template/StateGroups/index.ctp:16
+#: Template/StateGroups/view.ctp:19
+#: Template/TransactionGroupCreates/index.ctp:10
+#: Template/TransactionGroupCreates/view.ctp:13
+#: Template/Transactions/add.ctp:24
+#: Template/Transactions/edit.ctp:30
+#: Template/Transactions/index.ctp:24
+#: Template/Transactions/view.ctp:27
+msgid "New Transaction Group Create"
+msgstr ""
+
+#: Template/StateGroups/add.ctp:24
+msgid "Add State Group"
+msgstr ""
+
+#: Template/StateGroups/edit.ctp:30
+#: Template/StateGroups/view.ctp:10
+msgid "Edit State Group"
+msgstr ""
+
+#: Template/StateGroups/index.ctp:22
+msgid "State Groups"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:11
+msgid "Delete State Group"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:36
+msgid "User Count"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:68
+msgid "Related State Users"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:73
+#: Template/StateUsers/view.ctp:38
+msgid "Index Id"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:95
+#: Template/Transactions/view.ctp:171
+msgid "Related Transaction Group Creates"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:101
+#: Template/Transactions/view.ctp:177
+msgid "Group Public Key"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:124
+#: Template/TransactionTypes/view.ctp:35
+msgid "Related Transactions"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:130
+#: Template/TransactionTypes/view.ctp:41
+msgid "Transaction Type Id"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:131
+#: Template/TransactionTypes/view.ctp:42
+msgid "Tx Hash"
+msgstr ""
+
+#: Template/StateGroups/view.ctp:132
+#: Template/TransactionTypes/view.ctp:43
+#: Template/Transactions/view.ctp:50
+msgid "Received"
+msgstr ""
+
+#: Template/StateRelationshipTypes/add.ctp:10
+#: Template/StateRelationshipTypes/edit.ctp:16
+#: Template/StateRelationshipTypes/view.ctp:12
+msgid "List State Relationship Types"
+msgstr ""
+
+#: Template/StateRelationshipTypes/add.ctp:16
+msgid "Add State Relationship Type"
+msgstr ""
+
+#: Template/StateRelationshipTypes/edit.ctp:22
+#: Template/StateRelationshipTypes/view.ctp:10
+msgid "Edit State Relationship Type"
+msgstr ""
+
+#: Template/StateRelationshipTypes/index.ctp:10
+#: Template/StateRelationshipTypes/view.ctp:13
+msgid "New State Relationship Type"
+msgstr ""
+
+#: Template/StateRelationshipTypes/index.ctp:14
+msgid "State Relationship Types"
+msgstr ""
+
+#: Template/StateRelationshipTypes/view.ctp:11
+msgid "Delete State Relationship Type"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:17
+#: Template/StateUsers/edit.ctp:23
+#: Template/StateUsers/index.ctp:17
+#: Template/StateUsers/view.ctp:20
+#: Template/TransactionCreations/add.ctp:10
+#: Template/TransactionCreations/edit.ctp:16
+#: Template/TransactionCreations/view.ctp:12
+#: Template/Transactions/add.ctp:17
+#: Template/Transactions/edit.ctp:23
+#: Template/Transactions/index.ctp:17
+#: Template/Transactions/view.ctp:20
+msgid "List Transaction Creations"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:18
+#: Template/StateUsers/edit.ctp:24
+#: Template/StateUsers/index.ctp:18
+#: Template/StateUsers/view.ctp:21
+#: Template/TransactionCreations/index.ctp:10
+#: Template/TransactionCreations/view.ctp:13
+#: Template/Transactions/add.ctp:18
+#: Template/Transactions/edit.ctp:24
+#: Template/Transactions/index.ctp:18
+#: Template/Transactions/view.ctp:21
+msgid "New Transaction Creation"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:19
+#: Template/StateUsers/edit.ctp:25
+#: Template/StateUsers/index.ctp:19
+#: Template/StateUsers/view.ctp:22
+#: Template/TransactionSendCoins/add.ctp:10
+#: Template/TransactionSendCoins/edit.ctp:16
+#: Template/TransactionSendCoins/view.ctp:12
+#: Template/Transactions/add.ctp:25
+#: Template/Transactions/edit.ctp:31
+#: Template/Transactions/index.ctp:25
+#: Template/Transactions/view.ctp:28
+msgid "List Transaction Send Coins"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:20
+#: Template/StateUsers/edit.ctp:26
+#: Template/StateUsers/index.ctp:20
+#: Template/StateUsers/view.ctp:23
+#: Template/TransactionSendCoins/index.ctp:10
+#: Template/TransactionSendCoins/view.ctp:13
+#: Template/Transactions/add.ctp:26
+#: Template/Transactions/edit.ctp:32
+#: Template/Transactions/index.ctp:26
+#: Template/Transactions/view.ctp:29
+msgid "New Transaction Send Coin"
+msgstr ""
+
+#: Template/StateUsers/add.ctp:26
+msgid "Add State User"
+msgstr ""
+
+#: Template/StateUsers/edit.ctp:32
+#: Template/StateUsers/view.ctp:10
+msgid "Edit State User"
+msgstr ""
+
+#: Template/StateUsers/index.ctp:24
+msgid "State Users"
+msgstr ""
+
+#: Template/StateUsers/search.ctp:44
+msgid "Vorname oder Nachname oder E-Mail"
+msgstr ""
+
+#: Template/StateUsers/search.ctp:45
+msgid "Datenbank durchsuchen"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:11
+msgid "Delete State User"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:43
+msgid "Related State Balances"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:48
+#: Template/StateUsers/view.ctp:78
+#: Template/StateUsers/view.ctp:109
+#: Template/StateUsers/view.ctp:138
+#: Template/Transactions/view.ctp:63
+#: Template/Transactions/view.ctp:94
+#: Template/Transactions/view.ctp:206
+msgid "State User Id"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:70
+#: Template/Transactions/view.ctp:55
+msgid "Related State Created"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:103
+#: Template/Transactions/view.ctp:88
+msgid "Related Transaction Creations"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:111
+#: Template/Transactions/view.ctp:96
+msgid "Ident Hash"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:132
+#: Template/Transactions/view.ctp:200
+msgid "Related Transaction Send Coins"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:139
+#: Template/Transactions/view.ctp:207
+msgid "Receiver Public Key"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:140
+#: Template/Transactions/view.ctp:208
+msgid "Receiver User Id"
+msgstr ""
+
+#: Template/StateUsers/view.ctp:142
+#: Template/TransactionSendCoins/view.ctp:40
+#: Template/Transactions/view.ctp:210
+msgid "Sender Final Balance"
+msgstr ""
+
+#: Template/TransactionCreations/add.ctp:20
+msgid "Add Transaction Creation"
+msgstr ""
+
+#: Template/TransactionCreations/create.ctp:17
+#: Template/TransactionCreations/create_multi.ctp:17
+msgid "Schöpfungstransaktion"
+msgstr ""
+
+#: Template/TransactionCreations/create.ctp:28
+#: Template/TransactionCreations/create_multi.ctp:107
+msgid "Transaktion(n) abschließen"
+msgstr ""
+
+#: Template/TransactionCreations/create.ctp:29
+#: Template/TransactionCreations/create_multi.ctp:108
+#: Template/TransactionSendCoins/create.ctp:33
+msgid "Weitere Transaktion erstellen"
+msgstr ""
+
+#: Template/TransactionCreations/create_multi.ctp:85
+msgid "Für benutzerdefinierten Betrag"
+msgstr ""
+
+#: Template/TransactionCreations/create_multi.ctp:172
+msgid "Alle Transaktionen abgeschlossen!"
+msgstr ""
+
+#: Template/TransactionCreations/edit.ctp:26
+#: Template/TransactionCreations/view.ctp:10
+msgid "Edit Transaction Creation"
+msgstr ""
+
+#: Template/TransactionCreations/index.ctp:18
+msgid "Transaction Creations"
+msgstr ""
+
+#: Template/TransactionCreations/view.ctp:11
+msgid "Delete Transaction Creation"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/add.ctp:20
+msgid "Add Transaction Group Addaddres"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/edit.ctp:26
+#: Template/TransactionGroupAddaddress/view.ctp:10
+msgid "Edit Transaction Group Addaddres"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/index.ctp:18
+msgid "Transaction Group Addaddress"
+msgstr ""
+
+#: Template/TransactionGroupAddaddress/view.ctp:11
+msgid "Delete Transaction Group Addaddres"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/add.ctp:10
+#: Template/TransactionGroupAllowtrades/edit.ctp:16
+#: Template/TransactionGroupAllowtrades/view.ctp:12
+#: Template/Transactions/add.ctp:21
+#: Template/Transactions/edit.ctp:27
+#: Template/Transactions/index.ctp:21
+#: Template/Transactions/view.ctp:24
+msgid "List Transaction Group Allowtrades"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/add.ctp:18
+msgid "Add Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/edit.ctp:24
+#: Template/TransactionGroupAllowtrades/view.ctp:10
+msgid "Edit Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/index.ctp:10
+#: Template/TransactionGroupAllowtrades/view.ctp:13
+#: Template/Transactions/add.ctp:22
+#: Template/Transactions/edit.ctp:28
+#: Template/Transactions/index.ctp:22
+#: Template/Transactions/view.ctp:25
+msgid "New Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/index.ctp:16
+msgid "Transaction Group Allowtrades"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/view.ctp:11
+msgid "Delete Transaction Group Allowtrade"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/view.ctp:30
+#: Template/Transactions/view.ctp:150
+msgid "Group Id"
+msgstr ""
+
+#: Template/TransactionGroupAllowtrades/view.ctp:34
+#: Template/Transactions/view.ctp:151
+msgid "Allow"
+msgstr ""
+
+#: Template/TransactionGroupCreates/add.ctp:20
+msgid "Add Transaction Group Create"
+msgstr ""
+
+#: Template/TransactionGroupCreates/edit.ctp:26
+#: Template/TransactionGroupCreates/view.ctp:10
+msgid "Edit Transaction Group Create"
+msgstr ""
+
+#: Template/TransactionGroupCreates/index.ctp:18
+msgid "Transaction Group Creates"
+msgstr ""
+
+#: Template/TransactionGroupCreates/view.ctp:11
+msgid "Delete Transaction Group Create"
+msgstr ""
+
+#: Template/TransactionSendCoins/add.ctp:20
+msgid "Add Transaction Send Coin"
+msgstr ""
+
+#: Template/TransactionSendCoins/create.ctp:29
+msgid "Empfänger"
+msgstr ""
+
+#: Template/TransactionSendCoins/create.ctp:31
+msgid "Betrag in GDD"
+msgstr ""
+
+#: Template/TransactionSendCoins/create.ctp:32
+msgid "Transaktion abschließen"
+msgstr ""
+
+#: Template/TransactionSendCoins/edit.ctp:26
+#: Template/TransactionSendCoins/view.ctp:10
+msgid "Edit Transaction Send Coin"
+msgstr ""
+
+#: Template/TransactionSendCoins/index.ctp:18
+msgid "Transaction Send Coins"
+msgstr ""
+
+#: Template/TransactionSendCoins/view.ctp:11
+msgid "Delete Transaction Send Coin"
+msgstr ""
+
+#: Template/TransactionSignatures/add.ctp:10
+#: Template/TransactionSignatures/edit.ctp:16
+#: Template/TransactionSignatures/view.ctp:12
+#: Template/Transactions/add.ctp:27
+#: Template/Transactions/edit.ctp:33
+#: Template/Transactions/index.ctp:27
+#: Template/Transactions/view.ctp:30
+msgid "List Transaction Signatures"
+msgstr ""
+
+#: Template/TransactionSignatures/add.ctp:18
+msgid "Add Transaction Signature"
+msgstr ""
+
+#: Template/TransactionSignatures/edit.ctp:24
+#: Template/TransactionSignatures/view.ctp:10
+msgid "Edit Transaction Signature"
+msgstr ""
+
+#: Template/TransactionSignatures/index.ctp:10
+#: Template/TransactionSignatures/view.ctp:13
+#: Template/Transactions/add.ctp:28
+#: Template/Transactions/edit.ctp:34
+#: Template/Transactions/index.ctp:28
+#: Template/Transactions/view.ctp:31
+msgid "New Transaction Signature"
+msgstr ""
+
+#: Template/TransactionSignatures/index.ctp:16
+msgid "Transaction Signatures"
+msgstr ""
+
+#: Template/TransactionSignatures/view.ctp:11
+msgid "Delete Transaction Signature"
+msgstr ""
+
+#: Template/TransactionTypes/add.ctp:18
+msgid "Add Transaction Type"
+msgstr ""
+
+#: Template/TransactionTypes/edit.ctp:24
+#: Template/TransactionTypes/view.ctp:10
+msgid "Edit Transaction Type"
+msgstr ""
+
+#: Template/TransactionTypes/index.ctp:16
+msgid "Transaction Types"
+msgstr ""
+
+#: Template/TransactionTypes/view.ctp:11
+msgid "Delete Transaction Type"
+msgstr ""
+
+#: Template/Transactions/add.ctp:34
+msgid "Add Transaction"
+msgstr ""
+
+#: Template/Transactions/edit.ctp:40
+#: Template/Transactions/view.ctp:10
+msgid "Edit Transaction"
+msgstr ""
+
+#: Template/Transactions/index.ctp:32
+msgid "Transactions"
+msgstr ""
+
+#: Template/Transactions/send_to_node.ctp:8
+msgid "Transaktionen an Gradido-Node senden"
+msgstr ""
+
+#: Template/Transactions/view.ctp:11
+msgid "Delete Transaction"
+msgstr ""
+
+#: Template/Transactions/view.ctp:144
+msgid "Related Transaction Group Allowtrades"
+msgstr ""
+
+#: Template/Transactions/view.ctp:233
+msgid "Related Transaction Signatures"
+msgstr ""
+
+#: Template/Transactions/view.ctp:239
+msgid "Signature"
+msgstr ""
+
+#: Template/Transactions/view.ctp:240
+msgid "Pubkey"
+msgstr ""
+
diff --git a/community_server/src/Model/Behavior/empty b/community_server/src/Model/Behavior/empty
new file mode 100644
index 000000000..e69de29bb
diff --git a/community_server/src/Model/Entity/AddressType.php b/community_server/src/Model/Entity/AddressType.php
new file mode 100644
index 000000000..08dbba281
--- /dev/null
+++ b/community_server/src/Model/Entity/AddressType.php
@@ -0,0 +1,33 @@
+ true,
+ 'text' => true,
+ 'state_group_addresses' => true,
+ 'transaction_group_addaddress' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/AdminError.php b/community_server/src/Model/Entity/AdminError.php
new file mode 100644
index 000000000..23c60fd4a
--- /dev/null
+++ b/community_server/src/Model/Entity/AdminError.php
@@ -0,0 +1,41 @@
+ true,
+ 'controller' => true,
+ 'action' => true,
+ 'state' => true,
+ 'msg' => true,
+ 'details' => true,
+ 'created' => true,
+ 'state_user' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/CommunityProfile.php b/community_server/src/Model/Entity/CommunityProfile.php
new file mode 100644
index 000000000..367fe713c
--- /dev/null
+++ b/community_server/src/Model/Entity/CommunityProfile.php
@@ -0,0 +1,30 @@
+ true,
+ 'profile_img' => true,
+ 'profile_desc' => true,
+ ];
+}
diff --git a/community_server/src/Model/Entity/ElopageBuy.php b/community_server/src/Model/Entity/ElopageBuy.php
new file mode 100644
index 000000000..eca2f760b
--- /dev/null
+++ b/community_server/src/Model/Entity/ElopageBuy.php
@@ -0,0 +1,57 @@
+ true,
+ 'affiliate_program_id' => true,
+ 'publisher_id' => true,
+ 'order_id' => true,
+ 'product_id' => true,
+ 'product_price' => true,
+ 'payer_email' => true,
+ 'publisher_email' => true,
+ 'payed' => true,
+ 'success_date' => true,
+ 'event' => true,
+ 'elopage_user' => true,
+ 'affiliate_program' => true,
+ 'publisher' => true,
+ 'order' => true,
+ 'product' => true,
+ ];
+}
diff --git a/community_server/src/Model/Entity/Operator.php b/community_server/src/Model/Entity/Operator.php
new file mode 100644
index 000000000..9d5ddd3ca
--- /dev/null
+++ b/community_server/src/Model/Entity/Operator.php
@@ -0,0 +1,32 @@
+ true,
+ 'user_pubkey' => true,
+ 'operator_type_id' => true,
+ 'data_base64' => true,
+ 'modified' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/OperatorType.php b/community_server/src/Model/Entity/OperatorType.php
new file mode 100644
index 000000000..0ca968f47
--- /dev/null
+++ b/community_server/src/Model/Entity/OperatorType.php
@@ -0,0 +1,31 @@
+ true,
+ 'text' => true,
+ 'operators' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/ServerUser.php b/community_server/src/Model/Entity/ServerUser.php
new file mode 100644
index 000000000..f1d47fd34
--- /dev/null
+++ b/community_server/src/Model/Entity/ServerUser.php
@@ -0,0 +1,57 @@
+ true,
+ 'password' => true,
+ 'email' => true,
+ 'role' => true,
+ 'activated' => true,
+ 'last_login' => true,
+ 'created' => true,
+ 'modified' => true
+ ];
+
+ /**
+ * Fields that are excluded from JSON versions of the entity.
+ *
+ * @var array
+ */
+ protected $_hidden = [
+ 'password'
+ ];
+
+ protected function _setPassword($password)
+ {
+ if (strlen($password) > 0) {
+ return (new DefaultPasswordHasher)->hash($password);
+ }
+ }
+}
diff --git a/community_server/src/Model/Entity/StateBalance.php b/community_server/src/Model/Entity/StateBalance.php
new file mode 100644
index 000000000..30d0d091f
--- /dev/null
+++ b/community_server/src/Model/Entity/StateBalance.php
@@ -0,0 +1,33 @@
+ true,
+ 'modified' => true,
+ 'amount' => true,
+ 'state_user' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/StateCreated.php b/community_server/src/Model/Entity/StateCreated.php
new file mode 100644
index 000000000..99c783e6c
--- /dev/null
+++ b/community_server/src/Model/Entity/StateCreated.php
@@ -0,0 +1,41 @@
+ true,
+ 'month' => true,
+ 'year' => true,
+ 'state_user_id' => true,
+ 'created' => true,
+ 'short_ident_hash' => true,
+ 'transaction' => true,
+ 'state_user' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/StateError.php b/community_server/src/Model/Entity/StateError.php
new file mode 100644
index 000000000..448e9ccb3
--- /dev/null
+++ b/community_server/src/Model/Entity/StateError.php
@@ -0,0 +1,37 @@
+ true,
+ 'transaction_type_id' => true,
+ 'created' => true,
+ 'message_json' => true,
+ 'state_user' => true,
+ 'transaction_type' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/StateGroup.php b/community_server/src/Model/Entity/StateGroup.php
new file mode 100644
index 000000000..c2bdc75fc
--- /dev/null
+++ b/community_server/src/Model/Entity/StateGroup.php
@@ -0,0 +1,43 @@
+ true,
+ 'name' => true,
+ 'root_public_key' => true,
+ 'user_count' => true,
+ 'index' => true,
+ 'state_group_addresses' => true,
+ 'state_users' => true,
+ 'transaction_group_creates' => true,
+ 'transactions' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/StateGroupAddress.php b/community_server/src/Model/Entity/StateGroupAddress.php
new file mode 100644
index 000000000..e5ce71681
--- /dev/null
+++ b/community_server/src/Model/Entity/StateGroupAddress.php
@@ -0,0 +1,35 @@
+ true,
+ 'public_key' => true,
+ 'address_type_id' => true,
+ 'state_group' => true,
+ 'address_type' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/StateGroupRelationship.php b/community_server/src/Model/Entity/StateGroupRelationship.php
new file mode 100644
index 000000000..974b1375d
--- /dev/null
+++ b/community_server/src/Model/Entity/StateGroupRelationship.php
@@ -0,0 +1,37 @@
+ true,
+ 'state_group2_id' => true,
+ 'state_relationship_id' => true,
+ 'state_group1' => true,
+ 'state_group2' => true,
+ 'state_relationship' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/StateRelationshipType.php b/community_server/src/Model/Entity/StateRelationshipType.php
new file mode 100644
index 000000000..f3c70d31e
--- /dev/null
+++ b/community_server/src/Model/Entity/StateRelationshipType.php
@@ -0,0 +1,28 @@
+ true,
+ 'text' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/StateUser.php b/community_server/src/Model/Entity/StateUser.php
new file mode 100644
index 000000000..5fac7cda7
--- /dev/null
+++ b/community_server/src/Model/Entity/StateUser.php
@@ -0,0 +1,58 @@
+ true,
+ 'state_group_id' => true,
+ 'public_key' => true,
+ 'email' => true,
+ 'first_name' => true,
+ 'last_name' => true,
+ 'disabled' => true,
+ 'username' => true,
+ 'index' => true,
+ 'state_group' => true,
+ 'state_balances' => true,
+ 'state_created' => true,
+ 'transaction_creations' => true,
+ 'transaction_send_coins' => true
+ ];
+
+ public function getEmailWithName()
+ {
+ return $this->first_name . ' ' . $this->last_name . ' <' . $this->email . '>';
+ }
+
+ public function getNames()
+ {
+ return $this->first_name . ' ' . $this->last_name;
+ }
+}
diff --git a/community_server/src/Model/Entity/Transaction.php b/community_server/src/Model/Entity/Transaction.php
new file mode 100644
index 000000000..d4ebf68c4
--- /dev/null
+++ b/community_server/src/Model/Entity/Transaction.php
@@ -0,0 +1,52 @@
+ true,
+ 'transaction_type_id' => true,
+ 'tx_hash' => true,
+ 'memo' => true,
+ 'received' => true,
+ 'state_group' => true,
+ 'transaction_type' => true,
+ 'state_created' => true,
+ 'transaction_creations' => true,
+ 'transaction_group_addaddress' => true,
+ 'transaction_group_allowtrades' => true,
+ 'transaction_group_creates' => true,
+ 'transaction_send_coins' => true,
+ 'transaction_signatures' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/TransactionCreation.php b/community_server/src/Model/Entity/TransactionCreation.php
new file mode 100644
index 000000000..36aa7ac2d
--- /dev/null
+++ b/community_server/src/Model/Entity/TransactionCreation.php
@@ -0,0 +1,39 @@
+ true,
+ 'state_user_id' => true,
+ 'amount' => true,
+ 'ident_hash' => true,
+ 'transaction' => true,
+ 'state_user' => true,
+ 'target_date' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/TransactionGroupAddaddres.php b/community_server/src/Model/Entity/TransactionGroupAddaddres.php
new file mode 100644
index 000000000..3cb73b9ee
--- /dev/null
+++ b/community_server/src/Model/Entity/TransactionGroupAddaddres.php
@@ -0,0 +1,35 @@
+ true,
+ 'address_type_id' => true,
+ 'public_key' => true,
+ 'transaction' => true,
+ 'address_type' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/TransactionGroupAllowtrade.php b/community_server/src/Model/Entity/TransactionGroupAllowtrade.php
new file mode 100644
index 000000000..d097c643f
--- /dev/null
+++ b/community_server/src/Model/Entity/TransactionGroupAllowtrade.php
@@ -0,0 +1,35 @@
+ true,
+ 'group_id' => true,
+ 'allow' => true,
+ 'transaction' => true,
+ 'group' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/TransactionGroupCreate.php b/community_server/src/Model/Entity/TransactionGroupCreate.php
new file mode 100644
index 000000000..26fab510b
--- /dev/null
+++ b/community_server/src/Model/Entity/TransactionGroupCreate.php
@@ -0,0 +1,37 @@
+ true,
+ 'group_public_key' => true,
+ 'state_group_id' => true,
+ 'name' => true,
+ 'transaction' => true,
+ 'state_group' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/TransactionSendCoin.php b/community_server/src/Model/Entity/TransactionSendCoin.php
new file mode 100644
index 000000000..4d774501e
--- /dev/null
+++ b/community_server/src/Model/Entity/TransactionSendCoin.php
@@ -0,0 +1,43 @@
+ true,
+ 'state_user_id' => true,
+ 'receiver_public_key' => true,
+ 'receiver_user_id' => true,
+ 'amount' => true,
+ 'sender_final_balance' => true,
+ 'transaction' => true,
+ 'state_user' => true,
+ 'receiver_user' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/TransactionSignature.php b/community_server/src/Model/Entity/TransactionSignature.php
new file mode 100644
index 000000000..16bce8b00
--- /dev/null
+++ b/community_server/src/Model/Entity/TransactionSignature.php
@@ -0,0 +1,33 @@
+ true,
+ 'signature' => true,
+ 'pubkey' => true,
+ 'transaction' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/TransactionType.php b/community_server/src/Model/Entity/TransactionType.php
new file mode 100644
index 000000000..b8f13e474
--- /dev/null
+++ b/community_server/src/Model/Entity/TransactionType.php
@@ -0,0 +1,31 @@
+ true,
+ 'text' => true,
+ 'transactions' => true
+ ];
+}
diff --git a/community_server/src/Model/Entity/User.php b/community_server/src/Model/Entity/User.php
new file mode 100644
index 000000000..352371471
--- /dev/null
+++ b/community_server/src/Model/Entity/User.php
@@ -0,0 +1,58 @@
+ true,
+ 'first_name' => true,
+ 'last_name' => true,
+ 'password' => true,
+ 'pubkey' => true,
+ 'privkey' => true,
+ 'created' => true,
+ 'email_checked' => true,
+ 'language' => true,
+ 'email_opt_in' => true,
+ 'user_backups' => true,
+ 'user_roles' => true,
+ ];
+
+ /**
+ * Fields that are excluded from JSON versions of the entity.
+ *
+ * @var array
+ */
+ protected $_hidden = [
+ 'password',
+ ];
+}
diff --git a/community_server/src/Model/Messages/GPBMetadata/BasicTypes.php b/community_server/src/Model/Messages/GPBMetadata/BasicTypes.php
new file mode 100644
index 000000000..113202053
--- /dev/null
+++ b/community_server/src/Model/Messages/GPBMetadata/BasicTypes.php
@@ -0,0 +1,40 @@
+internalAddGeneratedFile(hex2bin(
+ "0ae0030a10426173696354797065732e70726f746f12076772616469646f" .
+ "22380a034b657912110a076564323535313918022001280c480012170a0d" .
+ "656432353531395f726566313018032001280c480042050a036b65792258" .
+ "0a0d5369676e617475726550616972120e0a067075624b65791801200128" .
+ "0c12110a076564323535313918022001280c480012170a0d656432353531" .
+ "395f726566313018032001280c4800420b0a097369676e61747572652237" .
+ "0a0c5369676e61747572654d617012270a07736967506169721801200328" .
+ "0b32162e6772616469646f2e5369676e617475726550616972222b0a0954" .
+ "696d657374616d70120f0a077365636f6e6473180120012803120d0a056e" .
+ "616e6f7318022001280522230a1054696d657374616d705365636f6e6473" .
+ "120f0a077365636f6e647318012001280322590a0c53656e646572416d6f" .
+ "756e74121d0a15656432353531395f73656e6465725f7075626b65791801" .
+ "2001280c120e0a06616d6f756e74180220012812121a0a1273656e646572" .
+ "46696e616c42616c616e636518032001281222410a0e5265636569766572" .
+ "416d6f756e74121f0a17656432353531395f72656365697665725f707562" .
+ "6b657918012001280c120e0a06616d6f756e74180220012812620670726f" .
+ "746f33"
+ ), true);
+
+ static::$is_initialized = true;
+ }
+}
+
diff --git a/community_server/src/Model/Messages/GPBMetadata/StateCreateGroup.php b/community_server/src/Model/Messages/GPBMetadata/StateCreateGroup.php
new file mode 100644
index 000000000..24ef6b2a7
--- /dev/null
+++ b/community_server/src/Model/Messages/GPBMetadata/StateCreateGroup.php
@@ -0,0 +1,31 @@
+internalAddGeneratedFile(hex2bin(
+ "0ab7010a16537461746543726561746547726f75702e70726f746f120767" .
+ "72616469646f228b010a10537461746543726561746547726f7570120c0a" .
+ "046e616d6518012001280912240a0e67726f75705075626c69634b657918" .
+ "022001280b320c2e6772616469646f2e4b6579122a0a14706172656e7447" .
+ "726f75705075626c69634b657918032001280b320c2e6772616469646f2e" .
+ "4b65794a04080410055211686564657261436f6e73656e73757349646206" .
+ "70726f746f33"
+ ), true);
+
+ static::$is_initialized = true;
+ }
+}
+
diff --git a/community_server/src/Model/Messages/GPBMetadata/StateGroupChangeParent.php b/community_server/src/Model/Messages/GPBMetadata/StateGroupChangeParent.php
new file mode 100644
index 000000000..8f9111842
--- /dev/null
+++ b/community_server/src/Model/Messages/GPBMetadata/StateGroupChangeParent.php
@@ -0,0 +1,31 @@
+internalAddGeneratedFile(hex2bin(
+ "0ace010a1c537461746547726f75704368616e6765506172656e742e7072" .
+ "6f746f12076772616469646f229c010a16537461746547726f7570436861" .
+ "6e6765506172656e7412240a0e67726f75705075626c69634b6579180120" .
+ "01280b320c2e6772616469646f2e4b6579122d0a176e6577506172656e74" .
+ "47726f75705075626c69634b657918022001280b320c2e6772616469646f" .
+ "2e4b6579122d0a176f6c64506172656e7447726f75705075626c69634b65" .
+ "7918032001280b320c2e6772616469646f2e4b6579620670726f746f33"
+ ), true);
+
+ static::$is_initialized = true;
+ }
+}
+
diff --git a/community_server/src/Model/Messages/GPBMetadata/Transaction.php b/community_server/src/Model/Messages/GPBMetadata/Transaction.php
new file mode 100644
index 000000000..9f1d8ff23
--- /dev/null
+++ b/community_server/src/Model/Messages/GPBMetadata/Transaction.php
@@ -0,0 +1,31 @@
+internalAddGeneratedFile(hex2bin(
+ "0ab7010a115472616e73616374696f6e2e70726f746f1207677261646964" .
+ "6f2290010a0b5472616e73616374696f6e120a0a02696418012001280412" .
+ "2b0a08726563656976656418022001280b32192e6772616469646f2e5469" .
+ "6d657374616d705365636f6e647312250a067369674d617018032001280b" .
+ "32152e6772616469646f2e5369676e61747572654d6170120e0a06747848" .
+ "61736818042001280c12110a09626f6479427974657318052001280c6206" .
+ "70726f746f33"
+ ), true);
+
+ static::$is_initialized = true;
+ }
+}
+
diff --git a/community_server/src/Model/Messages/GPBMetadata/TransactionBody.php b/community_server/src/Model/Messages/GPBMetadata/TransactionBody.php
new file mode 100644
index 000000000..d225389b6
--- /dev/null
+++ b/community_server/src/Model/Messages/GPBMetadata/TransactionBody.php
@@ -0,0 +1,40 @@
+internalAddGeneratedFile(hex2bin(
+ "0aec020a155472616e73616374696f6e426f64792e70726f746f12076772" .
+ "616469646f1a16537461746543726561746547726f75702e70726f746f1a" .
+ "1c537461746547726f75704368616e6765506172656e742e70726f746f1a" .
+ "195472616e73616374696f6e4372656174696f6e2e70726f746f22f0010a" .
+ "0f5472616e73616374696f6e426f6479120c0a046d656d6f180120012809" .
+ "12300a0b63726561746547726f757018022001280b32192e677261646964" .
+ "6f2e537461746543726561746547726f75704800123c0a1167726f757043" .
+ "68616e6765506172656e7418032001280b321f2e6772616469646f2e5374" .
+ "61746547726f75704368616e6765506172656e74480012250a087472616e" .
+ "7366657218042001280b32112e6772616469646f2e5472616e7366657248" .
+ "0012300a086372656174696f6e18052001280b321c2e6772616469646f2e" .
+ "5472616e73616374696f6e4372656174696f6e480042060a046461746162" .
+ "0670726f746f33"
+ ), true);
+
+ static::$is_initialized = true;
+ }
+}
+
diff --git a/community_server/src/Model/Messages/GPBMetadata/TransactionCreation.php b/community_server/src/Model/Messages/GPBMetadata/TransactionCreation.php
new file mode 100644
index 000000000..c8984298c
--- /dev/null
+++ b/community_server/src/Model/Messages/GPBMetadata/TransactionCreation.php
@@ -0,0 +1,29 @@
+internalAddGeneratedFile(hex2bin(
+ "0a88010a195472616e73616374696f6e4372656174696f6e2e70726f746f" .
+ "12076772616469646f225a0a135472616e73616374696f6e437265617469" .
+ "6f6e122f0a0e7265636569766572416d6f756e7418012001280b32172e67" .
+ "72616469646f2e5265636569766572416d6f756e7412120a0a6964656e74" .
+ "5f68617368180220012811620670726f746f33"
+ ), true);
+
+ static::$is_initialized = true;
+ }
+}
+
diff --git a/community_server/src/Model/Messages/GPBMetadata/Transfer.php b/community_server/src/Model/Messages/GPBMetadata/Transfer.php
new file mode 100644
index 000000000..f5236ee43
--- /dev/null
+++ b/community_server/src/Model/Messages/GPBMetadata/Transfer.php
@@ -0,0 +1,29 @@
+internalAddGeneratedFile(hex2bin(
+ "0a8d010a0e5472616e736665722e70726f746f12076772616469646f226a" .
+ "0a085472616e73666572122c0a0d73656e646572416d6f756e7473180120" .
+ "03280b32152e6772616469646f2e53656e646572416d6f756e7412300a0f" .
+ "7265636569766572416d6f756e747318022003280b32172e677261646964" .
+ "6f2e5265636569766572416d6f756e74620670726f746f33"
+ ), true);
+
+ static::$is_initialized = true;
+ }
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/Key.php b/community_server/src/Model/Messages/Gradido/Key.php
new file mode 100644
index 000000000..ace440729
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/Key.php
@@ -0,0 +1,96 @@
+model.messages.gradido.Key
+ */
+class Key extends \Google\Protobuf\Internal\Message
+{
+ protected $key;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type string $ed25519
+ * ed25519 signature (libsodium default)
+ * @type string $ed25519_ref10
+ * ed25519 ref10 signature
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\BasicTypes::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * ed25519 signature (libsodium default)
+ *
+ * Generated from protobuf field bytes ed25519 = 2;
+ * @return string
+ */
+ public function getEd25519()
+ {
+ return $this->readOneof(2);
+ }
+
+ /**
+ * ed25519 signature (libsodium default)
+ *
+ * Generated from protobuf field bytes ed25519 = 2;
+ * @param string $var
+ * @return $this
+ */
+ public function setEd25519($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->writeOneof(2, $var);
+
+ return $this;
+ }
+
+ /**
+ * ed25519 ref10 signature
+ *
+ * Generated from protobuf field bytes ed25519_ref10 = 3;
+ * @return string
+ */
+ public function getEd25519Ref10()
+ {
+ return $this->readOneof(3);
+ }
+
+ /**
+ * ed25519 ref10 signature
+ *
+ * Generated from protobuf field bytes ed25519_ref10 = 3;
+ * @param string $var
+ * @return $this
+ */
+ public function setEd25519Ref10($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->writeOneof(3, $var);
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getKey()
+ {
+ return $this->whichOneof("key");
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/ReceiverAmount.php b/community_server/src/Model/Messages/Gradido/ReceiverAmount.php
new file mode 100644
index 000000000..240c5a6fe
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/ReceiverAmount.php
@@ -0,0 +1,85 @@
+model.messages.gradido.ReceiverAmount
+ */
+class ReceiverAmount extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Generated from protobuf field bytes ed25519_receiver_pubkey = 1;
+ */
+ private $ed25519_receiver_pubkey = '';
+ /**
+ * Generated from protobuf field sint64 amount = 2;
+ */
+ private $amount = 0;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type string $ed25519_receiver_pubkey
+ * @type int|string $amount
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\BasicTypes::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Generated from protobuf field bytes ed25519_receiver_pubkey = 1;
+ * @return string
+ */
+ public function getEd25519ReceiverPubkey()
+ {
+ return $this->ed25519_receiver_pubkey;
+ }
+
+ /**
+ * Generated from protobuf field bytes ed25519_receiver_pubkey = 1;
+ * @param string $var
+ * @return $this
+ */
+ public function setEd25519ReceiverPubkey($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->ed25519_receiver_pubkey = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field sint64 amount = 2;
+ * @return int|string
+ */
+ public function getAmount()
+ {
+ return $this->amount;
+ }
+
+ /**
+ * Generated from protobuf field sint64 amount = 2;
+ * @param int|string $var
+ * @return $this
+ */
+ public function setAmount($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->amount = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/SenderAmount.php b/community_server/src/Model/Messages/Gradido/SenderAmount.php
new file mode 100644
index 000000000..9b423947e
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/SenderAmount.php
@@ -0,0 +1,119 @@
+model.messages.gradido.SenderAmount
+ */
+class SenderAmount extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Generated from protobuf field bytes ed25519_sender_pubkey = 1;
+ */
+ private $ed25519_sender_pubkey = '';
+ /**
+ * Generated from protobuf field sint64 amount = 2;
+ */
+ private $amount = 0;
+ /**
+ * sender balance after transaction, including perishability
+ *
+ * Generated from protobuf field sint64 senderFinalBalance = 3;
+ */
+ private $senderFinalBalance = 0;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type string $ed25519_sender_pubkey
+ * @type int|string $amount
+ * @type int|string $senderFinalBalance
+ * sender balance after transaction, including perishability
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\BasicTypes::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Generated from protobuf field bytes ed25519_sender_pubkey = 1;
+ * @return string
+ */
+ public function getEd25519SenderPubkey()
+ {
+ return $this->ed25519_sender_pubkey;
+ }
+
+ /**
+ * Generated from protobuf field bytes ed25519_sender_pubkey = 1;
+ * @param string $var
+ * @return $this
+ */
+ public function setEd25519SenderPubkey($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->ed25519_sender_pubkey = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field sint64 amount = 2;
+ * @return int|string
+ */
+ public function getAmount()
+ {
+ return $this->amount;
+ }
+
+ /**
+ * Generated from protobuf field sint64 amount = 2;
+ * @param int|string $var
+ * @return $this
+ */
+ public function setAmount($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->amount = $var;
+
+ return $this;
+ }
+
+ /**
+ * sender balance after transaction, including perishability
+ *
+ * Generated from protobuf field sint64 senderFinalBalance = 3;
+ * @return int|string
+ */
+ public function getSenderFinalBalance()
+ {
+ return $this->senderFinalBalance;
+ }
+
+ /**
+ * sender balance after transaction, including perishability
+ *
+ * Generated from protobuf field sint64 senderFinalBalance = 3;
+ * @param int|string $var
+ * @return $this
+ */
+ public function setSenderFinalBalance($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->senderFinalBalance = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/SignatureMap.php b/community_server/src/Model/Messages/Gradido/SignatureMap.php
new file mode 100644
index 000000000..ea6f16150
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/SignatureMap.php
@@ -0,0 +1,65 @@
+model.messages.gradido.SignatureMap
+ */
+class SignatureMap extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Each signature pair corresponds to a unique Key required to sign the transaction.
+ *
+ * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1;
+ */
+ private $sigPair;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type \Model\Messages\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $sigPair
+ * Each signature pair corresponds to a unique Key required to sign the transaction.
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\BasicTypes::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Each signature pair corresponds to a unique Key required to sign the transaction.
+ *
+ * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1;
+ * @return \Google\Protobuf\Internal\RepeatedField
+ */
+ public function getSigPair()
+ {
+ return $this->sigPair;
+ }
+
+ /**
+ * Each signature pair corresponds to a unique Key required to sign the transaction.
+ *
+ * Generated from protobuf field repeated .model.messages.gradido.SignaturePair sigPair = 1;
+ * @param \Model\Messages\Gradido\SignaturePair[]|\Google\Protobuf\Internal\RepeatedField $var
+ * @return $this
+ */
+ public function setSigPair($var)
+ {
+ $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\SignaturePair::class);
+ $this->sigPair = $arr;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/SignaturePair.php b/community_server/src/Model/Messages/Gradido/SignaturePair.php
new file mode 100644
index 000000000..4575a7d38
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/SignaturePair.php
@@ -0,0 +1,123 @@
+model.messages.gradido.SignaturePair
+ */
+class SignaturePair extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Generated from protobuf field bytes pubKey = 1;
+ */
+ private $pubKey = '';
+ protected $signature;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type string $pubKey
+ * @type string $ed25519
+ * ed25519 signature (libsodium default)
+ * @type string $ed25519_ref10
+ * ed25519 ref10 signature
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\BasicTypes::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Generated from protobuf field bytes pubKey = 1;
+ * @return string
+ */
+ public function getPubKey()
+ {
+ return $this->pubKey;
+ }
+
+ /**
+ * Generated from protobuf field bytes pubKey = 1;
+ * @param string $var
+ * @return $this
+ */
+ public function setPubKey($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->pubKey = $var;
+
+ return $this;
+ }
+
+ /**
+ * ed25519 signature (libsodium default)
+ *
+ * Generated from protobuf field bytes ed25519 = 2;
+ * @return string
+ */
+ public function getEd25519()
+ {
+ return $this->readOneof(2);
+ }
+
+ /**
+ * ed25519 signature (libsodium default)
+ *
+ * Generated from protobuf field bytes ed25519 = 2;
+ * @param string $var
+ * @return $this
+ */
+ public function setEd25519($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->writeOneof(2, $var);
+
+ return $this;
+ }
+
+ /**
+ * ed25519 ref10 signature
+ *
+ * Generated from protobuf field bytes ed25519_ref10 = 3;
+ * @return string
+ */
+ public function getEd25519Ref10()
+ {
+ return $this->readOneof(3);
+ }
+
+ /**
+ * ed25519 ref10 signature
+ *
+ * Generated from protobuf field bytes ed25519_ref10 = 3;
+ * @param string $var
+ * @return $this
+ */
+ public function setEd25519Ref10($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->writeOneof(3, $var);
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getSignature()
+ {
+ return $this->whichOneof("signature");
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/StateCreateGroup.php b/community_server/src/Model/Messages/Gradido/StateCreateGroup.php
new file mode 100644
index 000000000..dad246745
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/StateCreateGroup.php
@@ -0,0 +1,114 @@
+model.messages.gradido.StateCreateGroup
+ */
+class StateCreateGroup extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Generated from protobuf field string name = 1;
+ */
+ private $name = '';
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2;
+ */
+ private $groupPublicKey = null;
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3;
+ */
+ private $parentGroupPublicKey = null;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type string $name
+ * @type \Model\Messages\Gradido\Key $groupPublicKey
+ * @type \Model\Messages\Gradido\Key $parentGroupPublicKey
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\StateCreateGroup::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Generated from protobuf field string name = 1;
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Generated from protobuf field string name = 1;
+ * @param string $var
+ * @return $this
+ */
+ public function setName($var)
+ {
+ GPBUtil::checkString($var, True);
+ $this->name = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2;
+ * @return \Model\Messages\Gradido\Key
+ */
+ public function getGroupPublicKey()
+ {
+ return $this->groupPublicKey;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 2;
+ * @param \Model\Messages\Gradido\Key $var
+ * @return $this
+ */
+ public function setGroupPublicKey($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class);
+ $this->groupPublicKey = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3;
+ * @return \Model\Messages\Gradido\Key
+ */
+ public function getParentGroupPublicKey()
+ {
+ return $this->parentGroupPublicKey;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key parentGroupPublicKey = 3;
+ * @param \Model\Messages\Gradido\Key $var
+ * @return $this
+ */
+ public function setParentGroupPublicKey($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class);
+ $this->parentGroupPublicKey = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php b/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php
new file mode 100644
index 000000000..9cd15175a
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/StateGroupChangeParent.php
@@ -0,0 +1,114 @@
+model.messages.gradido.StateGroupChangeParent
+ */
+class StateGroupChangeParent extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1;
+ */
+ private $groupPublicKey = null;
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2;
+ */
+ private $newParentGroupPublicKey = null;
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3;
+ */
+ private $oldParentGroupPublicKey = null;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type \Model\Messages\Gradido\Key $groupPublicKey
+ * @type \Model\Messages\Gradido\Key $newParentGroupPublicKey
+ * @type \Model\Messages\Gradido\Key $oldParentGroupPublicKey
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\StateGroupChangeParent::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1;
+ * @return \Model\Messages\Gradido\Key
+ */
+ public function getGroupPublicKey()
+ {
+ return $this->groupPublicKey;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key groupPublicKey = 1;
+ * @param \Model\Messages\Gradido\Key $var
+ * @return $this
+ */
+ public function setGroupPublicKey($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class);
+ $this->groupPublicKey = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2;
+ * @return \Model\Messages\Gradido\Key
+ */
+ public function getNewParentGroupPublicKey()
+ {
+ return $this->newParentGroupPublicKey;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key newParentGroupPublicKey = 2;
+ * @param \Model\Messages\Gradido\Key $var
+ * @return $this
+ */
+ public function setNewParentGroupPublicKey($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class);
+ $this->newParentGroupPublicKey = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3;
+ * @return \Model\Messages\Gradido\Key
+ */
+ public function getOldParentGroupPublicKey()
+ {
+ return $this->oldParentGroupPublicKey;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Key oldParentGroupPublicKey = 3;
+ * @param \Model\Messages\Gradido\Key $var
+ * @return $this
+ */
+ public function setOldParentGroupPublicKey($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\Key::class);
+ $this->oldParentGroupPublicKey = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/Timestamp.php b/community_server/src/Model/Messages/Gradido/Timestamp.php
new file mode 100644
index 000000000..7b2316720
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/Timestamp.php
@@ -0,0 +1,101 @@
+model.messages.gradido.Timestamp
+ */
+class Timestamp extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Number of complete seconds since the start of the epoch
+ *
+ * Generated from protobuf field int64 seconds = 1;
+ */
+ private $seconds = 0;
+ /**
+ * Number of nanoseconds since the start of the last second
+ *
+ * Generated from protobuf field int32 nanos = 2;
+ */
+ private $nanos = 0;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type int|string $seconds
+ * Number of complete seconds since the start of the epoch
+ * @type int $nanos
+ * Number of nanoseconds since the start of the last second
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\BasicTypes::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Number of complete seconds since the start of the epoch
+ *
+ * Generated from protobuf field int64 seconds = 1;
+ * @return int|string
+ */
+ public function getSeconds()
+ {
+ return $this->seconds;
+ }
+
+ /**
+ * Number of complete seconds since the start of the epoch
+ *
+ * Generated from protobuf field int64 seconds = 1;
+ * @param int|string $var
+ * @return $this
+ */
+ public function setSeconds($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->seconds = $var;
+
+ return $this;
+ }
+
+ /**
+ * Number of nanoseconds since the start of the last second
+ *
+ * Generated from protobuf field int32 nanos = 2;
+ * @return int
+ */
+ public function getNanos()
+ {
+ return $this->nanos;
+ }
+
+ /**
+ * Number of nanoseconds since the start of the last second
+ *
+ * Generated from protobuf field int32 nanos = 2;
+ * @param int $var
+ * @return $this
+ */
+ public function setNanos($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->nanos = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/TimestampSeconds.php b/community_server/src/Model/Messages/Gradido/TimestampSeconds.php
new file mode 100644
index 000000000..2646a06c9
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/TimestampSeconds.php
@@ -0,0 +1,67 @@
+model.messages.gradido.TimestampSeconds
+ */
+class TimestampSeconds extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Number of complete seconds since the start of the epoch
+ *
+ * Generated from protobuf field int64 seconds = 1;
+ */
+ private $seconds = 0;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type int|string $seconds
+ * Number of complete seconds since the start of the epoch
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\BasicTypes::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Number of complete seconds since the start of the epoch
+ *
+ * Generated from protobuf field int64 seconds = 1;
+ * @return int|string
+ */
+ public function getSeconds()
+ {
+ return $this->seconds;
+ }
+
+ /**
+ * Number of complete seconds since the start of the epoch
+ *
+ * Generated from protobuf field int64 seconds = 1;
+ * @param int|string $var
+ * @return $this
+ */
+ public function setSeconds($var)
+ {
+ GPBUtil::checkInt64($var);
+ $this->seconds = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/Transaction.php b/community_server/src/Model/Messages/Gradido/Transaction.php
new file mode 100644
index 000000000..065cd80bb
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/Transaction.php
@@ -0,0 +1,166 @@
+model.messages.gradido.Transaction
+ */
+class Transaction extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Generated from protobuf field uint64 id = 1;
+ */
+ private $id = 0;
+ /**
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2;
+ */
+ private $received = null;
+ /**
+ * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3;
+ */
+ private $sigMap = null;
+ /**
+ * Generated from protobuf field bytes txHash = 4;
+ */
+ private $txHash = '';
+ /**
+ * Generated from protobuf field bytes bodyBytes = 5;
+ */
+ private $bodyBytes = '';
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type int|string $id
+ * @type \Model\Messages\Gradido\TimestampSeconds $received
+ * @type \Model\Messages\Gradido\SignatureMap $sigMap
+ * @type string $txHash
+ * @type string $bodyBytes
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\Transaction::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Generated from protobuf field uint64 id = 1;
+ * @return int|string
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Generated from protobuf field uint64 id = 1;
+ * @param int|string $var
+ * @return $this
+ */
+ public function setId($var)
+ {
+ GPBUtil::checkUint64($var);
+ $this->id = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2;
+ * @return \Model\Messages\Gradido\TimestampSeconds
+ */
+ public function getReceived()
+ {
+ return $this->received;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds received = 2;
+ * @param \Model\Messages\Gradido\TimestampSeconds $var
+ * @return $this
+ */
+ public function setReceived($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class);
+ $this->received = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3;
+ * @return \Model\Messages\Gradido\SignatureMap
+ */
+ public function getSigMap()
+ {
+ return $this->sigMap;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.SignatureMap sigMap = 3;
+ * @param \Model\Messages\Gradido\SignatureMap $var
+ * @return $this
+ */
+ public function setSigMap($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\SignatureMap::class);
+ $this->sigMap = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field bytes txHash = 4;
+ * @return string
+ */
+ public function getTxHash()
+ {
+ return $this->txHash;
+ }
+
+ /**
+ * Generated from protobuf field bytes txHash = 4;
+ * @param string $var
+ * @return $this
+ */
+ public function setTxHash($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->txHash = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field bytes bodyBytes = 5;
+ * @return string
+ */
+ public function getBodyBytes()
+ {
+ return $this->bodyBytes;
+ }
+
+ /**
+ * Generated from protobuf field bytes bodyBytes = 5;
+ * @param string $var
+ * @return $this
+ */
+ public function setBodyBytes($var)
+ {
+ GPBUtil::checkString($var, False);
+ $this->bodyBytes = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/TransactionBody.php b/community_server/src/Model/Messages/Gradido/TransactionBody.php
new file mode 100644
index 000000000..3452d4251
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/TransactionBody.php
@@ -0,0 +1,193 @@
+model.messages.gradido.TransactionBody
+ */
+class TransactionBody extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * max 150 chars
+ *
+ * Generated from protobuf field string memo = 1;
+ */
+ private $memo = '';
+ /**
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2;
+ */
+ private $created = null;
+ protected $data;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type string $memo
+ * max 150 chars
+ * @type \Model\Messages\Gradido\TimestampSeconds $created
+ * @type \Model\Messages\Gradido\StateCreateGroup $createGroup
+ * @type \Model\Messages\Gradido\StateGroupChangeParent $groupChangeParent
+ * @type \Model\Messages\Gradido\Transfer $transfer
+ * @type \Model\Messages\Gradido\TransactionCreation $creation
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\TransactionBody::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * max 150 chars
+ *
+ * Generated from protobuf field string memo = 1;
+ * @return string
+ */
+ public function getMemo()
+ {
+ return $this->memo;
+ }
+
+ /**
+ * max 150 chars
+ *
+ * Generated from protobuf field string memo = 1;
+ * @param string $var
+ * @return $this
+ */
+ public function setMemo($var)
+ {
+ GPBUtil::checkString($var, True);
+ $this->memo = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2;
+ * @return \Model\Messages\Gradido\TimestampSeconds
+ */
+ public function getCreated()
+ {
+ return $this->created;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds created = 2;
+ * @param \Model\Messages\Gradido\TimestampSeconds $var
+ * @return $this
+ */
+ public function setCreated($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class);
+ $this->created = $var;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.StateCreateGroup createGroup = 6;
+ * @return \Model\Messages\Gradido\StateCreateGroup
+ */
+ public function getCreateGroup()
+ {
+ return $this->readOneof(6);
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.StateCreateGroup createGroup = 6;
+ * @param \Model\Messages\Gradido\StateCreateGroup $var
+ * @return $this
+ */
+ public function setCreateGroup($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\StateCreateGroup::class);
+ $this->writeOneof(6, $var);
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.StateGroupChangeParent groupChangeParent = 7;
+ * @return \Model\Messages\Gradido\StateGroupChangeParent
+ */
+ public function getGroupChangeParent()
+ {
+ return $this->readOneof(7);
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.StateGroupChangeParent groupChangeParent = 7;
+ * @param \Model\Messages\Gradido\StateGroupChangeParent $var
+ * @return $this
+ */
+ public function setGroupChangeParent($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\StateGroupChangeParent::class);
+ $this->writeOneof(7, $var);
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Transfer transfer = 8;
+ * @return \Model\Messages\Gradido\Transfer
+ */
+ public function getTransfer()
+ {
+ return $this->readOneof(8);
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.Transfer transfer = 8;
+ * @param \Model\Messages\Gradido\Transfer $var
+ * @return $this
+ */
+ public function setTransfer($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\Transfer::class);
+ $this->writeOneof(8, $var);
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.TransactionCreation creation = 9;
+ * @return \Model\Messages\Gradido\TransactionCreation
+ */
+ public function getCreation()
+ {
+ return $this->readOneof(9);
+ }
+
+ /**
+ * Generated from protobuf field .model.messages.gradido.TransactionCreation creation = 9;
+ * @param \Model\Messages\Gradido\TransactionCreation $var
+ * @return $this
+ */
+ public function setCreation($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\TransactionCreation::class);
+ $this->writeOneof(9, $var);
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getData()
+ {
+ return $this->whichOneof("data");
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/TransactionCreation.php b/community_server/src/Model/Messages/Gradido/TransactionCreation.php
new file mode 100644
index 000000000..1c8f33dba
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/TransactionCreation.php
@@ -0,0 +1,136 @@
+model.messages.gradido.TransactionCreation
+ */
+class TransactionCreation extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * 40 Byte
+ *
+ * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1;
+ */
+ private $receiverAmount = null;
+ /**
+ * 4 Byte
+ *
+ * Generated from protobuf field sint32 ident_hash = 2;
+ */
+ private $ident_hash = 0;
+ /**
+ * 8 Byte
+ *
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3;
+ */
+ private $target_date = null;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type \Model\Messages\Gradido\ReceiverAmount $receiverAmount
+ * 40 Byte
+ * @type int $ident_hash
+ * 4 Byte
+ * @type \Model\Messages\Gradido\TimestampSeconds $target_date
+ * 8 Byte
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\TransactionCreation::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * 40 Byte
+ *
+ * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1;
+ * @return \Model\Messages\Gradido\ReceiverAmount
+ */
+ public function getReceiverAmount()
+ {
+ return $this->receiverAmount;
+ }
+
+ /**
+ * 40 Byte
+ *
+ * Generated from protobuf field .model.messages.gradido.ReceiverAmount receiverAmount = 1;
+ * @param \Model\Messages\Gradido\ReceiverAmount $var
+ * @return $this
+ */
+ public function setReceiverAmount($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\ReceiverAmount::class);
+ $this->receiverAmount = $var;
+
+ return $this;
+ }
+
+ /**
+ * 4 Byte
+ *
+ * Generated from protobuf field sint32 ident_hash = 2;
+ * @return int
+ */
+ public function getIdentHash()
+ {
+ return $this->ident_hash;
+ }
+
+ /**
+ * 4 Byte
+ *
+ * Generated from protobuf field sint32 ident_hash = 2;
+ * @param int $var
+ * @return $this
+ */
+ public function setIdentHash($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->ident_hash = $var;
+
+ return $this;
+ }
+
+ /**
+ * 8 Byte
+ *
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3;
+ * @return \Model\Messages\Gradido\TimestampSeconds
+ */
+ public function getTargetDate()
+ {
+ return $this->target_date;
+ }
+
+ /**
+ * 8 Byte
+ *
+ * Generated from protobuf field .model.messages.gradido.TimestampSeconds target_date = 3;
+ * @param \Model\Messages\Gradido\TimestampSeconds $var
+ * @return $this
+ */
+ public function setTargetDate($var)
+ {
+ GPBUtil::checkMessage($var, \Model\Messages\Gradido\TimestampSeconds::class);
+ $this->target_date = $var;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Messages/Gradido/Transfer.php b/community_server/src/Model/Messages/Gradido/Transfer.php
new file mode 100644
index 000000000..2c031d02b
--- /dev/null
+++ b/community_server/src/Model/Messages/Gradido/Transfer.php
@@ -0,0 +1,85 @@
+model.messages.gradido.Transfer
+ */
+class Transfer extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1;
+ */
+ private $senderAmounts;
+ /**
+ * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2;
+ */
+ private $receiverAmounts;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type \Model\Messages\Gradido\SenderAmount[]|\Google\Protobuf\Internal\RepeatedField $senderAmounts
+ * @type \Model\Messages\Gradido\ReceiverAmount[]|\Google\Protobuf\Internal\RepeatedField $receiverAmounts
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\Transfer::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1;
+ * @return \Google\Protobuf\Internal\RepeatedField
+ */
+ public function getSenderAmounts()
+ {
+ return $this->senderAmounts;
+ }
+
+ /**
+ * Generated from protobuf field repeated .model.messages.gradido.SenderAmount senderAmounts = 1;
+ * @param \Model\Messages\Gradido\SenderAmount[]|\Google\Protobuf\Internal\RepeatedField $var
+ * @return $this
+ */
+ public function setSenderAmounts($var)
+ {
+ $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\SenderAmount::class);
+ $this->senderAmounts = $arr;
+
+ return $this;
+ }
+
+ /**
+ * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2;
+ * @return \Google\Protobuf\Internal\RepeatedField
+ */
+ public function getReceiverAmounts()
+ {
+ return $this->receiverAmounts;
+ }
+
+ /**
+ * Generated from protobuf field repeated .model.messages.gradido.ReceiverAmount receiverAmounts = 2;
+ * @param \Model\Messages\Gradido\ReceiverAmount[]|\Google\Protobuf\Internal\RepeatedField $var
+ * @return $this
+ */
+ public function setReceiverAmounts($var)
+ {
+ $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Model\Messages\Gradido\ReceiverAmount::class);
+ $this->receiverAmounts = $arr;
+
+ return $this;
+ }
+
+}
+
diff --git a/community_server/src/Model/Navigation/NaviBreakLine.php b/community_server/src/Model/Navigation/NaviBreakLine.php
new file mode 100644
index 000000000..79917db8c
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviBreakLine.php
@@ -0,0 +1,16 @@
+ ";
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Model/Navigation/NaviEntry.php b/community_server/src/Model/Navigation/NaviEntry.php
new file mode 100644
index 000000000..2b02db9a8
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviEntry.php
@@ -0,0 +1,89 @@
+controller = $controller;
+ $this->action = $action;
+ $this->param = $param;
+ $this->iconClass = $iconClass;
+ if($active != null) {
+ $this->active = $active;
+ } else {
+ $this->active = ($GLOBALS["side"] == $controller &&
+ $GLOBALS["subside"] == $action &&
+ $GLOBALS["passed"] == $param);
+ }
+ $this->title = $title;
+ return $this;
+ }
+
+ public function setIconColor($iconColorClass) {
+ $this->iconColor = $iconColorClass;
+ return $this;
+ }
+ public function setBGColor($bgColorClass) {
+ $this->bgColorClass = $bgColorClass;
+ return $this;
+ }
+ private function isActive() {
+ return $this->active;
+ }
+
+
+
+ private function link() {
+ $self = $GLOBALS["self"];
+ if($this->hasChilds()) {
+ return $self->Html->link(
+ $this->title.' ',
+ ['controller' => $this->controller, "action" => $this->action, $this->param],
+ ['escape' => false]
+ );
+ } else {
+ return $self->Html->Link(
+ ''. $this->iconClass .' '
+ .'' . $this->title . ' ',
+ ['controller' => $this->controller, 'action' => $this->action, $this->param],
+ ['class' => $this->bgColorClass, 'escape' => false]);
+ }
+ }
+
+ public function __toString() {
+ $str = "";
+ $str .= "hasChilds()) { $class .= "dropdown";}
+ if($this->isActive()) { $class .= " selected"; }
+ if(strlen($class) > 0 ) $str .= " class='$class'";
+ $str .= ">";
+
+ $str .= $this->link();
+ if($this->hasChilds()) {
+ $str .= "";
+ foreach($this->childs as $child) {
+ $str .= $child;
+ }
+ $str .= " ";
+ }
+ $str .= " ";
+ return $str;
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php b/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php
new file mode 100644
index 000000000..7d467ed69
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviEntryAbsoluteLink.php
@@ -0,0 +1,92 @@
+link = $link;
+ $this->iconClass = $iconClass;
+ if ($active != null) {
+ $this->active = $active;
+ }
+ $this->title = $title;
+ return $this;
+ }
+
+ public function setIconColor($iconColorClass)
+ {
+ $this->iconColor = $iconColorClass;
+ return $this;
+ }
+
+ public function setBGColor($bgColorClass)
+ {
+ $this->bgColorClass = $bgColorClass;
+ return $this;
+ }
+
+ private function isActive()
+ {
+ return $this->active;
+ }
+
+ protected function link()
+ {
+ $self = $GLOBALS["self"];
+ if ($this->hasChilds()) {
+ return $self->Html->link(
+ $this->title.' ',
+ ['controller' => $this->controller, "action" => $this->action, $this->param],
+ ['escape' => false]
+ );
+ } else {
+ return ''
+ .''. $this->iconClass .' '
+ . '' . $this->title . ' '
+ . ' ';
+ }
+ }
+
+ public function __toString()
+ {
+ $str = "";
+ $str .= "hasChilds()) {
+ $class .= "dropdown";
+ }
+ if ($this->isActive()) {
+ $class .= " selected";
+ }
+ if (strlen($class) > 0) {
+ $str .= " class='$class'";
+ }
+ $str .= ">";
+
+ $str .= $this->link();
+ if ($this->hasChilds()) {
+ $str .= "";
+ foreach ($this->childs as $child) {
+ $str .= $child;
+ }
+ $str .= " ";
+ }
+ $str .= " ";
+ return $str;
+ }
+}
diff --git a/community_server/src/Model/Navigation/NaviEntryBase.php b/community_server/src/Model/Navigation/NaviEntryBase.php
new file mode 100644
index 000000000..ebb4e122f
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviEntryBase.php
@@ -0,0 +1,31 @@
+title = $title;
+ return $this;
+ }
+
+ public function add($child) {
+ $child->isChild = true;
+ array_push($this->childs, $child);
+ return $this;
+ }
+
+ protected function hasChilds() {
+ return count($this->childs) > 0;
+ }
+
+}
diff --git a/community_server/src/Model/Navigation/NaviEntryExternLink.php b/community_server/src/Model/Navigation/NaviEntryExternLink.php
new file mode 100644
index 000000000..8ace7fb4c
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviEntryExternLink.php
@@ -0,0 +1,26 @@
+link.'" class="' .$this->bgColorClass .'" target="_blank">'
+ .''. $this->iconClass .' '
+ . '' . $this->title . ' '
+ . '';
+ }
+}
diff --git a/community_server/src/Model/Navigation/NaviEntrySub.php b/community_server/src/Model/Navigation/NaviEntrySub.php
new file mode 100644
index 000000000..ae79aa433
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviEntrySub.php
@@ -0,0 +1,105 @@
+controller = $controller;
+ $this->action = $action;
+ $this->param = $param;
+ $this->iconClass = $iconClass;
+ if ($active != null) {
+ $this->active = $active;
+ } else {
+ $this->active = ($GLOBALS["side"] == $controller &&
+ $GLOBALS["subside"] == $action &&
+ $GLOBALS["passed"] == $param);
+ }
+ $this->title = $title;
+ $this->subtitle = $subtitle;
+ return $this;
+ }
+
+ public function setIconColor($iconColorClass)
+ {
+ $this->iconColor = $iconColorClass;
+ return $this;
+ }
+ public function setBGColor($bgColorClass)
+ {
+ $this->bgColorClass = $bgColorClass;
+ return $this;
+ }
+ private function isActive()
+ {
+ return $this->active;
+ }
+
+ private function link()
+ {
+ $self = $GLOBALS["self"];
+ if ($this->hasChilds()) {
+ return $self->Html->link(
+ $this->title.' ',
+ ['controller' => $this->controller, "action" => $this->action, $this->param],
+ ['escape' => false]
+ );
+ } else {
+ return $self->Html->Link(
+ ''
+ .'' . $this->title . ' '
+ .''. $this->iconClass .' ',
+ ['controller' => $this->controller, 'action' => $this->action, $this->param],
+ ['class' => $this->bgColorClass, 'escape' => false]
+ );
+ }
+ }
+
+ public function __toString()
+ {
+ $str = "";
+ $str .= "hasChilds()) {
+ $class .= "dropdown";
+ }
+ if ($this->isActive()) {
+ $class .= " selected";
+ }
+ if (strlen($class) > 0) {
+ $str .= " class='$class'";
+ }
+ $str .= ">";
+
+ $str .= ''. $this->subtitle .' ';
+ $str .= $this->link();
+
+ if ($this->hasChilds()) {
+ $str .= "";
+ foreach ($this->childs as $child) {
+ $str .= $child;
+ }
+ $str .= " ";
+ }
+ $str .= " ";
+ return $str;
+ }
+}
diff --git a/community_server/src/Model/Navigation/NaviHierarchy.php b/community_server/src/Model/Navigation/NaviHierarchy.php
new file mode 100644
index 000000000..5017f8678
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviHierarchy.php
@@ -0,0 +1,49 @@
+
+*/
+class NaviHierarchy implements \Countable
+{
+ private $hierarchy = [];
+
+ public function add($entry)
+ {
+ array_push($this->hierarchy, $entry);
+ return $this;
+ }
+ public function getHierarchy()
+ {
+ return $this->hierarchy;
+ }
+ public function count()
+ {
+ return count($this->hierarchy);
+ }
+ public function __toString()
+ {
+ $html = "";
+ $count = count($this->hierarchy);
+ foreach ($this->hierarchy as $i => $e) {
+ $html .= $e;
+ if ($i < $count - 1) {
+ $html .= "- ";
+ }
+ }
+ $html .= " ";
+ return $html;
+ }
+}
diff --git a/community_server/src/Model/Navigation/NaviHierarchyEntry.php b/community_server/src/Model/Navigation/NaviHierarchyEntry.php
new file mode 100644
index 000000000..5256518df
--- /dev/null
+++ b/community_server/src/Model/Navigation/NaviHierarchyEntry.php
@@ -0,0 +1,53 @@
+
+*/
+class NaviHierarchyEntry
+{
+ private $name;
+ private $controller;
+ private $action;
+ public function __construct($name, $controller, $action, $isLast)
+ {
+ $this->name = $name;
+ $this->controller = $controller;
+ $this->action = $action;
+ $this->isLast = $isLast;
+ return $this;
+ }
+ private function link()
+ {
+ $self = $GLOBALS["self"];
+ return $self->Html->Link(
+ '' . $this->name . ' ',
+ ['controller' => $this->controller, 'action' => $this->action],
+ ['class' => "", 'escape' => false]
+ );
+ }
+
+ public function __toString()
+ {
+ $str = "isLast){
+ $str .= " class='selected'";
+ }
+ $str .= ">";
+ $str .= $this->link();
+ $str .= " ";
+ return $str;
+ }
+}
diff --git a/community_server/src/Model/Navigation/TitleOnly.php b/community_server/src/Model/Navigation/TitleOnly.php
new file mode 100644
index 000000000..39d7ac616
--- /dev/null
+++ b/community_server/src/Model/Navigation/TitleOnly.php
@@ -0,0 +1,37 @@
+title = $title;
+ }
+
+ public function __toString() {
+ $str = "";
+ $str .= "hasChilds()) { $class .= " dropdown";}
+ if(strlen($class) > 0 ) $str .= " class='$class'";
+ $str .= ">";
+ $hNumber = 1;
+ if($this->isChild) $hNumber = 3;
+ $str .= "" . $this->title . " ";
+ if($this->hasChilds()) {
+ $str .= "";
+ foreach($this->childs as $child) {
+ $str .= $child;
+ }
+ $str .= " ";
+ }
+ $str .= " ";
+ return $str;
+ }
+}
diff --git a/community_server/src/Model/Table/AddressTypesTable.php b/community_server/src/Model/Table/AddressTypesTable.php
new file mode 100644
index 000000000..ea0c86d6e
--- /dev/null
+++ b/community_server/src/Model/Table/AddressTypesTable.php
@@ -0,0 +1,73 @@
+setTable('address_types');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->hasMany('StateGroupAddresses', [
+ 'foreignKey' => 'address_type_id'
+ ]);
+ $this->hasMany('TransactionGroupAddaddress', [
+ 'foreignKey' => 'address_type_id'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('name')
+ ->maxLength('name', 25)
+ ->requirePresence('name', 'create')
+ ->notEmptyString('name');
+
+ $validator
+ ->scalar('text')
+ ->maxLength('text', 255)
+ ->allowEmptyString('text');
+
+ return $validator;
+ }
+}
diff --git a/community_server/src/Model/Table/AdminErrorsTable.php b/community_server/src/Model/Table/AdminErrorsTable.php
new file mode 100644
index 000000000..e6263d8ff
--- /dev/null
+++ b/community_server/src/Model/Table/AdminErrorsTable.php
@@ -0,0 +1,107 @@
+setTable('admin_errors');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->belongsTo('StateUsers', [
+ 'foreignKey' => 'state_user_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('controller')
+ ->maxLength('controller', 255)
+ ->requirePresence('controller', 'create')
+ ->notEmptyString('controller');
+
+ $validator
+ ->scalar('action')
+ ->maxLength('action', 255)
+ ->requirePresence('action', 'create')
+ ->notEmptyString('action');
+
+ $validator
+ ->scalar('state')
+ ->maxLength('state', 255)
+ ->requirePresence('state', 'create')
+ ->notEmptyString('state');
+
+ $validator
+ ->scalar('msg')
+ ->maxLength('msg', 255)
+ ->requirePresence('msg', 'create')
+ ->notEmptyString('msg');
+
+ $validator
+ ->scalar('details')
+ ->maxLength('details', 255)
+ ->requirePresence('details', 'create')
+ ->notEmptyString('details');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['state_user_id'], 'StateUsers'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/CommunityProfilesTable.php b/community_server/src/Model/Table/CommunityProfilesTable.php
new file mode 100644
index 000000000..bbe862092
--- /dev/null
+++ b/community_server/src/Model/Table/CommunityProfilesTable.php
@@ -0,0 +1,81 @@
+setTable('community_profiles');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('StateUsers', [
+ 'foreignKey' => 'state_user_id',
+ 'joinType' => 'INNER',
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->allowEmptyFile('profile_img');
+
+ $validator
+ ->scalar('profile_desc')
+ ->maxLength('profile_desc', 2000)
+ ->allowEmptyFile('profile_desc');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['state_user_id'], 'StateUsers'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/ElopageBuysTable.php b/community_server/src/Model/Table/ElopageBuysTable.php
new file mode 100644
index 000000000..a5279d920
--- /dev/null
+++ b/community_server/src/Model/Table/ElopageBuysTable.php
@@ -0,0 +1,116 @@
+setTable('elopage_buys');
+ $this->setDisplayField('payer_email');
+ $this->setPrimaryKey('id');
+
+ }
+
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->integer('product_price')
+ ->requirePresence('product_price', 'create')
+ ->notEmptyString('product_price');
+
+ $validator
+ ->scalar('payer_email')
+ ->maxLength('payer_email', 255)
+ ->requirePresence('payer_email', 'create')
+ ->notEmptyString('payer_email');
+
+ $validator
+ ->scalar('publisher_email')
+ ->maxLength('publisher_email', 255)
+ ->requirePresence('publisher_email', 'create')
+ ->notEmptyString('publisher_email');
+
+ $validator
+ ->boolean('payed')
+ ->requirePresence('payed', 'create')
+ ->notEmptyString('payed');
+
+ $validator
+ ->dateTime('success_date')
+ ->requirePresence('success_date', 'create')
+ ->notEmptyDateTime('success_date');
+
+ $validator
+ ->scalar('event')
+ ->maxLength('event', 255)
+ ->requirePresence('event', 'create')
+ ->notEmptyString('event');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+
+ return $rules;
+ }
+
+ /**
+ * Returns the database connection name to use by default.
+ *
+ * @return string
+ */
+ public static function defaultConnectionName()
+ {
+ return 'loginServer';
+ }
+}
diff --git a/community_server/src/Model/Table/OperatorTypesTable.php b/community_server/src/Model/Table/OperatorTypesTable.php
new file mode 100644
index 000000000..8a3ce608c
--- /dev/null
+++ b/community_server/src/Model/Table/OperatorTypesTable.php
@@ -0,0 +1,70 @@
+setTable('operator_types');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->hasMany('Operators', [
+ 'foreignKey' => 'operator_type_id'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('name')
+ ->maxLength('name', 25)
+ ->requirePresence('name', 'create')
+ ->notEmptyString('name');
+
+ $validator
+ ->scalar('text')
+ ->maxLength('text', 255)
+ ->requirePresence('text', 'create')
+ ->notEmptyString('text');
+
+ return $validator;
+ }
+}
diff --git a/community_server/src/Model/Table/OperatorsTable.php b/community_server/src/Model/Table/OperatorsTable.php
new file mode 100644
index 000000000..7ae272767
--- /dev/null
+++ b/community_server/src/Model/Table/OperatorsTable.php
@@ -0,0 +1,93 @@
+setTable('operators');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('OperatorTypes', [
+ 'foreignKey' => 'operator_type_id',
+ 'joinType' => 'INNER'
+ ]);
+
+ $this->addBehavior('Timestamp');
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('username')
+ ->maxLength('username', 50)
+ ->requirePresence('username', 'create')
+ ->notEmptyString('username');
+ //->add('usernamePasswordHash', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);
+
+ $validator
+ ->requirePresence('user_pubkey', 'create')
+ ->notEmptyString('user_pubkey');
+
+ $validator
+ ->scalar('data_base64')
+ ->maxLength('data_base64', 255)
+ ->requirePresence('data_base64', 'create')
+ ->notEmptyString('data_base64');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ //$rules->add($rules->isUnique(['usernamePasswordHash']));
+ $rules->add($rules->existsIn(['operator_type_id'], 'OperatorTypes'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/ServerUsersTable.php b/community_server/src/Model/Table/ServerUsersTable.php
new file mode 100644
index 000000000..0ad1fbacb
--- /dev/null
+++ b/community_server/src/Model/Table/ServerUsersTable.php
@@ -0,0 +1,101 @@
+setTable('server_users');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('username')
+ ->maxLength('username', 50)
+ ->requirePresence('username', 'create')
+ ->notEmptyString('username', __('Please give a username'));
+
+ $validator
+ ->scalar('password')
+ ->maxLength('password', 255)
+ ->requirePresence('password', 'create')
+ ->notEmptyString('password', __('Please give a password'));
+
+ $validator
+ ->email('email')
+ ->requirePresence('email', 'create')
+ ->notEmptyString('email', __('Please give a email'));
+
+ $validator
+ ->scalar('role')
+ ->maxLength('role', 20)
+ ->notEmptyString('role');
+
+ $validator
+ ->boolean('activated')
+ ->notEmptyString('activated');
+
+ $validator
+ ->dateTime('last_login')
+ ->allowEmptyDateTime('last_login');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->isUnique(['username']));
+ $rules->add($rules->isUnique(['email']));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/StateBalancesTable.php b/community_server/src/Model/Table/StateBalancesTable.php
new file mode 100644
index 000000000..85b2f7837
--- /dev/null
+++ b/community_server/src/Model/Table/StateBalancesTable.php
@@ -0,0 +1,81 @@
+setTable('state_balances');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->belongsTo('StateUsers', [
+ 'foreignKey' => 'state_user_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('amount', 'create')
+ ->notEmptyString('amount');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['state_user_id'], 'StateUsers'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/StateCreatedTable.php b/community_server/src/Model/Table/StateCreatedTable.php
new file mode 100644
index 000000000..c97851f28
--- /dev/null
+++ b/community_server/src/Model/Table/StateCreatedTable.php
@@ -0,0 +1,96 @@
+setTable('state_created');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->belongsTo('Transactions', [
+ 'foreignKey' => 'transaction_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('StateUsers', [
+ 'foreignKey' => 'state_user_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('month', 'create')
+ ->notEmptyString('month');
+
+ $validator
+ ->requirePresence('year', 'create')
+ ->notEmptyString('year');
+
+ $validator
+ ->integer('short_ident_hash')
+ ->requirePresence('short_ident_hash', 'create')
+ ->notEmptyString('short_ident_hash');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['transaction_id'], 'Transactions'));
+ $rules->add($rules->existsIn(['state_user_id'], 'StateUsers'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/StateErrorsTable.php b/community_server/src/Model/Table/StateErrorsTable.php
new file mode 100644
index 000000000..62893b7bf
--- /dev/null
+++ b/community_server/src/Model/Table/StateErrorsTable.php
@@ -0,0 +1,88 @@
+setTable('state_errors');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->belongsTo('StateUsers', [
+ 'foreignKey' => 'state_user_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('TransactionTypes', [
+ 'foreignKey' => 'transaction_type_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('message_json')
+ ->requirePresence('message_json', 'create')
+ ->notEmptyString('message_json');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['state_user_id'], 'StateUsers'));
+ $rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/StateGroupAddressesTable.php b/community_server/src/Model/Table/StateGroupAddressesTable.php
new file mode 100644
index 000000000..62fcf9470
--- /dev/null
+++ b/community_server/src/Model/Table/StateGroupAddressesTable.php
@@ -0,0 +1,83 @@
+setTable('state_group_addresses');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('StateGroups', [
+ 'foreignKey' => 'state_group_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('AddressTypes', [
+ 'foreignKey' => 'address_type_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('public_key', 'create')
+ ->notEmptyString('public_key');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['state_group_id'], 'StateGroups'));
+ $rules->add($rules->existsIn(['address_type_id'], 'AddressTypes'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/StateGroupRelationshipsTable.php b/community_server/src/Model/Table/StateGroupRelationshipsTable.php
new file mode 100644
index 000000000..449561583
--- /dev/null
+++ b/community_server/src/Model/Table/StateGroupRelationshipsTable.php
@@ -0,0 +1,85 @@
+setTable('state_group_relationships');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('StateGroup1s', [
+ 'foreignKey' => 'state_group1_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('StateGroup2s', [
+ 'foreignKey' => 'state_group2_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('StateRelationships', [
+ 'foreignKey' => 'state_relationship_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['state_group1_id'], 'StateGroup1s'));
+ $rules->add($rules->existsIn(['state_group2_id'], 'StateGroup2s'));
+ $rules->add($rules->existsIn(['state_relationship_id'], 'StateRelationships'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/StateGroupsTable.php b/community_server/src/Model/Table/StateGroupsTable.php
new file mode 100644
index 000000000..49911d495
--- /dev/null
+++ b/community_server/src/Model/Table/StateGroupsTable.php
@@ -0,0 +1,102 @@
+setTable('state_groups');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('Indices', [
+ 'foreignKey' => 'index_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->hasMany('StateGroupAddresses', [
+ 'foreignKey' => 'state_group_id'
+ ]);
+ $this->hasMany('StateUsers', [
+ 'foreignKey' => 'state_group_id'
+ ]);
+ $this->hasMany('TransactionGroupCreates', [
+ 'foreignKey' => 'state_group_id'
+ ]);
+ $this->hasMany('Transactions', [
+ 'foreignKey' => 'state_group_id'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('name')
+ ->maxLength('name', 50)
+ ->requirePresence('name', 'create')
+ ->notEmptyString('name');
+
+ $validator
+ ->requirePresence('root_public_key', 'create')
+ ->notEmptyString('root_public_key');
+
+ $validator
+ ->notEmptyString('user_count');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['index_id'], 'Indices'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/StateRelationshipTypesTable.php b/community_server/src/Model/Table/StateRelationshipTypesTable.php
new file mode 100644
index 000000000..a18e7ce51
--- /dev/null
+++ b/community_server/src/Model/Table/StateRelationshipTypesTable.php
@@ -0,0 +1,63 @@
+setTable('state_relationship_types');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('name')
+ ->maxLength('name', 25)
+ ->requirePresence('name', 'create')
+ ->notEmptyString('name');
+
+ $validator
+ ->scalar('text')
+ ->maxLength('text', 255)
+ ->allowEmptyString('text');
+
+ return $validator;
+ }
+}
diff --git a/community_server/src/Model/Table/StateUsersTable.php b/community_server/src/Model/Table/StateUsersTable.php
new file mode 100644
index 000000000..77f026d0a
--- /dev/null
+++ b/community_server/src/Model/Table/StateUsersTable.php
@@ -0,0 +1,118 @@
+setTable('state_users');
+ $this->setDisplayField('email');
+ $this->setPrimaryKey('id');
+
+ /*$this->belongsTo('Indices', [
+ 'foreignKey' => 'index_id',
+ 'joinType' => 'INNER'
+ ]);*/
+ $this->belongsTo('StateGroups', [
+ 'foreignKey' => 'state_group_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->hasMany('StateBalances', [
+ 'foreignKey' => 'state_user_id'
+ ]);
+ $this->hasMany('StateCreated', [
+ 'foreignKey' => 'state_user_id'
+ ]);
+ $this->hasMany('TransactionCreations', [
+ 'foreignKey' => 'state_user_id'
+ ]);
+ $this->hasMany('TransactionSendCoins', [
+ 'foreignKey' => 'state_user_id'
+ ]);
+ $this->hasMany('TransactionReceivedCoins', [
+ 'className' => 'TransactionSendCoins',
+ 'foreignKey' => 'receiver_user_id'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('public_key', 'create')
+ ->notEmptyString('public_key');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ // $rules->add($rules->existsIn(['index_id'], 'Indices'));
+ //$rules->add($rules->existsIn(['state_group_id'], 'StateGroups'));
+
+ return $rules;
+ }
+
+ public function getReceiverProposal() {
+ $stateUsers = $this->find('all');
+ $receiverProposal = [];
+ foreach($stateUsers as $stateUser) {
+ $name = $stateUser->email;
+ $keyHex = bin2hex(stream_get_contents($stateUser->public_key));
+ if($name === NULL) {
+ $name = $stateUser->first_name . ' ' . $stateUser->last_name;
+ }
+ array_push($receiverProposal, ['name' => $name, 'key' => $keyHex]);
+ //$stateUser->public_key
+ }
+ return $receiverProposal;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionCreationsTable.php b/community_server/src/Model/Table/TransactionCreationsTable.php
new file mode 100644
index 000000000..bc9592ccf
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionCreationsTable.php
@@ -0,0 +1,89 @@
+setTable('transaction_creations');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('Transactions', [
+ 'foreignKey' => 'transaction_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('StateUsers', [
+ 'foreignKey' => 'state_user_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('amount', 'create')
+ ->notEmptyString('amount');
+
+ $validator
+ //->requirePresence('ident_hash', 'create')
+ //->notEmptyString('ident_hash');
+ ->allowEmptyString('ident_hash', null, 'create');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['transaction_id'], 'Transactions'));
+ $rules->add($rules->existsIn(['state_user_id'], 'StateUsers'));
+ $rules->add($rules->existsIn(['receiver_user_id'], 'StateUsers'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionGroupAddaddressTable.php b/community_server/src/Model/Table/TransactionGroupAddaddressTable.php
new file mode 100644
index 000000000..3fd03f32a
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionGroupAddaddressTable.php
@@ -0,0 +1,83 @@
+setTable('transaction_group_addaddress');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('Transactions', [
+ 'foreignKey' => 'transaction_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('AddressTypes', [
+ 'foreignKey' => 'address_type_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('public_key', 'create')
+ ->notEmptyString('public_key');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['transaction_id'], 'Transactions'));
+ $rules->add($rules->existsIn(['address_type_id'], 'AddressTypes'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php b/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php
new file mode 100644
index 000000000..463d1af8e
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionGroupAllowtradesTable.php
@@ -0,0 +1,83 @@
+setTable('transaction_group_allowtrades');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('Transactions', [
+ 'foreignKey' => 'transaction_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('Groups', [
+ 'foreignKey' => 'group_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->boolean('allow')
+ ->notEmptyString('allow');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['transaction_id'], 'Transactions'));
+ $rules->add($rules->existsIn(['group_id'], 'Groups'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionGroupCreatesTable.php b/community_server/src/Model/Table/TransactionGroupCreatesTable.php
new file mode 100644
index 000000000..263182b8e
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionGroupCreatesTable.php
@@ -0,0 +1,89 @@
+setTable('transaction_group_creates');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('Transactions', [
+ 'foreignKey' => 'transaction_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('StateGroups', [
+ 'foreignKey' => 'state_group_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('group_public_key', 'create')
+ ->notEmptyString('group_public_key');
+
+ $validator
+ ->scalar('name')
+ ->maxLength('name', 64)
+ ->requirePresence('name', 'create')
+ ->notEmptyString('name');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['transaction_id'], 'Transactions'));
+ $rules->add($rules->existsIn(['state_group_id'], 'StateGroups'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionSendCoinsTable.php b/community_server/src/Model/Table/TransactionSendCoinsTable.php
new file mode 100644
index 000000000..87ebb72f4
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionSendCoinsTable.php
@@ -0,0 +1,98 @@
+setTable('transaction_send_coins');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('Transactions', [
+ 'foreignKey' => 'transaction_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('StateUsers', [
+ 'foreignKey' => 'state_user_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('ReceiverUsers', [
+ 'className' => 'StateUsers',
+ 'foreignKey' => 'receiver_user_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('receiver_public_key', 'create')
+ ->notEmptyString('receiver_public_key');
+
+ $validator
+ ->requirePresence('amount', 'create')
+ ->notEmptyString('amount');
+
+ $validator
+ ->requirePresence('sender_final_balance', 'create')
+ ->notEmptyString('sender_final_balance');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['transaction_id'], 'Transactions'));
+ $rules->add($rules->existsIn(['state_user_id'], 'StateUsers'));
+ $rules->add($rules->existsIn(['receiver_user_id'], 'ReceiverUsers'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionSignaturesTable.php b/community_server/src/Model/Table/TransactionSignaturesTable.php
new file mode 100644
index 000000000..60c1ae99f
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionSignaturesTable.php
@@ -0,0 +1,81 @@
+setTable('transaction_signatures');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('Transactions', [
+ 'foreignKey' => 'transaction_id',
+ 'joinType' => 'INNER'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->requirePresence('signature', 'create')
+ ->notEmptyString('signature');
+
+ $validator
+ ->requirePresence('pubkey', 'create')
+ ->notEmptyString('pubkey');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['transaction_id'], 'Transactions'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionTypesTable.php b/community_server/src/Model/Table/TransactionTypesTable.php
new file mode 100644
index 000000000..5cc842f5e
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionTypesTable.php
@@ -0,0 +1,69 @@
+setTable('transaction_types');
+ $this->setDisplayField('name');
+ $this->setPrimaryKey('id');
+
+ $this->hasMany('Transactions', [
+ 'foreignKey' => 'transaction_type_id'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->scalar('name')
+ ->maxLength('name', 24)
+ ->requirePresence('name', 'create')
+ ->notEmptyString('name');
+
+ $validator
+ ->scalar('text')
+ ->maxLength('text', 255)
+ ->allowEmptyString('text');
+
+ return $validator;
+ }
+}
diff --git a/community_server/src/Model/Table/TransactionsTable.php b/community_server/src/Model/Table/TransactionsTable.php
new file mode 100644
index 000000000..75659a5b2
--- /dev/null
+++ b/community_server/src/Model/Table/TransactionsTable.php
@@ -0,0 +1,117 @@
+setTable('transactions');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->belongsTo('StateGroups', [
+ 'foreignKey' => 'state_group_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->belongsTo('TransactionTypes', [
+ 'foreignKey' => 'transaction_type_id',
+ 'joinType' => 'INNER'
+ ]);
+ $this->hasMany('StateCreated', [
+ 'foreignKey' => 'transaction_id'
+ ]);
+ $this->hasMany('TransactionCreations', [
+ 'foreignKey' => 'transaction_id'
+ ]);
+ $this->hasMany('TransactionGroupAddaddress', [
+ 'foreignKey' => 'transaction_id'
+ ]);
+ $this->hasMany('TransactionGroupAllowtrades', [
+ 'foreignKey' => 'transaction_id'
+ ]);
+ $this->hasMany('TransactionGroupCreates', [
+ 'foreignKey' => 'transaction_id'
+ ]);
+ $this->hasMany('TransactionSendCoins', [
+ 'foreignKey' => 'transaction_id'
+ ]);
+ $this->hasMany('TransactionSignatures', [
+ 'foreignKey' => 'transaction_id'
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ //->requirePresence('tx_hash', 'create')
+ ->allowEmptyString('tx_hash', null, 'create');
+
+ $validator
+ ->allowEmptyString('memo', null, 'create');
+
+ $validator
+ ->dateTime('received')
+ ->notEmptyDateTime('received');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->existsIn(['state_group_id'], 'StateGroups'));
+ $rules->add($rules->existsIn(['transaction_type_id'], 'TransactionTypes'));
+
+ return $rules;
+ }
+}
diff --git a/community_server/src/Model/Table/UsersTable.php b/community_server/src/Model/Table/UsersTable.php
new file mode 100644
index 000000000..0e99ba521
--- /dev/null
+++ b/community_server/src/Model/Table/UsersTable.php
@@ -0,0 +1,130 @@
+setTable('users');
+ $this->setDisplayField('id');
+ $this->setPrimaryKey('id');
+
+ $this->addBehavior('Timestamp');
+
+ $this->hasMany('EmailOptIn', [
+ 'foreignKey' => 'user_id',
+ ]);
+ $this->hasMany('UserBackups', [
+ 'foreignKey' => 'user_id',
+ ]);
+ $this->hasMany('UserRoles', [
+ 'foreignKey' => 'user_id',
+ ]);
+ }
+
+ /**
+ * Default validation rules.
+ *
+ * @param \Cake\Validation\Validator $validator Validator instance.
+ * @return \Cake\Validation\Validator
+ */
+ public function validationDefault(Validator $validator)
+ {
+ $validator
+ ->integer('id')
+ ->allowEmptyString('id', null, 'create');
+
+ $validator
+ ->email('email')
+ ->requirePresence('email', 'create')
+ ->notEmptyString('email')
+ ->add('email', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']);
+
+ $validator
+ ->scalar('first_name')
+ ->maxLength('first_name', 150)
+ ->requirePresence('first_name', 'create')
+ ->notEmptyString('first_name');
+
+ $validator
+ ->scalar('last_name')
+ ->maxLength('last_name', 255)
+ ->allowEmptyString('last_name');
+
+ $validator
+ ->requirePresence('password', 'create')
+ ->notEmptyString('password');
+
+ $validator
+ ->allowEmptyString('pubkey');
+
+ $validator
+ ->allowEmptyString('privkey');
+
+ $validator
+ ->boolean('email_checked')
+ ->notEmptyString('email_checked');
+
+ $validator
+ ->scalar('language')
+ ->maxLength('language', 4)
+ ->notEmptyString('language');
+
+ return $validator;
+ }
+
+ /**
+ * Returns a rules checker object that will be used for validating
+ * application integrity.
+ *
+ * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
+ * @return \Cake\ORM\RulesChecker
+ */
+ public function buildRules(RulesChecker $rules)
+ {
+ $rules->add($rules->isUnique(['email']));
+
+ return $rules;
+ }
+
+ /**
+ * Returns the database connection name to use by default.
+ *
+ * @return string
+ */
+ public static function defaultConnectionName()
+ {
+ return 'loginServer';
+ }
+}
diff --git a/community_server/src/Model/Transactions/SignatureMap.php b/community_server/src/Model/Transactions/SignatureMap.php
new file mode 100644
index 000000000..d8cf35929
--- /dev/null
+++ b/community_server/src/Model/Transactions/SignatureMap.php
@@ -0,0 +1,68 @@
+mProtoSigMap = $protoSigMap;
+ }
+
+ public function getProto() {
+ return $this->mProtoSigMap;
+ }
+
+ static public function fromEntity($transactionSignatures)
+ {
+
+ $protoSigMap = new \Model\Messages\Gradido\SignatureMap();
+ $sigPairs = $protoSigMap->getSigPair();
+ //echo "sigPairs: "; var_dump($sigPairs); echo " ";
+ //return null;
+ foreach($transactionSignatures as $signature) {
+ $sigPair = new \Model\Messages\Gradido\SignaturePair();
+ $sigPair->setPubKey(stream_get_contents($signature->pubkey));
+ $sigPair->setEd25519(stream_get_contents($signature->signature));
+
+ $sigPairs[] = $sigPair;
+ //array_push($sigPairs, $sigPair);
+ }
+ return new SignatureMap($protoSigMap);
+ }
+
+ static public function build($bodyBytes, array $keys)
+ {
+ $protoSigMap = new \Model\Messages\Gradido\SignatureMap();
+ $sigPairs = $protoSigMap->getSigPair();
+ //echo "sigPairs: "; var_dump($sigPairs); echo " ";
+ //return null;
+
+ // sign with keys
+ foreach($keys as $key) {
+ $sigPair = new \Model\Messages\Gradido\SignaturePair();
+ $sigPair->setPubKey(hex2bin($key['pub']));
+ $sigPair->setEd25519(sodium_crypto_sign_detached($bodyBytes, hex2bin($key['priv'])));
+
+ $sigPairs[] = $sigPair;
+ }
+ //array_push($sigPairs, $sigPair);
+
+ return new SignatureMap($protoSigMap);
+ }
+
+
+}
\ No newline at end of file
diff --git a/community_server/src/Model/Transactions/Transaction.php b/community_server/src/Model/Transactions/Transaction.php
new file mode 100644
index 000000000..76353595a
--- /dev/null
+++ b/community_server/src/Model/Transactions/Transaction.php
@@ -0,0 +1,269 @@
+mProtoTransaction = $base64Data;
+ $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes());
+ return;
+ }
+
+ try {
+ $transactionBin = sodium_base642bin($base64Data, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING);
+ } catch(\SodiumException $e) {
+ //$this->addError('Transaction', $e->getMessage());// . ' ' . $base64Data);
+ //return;
+ $transactionBin = base64_decode($base64Data, true);
+ if($transactionBin == false) {
+ $this->addError('Transaction', $e->getMessage());// . ' ' . $base64Data);
+ return;
+ }
+ }
+ //*/}
+
+ if($transactionBin == false) {
+ //$this->addError('base64 decode failed');
+ $this->addError('Transaction', 'base64 decode error: ' . $base64Data);
+ } else {
+ //var_dump($transactionBin);
+ $this->mProtoTransaction = new \Model\Messages\Gradido\Transaction();
+ try {
+ $this->mProtoTransaction->mergeFromString($transactionBin);
+ //var_dump($this->mProtoTransaction);
+ // cannot catch Exception with cakePHP, I don't know why
+ } catch(\Google\Protobuf\Internal\GPBDecodeException $e) {
+ //var_dump($e);
+ $this->addError('Transaction', $e->getMessage());
+ return;
+ }//*/
+
+ //echo 'serialize to json: ';
+ //echo $this->mProtoTransaction->serializeToJsonString();
+ //echo "body bytes: ";
+ //var_dump($this->mProtoTransaction->getBodyBytes());
+ //echo " end body bytes ";
+ $this->mTransactionBody = new TransactionBody($this->mProtoTransaction->getBodyBytes());
+ }
+ }
+
+ static public function build(\Model\Messages\Gradido\TransactionBody $transactionBody, $senderKeyPair)
+ {
+ $protoTransaction = new \Model\Messages\Gradido\Transaction();
+
+ $recevied = new \Model\Messages\Gradido\TimestampSeconds();
+ $recevied->setSeconds(time());
+ $protoTransaction->setReceived($recevied);
+
+ $bodyBytes = $transactionBody->serializeToString();
+
+ $sigMap = SignatureMap::build($bodyBytes, [$senderKeyPair]);
+ $protoTransaction->setSigMap($sigMap->getProto());
+
+ $protoTransaction->setBodyBytes($bodyBytes);
+
+ return $protoTransaction;
+
+ }
+
+ public function getTransactionBody() {
+ return $this->mTransactionBody;
+ }
+
+ public function getFirstPublic() {
+ $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair();
+ return $sigPairs[0]->getPubKey();
+ }
+
+ public function getId() {
+ return $this->mProtoTransaction->getId();
+ }
+
+ public function validate() {
+ $sigMap = $this->mProtoTransaction->getSigMap();
+ if(!$sigMap) {
+ $this->addError('Transaction', 'signature map is zero');
+ return false;
+ }
+ //var_dump($sigMap);
+ //die();
+ $sigPairs = $sigMap->getSigPair();
+ $bodyBytes = $this->mProtoTransaction->getBodyBytes();
+
+
+ if(!$sigPairs || count($sigPairs) < 1) {
+ $this->addError('Transaction::validate', 'no signature found');
+ return false;
+ }
+
+ // check signature(s)
+ foreach($sigPairs as $sigPair) {
+ //echo 'sig Pair: '; var_dump($sigPair); echo " ";
+ $pubkey = $sigPair->getPubKey();
+ $signature = $sigPair->getEd25519();
+ //echo "verify bodybytes: " . bin2hex($bodyBytes) . ' ';
+ if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) {
+ $this->addError('Transaction::validate', 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid ' );
+ return false;
+ }
+ }
+
+ if(!$this->mTransactionBody->validate($sigPairs)) {
+ $this->addErrors($this->mTransactionBody->getErrors());
+ return false;
+ }
+
+ return true;
+ }
+
+ public function save()
+ {
+ $connection = ConnectionManager::get('default');
+ $connection->begin();
+ //id transaction_id signature pubkey
+
+ if (!$this->mTransactionBody->save($this->getFirstPublic(), $this->mProtoTransaction->getSigMap())) {
+ $this->addErrors($this->mTransactionBody->getErrors());
+ $connection->rollback();
+ return false;
+ }
+
+ // save transaction signatures
+ $transactionsSignaturesTable = TableRegistry::getTableLocator()->get('transaction_signatures');
+ $transactionId = $this->mTransactionBody->getTransactionID();
+ //signature pubkey
+
+ $sigPairs = $this->mProtoTransaction->getSigMap()->getSigPair();
+ //echo "sigPairs: "; var_dump($sigPairs);
+ $signatureEntitys = [];
+ foreach($sigPairs as $sigPair) {
+ $signatureEntity = $transactionsSignaturesTable->newEntity();
+ $signatureEntity->transaction_id = $transactionId;
+ $signatureEntity->signature = $sigPair->getEd25519();
+ $signatureEntity->pubkey = $sigPair->getPubKey();
+ array_push($signatureEntitys, $signatureEntity);
+ }
+ //debug($signatureEntitys);
+ if(!$transactionsSignaturesTable->saveMany($signatureEntitys)) {
+ foreach($signatureEntitys as $entity) {
+ $errors = $entity->getErrors();
+ if(!$errors && count($errors) > 0) {
+ $pubkeyHex = bin2hex($entity->pubkey);
+ $this->addError('Transaction::save', 'error saving signature for pubkey: ' . $pubkeyHex . ', with errors: ' . json_encode($errors) );
+ }
+ }
+ $connection->rollback();
+ return false;
+ }
+
+ $connection->commit();
+
+ $this->mTransactionBody->getSpecificTransaction()->sendNotificationEmail($this->mTransactionBody->getMemo());
+
+ return true;
+ }
+
+ static public function fromTable($id)
+ {
+ $transactionsTable = TableRegistry::getTableLocator()->get('transactions');
+ $transactionEntry = $transactionsTable
+ ->find('all')
+ ->where(['id' => $id])
+ ->contain([
+ 'TransactionCreations',
+ 'TransactionSendCoins',
+ 'TransactionSignatures'])
+ ->first();
+ //var_dump($transactionEntry->toArray());
+ $protoTransaction = new \Model\Messages\Gradido\Transaction();
+
+
+
+ $protoTransaction->setId($transactionEntry->id);
+
+
+ $recevied = new \Model\Messages\Gradido\TimestampSeconds();
+ $recevied->setSeconds($transactionEntry->received->getTimestamp());
+ $protoTransaction->setReceived($recevied);
+
+
+ $sigMap = SignatureMap::fromEntity($transactionEntry->transaction_signatures);
+ $protoTransaction->setSigMap($sigMap->getProto());
+
+ //echo "sig map: check ";
+ $protoTransaction->setTxHash(stream_get_contents($transactionEntry->tx_hash));
+
+ $body = TransactionBody::fromEntity($transactionEntry->memo, $transactionEntry);
+ if(is_array($body)) {
+ return ['state' => 'error', 'msg' => 'error creating body transaction', 'details' => $body];
+ }
+
+ // validate signatures
+ $sigPairs = $sigMap->getProto()->getSigPair();
+
+ if(!$sigPairs || count($sigPairs) < 1) {
+ return ['state' => 'error', 'msg' => 'error no signatures found'];
+ }
+
+ //echo "verify bodybytes: " . bin2hex($bodyBytes) . ' ';
+ $created = new \Model\Messages\Gradido\TimestampSeconds();
+ $created->setSeconds($recevied->getSeconds());
+ $body->setCreated($created);
+ $bodyBytes = $body->serializeToString();
+ $createTrys = 0;
+ $createRight = false;
+ // check signature(s) and
+ // try to get created field of TransactionBody right, because it wasn't saved
+ foreach($sigPairs as $sigPair) {
+ //echo 'sig Pair: '; var_dump($sigPair); echo " ";
+ $pubkey = $sigPair->getPubKey();
+ $signature = $sigPair->getEd25519();
+ if(!$createRight) {
+ while($createTrys < 500) {
+ if(\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) {
+ $createRight = true;
+ break;
+ } else {
+ $createTrys++;
+ $created->setSeconds($created->getSeconds() - 1);
+ //$body->setCreated($created);
+ $bodyBytes = $body->serializeToString();
+ }
+ }
+ }
+
+ if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) {
+ return ['state' => 'error', 'msg' => 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid '];
+ }
+ }
+
+ $protoTransaction->setBodyBytes($bodyBytes);
+
+
+
+ return $protoTransaction;
+ }
+
+}
\ No newline at end of file
diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php
new file mode 100644
index 000000000..4198fbaaa
--- /dev/null
+++ b/community_server/src/Model/Transactions/TransactionBase.php
@@ -0,0 +1,93 @@
+errors;
+ }
+
+ public function addError($functionName, $errorName) {
+ array_push($this->errors, [$functionName => $errorName]);
+ }
+
+ public function addErrors($errors) {
+ $this->errors = array_merge($this->errors, $errors);
+ }
+
+ public function hasErrors() {
+ return count($this->errors) > 0;
+ }
+
+ public static function getStateUsersTable()
+ {
+ if(!self::$stateUsersTable) {
+ self::$stateUsersTable = TableRegistry::getTableLocator()->get('state_users');
+ }
+ return self::$stateUsersTable;
+ }
+
+
+ protected function getStateUserId($publicKey) {
+
+ $stateUsersTable = self::getStateUsersTable();
+ $stateUser = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $publicKey])->first();
+ if($stateUser) {
+ return $stateUser->id;
+ }
+ // create new entry
+ $stateUserEntity = $stateUsersTable->newEntity();
+ $stateUserEntity->public_key = $publicKey;
+ if($stateUsersTable->save($stateUserEntity)) {
+ return $stateUserEntity->id;
+ } else {
+ $this->addError('TransactionBase::getStateUserId', 'error saving new state user with error: ' . json_encode($stateUserEntity->getErrors()));
+ }
+
+ return NULL;
+ }
+
+ protected function getStateUser($id) {
+ $stateUsersTable = self::getStateUsersTable();
+ $stateUser = $stateUsersTable->get($id);
+ if($stateUser) {
+ return $stateUser;
+ }
+
+ return NULL;
+ }
+
+
+ protected function updateStateBalance($stateUserId, $addAmountCent) {
+ $finalBalance = 0;
+ $stateBalancesTable = TableRegistry::getTableLocator()->get('stateBalances');
+ $stateBalanceQuery = $stateBalancesTable
+ ->find('all')
+ ->select(['amount', 'id'])
+ ->contain(false)
+ ->where(['state_user_id' => $stateUserId]);//->first();
+ //debug($stateBalanceQuery);
+
+ if($stateBalanceQuery->count() > 0) {
+ $stateBalanceEntry = $stateBalanceQuery->first();
+ $stateBalanceEntry->amount += $addAmountCent;
+ } else {
+ $stateBalanceEntry = $stateBalancesTable->newEntity();
+ $stateBalanceEntry->state_user_id = $stateUserId;
+ $stateBalanceEntry->amount = $addAmountCent;
+ }
+ $finalBalance = $stateBalanceEntry->amount;
+ //echo "\ntry to save: "; var_dump($stateBalanceEntry); echo "\n";
+ if(!$stateBalancesTable->save($stateBalanceEntry)) {
+ $errors = $stateBalanceEntry->getErrors();
+ $this->addError('TransactionBase::updateStateBalance', 'error saving state balance with: ' . json_encode($errors));
+ return false;
+ }
+ return $finalBalance;
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Model/Transactions/TransactionBody.php b/community_server/src/Model/Transactions/TransactionBody.php
new file mode 100644
index 000000000..0dca15637
--- /dev/null
+++ b/community_server/src/Model/Transactions/TransactionBody.php
@@ -0,0 +1,191 @@
+mProtoTransactionBody = new \Model\Messages\Gradido\TransactionBody();
+ try {
+ $this->mProtoTransactionBody->mergeFromString($bodyBytes);
+ // cannot catch Exception with cakePHP, I don't know why
+ } catch(\Google\Protobuf\Internal\GPBDecodeException $e) {
+ //var_dump($e);
+ $this->addError('TransactionBody', $e->getMessage());
+ return;
+ }
+
+ switch($this->mProtoTransactionBody->getData()) {
+ case 'creation' : $this->mSpecificTransaction = new TransactionCreation($this->mProtoTransactionBody->getCreation()); break;
+ case 'transfer' : $this->mSpecificTransaction = new TransactionTransfer($this->mProtoTransactionBody->getTransfer()); break;
+ }
+ }
+
+ public function validate($sigPairs) {
+
+ // transaction type id
+ $transactionTypesTable = TableRegistry::getTableLocator()->get('transaction_types');
+
+ $typeName = $this->getTransactionTypeName();
+ $transactionType = $transactionTypesTable->find('all')->where(['name' => $typeName])->select(['id'])->first();
+ if($transactionType == NULL) {
+ $this->addError('TransactionBody::validate', 'zero type id for type: ' . $typeName);
+ return false;
+ }
+ $this->transactionTypeId = $transactionType->id;
+
+ // check if creation time is in the past
+ if($this->mProtoTransactionBody->getCreated()->getSeconds() > time()) {
+ $this->addError('TransactionBody::validate', 'Transaction were created in the past!');
+ return false;
+ }
+ if(!$this->mSpecificTransaction->validate($sigPairs)) {
+ $this->addErrors($this->mSpecificTransaction->getErrors());
+ return false;
+ }
+
+
+
+ return true;
+ }
+
+ public function getSpecificTransaction() {
+ return $this->mSpecificTransaction;
+ }
+
+ public function getMemo() {
+ return $this->mProtoTransactionBody->getMemo();
+ }
+
+ public function getTransactionTypeName()
+ {
+ return $this->mProtoTransactionBody->getData();
+ }
+
+ public function save($firstPublic, $sigMap) {
+ $transactionsTable = TableRegistry::getTableLocator()->get('transactions');
+ $transactionEntity = $transactionsTable->newEntity();
+
+
+ $transactionEntity->transaction_type_id = $this->transactionTypeId;
+ $transactionEntity->memo = $this->getMemo();
+
+ if ($transactionsTable->save($transactionEntity)) {
+ // success
+ $this->mTransactionID = $transactionEntity->id;
+ if(!$this->mSpecificTransaction->save($transactionEntity->id, $firstPublic)) {
+ $this->addErrors($this->mSpecificTransaction->getErrors());
+ return false;
+ }
+ } else {
+ $this->addError('TransactionBody::save', 'error saving transaction with: ' . json_encode($transactionEntity->getError()));
+ return false;
+ }
+ $previousTxHash = null;
+ if($this->mTransactionID > 1) {
+ try {
+ $previousTransaction = $transactionsTable
+ ->find('all', ['contain' => false])
+ ->select(['tx_hash'])
+ ->where(['id' => $this->mTransactionID - 1])
+ ->first();
+ /*$previousTransaction = $transactionsTable->get($this->mTransactionID - 1, [
+ 'contain' => false,
+ 'fields' => ['tx_hash']
+ ]);*/
+ } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) {
+ $this->addError('TransactionBody::save', 'previous transaction (with id ' . ($this->mTransactionID-1) . ' not found');
+ return false;
+ }
+ if(!$previousTransaction) {
+ // shouldn't occur
+ $this->addError('TransactionBody::save', 'previous transaction (with id ' . ($this->mTransactionID-1) . ' not found');
+ return false;
+ }
+ $previousTxHash = $previousTransaction->tx_hash;
+ }
+ try {
+ //$transactionEntity->received = $transactionsTable->get($transactionEntity->id, ['contain' => false, 'fields' => ['received']])->received;
+ $transactionEntity->received = $transactionsTable
+ ->find('all', ['contain' => false])
+ ->where(['id' => $transactionEntity->id])
+ ->select(['received'])->first()->received;
+ } catch(Cake\Datasource\Exception\RecordNotFoundException $ex) {
+ $this->addError('TransactionBody::save', 'current transaction (with id ' . ($transactionEntity->id) . ' not found');
+ $this->addError('exception: ', $ex->getMessage());
+ return false;
+ }
+
+ // calculate tx hash
+ // previous tx hash + id + received + sigMap as string
+ // Sodium use for the generichash function BLAKE2b today (11.11.2019), mabye change in the future
+ $state = \Sodium\crypto_generichash_init();
+ //echo "prev hash: $previousTxHash\n";
+ if($previousTxHash != null) {
+ \Sodium\crypto_generichash_update($state, stream_get_contents($previousTxHash));
+ }
+ //echo "id: " . $transactionEntity->id . "\n";
+ \Sodium\crypto_generichash_update($state, strval($transactionEntity->id));
+ //echo "received: " . $transactionEntity->received;
+ \Sodium\crypto_generichash_update($state, $transactionEntity->received->i18nFormat('yyyy-MM-dd HH:mm:ss'));
+ \Sodium\crypto_generichash_update($state, $sigMap->serializeToString());
+ $transactionEntity->tx_hash = \Sodium\crypto_generichash_final($state);
+ if ($transactionsTable->save($transactionEntity)) {
+ return true;
+ }
+ $this->addError('TransactionBody::save', 'error saving transaction with: ' . json_encode($transactionEntity->getError()));
+ return false;
+ }
+
+ public function getTransactionID() {
+ return $this->mTransactionID;
+ }
+
+ public function getTransactionTypeId() {
+ return $this->transactionTypeId;
+ }
+
+ static public function fromEntity($memo, $transaction)
+ {
+ $protoBody = new \Model\Messages\Gradido\TransactionBody();
+ $protoBody->setMemo($memo);
+
+ //$created->setSeconds($var);
+ //$protoBody->setCreated($created);
+ if(count($transaction->transaction_creations) == 1) {
+ //echo "is creation ";
+ $protoBody->setCreation(TransactionCreation::fromEntity($transaction->transaction_creations[0])->getProto());
+ }
+ else if(count($transaction->transaction_send_coins) == 1) {
+ //echo "is transfer";
+ $protoBody->setTransfer(TransactionTransfer::fromEntity($transaction->transaction_send_coins)->getProto());
+ } else {
+ return ['invalid transaction type or count'];
+ }
+
+ return $protoBody;
+ }
+
+ static public function build($memo, $specificTransaction)
+ {
+ $protoBody = new \Model\Messages\Gradido\TransactionBody();
+ $protoBody->setMemo($memo);
+
+ if(is_a($specificTransaction, 'TransactionCreation')) {
+ $protoBody->setCreation($specificTransaction->getProto());
+ } else if(is_a($specificTransaction, 'TransactionTransfer')) {
+ $protoBody->setTransfer($specificTransaction->getProto());
+ } else {
+ return ['invalid tarnsaction type'];
+ }
+ return $protoBody;
+
+ }
+
+}
diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php
new file mode 100644
index 000000000..d9caa9f7b
--- /dev/null
+++ b/community_server/src/Model/Transactions/TransactionCreation.php
@@ -0,0 +1,292 @@
+protoTransactionCreation = $protoTransactionCreation;
+ $this->transactionCreationsTable = TableRegistry::getTableLocator()->get('transaction_creations');
+ $this->receiver_pubkey_hex = bin2hex($this->getReceiverPublic());
+ }
+
+ public function getProto() {
+ return $this->protoTransactionCreation;
+ }
+
+ static public function build($amount, $memo, $receiver_public_hex, $ident_hash, $targetDate = null)
+ {
+ $receiver = new \Model\Messages\Gradido\ReceiverAmount();
+ $receiver->setAmount($amount);
+ //$this->receiver_pubkey_hex = $receiver_public_hex;
+ if(strlen($receiver_public_hex) != 64) {
+ return ['state' => 'error', 'msg' => 'invalid pubkey'];
+ }
+ $pubKeyBin = hex2bin($receiver_public_hex);
+ $receiver->setEd25519ReceiverPubkey($pubKeyBin);
+ //var_dump($requestData);
+
+ $creationDate = new \Model\Messages\Gradido\TimestampSeconds();
+ $creationDate->setSeconds(time());
+
+ $transactionBody = new \Model\Messages\Gradido\TransactionBody();
+ $transactionBody->setMemo($memo);
+ $transactionBody->setCreated($creationDate);
+
+
+ $transaction = new \Model\Messages\Gradido\TransactionCreation();
+ $transaction->setReceiverAmount($receiver);
+ $transaction->setIdentHash($ident_hash);
+ //echo "target date: ";
+ //var_dump($targetDate);
+ //die('die');
+ if($targetDate) {
+ $targetDateTimestamp = new \Model\Messages\Gradido\TimestampSeconds();
+ $targetDateTimestamp->setSeconds($targetDate->getTimestamp());
+ //var_dump($targetDateTimestamp); die('target');
+ $transaction->setTargetDate($targetDateTimestamp);
+ }
+
+ $transactionBody->setCreation($transaction);
+ return ['state' => 'success', 'transactionBody' => $transactionBody];
+ }
+
+ static protected function DRHashRotateLeft( $hash, $rotateBy )
+ {
+ return ($hash<<$rotateBy)|($hash>>(32-$rotateBy));
+ }
+
+ static public function DRMakeStringHash($str)
+ {
+ $ret = 0;
+
+ if( $str )
+ {
+ for ($i=0; $i < strlen($str); $i++)
+ {
+ $ret = TransactionCreation::DRHashRotateLeft($ret, 7) + ord($str{$i});
+ }
+ }
+ return $ret;
+ }
+
+ public function getAmount() {
+ return $this->protoTransactionCreation->getReceiverAmount()->getAmount();
+ }
+
+ public function getReceiverPublic() {
+ return $this->protoTransactionCreation->getReceiverAmount()->getEd25519ReceiverPubkey();
+ }
+
+ public function getIdentHash() {
+ return $this->protoTransactionCreation->getIdentHash();
+ }
+
+
+ public function validate($sigPairs) {
+ // check if receiver public is not in signature list
+ $receiverPublic = $this->getReceiverPublic();
+ foreach($sigPairs as $sigPair) {
+ $pubkey = $sigPair->getPubKey();
+ if($pubkey == $receiverPublic) {
+ $this->addError('TransactionCreation::validate', 'receiver aren\'t allowed to sign creation Transaction');
+ return false;
+ }
+ }
+
+ // check if creation threshold for this month isn't reached
+
+ //$identHashBin = sprintf("%0d", $this->getIdentHash());
+ // padding with zero in case hash is smaller than 32 bytes, static length binary field in db
+ // ident hash isn't collision ressistent, it is for speed up search
+ $identHashBin = pack('a32', $this->getIdentHash());
+
+ ////////// old validation not more than 3k GDD for 3 Month ///////////////
+ /*$existingCreations = $this->transactionCreationsTable
+ ->find('all')
+ ->select(['amount', 'state_user_id', 'target_date'])
+ ->contain(['StateUsers' => ['fields' => ['StateUsers.public_key']]])
+ ->where(['target_date' => NULL]);
+ //$targetDate = $this->protoTransactionCreation->getTargetDate();
+ //echo "choose existing transactions ";
+ //$existingCreations->where([$q->func()->extract('YEAR_MONTH', 'target_date') . ' LIKE ' . $q->func()->extract('YEAR_MONTH', $targetDate)]);
+ // ->where(['EXTRACT(YEAR_MONTH FROM target_date) LIKE EXTRACT(YEAR_MONTH FROM']);
+ // uncomment because ident hash didn't work at the moment
+ //->where(['ident_hash' => $identHashBin]);
+ //$existingCreations->select(['amount_sum' => $existingCreations->func()->sum('amount')]);
+
+ $existingCreations->matching('Transactions', function ($q) {
+
+ return $q->where(
+ ['OR' =>
+ ['EXTRACT(YEAR_MONTH FROM Transactions.received) LIKE EXTRACT(YEAR_MONTH FROM NOW())',
+ 'EXTRACT(YEAR_MONTH FROM DATE_ADD(Transactions.received, INTERVAL 2 MONTH)) LIKE EXTRACT(YEAR_MONTH FROM NOW())']
+ ])->select('received');
+
+
+ });
+ //debug($existingCreations);
+ //echo "after choose existing transactions ";
+ $newSum = $this->getAmount();
+ //var_dump($existingCreations->toArray());
+ foreach($existingCreations as $creation) {
+ $keyHex = bin2hex(stream_get_contents($creation->state_user->public_key));
+ //echo "\ncompare \n$keyHex\nwith: \n". $this->receiver_pubkey_hex."\n";
+ if($keyHex == $this->receiver_pubkey_hex) {
+ $newSum += $creation->amount;
+ }
+ }
+
+
+ if($newSum > 30000000) {
+ $this->addError('TransactionCreation::validate', 'Creation more than 1.000 GDD per Month (3 Month) not allowed');
+ return false;
+ }//*/
+
+ /////////////// new validation, not more than 1K GDD per month via target_date ///////////////////////////
+ $existingCreations2 = $this->transactionCreationsTable
+ ->find('all')
+ ->select(['amount', 'state_user_id', 'target_date'])
+ ->contain(['StateUsers' => ['fields' => ['StateUsers.public_key']]]);
+ $q = $existingCreations2;
+ $targetDate = $this->protoTransactionCreation->getTargetDate();
+
+ $targetDateFrozen = new FrozenDate($targetDate->getSeconds());
+ $targetDateMonthYearConcat = $targetDateFrozen->format('Ym');
+
+ $existingCreations2->where([
+ 'target_date IS NOT' => NULL,
+ 'EXTRACT(YEAR_MONTH FROM target_date) LIKE ' => $targetDateMonthYearConcat,
+ ]);
+
+ $newSum2 = $this->getAmount();
+ $receiverEmail = '';
+ foreach($existingCreations2 as $creation) {
+ $keyHex = bin2hex(stream_get_contents($creation->state_user->public_key));
+ //echo "\ncompare \n$keyHex\nwith: \n". $this->receiver_pubkey_hex."\n";
+ if($keyHex == $this->receiver_pubkey_hex) {
+ $newSum2 += $creation->amount;
+ $receiverEmail = $creation->state_user->email;
+ }
+ //$newSum2 += $creation->amount;
+ }
+
+ /*if(!$existingCreations2->count()) {
+ if($newSum > 30000000) {
+ $this->addError('TransactionCreation::validate', 'Creation more than 1.000 GDD per Month (3 Month) not allowed');
+ return false;
+ }
+ } else {*/
+ if($newSum2 > 10000000) {
+ $this->addError(
+ 'TransactionCreation::validate',
+ 'Creation more than 1.000 GDD per Month for '. $receiverEmail .' in target_date not allowed'
+ );
+ return false;
+ //}
+ }
+
+ return true;
+ }
+
+ public function save($transaction_id, $firstPublic)
+ {
+
+ $transactionCreationEntity = $this->transactionCreationsTable->newEntity();
+ $transactionCreationEntity->transaction_id = $transaction_id;
+
+ // state user id
+ //$state_user_id = $this->getStateUserId($firstPublic);
+ $receiverUserId = $this->getStateUserId($this->getReceiverPublic());
+ if(!$receiverUserId) {
+ $this->addError('TransactionCreation::save', 'couldn\'t get state user id');
+ return false;
+ }
+ $transactionCreationEntity->state_user_id = $receiverUserId;
+ $transactionCreationEntity->amount = $this->getAmount();
+ $transactionCreationEntity->ident_hash = $this->getIdentHash();
+ $transactionCreationEntity->target_date = $this->protoTransactionCreation->getTargetDate()->getSeconds();
+
+ if(!$this->transactionCreationsTable->save($transactionCreationEntity)) {
+ $this->addError('TransactionCreation::save', 'error saving transactionCreation with errors: ' . json_encode($transactionCreationEntity->getErrors()));
+ return false;
+ }
+
+ // update state balance
+ if(false === $this->updateStateBalance($receiverUserId, $this->getAmount())) {
+ return false;
+ }
+
+
+ return true;
+ }
+
+ public function sendNotificationEmail($memo)
+ {
+ // send notification email
+ $receiverUserId = $this->getStateUserId($this->getReceiverPublic());
+ $receiverUser = $this->getStateUser($receiverUserId);
+ $noReplyEmail = Configure::read('noReplyEmail');
+
+ try {
+ $email = new Email();
+ $emailViewBuilder = $email->viewBuilder();
+ $emailViewBuilder->setTemplate('notificationCreation')
+ ->setVars(['user' => $receiverUser, 'gdd_cent' => $this->getAmount(), 'memo' => $memo]);
+ $receiverNames = $receiverUser->getNames();
+ if($receiverNames == '' || $receiverUser->email == '') {
+ $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id);
+ return false;
+ }
+ $email->setFrom([$noReplyEmail => 'Gradido (nicht antworten)'])
+ ->setTo([$receiverUser->email => $receiverUser->getNames()])
+ ->setSubject(__('Gradido Schöpfung erhalten'))
+ ->send();
+ } catch(Exception $e) {
+ $this->addError('TransactionCreation::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage());
+ return false;
+ }
+ return true;
+ }
+
+ static public function fromEntity($transactionCreationEntity)
+ {
+ $protoCreation = new \Model\Messages\Gradido\TransactionCreation();
+
+ //var_dump($transactionCreationEntity);
+ $stateUsersTable = TableRegistry::getTableLocator()->get('state_users');
+ //return new TransactionCreation($protoCreation);
+ $userId = $transactionCreationEntity->state_user_id;
+
+
+ $stateUser = $stateUsersTable->get($userId);
+
+
+ $receiverAmount = new \Model\Messages\Gradido\ReceiverAmount();
+ $receiverAmount->setEd25519ReceiverPubkey(stream_get_contents($stateUser->public_key));
+
+ $receiverAmount->setAmount($transactionCreationEntity->amount);
+
+ $protoCreation->setReceiverAmount($receiverAmount);
+
+ //echo "receiver amount: check ";
+ //$identHashBytes = stream_get_contents($transactionCreationEntity->ident_hash);
+
+ // intval
+ //$protoCreation->setIdentHash(intval($identHashBytes));
+ $protoCreation->setIdentHash(self::DRMakeStringHash($stateUser->email));
+ return new TransactionCreation($protoCreation);
+ }
+}
diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php
new file mode 100644
index 000000000..c89a0f175
--- /dev/null
+++ b/community_server/src/Model/Transactions/TransactionTransfer.php
@@ -0,0 +1,262 @@
+protoTransactionTransfer = $protoTransactionTransfer;
+ }
+
+ public function getProto() {
+ return $this->protoTransactionTransfer;
+ }
+
+ static public function build($amount, $memo, $receiver_public_hex, $sender_public_hex)
+ {
+ // repeated SenderAmount senderAmounts = 1;
+ // repeated ReceiverAmount receiverAmounts = 2;
+ $receiver = new \Model\Messages\Gradido\ReceiverAmount();
+ $sender = new \Model\Messages\Gradido\SenderAmount();
+ $receiver->setAmount($amount);
+ $sender->setAmount($amount);
+
+ if(strlen($receiver_public_hex) != 64) {
+ return ['state' => 'error', 'msg' => 'invalid receiver pubkey'];
+ }
+ if(strlen($sender_public_hex) != 64) {
+ return ['state' => 'error', 'msg' => 'invalid sender pubkey'];
+ }
+ $receiverPubKeyBin = hex2bin($receiver_public_hex);
+ $receiver->setEd25519ReceiverPubkey($receiverPubKeyBin);
+
+ $senderPubKeyBin = hex2bin($sender_public_hex);
+ $sender->setEd25519SenderPubkey($senderPubKeyBin);
+ //var_dump($requestData);
+
+ $creationDate = new \Model\Messages\Gradido\TimestampSeconds();
+ $creationDate->setSeconds(time());
+
+ $transactionBody = new \Model\Messages\Gradido\TransactionBody();
+ $transactionBody->setMemo($memo);
+ $transactionBody->setCreated($creationDate);
+
+ $transaction = new \Model\Messages\Gradido\Transfer();
+ $transaction->setReceiverAmounts([$receiver]);
+ $transaction->setSenderAmounts([$sender]);
+ $transactionBody->setTransfer($transaction);
+ return ['state' => 'success', 'transactionBody' => $transactionBody];
+ }
+
+ public function validate($sigPairs) {
+ //$this->addError('TransactionTransfer::validate', 'not implemented yet');
+ //return false;
+ //$time = microtime(true);
+ static $functionName = 'TransactionCreation::validate';
+ /*
+ * // check signature(s)
+ foreach($sigPairs as $sigPair) {
+ //echo 'sig Pair: '; var_dump($sigPair); echo " ";
+ $pubkey = $sigPair->getPubKey();
+ $signature = $sigPair->getEd25519();
+ if (!\Sodium\crypto_sign_verify_detached($signature, $bodyBytes, $pubkey)) {
+ $this->addError('Transaction::validate', 'signature for key ' . bin2hex($pubkey) . ' isn\'t valid ' );
+ return false;
+ }
+ }
+ */
+ $sigPubHexs = [];
+ foreach($sigPairs as $sigPair) {
+ //echo 'sig Pair: '; var_dump($sigPair); echo " ";
+ $pubkey = bin2hex($sigPair->getPubKey());
+ $hash = TransactionCreation::DRMakeStringHash($pubkey);
+ if(!isset($sigPubHexs[$hash])) {
+ $sigPubHexs[$hash] = [$pubkey];
+ } else {
+ array_push($sigPubHexs[$hash], $pubkey);
+ }
+ //array_push($sigPubHexs, $pubkey);
+ }
+
+ $stateUsersTable = TableRegistry::getTableLocator()->get('state_users');
+ $senderAmounts = $this->protoTransactionTransfer->getSenderAmounts();
+ $senderSum = 0;
+ $receiverSum = 0;
+
+ $senderPublics = [];
+ foreach($senderAmounts as $i => $senderAmount) {
+ $senderPublic = $senderAmount->getEd25519SenderPubkey();
+ $senderPublicHex = bin2hex($senderPublic);
+ array_push($senderPublics, $senderPublic);
+
+ if(strlen($senderPublicHex) != 64) {
+ $this->addError($functionName, 'invalid sender public key');
+ return false;
+ }
+ // check if signature exist for sender
+ $hash = TransactionCreation::DRMakeStringHash($senderPublicHex);
+ if(!isset($sigPubHexs[$hash]) || in_array($senderPublicHex, $sigPubHexs[$hash]) === FALSE) {
+ $this->addError($functionName, 'missing signature for sender');
+ return false;
+ }
+ // check if sender has enough Gradido
+ $amount = $senderAmount->getAmount();
+ $user = $stateUsersTable
+ ->find('all')
+ ->select(['id'])
+ ->where(['public_key' => $senderPublic])
+ ->contain(['StateBalances' => ['fields' => ['amount', 'state_user_id']]])->first();
+ if(!$user) {
+ $this->addError($functionName, 'couldn\'t find sender ' . $i .' in db' );
+ return false;
+ }
+ //var_dump($user);
+ if(intval($user->state_balances[0]->amount) < intval($amount)) {
+ $this->addError($functionName, 'sender ' . $i . ' hasn\t enough GDD');
+ return false;
+ }
+ $senderSum += $amount;
+ }
+ $uniqueSenderPublics = array_unique($senderPublics);
+ if(count($senderPublics) !== count($uniqueSenderPublics)) {
+ $this->addError($functionName, 'duplicate sender public key');
+ return false;
+ }
+
+ $receiverAmounts = $this->protoTransactionTransfer->getReceiverAmounts();
+ $receiverPublics = [];
+ foreach($receiverAmounts as $reveiverAmount) {
+ if(strlen($reveiverAmount->getEd25519ReceiverPubkey()) != 32) {
+ $this->addError($functionName, 'invalid receiver public key');
+ return false;
+ }
+ array_push($receiverPublics, $reveiverAmount->getEd25519ReceiverPubkey());
+ $receiverSum += $reveiverAmount->getAmount();
+ }
+ $uniqueReceiverPublic = array_unique($receiverPublics);
+ if(count($uniqueReceiverPublic) !== count($receiverPublics)) {
+ $this->addError($functionName, 'duplicate receiver public key');
+ return false;
+ }
+ $uniquePublics = array_unique(array_merge($receiverPublics, $senderPublics));
+ if(count($uniquePublics) !== count($senderPublics) + count($receiverPublics)) {
+ // means at least one sender is the same as one receiver
+ $this->addError($functionName, 'duplicate public in sender and receiver');
+ return false;
+ }
+ if($senderSum !== $receiverSum) {
+ $this->addError($functionName, 'sender amount doesn\'t match receiver amount');
+ return false;
+ }
+ //die("\n");
+ return true;
+ }
+
+ public function save($transaction_id, $firstPublic) {
+
+ static $functionName = 'TransactionCreation::save';
+
+ if(count($this->protoTransactionTransfer->getSenderAmounts()) !== 1) {
+ $this->addError($functionName, 'not more than one sender currently supported');
+ return false;
+ }
+ $senderAmount = $this->protoTransactionTransfer->getSenderAmounts()[0];
+
+ if(count($this->protoTransactionTransfer->getReceiverAmounts()) !== 1) {
+ $this->addError($functionName, 'not more than one receiver currently supported');
+ return false;
+ }
+ $receiverAmount = $this->protoTransactionTransfer->getReceiverAmounts()[0];
+ $transactionTransferTable = TableRegistry::getTableLocator()->get('TransactionSendCoins');
+
+ $senderUserId = $this->getStateUserId($senderAmount->getEd25519SenderPubkey());
+ $receiverUserId = $this->getStateUserId($receiverAmount->getEd25519ReceiverPubkey());
+
+ if($senderUserId === NULL || $receiverUserId === NULL) {
+ return false;
+ }
+
+ $finalSenderBalance = $this->updateStateBalance($senderUserId, -$senderAmount->getAmount());
+ if(false === $finalSenderBalance) {
+ return false;
+ }
+ if(false === $this->updateStateBalance($receiverUserId, $receiverAmount->getAmount())) {
+ return false;
+ }
+
+ $transactionTransferEntity = $transactionTransferTable->newEntity();
+ $transactionTransferEntity->transaction_id = $transaction_id;
+ $transactionTransferEntity->state_user_id = $senderUserId;
+ $transactionTransferEntity->receiver_public_key = $receiverAmount->getEd25519ReceiverPubkey();
+ $transactionTransferEntity->receiver_user_id = $receiverUserId;
+ $transactionTransferEntity->amount = $senderAmount->getAmount();
+ $transactionTransferEntity->sender_final_balance = $finalSenderBalance;
+
+ if(!$transactionTransferTable->save($transactionTransferEntity)) {
+ $this->addError($functionName, 'error saving transactionSendCoins with errors: ' . json_encode($transactionTransferEntity->getErrors()));
+ return false;
+ }
+
+
+
+
+ //$this->addError('TransactionTransfer::save', 'not implemented yet');
+ //return false;
+ return true;
+ }
+
+ public function sendNotificationEmail($memo)
+ {
+ // send notification email
+
+ $senderAmount = $this->protoTransactionTransfer->getSenderAmounts()[0];
+ $receiverAmount = $this->protoTransactionTransfer->getReceiverAmounts()[0];
+ $senderUserId = $this->getStateUserId($senderAmount->getEd25519SenderPubkey());
+ $receiverUserId = $this->getStateUserId($receiverAmount->getEd25519ReceiverPubkey());
+
+ $receiverUser = $this->getStateUser($receiverUserId);
+ $senderUser = $this->getStateUser($senderUserId);
+ $serverAdminEmail = Configure::read('ServerAdminEmail');
+
+ try {
+ $email = new Email();
+ $emailViewBuilder = $email->viewBuilder();
+ $emailViewBuilder->setTemplate('notificationTransfer')
+ ->setVars(['receiverUser' => $receiverUser,
+ 'senderUser' => $senderUser,
+ 'gdd_cent' => $receiverAmount->getAmount(),
+ 'memo' => $memo]);
+ $receiverNames = $receiverUser->getNames();
+ if($receiverNames == '' || $receiverUser->email == '') {
+ $this->addError('TransactionCreation::sendNotificationEmail', 'to email is empty for user: ' . $receiverUser->id);
+ return false;
+ }
+ $email->setFrom([$serverAdminEmail => $senderUser->getNames() . ' via Gradido Community'])
+ ->setTo([$receiverUser->email => $receiverUser->getNames()])
+ ->setReplyTo($senderUser->email)
+ ->setSubject(__('Gradidos erhalten'))
+ ->send();
+ } catch(Exception $e) {
+ $this->addError('TransactionTransfer::sendNotificationEmail', 'error sending notification email: ' . $e->getMessage());
+ return false;
+ }
+ return true;
+ }
+
+ static public function fromEntity($transactionTransferEntity)
+ {
+ $protoTransfer = new \Model\Messages\Gradido\Transfer();
+
+ $stateUsersTable = TableRegistry::getTableLocator()->get('state_users');
+
+
+ return new TransactionTransfer($protoTransfer);
+ }
+}
+
diff --git a/community_server/src/Model/Validation/GenericValidation.php b/community_server/src/Model/Validation/GenericValidation.php
new file mode 100644
index 000000000..839441454
--- /dev/null
+++ b/community_server/src/Model/Validation/GenericValidation.php
@@ -0,0 +1,35 @@
+]|>|<|javascript:){1,}/', $value)) {
+ return false;
+ }
+ return true;
+ }
+
+ public static function email($value, array $context) {
+ if(preg_match('/^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/', $value)) {
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Model/Validation/TransactionValidation.php b/community_server/src/Model/Validation/TransactionValidation.php
new file mode 100644
index 000000000..9705ef40b
--- /dev/null
+++ b/community_server/src/Model/Validation/TransactionValidation.php
@@ -0,0 +1,49 @@
+ 'en_GB']);
+ $numberparts = preg_split('/\./', $checkFloatVal);
+ //var_dump($numberparts);
+ if(isset($numberparts[1]) && strlen($numberparts[1]) > 2) return false;
+
+ $floatVal = floatval(Number::format($value, ['places' => 4, 'locale' => 'en_GB']));
+ //echo "floatVal: $floatVal ";
+ return $floatVal >= 0.0;
+ }
+
+ public static function hexKey64($value, array $context) {
+ if(strlen($value) != 64) return false;
+ if(preg_match('/^[[:xdigit:]]*$/', $value)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static function hexKey128($value, array $context) {
+ if(strlen($value) != 128) return false;
+ if(preg_match('/^[[:xdigit:]]*$/', $value)) {
+ return true;
+ }
+ return false;
+ }
+
+ public static function alphaNumeric($value, array $context) {
+ //if(preg_match('/^[a-zA-Z0-9äöüÄÖÜß _;:()-]\n\r*$/', $value)) {
+ if(preg_match('/([<>]|>|<|javascript:){1,}/', $value)) {
+ return false;
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/community_server/src/Shell/ConsoleShell.php b/community_server/src/Shell/ConsoleShell.php
new file mode 100644
index 000000000..f7bfe8ed4
--- /dev/null
+++ b/community_server/src/Shell/ConsoleShell.php
@@ -0,0 +1,81 @@
+err('Unable to load Psy\Shell. ');
+ $this->err('');
+ $this->err('Make sure you have installed psysh as a dependency,');
+ $this->err('and that Psy\Shell is registered in your autoloader.');
+ $this->err('');
+ $this->err('If you are using composer run');
+ $this->err('');
+ $this->err('$ php composer.phar require --dev psy/psysh ');
+ $this->err('');
+
+ return self::CODE_ERROR;
+ }
+
+ $this->out("You can exit with `CTRL-C` or `exit` ");
+ $this->out('');
+
+ Log::drop('debug');
+ Log::drop('error');
+ $this->_io->setLoggers(false);
+ restore_error_handler();
+ restore_exception_handler();
+
+ $psy = new PsyShell();
+ $psy->run();
+ }
+
+ /**
+ * Display help for this console.
+ *
+ * @return \Cake\Console\ConsoleOptionParser
+ */
+ public function getOptionParser()
+ {
+ $parser = new ConsoleOptionParser('console');
+ $parser->setDescription(
+ 'This shell provides a REPL that you can use to interact with ' .
+ 'your application in a command line designed to run PHP code. ' .
+ 'You can use it to run adhoc queries with your models, or ' .
+ 'explore the features of CakePHP and your application.' .
+ "\n\n" .
+ 'You will need to have psysh installed for this Shell to work.'
+ );
+
+ return $parser;
+ }
+}
diff --git a/community_server/src/Template/AddressTypes/add.ctp b/community_server/src/Template/AddressTypes/add.ctp
new file mode 100644
index 000000000..7422b666a
--- /dev/null
+++ b/community_server/src/Template/AddressTypes/add.ctp
@@ -0,0 +1,28 @@
+
+
+
+ = $this->Form->create($addressType) ?>
+
+ = __('Add Address Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/AddressTypes/edit.ctp b/community_server/src/Template/AddressTypes/edit.ctp
new file mode 100644
index 000000000..c43cbaf96
--- /dev/null
+++ b/community_server/src/Template/AddressTypes/edit.ctp
@@ -0,0 +1,34 @@
+
+
+
+ = $this->Form->create($addressType) ?>
+
+ = __('Edit Address Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/AddressTypes/index.ctp b/community_server/src/Template/AddressTypes/index.ctp
new file mode 100644
index 000000000..8460e08a7
--- /dev/null
+++ b/community_server/src/Template/AddressTypes/index.ctp
@@ -0,0 +1,53 @@
+
+
+
+
= __('Address Types') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('text') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($addressType->id) ?>
+ = h($addressType->name) ?>
+ = h($addressType->text) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $addressType->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $addressType->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $addressType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $addressType->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/AddressTypes/view.ctp b/community_server/src/Template/AddressTypes/view.ctp
new file mode 100644
index 000000000..19fa6c81e
--- /dev/null
+++ b/community_server/src/Template/AddressTypes/view.ctp
@@ -0,0 +1,90 @@
+
+
+
+
= h($addressType->name) ?>
+
+
+ = __('Name') ?>
+ = h($addressType->name) ?>
+
+
+ = __('Text') ?>
+ = h($addressType->text) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($addressType->id) ?>
+
+
+
+
+
diff --git a/community_server/src/Template/AdminErrors/add.ctp b/community_server/src/Template/AdminErrors/add.ctp
new file mode 100644
index 000000000..b69f68213
--- /dev/null
+++ b/community_server/src/Template/AdminErrors/add.ctp
@@ -0,0 +1,30 @@
+
+
+
+ = $this->Form->create($adminError) ?>
+
+ = __('Add Admin Error') ?>
+ Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('controller');
+ echo $this->Form->control('action');
+ echo $this->Form->control('state');
+ echo $this->Form->control('msg');
+ echo $this->Form->control('details');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/AdminErrors/edit.ctp b/community_server/src/Template/AdminErrors/edit.ctp
new file mode 100644
index 000000000..dea74b94b
--- /dev/null
+++ b/community_server/src/Template/AdminErrors/edit.ctp
@@ -0,0 +1,36 @@
+
+
+
+ = $this->Form->create($adminError) ?>
+
+ = __('Edit Admin Error') ?>
+ Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('controller');
+ echo $this->Form->control('action');
+ echo $this->Form->control('state');
+ echo $this->Form->control('msg');
+ echo $this->Form->control('details');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/AdminErrors/index.ctp b/community_server/src/Template/AdminErrors/index.ctp
new file mode 100644
index 000000000..96e077ce1
--- /dev/null
+++ b/community_server/src/Template/AdminErrors/index.ctp
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
= $this->Number->format($adminError->id) ?>
+
= $adminError->has('state_user') ? $this->Html->link($adminError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $adminError->state_user->id]) : '' ?>
+
= h($adminError->controller) ?>
+
= h($adminError->action) ?>
+
= h($adminError->state) ?>
+
= h($adminError->msg) ?>
+
= h($adminError->details) ?>
+
= h($adminError->created) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $adminError->id]) ?>
+
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $adminError->id]) ?>
+
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $adminError->id], ['confirm' => __('Are you sure you want to delete # {0}?', $adminError->id)]) ?>
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/AdminErrors/view.ctp b/community_server/src/Template/AdminErrors/view.ctp
new file mode 100644
index 000000000..0b0bebb64
--- /dev/null
+++ b/community_server/src/Template/AdminErrors/view.ctp
@@ -0,0 +1,54 @@
+
+
+
+
= h($adminError->id) ?>
+
+
+ = __('State User') ?>
+ = $adminError->has('state_user') ? $this->Html->link($adminError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $adminError->state_user->id]) : '' ?>
+
+
+ = __('Controller') ?>
+ = h($adminError->controller) ?>
+
+
+ = __('Action') ?>
+ = h($adminError->action) ?>
+
+
+ = __('State') ?>
+ = h($adminError->state) ?>
+
+
+ = __('Msg') ?>
+ = h($adminError->msg) ?>
+
+
+ = __('Details') ?>
+ = h($adminError->details) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($adminError->id) ?>
+
+
+ = __('Created') ?>
+ = h($adminError->created) ?>
+
+
+
diff --git a/community_server/src/Template/Cell/empty b/community_server/src/Template/Cell/empty
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/community_server/src/Template/Cell/empty
@@ -0,0 +1 @@
+
diff --git a/community_server/src/Template/CommunityProfiles/add.ctp b/community_server/src/Template/CommunityProfiles/add.ctp
new file mode 100644
index 000000000..ab7ce0f6b
--- /dev/null
+++ b/community_server/src/Template/CommunityProfiles/add.ctp
@@ -0,0 +1,24 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('List Community Profiles'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($communityProfile) ?>
+
+ = __('Add Community Profile') ?>
+ Form->control('state_user_id');
+ echo $this->Form->control('profile_desc');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/CommunityProfiles/edit.ctp b/community_server/src/Template/CommunityProfiles/edit.ctp
new file mode 100644
index 000000000..230e3b685
--- /dev/null
+++ b/community_server/src/Template/CommunityProfiles/edit.ctp
@@ -0,0 +1,30 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Form->postLink(
+ __('Delete'),
+ ['action' => 'delete', $communityProfile->id],
+ ['confirm' => __('Are you sure you want to delete # {0}?', $communityProfile->id)]
+ )
+ ?>
+ = $this->Html->link(__('List Community Profiles'), ['action' => 'index']) ?>
+
+
+
+ = $this->Form->create($communityProfile) ?>
+
+ = __('Edit Community Profile') ?>
+ Form->control('state_user_id');
+ echo $this->Form->control('profile_desc');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/CommunityProfiles/index.ctp b/community_server/src/Template/CommunityProfiles/index.ctp
new file mode 100644
index 000000000..12f3c03b1
--- /dev/null
+++ b/community_server/src/Template/CommunityProfiles/index.ctp
@@ -0,0 +1,49 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('New Community Profile'), ['action' => 'add']) ?>
+
+
+
+
= __('Community Profiles') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('state_user_id') ?>
+ = $this->Paginator->sort('profile_desc') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($communityProfile->id) ?>
+ = $this->Number->format($communityProfile->state_user_id) ?>
+ = h($communityProfile->profile_desc) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $communityProfile->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $communityProfile->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $communityProfile->id], ['confirm' => __('Are you sure you want to delete # {0}?', $communityProfile->id)]) ?>
+
+
+
+
+
+
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/CommunityProfiles/view.ctp b/community_server/src/Template/CommunityProfiles/view.ctp
new file mode 100644
index 000000000..1f8aaf0f4
--- /dev/null
+++ b/community_server/src/Template/CommunityProfiles/view.ctp
@@ -0,0 +1,32 @@
+
+
+
+ = __('Actions') ?>
+ = $this->Html->link(__('Edit Community Profile'), ['action' => 'edit', $communityProfile->id]) ?>
+ = $this->Form->postLink(__('Delete Community Profile'), ['action' => 'delete', $communityProfile->id], ['confirm' => __('Are you sure you want to delete # {0}?', $communityProfile->id)]) ?>
+ = $this->Html->link(__('List Community Profiles'), ['action' => 'index']) ?>
+ = $this->Html->link(__('New Community Profile'), ['action' => 'add']) ?>
+
+
+
+
= h($communityProfile->id) ?>
+
+
+ = __('Profile Desc') ?>
+ = h($communityProfile->profile_desc) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($communityProfile->id) ?>
+
+
+ = __('State User Id') ?>
+ = $this->Number->format($communityProfile->state_user_id) ?>
+
+
+
diff --git a/community_server/src/Template/Dashboard/error_http_request.ctp b/community_server/src/Template/Dashboard/error_http_request.ctp
new file mode 100644
index 000000000..cdbbec19b
--- /dev/null
+++ b/community_server/src/Template/Dashboard/error_http_request.ctp
@@ -0,0 +1,14 @@
+assign('title', __('Error, Please try again'));
+?>
+
+
+ = __('Back'); ?>
+
diff --git a/community_server/src/Template/Dashboard/index.ctp b/community_server/src/Template/Dashboard/index.ctp
new file mode 100644
index 000000000..3e93e968a
--- /dev/null
+++ b/community_server/src/Template/Dashboard/index.ctp
@@ -0,0 +1,114 @@
+assign(
+ 'title',
+ __('Willkommen') . ', ' . $user['first_name'] . ' ' . $user['last_name'] . '!'
+);
+$this->assign(
+ 'header',
+ ''.__('Willkommen') . ', ' . $user['first_name'] . ' ' . $user['last_name'] . '! '
+);
+?>
+
+= round($requestTime * 1000.0) ?> ms
+
+
+
Gradido ...
+
+
+ account_balance_wallet
+ = $this->Html->link(
+ __('Kontoübersicht'),
+ ['controller' => 'StateBalances', 'action' => 'overview'],
+ ['class' => 'action-button-link']
+ );?>
+
+
+ account_balance
+ = $this->Html->link(
+ __('Überweisung'),
+ ['controller' => 'TransactionSendCoins', 'action' => 'create'],
+ ['class' => 'action-button-link']
+ ); ?>
+
+
+
+
+
+
+
= __('Adminbereich'); ?>
+
Gradido ...
+
+
+ redeem
+
+ = $this->Html->link(
+ __('schöpfen'),
+ ['controller' => 'TransactionCreations', 'action' => 'createMulti'],
+ ['class' => 'action-button-link']
+ );?>
+
+
+
+
+
Statistik
+
+
+ cached
+ = $this->Html->link(
+ __('Anmeldungen'),
+ ['controller' => 'Users', 'action' => 'statistics'],
+ ['class' => 'info-item-link']
+ );?>
+
+
+
+ error_outline
+ = $this->Html->link(
+ __('Fehler') . ' (' . $adminErrorCount . ')',
+ ['controller' => 'AdminErrors'], ['class' => 'info-item-link']);
+ ?>
+
+
+
+
+
+
+
+
Benutzer ...
+
+
+ search
+ = $this->Html->link(
+ __('suchen'),
+ ['controller' => 'StateUsers', 'action' => 'search'],
+ ['class' => 'info-item-link']
+ ); ?>
+
+
+
+
+
+
diff --git a/community_server/src/Template/Dashboard/server_index.ctp b/community_server/src/Template/Dashboard/server_index.ctp
new file mode 100644
index 000000000..1b4da7647
--- /dev/null
+++ b/community_server/src/Template/Dashboard/server_index.ctp
@@ -0,0 +1,36 @@
+assign('title', __('Willkommen'));
+$this->assign(
+ 'header',
+ 'Server Dashboard, nur für Admins '
+);
+?>
+
+
Gradido ...
+
+
+ redeem
+ = $this->Html->link(
+ __('viele schöpfen'),
+ ['controller' => 'TransactionCreations', 'action' => 'createMulti'],
+ ['class' => 'action-button-link']
+ );?>
+
+
+
+
+ error_outline
+ = $this->Html->link(
+ __('Fehler') . ' (' . $adminErrorCount . ')',
+ ['controller' => 'AdminErrors'], ['class' => 'info-item-link']);
+ ?>
+
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/Flash/default.ctp b/community_server/src/Template/Element/Flash/default.ctp
new file mode 100644
index 000000000..694b244c1
--- /dev/null
+++ b/community_server/src/Template/Element/Flash/default.ctp
@@ -0,0 +1,13 @@
+
+
+
+ = $message ?>
+
diff --git a/community_server/src/Template/Element/Flash/error.ctp b/community_server/src/Template/Element/Flash/error.ctp
new file mode 100644
index 000000000..65a8fbec3
--- /dev/null
+++ b/community_server/src/Template/Element/Flash/error.ctp
@@ -0,0 +1,10 @@
+
+
+
+ report_problem
+ = $message ?>
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/Flash/success.ctp b/community_server/src/Template/Element/Flash/success.ctp
new file mode 100644
index 000000000..31a062095
--- /dev/null
+++ b/community_server/src/Template/Element/Flash/success.ctp
@@ -0,0 +1,10 @@
+
+
+
+
+ = __('Info:') ?> = $message ?>
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/navi.ctp b/community_server/src/Template/Element/navi.ctp
new file mode 100644
index 000000000..33055197f
--- /dev/null
+++ b/community_server/src/Template/Element/navi.ctp
@@ -0,0 +1,38 @@
+getRequest()->getSession();
+$errorCount = intval($session->read('StateUser.errorCount'));
+$balance = $session->read('StateUser.balance');
+//echo "balance: $balance ";
+if(!isset($balance)) {
+ $balance = 0;
+}
+
+$navi = [];
+/*if($errorCount > 0) {
+ $errorNaviEntry = new NaviEntry(__('Fehler '). "($errorCount)", 'mdi-alert-outline', 'StateErrors', 'showForUser');
+ $errorNaviEntry->setBGColor('bg-inverse-danger')
+ ->setIconColor('alert-color');
+ array_push($navi, $errorNaviEntry);
+}*/
+$balanceNaviEntry = new NaviEntry(
+ __('Kontoübersicht') . ' (' .
+ str_replace(array("\r", "\n"), '', strip_tags($this->element('printGradido', ['number' => $balance])))
+ . ' )',
+ 'account_balance_wallet', 'StateBalances', 'overview'
+);
+if($balance < 0 ) {
+ //$balanceNaviEntry->setIconColor('alert-color');
+} else if($balance > 0) {
+ //$balanceNaviEntry->setIconColor('success-color');
+}
+array_push($navi, $balanceNaviEntry);
+array_push($navi, new NaviEntry(__('Startseite'), 'home', 'Dashboard', 'index'));
+array_push($navi, new NaviEntry(__('Überweisung'), 'account_balance', 'TransactionSendCoins', 'create'));
+array_push($navi, new NaviEntryExternLink(__('Mitgliederbereich'), 'people_alt', 'https://elopage.com/s/gradido/sign_in'));
+
+?>
+
diff --git a/community_server/src/Template/Element/navi_center.ctp b/community_server/src/Template/Element/navi_center.ctp
new file mode 100644
index 000000000..d07f44978
--- /dev/null
+++ b/community_server/src/Template/Element/navi_center.ctp
@@ -0,0 +1,7 @@
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/navi_header.ctp b/community_server/src/Template/Element/navi_header.ctp
new file mode 100644
index 000000000..cbc2eea97
--- /dev/null
+++ b/community_server/src/Template/Element/navi_header.ctp
@@ -0,0 +1,45 @@
+getRequest()->getSession();
+$errorCount = intval($session->read('StateUser.errorCount'));
+$transactionPendings = $session->read('Transactions.pending');
+
+/*
+class NavHeaderEntry
+{
+ public function __construct($icon_name, $controller, $action, $title) {
+ ;
+ }
+
+ public function
+}
+*/
+?>
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/navi_notify.ctp b/community_server/src/Template/Element/navi_notify.ctp
new file mode 100644
index 000000000..35687687d
--- /dev/null
+++ b/community_server/src/Template/Element/navi_notify.ctp
@@ -0,0 +1,41 @@
+getRequest()->getSession();
+$errorCount = intval($session->read('StateUser.errorCount'));
+$transactionPendings = $session->read('Transactions.pending');
+
+/*
+class NavHeaderEntry
+{
+ public function __construct($icon_name, $controller, $action, $title) {
+ ;
+ }
+
+ public function
+}
+*/
+?>
+ 0) : ?>
+ " href="= Router::url('./', true) ?>account/checkTransactions">
+ verified_user
+
+
+
+
+ 0) : ?>
+ = $this->Html->link(
+ 'announcement ',
+ ['controller' => 'StateErrors', 'action' => 'ShowForUser'],
+ ['class' => 'notify-link', 'escape' => false, 'title' => "$errorCount " . __('Fehler')]) ?>
+
diff --git a/community_server/src/Template/Element/printEuro.ctp b/community_server/src/Template/Element/printEuro.ctp
new file mode 100644
index 000000000..976e4e007
--- /dev/null
+++ b/community_server/src/Template/Element/printEuro.ctp
@@ -0,0 +1,24 @@
+ 0) $class = "grd-positive-currency";*/
+if($number < 0) {
+ $class = 'grd-negative-currency';
+}
+
+?>
+= $this->Number->format(intval($number) / 100.0, ['precision' => 2]) . ' €';?>
+
+
+ = $this->Number->format(intval($number) / 100.0, ['precision' => 2]) . ' €';?>
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/printGDT.ctp b/community_server/src/Template/Element/printGDT.ctp
new file mode 100644
index 000000000..8052283d0
--- /dev/null
+++ b/community_server/src/Template/Element/printGDT.ctp
@@ -0,0 +1,24 @@
+ 0) $class = "grd-positive-currency";*/
+if($number < 0) {
+ $class = 'grd-negative-currency';
+}
+
+?>
+= $this->Number->format(intval($number) / 100.0, ['precision' => 2]) . ' GDT';?>
+
+
+ = $this->Number->format(intval($number) / 100.0, ['precision' => 2]) . ' GDT';?>
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/printGradido.ctp b/community_server/src/Template/Element/printGradido.ctp
new file mode 100644
index 000000000..404bdb70d
--- /dev/null
+++ b/community_server/src/Template/Element/printGradido.ctp
@@ -0,0 +1,19 @@
+
+= $this->Number->format(intval($number) / 10000.0, ['precision' => 2]) . ' GDD';?>
+
+
+ = $this->Number->format(intval($number) / 10000.0, ['precision' => 2]) . ' GDD';?>
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/Element/user_menu.ctp b/community_server/src/Template/Element/user_menu.ctp
new file mode 100644
index 000000000..633674233
--- /dev/null
+++ b/community_server/src/Template/Element/user_menu.ctp
@@ -0,0 +1,43 @@
+getRequest()->getSession();
+$user = $session->read('StateUser');
+$transactionPendings = $session->read('Transactions.pending');
+$this->set('user', $user);
+$navi = [];
+array_push($navi, new NaviEntry(__('Mein Profil'), 'build', 'Profile', 'index'));
+if(intval($transactionPendings) > 0) {
+/* array_push($navi, new NaviEntryAbsoluteLink(
+ __("Transaktionen unterzeichnen") . ' (' . intval($transactionPendings) . ')',
+ 'mdi-signature-freehand', 'account/checkTransactions'
+ ));*/
+} else {
+ array_push($navi, new NaviEntryAbsoluteLink(__('Abmelden'), 'exit_to_app', 'account/logout'));
+}
+?>
+
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/ElopageBuys/add.ctp b/community_server/src/Template/ElopageBuys/add.ctp
new file mode 100644
index 000000000..e9c2c6a80
--- /dev/null
+++ b/community_server/src/Template/ElopageBuys/add.ctp
@@ -0,0 +1,33 @@
+
+
+
+ = $this->Form->create($elopageBuy) ?>
+
+ = __('Add Elopage Buy') ?>
+ Form->control('elopage_user_id');
+ echo $this->Form->control('affiliate_program_id');
+ echo $this->Form->control('publisher_id');
+ echo $this->Form->control('order_id');
+ echo $this->Form->control('product_id');
+ echo $this->Form->control('product_price');
+ echo $this->Form->control('payer_email');
+ echo $this->Form->control('publisher_email');
+ echo $this->Form->control('payed');
+ echo $this->Form->control('success_date');
+ echo $this->Form->control('event');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/ElopageBuys/edit.ctp b/community_server/src/Template/ElopageBuys/edit.ctp
new file mode 100644
index 000000000..e33956b83
--- /dev/null
+++ b/community_server/src/Template/ElopageBuys/edit.ctp
@@ -0,0 +1,39 @@
+
+
+
+ = $this->Form->create($elopageBuy) ?>
+
+ = __('Edit Elopage Buy') ?>
+ Form->control('elopage_user_id');
+ echo $this->Form->control('affiliate_program_id');
+ echo $this->Form->control('publisher_id');
+ echo $this->Form->control('order_id');
+ echo $this->Form->control('product_id');
+ echo $this->Form->control('product_price');
+ echo $this->Form->control('payer_email');
+ echo $this->Form->control('publisher_email');
+ echo $this->Form->control('payed');
+ echo $this->Form->control('success_date');
+ echo $this->Form->control('event');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/ElopageBuys/index.ctp b/community_server/src/Template/ElopageBuys/index.ctp
new file mode 100644
index 000000000..4d5ecc1d1
--- /dev/null
+++ b/community_server/src/Template/ElopageBuys/index.ctp
@@ -0,0 +1,67 @@
+
+
+
+
= __('Elopage Buys') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('elopage_user_id') ?>
+ = $this->Paginator->sort('affiliate_program_id') ?>
+ = $this->Paginator->sort('publisher_id') ?>
+ = $this->Paginator->sort('order_id') ?>
+ = $this->Paginator->sort('product_id') ?>
+ = $this->Paginator->sort('product_price') ?>
+ = $this->Paginator->sort('payer_email') ?>
+ = $this->Paginator->sort('publisher_email') ?>
+ = $this->Paginator->sort('payed') ?>
+ = $this->Paginator->sort('success_date') ?>
+ = $this->Paginator->sort('event') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($elopageBuy->id) ?>
+ = $this->Number->format($elopageBuy->elopage_user_id) ?>
+ = $this->Number->format($elopageBuy->affiliate_program_id) ?>
+ = $this->Number->format($elopageBuy->publisher_id) ?>
+ = $this->Number->format($elopageBuy->order_id) ?>
+ = $this->Number->format($elopageBuy->product_id) ?>
+ = $this->Number->format($elopageBuy->product_price) ?>
+ = h($elopageBuy->payer_email) ?>
+ = h($elopageBuy->publisher_email) ?>
+ = h($elopageBuy->payed) ?>
+ = h($elopageBuy->success_date) ?>
+ = h($elopageBuy->event) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $elopageBuy->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $elopageBuy->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $elopageBuy->id], ['confirm' => __('Are you sure you want to delete # {0}?', $elopageBuy->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/ElopageBuys/statistics.ctp b/community_server/src/Template/ElopageBuys/statistics.ctp
new file mode 100644
index 000000000..3ac6cf7f6
--- /dev/null
+++ b/community_server/src/Template/ElopageBuys/statistics.ctp
@@ -0,0 +1,35 @@
+toArray());
+/*foreach($elopageBuys as $entry) {
+ echo $entry->success_date . " ";
+}
+ *
+ */
+/*foreach($users as $user) {
+ //var_dump($user);
+ echo $user->created;
+ echo " ";
+}*/
+?>
+
+
+
+
+
+
+
+
= $users->count()?>
+
= __('Anmeldungen diesen Monat'); ?>
+
12.01 %
+
+
+
+
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/ElopageBuys/view.ctp b/community_server/src/Template/ElopageBuys/view.ctp
new file mode 100644
index 000000000..2631e17fe
--- /dev/null
+++ b/community_server/src/Template/ElopageBuys/view.ctp
@@ -0,0 +1,68 @@
+
+
+
+
= h($elopageBuy->id) ?>
+
+
+ = __('Payer Email') ?>
+ = h($elopageBuy->payer_email) ?>
+
+
+ = __('Publisher Email') ?>
+ = h($elopageBuy->publisher_email) ?>
+
+
+ = __('Event') ?>
+ = h($elopageBuy->event) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($elopageBuy->id) ?>
+
+
+ = __('Elopage User Id') ?>
+ = $this->Number->format($elopageBuy->elopage_user_id) ?>
+
+
+ = __('Affiliate Program Id') ?>
+ = $this->Number->format($elopageBuy->affiliate_program_id) ?>
+
+
+ = __('Publisher Id') ?>
+ = $this->Number->format($elopageBuy->publisher_id) ?>
+
+
+ = __('Order Id') ?>
+ = $this->Number->format($elopageBuy->order_id) ?>
+
+
+ = __('Product Id') ?>
+ = $this->Number->format($elopageBuy->product_id) ?>
+
+
+ = __('Product Price') ?>
+ = $this->Number->format($elopageBuy->product_price) ?>
+
+
+ = __('Success Date') ?>
+ = h($elopageBuy->success_date) ?>
+
+
+ = __('Payed') ?>
+ = $elopageBuy->payed ? __('Yes') : __('No'); ?>
+
+
+
diff --git a/community_server/src/Template/Email/html/default.ctp b/community_server/src/Template/Email/html/default.ctp
new file mode 100644
index 000000000..ac3daa7fe
--- /dev/null
+++ b/community_server/src/Template/Email/html/default.ctp
@@ -0,0 +1,20 @@
+ ' . $line . "\n";
+endforeach;
diff --git a/community_server/src/Template/Email/text/default.ctp b/community_server/src/Template/Email/text/default.ctp
new file mode 100644
index 000000000..862cd9f76
--- /dev/null
+++ b/community_server/src/Template/Email/text/default.ctp
@@ -0,0 +1,16 @@
+assign('title', __('Gradido Schöpfung'));
+?>= __('Hallo') ?> = $user->first_name ?> = $user->last_name ?>,
+
+= __('für dich wurden soeben {0} geschöpft.', $this->element('printGradido', ['number' => $gdd_cent, 'raw' => true])) ?>
+Gradido Akademie schreibt:
+
+= $memo ?>
+
+= __('Bitte antworte nicht auf diese E-Mail!'); ?>
+
+= __('Mit freundlichen Grüßen'); ?>
+Gradido Community Server
\ No newline at end of file
diff --git a/community_server/src/Template/Email/text/notification_transfer.ctp b/community_server/src/Template/Email/text/notification_transfer.ctp
new file mode 100644
index 000000000..2cc692e02
--- /dev/null
+++ b/community_server/src/Template/Email/text/notification_transfer.ctp
@@ -0,0 +1,21 @@
+assign('title', __('Gradido Überweisung'));
+$receiverNames = $receiverUser->first_name . ' ' . $receiverUser->last_name;
+$senderNames = $senderUser->first_name . ' ' . $senderUser->last_name;
+?>= __('Hallo') ?> = $receiverNames ?>,
+
+= __('Du hast soeben {0} von {1} erhalten.', $this->element('printGradido', ['number' => $gdd_cent, 'raw' => true]), $senderNames) ?>
+= __('{0} schreibt:', $senderNames) ?>
+
+= $memo ?>
+
+= __('Du kannst {0} eine Nachricht schreiben, indem du auf diese E-Mail antwortest', $senderNames); ?>
+
+= __('Mit freundlichen Grüßen'); ?>
+Gradido Community Server
\ No newline at end of file
diff --git a/community_server/src/Template/Error/error400.ctp b/community_server/src/Template/Error/error400.ctp
new file mode 100644
index 000000000..6b538b7f4
--- /dev/null
+++ b/community_server/src/Template/Error/error400.ctp
@@ -0,0 +1,38 @@
+layout = 'error';
+
+if (Configure::read('debug')) :
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error400.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+= $this->element('auto_table_warning') ?>
+end();
+endif;
+?>
+= h($message) ?>
+
+ = __d('cake', 'Error') ?>:
+ = __d('cake', 'The requested address {0} was not found on this server.', "'{$url}' ") ?>
+
diff --git a/community_server/src/Template/Error/error500.ctp b/community_server/src/Template/Error/error500.ctp
new file mode 100644
index 000000000..3328cc52c
--- /dev/null
+++ b/community_server/src/Template/Error/error500.ctp
@@ -0,0 +1,43 @@
+layout = 'error';
+
+if (Configure::read('debug')) :
+ $this->layout = 'dev_error';
+
+ $this->assign('title', $message);
+ $this->assign('templateName', 'error500.ctp');
+
+ $this->start('file');
+?>
+queryString)) : ?>
+
+ SQL Query:
+ = h($error->queryString) ?>
+
+
+params)) : ?>
+ SQL Query Params:
+ params) ?>
+
+
+ Error in:
+ = sprintf('%s, line %s', str_replace(ROOT, 'ROOT', $error->getFile()), $error->getLine()) ?>
+
+element('auto_table_warning');
+
+ if (extension_loaded('xdebug')) :
+ xdebug_print_function_stack();
+ endif;
+
+ $this->end();
+endif;
+?>
+= __d('cake', 'An Internal Error Has Occurred') ?>
+
+ = __d('cake', 'Error') ?>:
+ = h($message) ?>
+
diff --git a/community_server/src/Template/Layout/Email/html/default.ctp b/community_server/src/Template/Layout/Email/html/default.ctp
new file mode 100644
index 000000000..3ff87ff83
--- /dev/null
+++ b/community_server/src/Template/Layout/Email/html/default.ctp
@@ -0,0 +1,24 @@
+
+
+
+
+ = $this->fetch('title') ?>
+
+
+ = $this->fetch('content') ?>
+
+
diff --git a/community_server/src/Template/Layout/Email/text/default.ctp b/community_server/src/Template/Layout/Email/text/default.ctp
new file mode 100644
index 000000000..29b439ccc
--- /dev/null
+++ b/community_server/src/Template/Layout/Email/text/default.ctp
@@ -0,0 +1,16 @@
+fetch('content');
diff --git a/community_server/src/Template/Layout/ajax.ctp b/community_server/src/Template/Layout/ajax.ctp
new file mode 100644
index 000000000..29b439ccc
--- /dev/null
+++ b/community_server/src/Template/Layout/ajax.ctp
@@ -0,0 +1,16 @@
+fetch('content');
diff --git a/community_server/src/Template/Layout/default.ctp b/community_server/src/Template/Layout/default.ctp
new file mode 100644
index 000000000..4633502df
--- /dev/null
+++ b/community_server/src/Template/Layout/default.ctp
@@ -0,0 +1,53 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>:
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+ = $this->Html->css(['main.css']) ?>
+ = $this->Html->script(['basic']) ?>
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+ = $this->html->link(__('Logout'), ['controller' => 'ServerUsers', 'action' => 'logout'])?>
+ Documentation
+ API
+
+
+ = $this->Flash->render() ?>
+ = $this->fetch('content') ?>
+
+
+
+
+ = round($timeUsed * 1000.0, 4) ?> ms
+
+
+
+
diff --git a/community_server/src/Template/Layout/error.ctp b/community_server/src/Template/Layout/error.ctp
new file mode 100644
index 000000000..7367c1bf7
--- /dev/null
+++ b/community_server/src/Template/Layout/error.ctp
@@ -0,0 +1,47 @@
+
+
+
+
+ = $this->Html->charset() ?>
+
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('style.css') ?>
+
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->fetch('content') ?>
+
+
+
+
+
diff --git a/community_server/src/Template/Layout/frontend.ctp b/community_server/src/Template/Layout/frontend.ctp
new file mode 100644
index 000000000..425073374
--- /dev/null
+++ b/community_server/src/Template/Layout/frontend.ctp
@@ -0,0 +1,113 @@
+";
+//echo "transactions pending: " . $transactionPendings;
+?>
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>:
+ = $this->fetch('title') ?>
+
+ = $this->Html->meta('icon') ?>
+ = $this->Html->css(['main.css']) ?>
+ = $this->Html->script(['basic']) ?>
+ = $this->fetch('meta') ?>
+ = $this->fetch('css') ?>
+ = $this->fetch('script') ?>
+
+
+
+
+
+
+ menu
+
+
+
+
+
+
+
+
+
+ = $this->Flash->render() ?>
+
+ = $this->element('navi_center'); ?>
+
+
+ fetch('header')): ?>
+
+ = $this->fetch('header') ?>
+
+
+
+ = $this->fetch('content') ?>
+
+
+
+
+
Copyright © 2020 Gradido
+
+
+
+ =round($timeUsed * 1000.0, 4)?> ms
+
+
+
+
= __("Community Server in Entwicklung") ?>
+
Alpha 0.20.06.03
+
+
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/Layout/rss/default.ctp b/community_server/src/Template/Layout/rss/default.ctp
new file mode 100644
index 000000000..8269be212
--- /dev/null
+++ b/community_server/src/Template/Layout/rss/default.ctp
@@ -0,0 +1,11 @@
+fetch('title');
+endif;
+
+echo $this->Rss->document(
+ $this->Rss->channel([], $channel, $this->fetch('content'))
+);
diff --git a/community_server/src/Template/OperatorTypes/add.ctp b/community_server/src/Template/OperatorTypes/add.ctp
new file mode 100644
index 000000000..c50feecf0
--- /dev/null
+++ b/community_server/src/Template/OperatorTypes/add.ctp
@@ -0,0 +1,26 @@
+
+
+
+ = $this->Form->create($operatorType) ?>
+
+ = __('Add Operator Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/OperatorTypes/edit.ctp b/community_server/src/Template/OperatorTypes/edit.ctp
new file mode 100644
index 000000000..0b61f0f7a
--- /dev/null
+++ b/community_server/src/Template/OperatorTypes/edit.ctp
@@ -0,0 +1,32 @@
+
+
+
+ = $this->Form->create($operatorType) ?>
+
+ = __('Edit Operator Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/OperatorTypes/index.ctp b/community_server/src/Template/OperatorTypes/index.ctp
new file mode 100644
index 000000000..52a49b547
--- /dev/null
+++ b/community_server/src/Template/OperatorTypes/index.ctp
@@ -0,0 +1,51 @@
+
+
+
+
= __('Operator Types') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('text') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($operatorType->id) ?>
+ = h($operatorType->name) ?>
+ = h($operatorType->text) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $operatorType->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $operatorType->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $operatorType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $operatorType->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/OperatorTypes/view.ctp b/community_server/src/Template/OperatorTypes/view.ctp
new file mode 100644
index 000000000..a7cb775cf
--- /dev/null
+++ b/community_server/src/Template/OperatorTypes/view.ctp
@@ -0,0 +1,61 @@
+
+
+
+
= h($operatorType->name) ?>
+
+
+ = __('Name') ?>
+ = h($operatorType->name) ?>
+
+
+ = __('Text') ?>
+ = h($operatorType->text) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($operatorType->id) ?>
+
+
+
+
diff --git a/community_server/src/Template/Operators/add.ctp b/community_server/src/Template/Operators/add.ctp
new file mode 100644
index 000000000..6696cce5c
--- /dev/null
+++ b/community_server/src/Template/Operators/add.ctp
@@ -0,0 +1,26 @@
+
+
+
+ = $this->Form->create($operator) ?>
+
+ = __('Add Operator') ?>
+ Form->control('username');
+ echo $this->Form->control('user_pubkey');
+ echo $this->Form->control('operator_type_id');
+ echo $this->Form->control('data_base64');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/Operators/edit.ctp b/community_server/src/Template/Operators/edit.ctp
new file mode 100644
index 000000000..88a348e59
--- /dev/null
+++ b/community_server/src/Template/Operators/edit.ctp
@@ -0,0 +1,32 @@
+
+
+
+ = $this->Form->create($operator) ?>
+
+ = __('Edit Operator') ?>
+ Form->control('username');
+ echo $this->Form->control('user_pubkey');
+ echo $this->Form->control('operator_type_id');
+ echo $this->Form->control('data_base64');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/Operators/index.ctp b/community_server/src/Template/Operators/index.ctp
new file mode 100644
index 000000000..3da9a6afb
--- /dev/null
+++ b/community_server/src/Template/Operators/index.ctp
@@ -0,0 +1,56 @@
+
+
+
+
= __('Operators') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('username') ?>
+ = $this->Paginator->sort('user_pubkey') ?>
+ = $this->Paginator->sort('operator_type_id') ?>
+ = $this->Paginator->sort('data_base64') ?>
+ = $this->Paginator->sort('modified') ?>
+ = __('Actions') ?>
+
+
+
+ operator_type->name ?>
+
+ = $this->Number->format($operator->id) ?>
+ = h($operator->username) ?>
+ = h(bin2hex($operator->user_pubkey)) ?>
+ = $this->Html->link(__($operator->operator_type->name), ['controller' => 'OperatorTypes', 'action' => 'view', $operator->operator_type_id]) ?>
+ = h($operator->data_base64) ?>
+ = h($operator->modified) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $operator->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $operator->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $operator->id], ['confirm' => __('Are you sure you want to delete # {0}?', $operator->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/Operators/view.ctp b/community_server/src/Template/Operators/view.ctp
new file mode 100644
index 000000000..a317c8e17
--- /dev/null
+++ b/community_server/src/Template/Operators/view.ctp
@@ -0,0 +1,40 @@
+
+
+
+
= h($operator->id) ?>
+
+
+ = __('Username') ?>
+ = h($operator->username) ?>
+
+
+ = __('User Pubkey') ?>
+ = h(bin2hex($operator->user_pubkey)) ?>
+
+
+ = __('Data Base64') ?>
+ = h($operator->data_base64) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($operator->id) ?>
+
+
+ = __('Operator Type Id') ?>
+ = $this->Number->format($operator->operator_type_id) ?>
+
+
+
diff --git a/community_server/src/Template/Pages/cake_home.ctp b/community_server/src/Template/Pages/cake_home.ctp
new file mode 100644
index 000000000..5a3731e4c
--- /dev/null
+++ b/community_server/src/Template/Pages/cake_home.ctp
@@ -0,0 +1,276 @@
+layout = false;
+
+if (!Configure::read('debug')) :
+ throw new NotFoundException(
+ 'Please replace src/Template/Pages/home.ctp with your own version or re-enable debug mode.'
+ );
+endif;
+
+$cakeDescription = 'CakePHP: the rapid development PHP framework';
+?>
+
+
+
+ = $this->Html->charset() ?>
+
+
+ = $cakeDescription ?>
+
+
+ = $this->Html->meta('icon') ?>
+ = $this->Html->css('base.css') ?>
+ = $this->Html->css('style.css') ?>
+ = $this->Html->css('home.css') ?>
+
+
+
+
+
+
+
+
+
+
Please be aware that this page will not be shown if you turn off debug mode unless you replace src/Template/Pages/home.ctp with your own version.
+
+
+
+
+
+
+
+
+
Environment
+
+ =')) : ?>
+ Your version of PHP is 5.6.0 or higher (detected = PHP_VERSION ?>).
+
+ Your version of PHP is too low. You need PHP 5.6.0 or higher to use CakePHP (detected = PHP_VERSION ?>).
+
+
+
+ Your version of PHP has the mbstring extension loaded.
+
+ Your version of PHP does NOT have the mbstring extension loaded.
+
+
+
+ Your version of PHP has the openssl extension loaded.
+
+ Your version of PHP has the mcrypt extension loaded.
+
+ Your version of PHP does NOT have the openssl or mcrypt extension loaded.
+
+
+
+ Your version of PHP has the intl extension loaded.
+
+ Your version of PHP does NOT have the intl extension loaded.
+
+
+
+
+
Filesystem
+
+
+ Your tmp directory is writable.
+
+ Your tmp directory is NOT writable.
+
+
+
+ Your logs directory is writable.
+
+ Your logs directory is NOT writable.
+
+
+
+
+ The = $settings['className'] ?>Engine is being used for core caching. To change the config edit config/app.php
+
+ Your cache is NOT working. Please check the settings in config/app.php
+
+
+
+
+
+
+
+
+
Database
+ connect();
+ } catch (Exception $connectionError) {
+ $connected = false;
+ $errorMsg = $connectionError->getMessage();
+ if (method_exists($connectionError, 'getAttributes')) :
+ $attributes = $connectionError->getAttributes();
+ if (isset($errorMsg['message'])) :
+ $errorMsg .= '
' . $attributes['message'];
+ endif;
+ endif;
+ }
+ ?>
+
+
+ CakePHP is able to connect to the database.
+
+ CakePHP is NOT able to connect to the database. = $errorMsg ?>
+
+
+
+
+
DebugKit
+
+
+ DebugKit is loaded.
+
+ DebugKit is NOT loaded. You need to either install pdo_sqlite, or define the "debug_kit" connection name.
+
+
+
+
+
+
+
+
+
Editing this Page
+
+ To change the content of this page, edit: src/Template/Pages/home.ctp.
+ You can also add some CSS styles for your pages at: webroot/css/.
+
+
+
+
+
+
+
+
More about Cake
+
+ CakePHP is a rapid development framework for PHP which uses commonly known design patterns like Front Controller and MVC.
+ Our primary goal is to provide a structured framework that enables PHP users at all levels to rapidly develop robust web applications, without any loss to flexibility.
+
+
+
+
+
+
+
+
P
+
Help and Bug Reports
+
+
+
+
r
+
Docs and Downloads
+
+
+
+
s
+
Training and Certification
+
+
+
+
+
+
diff --git a/community_server/src/Template/Pages/gradido.ctp b/community_server/src/Template/Pages/gradido.ctp
new file mode 100644
index 000000000..f6a2213cc
--- /dev/null
+++ b/community_server/src/Template/Pages/gradido.ctp
@@ -0,0 +1,14 @@
+layout = false;?>
+
+ Web Assembly Test (CakePHP Single Node Version)
+
+
+
+ Wird geladen...
+
+
+
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/Pages/home.ctp b/community_server/src/Template/Pages/home.ctp
new file mode 100644
index 000000000..3926921c4
--- /dev/null
+++ b/community_server/src/Template/Pages/home.ctp
@@ -0,0 +1,19 @@
+layout = false;?>
+
+ Web Assembly Test (CakePHP Single Node Version)
+
+
+
+
+
+
Gradido
+ Implementierung wählen
+
+
+
+
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/Pages/visitor.ctp b/community_server/src/Template/Pages/visitor.ctp
new file mode 100644
index 000000000..e6956c97c
--- /dev/null
+++ b/community_server/src/Template/Pages/visitor.ctp
@@ -0,0 +1,16 @@
+layout = false;?>
+
+
+
+ Visitor Page
+
+
+
+
+ Info Page for Visitor to learn about group before try to enter or connect (befriend)
+
+
diff --git a/community_server/src/Template/Profile/edit.ctp b/community_server/src/Template/Profile/edit.ctp
new file mode 100644
index 000000000..edddf1631
--- /dev/null
+++ b/community_server/src/Template/Profile/edit.ctp
@@ -0,0 +1,41 @@
+assign('title', __('Profil ändern'));
+// In a View class
+$this->loadHelper('Form', [
+ 'templates' => 'horizontal_form',
+]);
+?>
+
+
+= $this->Html->script(['core', 'vendor.addons']); ?>
+
diff --git a/community_server/src/Template/Profile/index.ctp b/community_server/src/Template/Profile/index.ctp
new file mode 100644
index 000000000..b77ff9f70
--- /dev/null
+++ b/community_server/src/Template/Profile/index.ctp
@@ -0,0 +1,82 @@
+';
+$header .= '';
+if (!empty($communityProfile['profile_desc'])) {
+ $header .= "".$communityProfile['profile_desc']."
";
+}
+$header .= '';
+if ($communityProfile && $communityProfile['profile_img']) {
+ $header .= "";
+}
+$this->assign('title', __('Mein Profil'));
+$this->assign('header', $header);
+?>
+
+= round($requestTime * 1000.0) ?> ms
+
+
+
+ assignment_ind
+ Meine Daten
+
+
+
+
+ E-Mail Adresse:
+ =$user['email']?>
+
+
+ Vorname:
+ =$user['first_name']?>
+
+
+ Nachname:
+ =$user['last_name']?>
+
+
+
+
+ Meine Daten ändern
+
+
+
+
+
+
+ vpn_key
+ Passwort ändern
+
+
+
diff --git a/community_server/src/Template/ServerUsers/add.ctp b/community_server/src/Template/ServerUsers/add.ctp
new file mode 100644
index 000000000..35907282b
--- /dev/null
+++ b/community_server/src/Template/ServerUsers/add.ctp
@@ -0,0 +1,26 @@
+
+
+
+ = $this->Form->create($serverUser) ?>
+
+ = __('Add Server User') ?>
+ Form->control('username');
+ echo $this->Form->control('password');
+ echo $this->Form->control('email');
+ echo $this->Form->control('role');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/ServerUsers/edit.ctp b/community_server/src/Template/ServerUsers/edit.ctp
new file mode 100644
index 000000000..df812d032
--- /dev/null
+++ b/community_server/src/Template/ServerUsers/edit.ctp
@@ -0,0 +1,34 @@
+
+
+
+ = $this->Form->create($serverUser) ?>
+
+ = __('Edit Server User') ?>
+ Form->control('username');
+ echo $this->Form->control('password');
+ echo $this->Form->control('email');
+ echo $this->Form->control('role');
+ echo $this->Form->control('activated');
+ echo $this->Form->control('last_login', ['empty' => true]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/ServerUsers/index.ctp b/community_server/src/Template/ServerUsers/index.ctp
new file mode 100644
index 000000000..a6e14cedc
--- /dev/null
+++ b/community_server/src/Template/ServerUsers/index.ctp
@@ -0,0 +1,59 @@
+
+
+
+
= __('Server Users') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('username') ?>
+ = $this->Paginator->sort('email') ?>
+ = $this->Paginator->sort('role') ?>
+ = $this->Paginator->sort('activated') ?>
+ = $this->Paginator->sort('last_login') ?>
+ = $this->Paginator->sort('created') ?>
+ = $this->Paginator->sort('modified') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($serverUser->id) ?>
+ = h($serverUser->username) ?>
+ = h($serverUser->email) ?>
+ = h($serverUser->role) ?>
+ = h($serverUser->activated) ?>
+ = h($serverUser->last_login) ?>
+ = h($serverUser->created) ?>
+ = h($serverUser->modified) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $serverUser->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $serverUser->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $serverUser->id], ['confirm' => __('Are you sure you want to delete # {0}?', $serverUser->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/ServerUsers/login.ctp b/community_server/src/Template/ServerUsers/login.ctp
new file mode 100644
index 000000000..4996d5e7b
--- /dev/null
+++ b/community_server/src/Template/ServerUsers/login.ctp
@@ -0,0 +1,22 @@
+loadHelper('Form', [
+ 'templates' => 'horizontal_form',
+]);
+?>
+= $this->Flash->render() ?>
+
+ = $this->Form->create() ?>
+
+ = __('Please enter your username and password') ?>
+ = $this->Form->control('username') ?>
+ = $this->Form->control('password') ?>
+
+ = $this->Form->button(__('Login'), ['class' => 'form-button']); ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/ServerUsers/view.ctp b/community_server/src/Template/ServerUsers/view.ctp
new file mode 100644
index 000000000..0d3a9ae21
--- /dev/null
+++ b/community_server/src/Template/ServerUsers/view.ctp
@@ -0,0 +1,56 @@
+
+
+
+
= h($serverUser->id) ?>
+
+
+ = __('Username') ?>
+ = h($serverUser->username) ?>
+
+
+ = __('Password') ?>
+ = h($serverUser->password) ?>
+
+
+ = __('Email') ?>
+ = h($serverUser->email) ?>
+
+
+ = __('Role') ?>
+ = h($serverUser->role) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($serverUser->id) ?>
+
+
+ = __('Last Login') ?>
+ = h($serverUser->last_login) ?>
+
+
+ = __('Created') ?>
+ = h($serverUser->created) ?>
+
+
+ = __('Modified') ?>
+ = h($serverUser->modified) ?>
+
+
+ = __('Activated') ?>
+ = $serverUser->activated ? __('Yes') : __('No'); ?>
+
+
+
diff --git a/community_server/src/Template/StateBalances/add.ctp b/community_server/src/Template/StateBalances/add.ctp
new file mode 100644
index 000000000..64ef5d576
--- /dev/null
+++ b/community_server/src/Template/StateBalances/add.ctp
@@ -0,0 +1,27 @@
+
+
+
+ = $this->Form->create($stateBalance) ?>
+ add
+
+ = __('Add State Balance') ?>
+ Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('amount');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateBalances/edit.ctp b/community_server/src/Template/StateBalances/edit.ctp
new file mode 100644
index 000000000..c4a6c1e81
--- /dev/null
+++ b/community_server/src/Template/StateBalances/edit.ctp
@@ -0,0 +1,33 @@
+
+
+
+ = $this->Form->create($stateBalance) ?>
+ edit
+
+ = __('Edit State Balance') ?>
+ Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('amount');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateBalances/index.ctp b/community_server/src/Template/StateBalances/index.ctp
new file mode 100644
index 000000000..4b0db06d6
--- /dev/null
+++ b/community_server/src/Template/StateBalances/index.ctp
@@ -0,0 +1,54 @@
+
+
+
+
= __('State Balances') ?>
+ index
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('state_user_id') ?>
+ = $this->Paginator->sort('modified') ?>
+ = $this->Paginator->sort('amount') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateBalance->id) ?>
+ = $stateBalance->has('state_user') ? $this->Html->link($stateBalance->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateBalance->state_user->id]) : '' ?>
+ = h($stateBalance->modified) ?>
+ = $this->Number->format($stateBalance->amount) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateBalance->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateBalance->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateBalance->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateBalance->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateBalances/overview.ctp b/community_server/src/Template/StateBalances/overview.ctp
new file mode 100644
index 000000000..e55d0aa7b
--- /dev/null
+++ b/community_server/src/Template/StateBalances/overview.ctp
@@ -0,0 +1,149 @@
+assign('title', __('Kontoübersicht'));
+
+$header = '' . __('Aktueller Kontostand: ') . ' ' .
+ '' . $this->element('printGradido', ['number' => $balance]) . ' ';
+if($gdtSum > 0) {
+ $header .= ''.$this->Html->link(
+ $this->element('printGDT', ['number' => $gdtSum]),
+ ['action' => 'overview_gdt'],
+ ['escape' => false]
+ ).' ';
+}
+$this->assign('header', $header);
+//var_dump($transactions);
+?>
+
+ 0) : ?>
+
+
+
+
+
+
Überweisungen
+
+
+
+
+
+
+
+
+ 30) {
+ $memoShort = substr($memoShort, 0, 30) . '...';
+ }
+ $cellColorClass = 'success-color';
+ if($send) {
+ $balance = -$balance;
+ $cellColorClass = 'alert-color';
+ } else if($transaction['type'] == 'creation') {
+ $cellColorClass = 'orange-color';
+ }
+ ?>
+
+
+ = $this->Html->image('50x50.png', ['class' => 'profile-img', 'alt' => 'profile image']) ?>
+
+
+
+ = $transaction['name'] ?>
+
+
+
= $transaction['name'] ?>
+
+
+
+
+ redeem
+
+ = __('Geschöpft')?>
+
+ arrow_back
+ = __('Gesendet') ?>
+
+ arrow_forward
+ = __('Empfangen') ?>
+
+
+
+
+
+ 30): ?>
+ = substr($memoShort, 0, 30) . '...' ?>
+
+ = $transaction['memo'] ?>
+
+
+
= $transaction['date']->nice() ?>
+
= $this->element('printGradido', ['number' => $balance]) ?>
+
+ = $transaction['transaction_id'] ?>
+
+
+
+
+
+
+
+ 0) : ?>
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/StateBalances/overview_gdt.ctp b/community_server/src/Template/StateBalances/overview_gdt.ctp
new file mode 100644
index 000000000..85ecbfd50
--- /dev/null
+++ b/community_server/src/Template/StateBalances/overview_gdt.ctp
@@ -0,0 +1,119 @@
+assign('title', __('GDT Kontoübersicht'));
+$header = '' . __('Zur Verfügung: ') . ' ';
+$gdtSumFromEmails = 0;
+foreach($gdtSumPerEmail as $email => $gdt) {
+ $gdtSumFromEmails += $gdt;
+}
+
+if($gdtSum > 0){
+ $header .= ''.$this->element('printGDT', ['number' => $gdtSumFromEmails]).' ';
+}
+if($moreEntrysAsShown) {
+ $header .= ''. __('Nur die letzten 100 Einträge werden angezeigt!') . ' ';
+}
+$this->assign('header', $header);
+
+?>
+ 0) :?>
+
+
= __('Eigene Einzahlungen') ?>
+
+
+
+
+
+
+
+
+
+
+
+
= $entry['email'] ?>
+
= new FrozenTime($entry['date']) ?>
+
= h($entry['comment']) ?>
+
+ = $this->element('printEuro', ['number' => $entry['amount']]); ?>
+ element('printEuro', ['number' => $entry['amount2']]) ?>
+
+
+ = $this->Number->format($entry['factor']) ?>
+ x
+ = $this->Number->format($entry['factor2']) ?>
+
+
+
= $this->element('printGDT', ['number' => $entry['gdt']]) ?>
+
+
+
+
+
+ 0) : ?>
+
+
= __('Einzahlungen anderer (Publisherprogramm)') ?>
+
+
+
+
+
+
+
+
+
+
+
= $elopageTransaction['email'] ?>
+
+
+
+
= new FrozenTime($gdtEntry['date']) ?>
+
+ = $this->element('printEuro', ['number' => $gdtEntry['amount']]) ?>
+ element('printEuro', ['number' => $gdtEntry['amount2']]) ?>
+
+
+ = $this->Number->format($gdtEntry['factor']) ?>
+ x
+ = $this->Number->format($gdtEntry['factor2']) ?>
+
+
+
= $this->element('printGDT', ['number' => $gdtEntry['gdt']]) ?>
+
+
+
+
+
+= $this->Html->script(['basic', 'popper.min', 'tippy-bundle.umd.min']) ?>
+
\ No newline at end of file
diff --git a/community_server/src/Template/StateBalances/view.ctp b/community_server/src/Template/StateBalances/view.ctp
new file mode 100644
index 000000000..e5f8901dd
--- /dev/null
+++ b/community_server/src/Template/StateBalances/view.ctp
@@ -0,0 +1,39 @@
+
+
+
+
= h($stateBalance->id) ?>
+ view
+
+
+ = __('State User') ?>
+ = $stateBalance->has('state_user') ? $this->Html->link($stateBalance->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateBalance->state_user->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($stateBalance->id) ?>
+
+
+ = __('Amount') ?>
+ = $this->Number->format($stateBalance->amount) ?>
+
+
+ = __('Modified') ?>
+ = h($stateBalance->modified) ?>
+
+
+
diff --git a/community_server/src/Template/StateCreated/add.ctp b/community_server/src/Template/StateCreated/add.ctp
new file mode 100644
index 000000000..c66cf83f3
--- /dev/null
+++ b/community_server/src/Template/StateCreated/add.ctp
@@ -0,0 +1,31 @@
+
+
+
+ = $this->Form->create($stateCreated) ?>
+
+ = __('Add State Created') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('month');
+ echo $this->Form->control('year');
+ echo $this->Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('short_ident_hash');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateCreated/edit.ctp b/community_server/src/Template/StateCreated/edit.ctp
new file mode 100644
index 000000000..be1ef330b
--- /dev/null
+++ b/community_server/src/Template/StateCreated/edit.ctp
@@ -0,0 +1,37 @@
+
+
+
+ = $this->Form->create($stateCreated) ?>
+
+ = __('Edit State Created') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('month');
+ echo $this->Form->control('year');
+ echo $this->Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('short_ident_hash');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateCreated/index.ctp b/community_server/src/Template/StateCreated/index.ctp
new file mode 100644
index 000000000..64a514b3b
--- /dev/null
+++ b/community_server/src/Template/StateCreated/index.ctp
@@ -0,0 +1,61 @@
+
+
+
+
= __('State Created') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('transaction_id') ?>
+ = $this->Paginator->sort('month') ?>
+ = $this->Paginator->sort('year') ?>
+ = $this->Paginator->sort('state_user_id') ?>
+ = $this->Paginator->sort('created') ?>
+ = $this->Paginator->sort('short_ident_hash') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateCreated->id) ?>
+ = $stateCreated->has('transaction') ? $this->Html->link($stateCreated->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateCreated->transaction->id]) : '' ?>
+ = $this->Number->format($stateCreated->month) ?>
+ = $this->Number->format($stateCreated->year) ?>
+ = $stateCreated->has('state_user') ? $this->Html->link($stateCreated->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateCreated->state_user->id]) : '' ?>
+ = h($stateCreated->created) ?>
+ = $this->Number->format($stateCreated->short_ident_hash) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateCreated->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateCreated->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateCreated->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateCreated->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateCreated/view.ctp b/community_server/src/Template/StateCreated/view.ctp
new file mode 100644
index 000000000..e0e9301ec
--- /dev/null
+++ b/community_server/src/Template/StateCreated/view.ctp
@@ -0,0 +1,52 @@
+
+
+
+
= h($stateCreated->id) ?>
+
+
+ = __('Transaction') ?>
+ = $stateCreated->has('transaction') ? $this->Html->link($stateCreated->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $stateCreated->transaction->id]) : '' ?>
+
+
+ = __('State User') ?>
+ = $stateCreated->has('state_user') ? $this->Html->link($stateCreated->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateCreated->state_user->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($stateCreated->id) ?>
+
+
+ = __('Month') ?>
+ = $this->Number->format($stateCreated->month) ?>
+
+
+ = __('Year') ?>
+ = $this->Number->format($stateCreated->year) ?>
+
+
+ = __('Short Ident Hash') ?>
+ = $this->Number->format($stateCreated->short_ident_hash) ?>
+
+
+ = __('Created') ?>
+ = h($stateCreated->created) ?>
+
+
+
diff --git a/community_server/src/Template/StateErrors/add.ctp b/community_server/src/Template/StateErrors/add.ctp
new file mode 100644
index 000000000..24d095b90
--- /dev/null
+++ b/community_server/src/Template/StateErrors/add.ctp
@@ -0,0 +1,29 @@
+
+
+
+ = $this->Form->create($stateError) ?>
+
+ = __('Add State Error') ?>
+ Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]);
+ echo $this->Form->control('message_json');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateErrors/edit.ctp b/community_server/src/Template/StateErrors/edit.ctp
new file mode 100644
index 000000000..795b6c7dd
--- /dev/null
+++ b/community_server/src/Template/StateErrors/edit.ctp
@@ -0,0 +1,35 @@
+
+
+
+ = $this->Form->create($stateError) ?>
+
+ = __('Edit State Error') ?>
+ Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]);
+ echo $this->Form->control('message_json');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateErrors/index.ctp b/community_server/src/Template/StateErrors/index.ctp
new file mode 100644
index 000000000..3f34f449b
--- /dev/null
+++ b/community_server/src/Template/StateErrors/index.ctp
@@ -0,0 +1,55 @@
+
+
+
+
= __('State Errors') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('state_user_id') ?>
+ = $this->Paginator->sort('transaction_type_id') ?>
+ = $this->Paginator->sort('created') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateError->id) ?>
+ = $stateError->has('state_user') ? $this->Html->link($stateError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateError->state_user->id]) : '' ?>
+ = $stateError->has('transaction_type') ? $this->Html->link($stateError->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateError->transaction_type->id]) : '' ?>
+ = h($stateError->created) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateError->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateError->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateError->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateError->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateErrors/show_for_user.ctp b/community_server/src/Template/StateErrors/show_for_user.ctp
new file mode 100644
index 000000000..2420571a3
--- /dev/null
+++ b/community_server/src/Template/StateErrors/show_for_user.ctp
@@ -0,0 +1,51 @@
+assign('title', __('Fehlermeldungen'));
+//var_dump($transactionTypes);
+/*foreach($transactionTypes as $i => $t) {
+ echo "$i => ";
+ var_dump($t);
+ echo " ";
+}*/
+?>
+
+
Fehler
+
+
+
+
+
+
+
+ transaction_type_id-1];
+ $errorMessage = "";
+ $errorArray = json_decode($error->message_json, true);
+ if(isset($errorArray['details']) && is_array($errorArray['details'])) {
+ foreach($errorArray['details'][0] as $function => $errorString) {
+ $errorMessage = '
' . $function . ' ' . $errorString;
+ }
+ } else {
+ $errorMessage = $error->message_json;
+ }
+ ?>
+
+
= $type->name ?>
+
= $error->created ?>
+
= $errorMessage ?>
+
+ = $this->Html->link(
+ __('Delete'),
+ ['action' => 'deleteForUser', $error->id],
+ ['class' => 'form-button button-cancel']
+ ) ?>
+
+
+
+
diff --git a/community_server/src/Template/StateErrors/view.ctp b/community_server/src/Template/StateErrors/view.ctp
new file mode 100644
index 000000000..c2913d306
--- /dev/null
+++ b/community_server/src/Template/StateErrors/view.ctp
@@ -0,0 +1,44 @@
+
+
+
+
= h($stateError->id) ?>
+
+
+ = __('State User') ?>
+ = $stateError->has('state_user') ? $this->Html->link($stateError->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $stateError->state_user->id]) : '' ?>
+
+
+ = __('Transaction Type') ?>
+ = $stateError->has('transaction_type') ? $this->Html->link($stateError->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $stateError->transaction_type->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($stateError->id) ?>
+
+
+ = __('Created') ?>
+ = h($stateError->created) ?>
+
+
+
+
= __('Message Json') ?>
+ = $this->Text->autoParagraph(h($stateError->message_json)); ?>
+
+
diff --git a/community_server/src/Template/StateGroupAddresses/add.ctp b/community_server/src/Template/StateGroupAddresses/add.ctp
new file mode 100644
index 000000000..f9eba953a
--- /dev/null
+++ b/community_server/src/Template/StateGroupAddresses/add.ctp
@@ -0,0 +1,28 @@
+
+
+
+ = $this->Form->create($stateGroupAddress) ?>
+
+ = __('Add State Group Address') ?>
+ Form->control('state_group_id', ['options' => $stateGroups]);
+ echo $this->Form->control('address_type_id', ['options' => $addressTypes]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateGroupAddresses/edit.ctp b/community_server/src/Template/StateGroupAddresses/edit.ctp
new file mode 100644
index 000000000..46107779b
--- /dev/null
+++ b/community_server/src/Template/StateGroupAddresses/edit.ctp
@@ -0,0 +1,34 @@
+
+
+
+ = $this->Form->create($stateGroupAddress) ?>
+
+ = __('Edit State Group Address') ?>
+ Form->control('state_group_id', ['options' => $stateGroups]);
+ echo $this->Form->control('address_type_id', ['options' => $addressTypes]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateGroupAddresses/index.ctp b/community_server/src/Template/StateGroupAddresses/index.ctp
new file mode 100644
index 000000000..1d988e9a7
--- /dev/null
+++ b/community_server/src/Template/StateGroupAddresses/index.ctp
@@ -0,0 +1,53 @@
+
+
+
+
= __('State Group Addresses') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('state_group_id') ?>
+ = $this->Paginator->sort('address_type_id') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateGroupAddress->id) ?>
+ = $stateGroupAddress->has('state_group') ? $this->Html->link($stateGroupAddress->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $stateGroupAddress->state_group->id]) : '' ?>
+ = $stateGroupAddress->has('address_type') ? $this->Html->link($stateGroupAddress->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $stateGroupAddress->address_type->id]) : '' ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateGroupAddress->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateGroupAddress->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateGroupAddress->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroupAddress->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateGroupAddresses/view.ctp b/community_server/src/Template/StateGroupAddresses/view.ctp
new file mode 100644
index 000000000..848a6476f
--- /dev/null
+++ b/community_server/src/Template/StateGroupAddresses/view.ctp
@@ -0,0 +1,36 @@
+
+
+
+
= h($stateGroupAddress->id) ?>
+
+
+ = __('State Group') ?>
+ = $stateGroupAddress->has('state_group') ? $this->Html->link($stateGroupAddress->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $stateGroupAddress->state_group->id]) : '' ?>
+
+
+ = __('Address Type') ?>
+ = $stateGroupAddress->has('address_type') ? $this->Html->link($stateGroupAddress->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $stateGroupAddress->address_type->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($stateGroupAddress->id) ?>
+
+
+
diff --git a/community_server/src/Template/StateGroupRelationships/add.ctp b/community_server/src/Template/StateGroupRelationships/add.ctp
new file mode 100644
index 000000000..39eb550e8
--- /dev/null
+++ b/community_server/src/Template/StateGroupRelationships/add.ctp
@@ -0,0 +1,25 @@
+
+
+
+ = $this->Form->create($stateGroupRelationship) ?>
+
+ = __('Add State Group Relationship') ?>
+ Form->control('state_group1_id');
+ echo $this->Form->control('state_group2_id');
+ echo $this->Form->control('state_relationship_id');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateGroupRelationships/edit.ctp b/community_server/src/Template/StateGroupRelationships/edit.ctp
new file mode 100644
index 000000000..55bcc6afe
--- /dev/null
+++ b/community_server/src/Template/StateGroupRelationships/edit.ctp
@@ -0,0 +1,31 @@
+
+
+
+ = $this->Form->create($stateGroupRelationship) ?>
+
+ = __('Edit State Group Relationship') ?>
+ Form->control('state_group1_id');
+ echo $this->Form->control('state_group2_id');
+ echo $this->Form->control('state_relationship_id');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateGroupRelationships/index.ctp b/community_server/src/Template/StateGroupRelationships/index.ctp
new file mode 100644
index 000000000..57fbc4da5
--- /dev/null
+++ b/community_server/src/Template/StateGroupRelationships/index.ctp
@@ -0,0 +1,51 @@
+
+
+
+
= __('State Group Relationships') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('state_group1_id') ?>
+ = $this->Paginator->sort('state_group2_id') ?>
+ = $this->Paginator->sort('state_relationship_id') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateGroupRelationship->id) ?>
+ = $this->Number->format($stateGroupRelationship->state_group1_id) ?>
+ = $this->Number->format($stateGroupRelationship->state_group2_id) ?>
+ = $this->Number->format($stateGroupRelationship->state_relationship_id) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateGroupRelationship->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateGroupRelationship->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateGroupRelationship->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroupRelationship->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateGroupRelationships/view.ctp b/community_server/src/Template/StateGroupRelationships/view.ctp
new file mode 100644
index 000000000..de871dc77
--- /dev/null
+++ b/community_server/src/Template/StateGroupRelationships/view.ctp
@@ -0,0 +1,36 @@
+
+
+
+
= h($stateGroupRelationship->id) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($stateGroupRelationship->id) ?>
+
+
+ = __('State Group1 Id') ?>
+ = $this->Number->format($stateGroupRelationship->state_group1_id) ?>
+
+
+ = __('State Group2 Id') ?>
+ = $this->Number->format($stateGroupRelationship->state_group2_id) ?>
+
+
+ = __('State Relationship Id') ?>
+ = $this->Number->format($stateGroupRelationship->state_relationship_id) ?>
+
+
+
diff --git a/community_server/src/Template/StateGroups/add.ctp b/community_server/src/Template/StateGroups/add.ctp
new file mode 100644
index 000000000..e71480593
--- /dev/null
+++ b/community_server/src/Template/StateGroups/add.ctp
@@ -0,0 +1,32 @@
+
+
+
+ = $this->Form->create($stateGroup) ?>
+
+ = __('Add State Group') ?>
+ Form->control('name');
+ echo $this->Form->control('user_count');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateGroups/edit.ctp b/community_server/src/Template/StateGroups/edit.ctp
new file mode 100644
index 000000000..93b35256b
--- /dev/null
+++ b/community_server/src/Template/StateGroups/edit.ctp
@@ -0,0 +1,38 @@
+
+
+
+ = $this->Form->create($stateGroup) ?>
+
+ = __('Edit State Group') ?>
+ Form->control('name');
+ echo $this->Form->control('user_count');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateGroups/index.ctp b/community_server/src/Template/StateGroups/index.ctp
new file mode 100644
index 000000000..a37029ab2
--- /dev/null
+++ b/community_server/src/Template/StateGroups/index.ctp
@@ -0,0 +1,57 @@
+
+
+
+
= __('State Groups') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('user_count') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateGroup->id) ?>
+ = h($stateGroup->name) ?>
+ = $this->Number->format($stateGroup->user_count) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateGroup->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateGroup->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateGroup->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateGroup->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateGroups/view.ctp b/community_server/src/Template/StateGroups/view.ctp
new file mode 100644
index 000000000..0ecb27009
--- /dev/null
+++ b/community_server/src/Template/StateGroups/view.ctp
@@ -0,0 +1,152 @@
+
+
+
+
= h($stateGroup->name) ?>
+
+
+ = __('Name') ?>
+ = h($stateGroup->name) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($stateGroup->id) ?>
+
+
+ = __('User Count') ?>
+ = $this->Number->format($stateGroup->user_count) ?>
+
+
+
+
+
+
+
diff --git a/community_server/src/Template/StateRelationshipTypes/add.ctp b/community_server/src/Template/StateRelationshipTypes/add.ctp
new file mode 100644
index 000000000..5eb7c3b4f
--- /dev/null
+++ b/community_server/src/Template/StateRelationshipTypes/add.ctp
@@ -0,0 +1,24 @@
+
+
+
+ = $this->Form->create($stateRelationshipType) ?>
+
+ = __('Add State Relationship Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateRelationshipTypes/edit.ctp b/community_server/src/Template/StateRelationshipTypes/edit.ctp
new file mode 100644
index 000000000..96ef4ba88
--- /dev/null
+++ b/community_server/src/Template/StateRelationshipTypes/edit.ctp
@@ -0,0 +1,30 @@
+
+
+
+ = $this->Form->create($stateRelationshipType) ?>
+
+ = __('Edit State Relationship Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateRelationshipTypes/index.ctp b/community_server/src/Template/StateRelationshipTypes/index.ctp
new file mode 100644
index 000000000..2e44a8d88
--- /dev/null
+++ b/community_server/src/Template/StateRelationshipTypes/index.ctp
@@ -0,0 +1,49 @@
+
+
+
+
= __('State Relationship Types') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('text') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateRelationshipType->id) ?>
+ = h($stateRelationshipType->name) ?>
+ = h($stateRelationshipType->text) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateRelationshipType->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateRelationshipType->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateRelationshipType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateRelationshipType->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateRelationshipTypes/view.ctp b/community_server/src/Template/StateRelationshipTypes/view.ctp
new file mode 100644
index 000000000..5d745a0df
--- /dev/null
+++ b/community_server/src/Template/StateRelationshipTypes/view.ctp
@@ -0,0 +1,32 @@
+
+
+
+
= h($stateRelationshipType->name) ?>
+
+
+ = __('Name') ?>
+ = h($stateRelationshipType->name) ?>
+
+
+ = __('Text') ?>
+ = h($stateRelationshipType->text) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($stateRelationshipType->id) ?>
+
+
+
diff --git a/community_server/src/Template/StateUsers/add.ctp b/community_server/src/Template/StateUsers/add.ctp
new file mode 100644
index 000000000..a810bc9d5
--- /dev/null
+++ b/community_server/src/Template/StateUsers/add.ctp
@@ -0,0 +1,34 @@
+
+
+
+ = $this->Form->create($stateUser) ?>
+
+ = __('Add State User') ?>
+ Form->control('index_id');
+ echo $this->Form->control('state_group_id', ['options' => $stateGroups]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateUsers/edit.ctp b/community_server/src/Template/StateUsers/edit.ctp
new file mode 100644
index 000000000..473f1d845
--- /dev/null
+++ b/community_server/src/Template/StateUsers/edit.ctp
@@ -0,0 +1,39 @@
+
+
+
+ = $this->Form->create($stateUser) ?>
+
+ = __('Edit State User') ?>
+ Form->control('disabled');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/StateUsers/index.ctp b/community_server/src/Template/StateUsers/index.ctp
new file mode 100644
index 000000000..4e6ea8cb1
--- /dev/null
+++ b/community_server/src/Template/StateUsers/index.ctp
@@ -0,0 +1,69 @@
+
+
+
+
= __('State Users') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+
+ = $this->Paginator->sort('first_name') ?>
+ = $this->Paginator->sort('last_name') ?>
+ = $this->Paginator->sort('username') ?>
+ = $this->Paginator->sort('email') ?>
+ = $this->Paginator->sort('disabled') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($stateUser->id) ?>
+
+ = $stateUser->first_name ?>
+ = $stateUser->last_name ?>
+ = $stateUser->username ?>
+ = $stateUser->email ?>
+ = $stateUser->disabled ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $stateUser->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $stateUser->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $stateUser->id], ['confirm' => __('Are you sure you want to delete # {0}?', $stateUser->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/StateUsers/list_ident_hashes.ctp b/community_server/src/Template/StateUsers/list_ident_hashes.ctp
new file mode 100644
index 000000000..7f50910b1
--- /dev/null
+++ b/community_server/src/Template/StateUsers/list_ident_hashes.ctp
@@ -0,0 +1,29 @@
+
+
+
+
+
+ first name last name email identHash Public key hex
+
+
+
+
+
+
+ = $user->first_name ?>
+ = $user->last_name ?>
+ = $user->email ?>
+ = $user->identHash ?>
+ = bin2hex(stream_get_contents($user->public_key)) ?>
+
+
+
+
+
diff --git a/community_server/src/Template/StateUsers/search.ctp b/community_server/src/Template/StateUsers/search.ctp
new file mode 100644
index 000000000..e6775729b
--- /dev/null
+++ b/community_server/src/Template/StateUsers/search.ctp
@@ -0,0 +1,65 @@
+assign('title', __('Benutzer suchen'));
+// In a View class
+$this->loadHelper('Form', [
+ 'templates' => 'horizontal_form',
+]);
+?>
+= $this->Html->css([
+ 'loginServer/style.css',
+ 'rippleUI/style.css',
+ 'materialdesignicons.min.css'
+]) ?>
+
+
+
+
+
+= $this->Html->script('userSearch') ?>
+
+
+
diff --git a/community_server/src/Template/StateUsers/view.ctp b/community_server/src/Template/StateUsers/view.ctp
new file mode 100644
index 000000000..c2bb33c2b
--- /dev/null
+++ b/community_server/src/Template/StateUsers/view.ctp
@@ -0,0 +1,143 @@
+
+
+
+
= h($stateUser->first_name) ?> = h($stateUser->last_name) ?> <= h($stateUser->email) ?>>
+
Konto-Adresse: = h(bin2hex(stream_get_contents($stateUser->public_key))) ?>
+
+
+
+
+
+
diff --git a/community_server/src/Template/TransactionCreations/add.ctp b/community_server/src/Template/TransactionCreations/add.ctp
new file mode 100644
index 000000000..dfe34be56
--- /dev/null
+++ b/community_server/src/Template/TransactionCreations/add.ctp
@@ -0,0 +1,29 @@
+
+
+
+ = $this->Form->create($transactionCreation) ?>
+
+ = __('Add Transaction Creation') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('amount');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionCreations/create.ctp b/community_server/src/Template/TransactionCreations/create.ctp
new file mode 100644
index 000000000..a7e7c4afc
--- /dev/null
+++ b/community_server/src/Template/TransactionCreations/create.ctp
@@ -0,0 +1,31 @@
+ $receiver) {
+ //var_dump($receiver);
+ array_push($address_options, [
+ 'text' => $receiver['name'],
+ 'value' => $i+1,
+ 'title' => $receiver['key']
+ ]);
+}
+$this->assign('title', __('Schöpfungstransaktion'));
+?>
+
+
+ = $this->Form->create($creationForm) ?>
+
+ = $this->Form->control('memo'); ?>
+ = $this->Form->control('amount'); ?>
+ = $this->Form->control('receiver', ['options' => $address_options]); ?>
+
+
+ = $this->Form->button(__('Transaktion(en) abschließen'), ['name' => 'next', 'class' => 'grd-form-bn grd-form-bn-succeed grd_clickable grd-width-200']) ?>
+ = $this->Form->button(__('Weitere Transaktion erstellen'), ['name' => 'add', 'class' => 'grd-form-bn grd_clickable grd-width-200']) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionCreations/create_multi.ctp b/community_server/src/Template/TransactionCreations/create_multi.ctp
new file mode 100644
index 000000000..d4d130b9c
--- /dev/null
+++ b/community_server/src/Template/TransactionCreations/create_multi.ctp
@@ -0,0 +1,229 @@
+ $receiver) {
+ //var_dump($receiver);
+ array_push($address_options, [
+ 'text' => $receiver['name'],
+ 'value' => $i+1,
+ 'title' => $receiver['key']
+ ]);
+}*/
+$this->assign('title', __('Schöpfungstransaktion'));
+$this->loadHelper('Form', [
+ 'templates' => 'horizontal_form',
+]);
+
+use Cake\I18n\FrozenTime;
+
+?>
+
+= $this->Html->script('basic'); ?>
+
+ 0) : ?>
+
+
\ No newline at end of file
diff --git a/community_server/src/Template/TransactionCreations/edit.ctp b/community_server/src/Template/TransactionCreations/edit.ctp
new file mode 100644
index 000000000..85b7704be
--- /dev/null
+++ b/community_server/src/Template/TransactionCreations/edit.ctp
@@ -0,0 +1,35 @@
+
+
+
+ = $this->Form->create($transactionCreation) ?>
+
+ = __('Edit Transaction Creation') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('amount');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionCreations/index.ctp b/community_server/src/Template/TransactionCreations/index.ctp
new file mode 100644
index 000000000..d9d156239
--- /dev/null
+++ b/community_server/src/Template/TransactionCreations/index.ctp
@@ -0,0 +1,55 @@
+
+
+
+
= __('Transaction Creations') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('transaction_id') ?>
+ = $this->Paginator->sort('state_user_id') ?>
+ = $this->Paginator->sort('amount') ?>
+ = $this->Paginator->sort('ident_hash ') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($transactionCreation->id) ?>
+ = $transactionCreation->has('transaction') ? $this->Html->link($transactionCreation->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionCreation->transaction->id]) : '' ?>
+ = $transactionCreation->has('state_user') ? $this->Html->link($transactionCreation->state_user->getEmailWithName(), ['controller' => 'StateUsers', 'action' => 'view', $transactionCreation->state_user->id]) : '' ?>
+ = $this->element('printGradido', ['number' => $transactionCreation->amount]) ?>
+ = stream_get_contents($transactionCreation->ident_hash) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $transactionCreation->id]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/TransactionCreations/view.ctp b/community_server/src/Template/TransactionCreations/view.ctp
new file mode 100644
index 000000000..a51312674
--- /dev/null
+++ b/community_server/src/Template/TransactionCreations/view.ctp
@@ -0,0 +1,40 @@
+
+
+
+
= h($transactionCreation->id) ?>
+
+
+ = __('Transaction') ?>
+ = $transactionCreation->has('transaction') ? $this->Html->link($transactionCreation->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionCreation->transaction->id]) : '' ?>
+
+
+ = __('State User') ?>
+ = $transactionCreation->has('state_user') ? $this->Html->link($transactionCreation->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $transactionCreation->state_user->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transactionCreation->id) ?>
+
+
+ = __('Amount') ?>
+ = $this->Number->format($transactionCreation->amount) ?>
+
+
+
diff --git a/community_server/src/Template/TransactionGroupAddaddress/add.ctp b/community_server/src/Template/TransactionGroupAddaddress/add.ctp
new file mode 100644
index 000000000..21fa1bea7
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAddaddress/add.ctp
@@ -0,0 +1,28 @@
+
+
+
+ = $this->Form->create($transactionGroupAddaddres) ?>
+
+ = __('Add Transaction Group Addaddres') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('address_type_id', ['options' => $addressTypes]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionGroupAddaddress/edit.ctp b/community_server/src/Template/TransactionGroupAddaddress/edit.ctp
new file mode 100644
index 000000000..e9d7c318a
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAddaddress/edit.ctp
@@ -0,0 +1,34 @@
+
+
+
+ = $this->Form->create($transactionGroupAddaddres) ?>
+
+ = __('Edit Transaction Group Addaddres') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('address_type_id', ['options' => $addressTypes]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionGroupAddaddress/index.ctp b/community_server/src/Template/TransactionGroupAddaddress/index.ctp
new file mode 100644
index 000000000..eb3d82084
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAddaddress/index.ctp
@@ -0,0 +1,53 @@
+
+
+
+
= __('Transaction Group Addaddress') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('transaction_id') ?>
+ = $this->Paginator->sort('address_type_id') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($transactionGroupAddaddres->id) ?>
+ = $transactionGroupAddaddres->has('transaction') ? $this->Html->link($transactionGroupAddaddres->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAddaddres->transaction->id]) : '' ?>
+ = $transactionGroupAddaddres->has('address_type') ? $this->Html->link($transactionGroupAddaddres->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $transactionGroupAddaddres->address_type->id]) : '' ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $transactionGroupAddaddres->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $transactionGroupAddaddres->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupAddaddres->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupAddaddres->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/TransactionGroupAddaddress/view.ctp b/community_server/src/Template/TransactionGroupAddaddress/view.ctp
new file mode 100644
index 000000000..8401780e7
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAddaddress/view.ctp
@@ -0,0 +1,36 @@
+
+
+
+
= h($transactionGroupAddaddres->id) ?>
+
+
+ = __('Transaction') ?>
+ = $transactionGroupAddaddres->has('transaction') ? $this->Html->link($transactionGroupAddaddres->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAddaddres->transaction->id]) : '' ?>
+
+
+ = __('Address Type') ?>
+ = $transactionGroupAddaddres->has('address_type') ? $this->Html->link($transactionGroupAddaddres->address_type->name, ['controller' => 'AddressTypes', 'action' => 'view', $transactionGroupAddaddres->address_type->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transactionGroupAddaddres->id) ?>
+
+
+
diff --git a/community_server/src/Template/TransactionGroupAllowtrades/add.ctp b/community_server/src/Template/TransactionGroupAllowtrades/add.ctp
new file mode 100644
index 000000000..7e29efc24
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAllowtrades/add.ctp
@@ -0,0 +1,27 @@
+
+
+
+ = $this->Form->create($transactionGroupAllowtrade) ?>
+
+ = __('Add Transaction Group Allowtrade') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('group_id');
+ echo $this->Form->control('allow');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp b/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp
new file mode 100644
index 000000000..500241331
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAllowtrades/edit.ctp
@@ -0,0 +1,33 @@
+
+
+
+ = $this->Form->create($transactionGroupAllowtrade) ?>
+
+ = __('Edit Transaction Group Allowtrade') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('group_id');
+ echo $this->Form->control('allow');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionGroupAllowtrades/index.ctp b/community_server/src/Template/TransactionGroupAllowtrades/index.ctp
new file mode 100644
index 000000000..07386ccb2
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAllowtrades/index.ctp
@@ -0,0 +1,53 @@
+
+
+
+
= __('Transaction Group Allowtrades') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('transaction_id') ?>
+ = $this->Paginator->sort('group_id') ?>
+ = $this->Paginator->sort('allow') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($transactionGroupAllowtrade->id) ?>
+ = $transactionGroupAllowtrade->has('transaction') ? $this->Html->link($transactionGroupAllowtrade->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAllowtrade->transaction->id]) : '' ?>
+ = $this->Number->format($transactionGroupAllowtrade->group_id) ?>
+ = h($transactionGroupAllowtrade->allow) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $transactionGroupAllowtrade->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $transactionGroupAllowtrade->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupAllowtrade->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupAllowtrade->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/TransactionGroupAllowtrades/view.ctp b/community_server/src/Template/TransactionGroupAllowtrades/view.ctp
new file mode 100644
index 000000000..7a6a36f5a
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupAllowtrades/view.ctp
@@ -0,0 +1,38 @@
+
+
+
+
= h($transactionGroupAllowtrade->id) ?>
+
+
+ = __('Transaction') ?>
+ = $transactionGroupAllowtrade->has('transaction') ? $this->Html->link($transactionGroupAllowtrade->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupAllowtrade->transaction->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transactionGroupAllowtrade->id) ?>
+
+
+ = __('Group Id') ?>
+ = $this->Number->format($transactionGroupAllowtrade->group_id) ?>
+
+
+ = __('Allow') ?>
+ = $transactionGroupAllowtrade->allow ? __('Yes') : __('No'); ?>
+
+
+
diff --git a/community_server/src/Template/TransactionGroupCreates/add.ctp b/community_server/src/Template/TransactionGroupCreates/add.ctp
new file mode 100644
index 000000000..6e6174eb4
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupCreates/add.ctp
@@ -0,0 +1,29 @@
+
+
+
+ = $this->Form->create($transactionGroupCreate) ?>
+
+ = __('Add Transaction Group Create') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('state_group_id', ['options' => $stateGroups]);
+ echo $this->Form->control('name');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionGroupCreates/edit.ctp b/community_server/src/Template/TransactionGroupCreates/edit.ctp
new file mode 100644
index 000000000..d1890afca
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupCreates/edit.ctp
@@ -0,0 +1,35 @@
+
+
+
+ = $this->Form->create($transactionGroupCreate) ?>
+
+ = __('Edit Transaction Group Create') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('state_group_id', ['options' => $stateGroups]);
+ echo $this->Form->control('name');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionGroupCreates/index.ctp b/community_server/src/Template/TransactionGroupCreates/index.ctp
new file mode 100644
index 000000000..13aeabf83
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupCreates/index.ctp
@@ -0,0 +1,55 @@
+
+
+
+
= __('Transaction Group Creates') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('transaction_id') ?>
+ = $this->Paginator->sort('state_group_id') ?>
+ = $this->Paginator->sort('name') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($transactionGroupCreate->id) ?>
+ = $transactionGroupCreate->has('transaction') ? $this->Html->link($transactionGroupCreate->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupCreate->transaction->id]) : '' ?>
+ = $transactionGroupCreate->has('state_group') ? $this->Html->link($transactionGroupCreate->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transactionGroupCreate->state_group->id]) : '' ?>
+ = h($transactionGroupCreate->name) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $transactionGroupCreate->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $transactionGroupCreate->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $transactionGroupCreate->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionGroupCreate->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/TransactionGroupCreates/view.ctp b/community_server/src/Template/TransactionGroupCreates/view.ctp
new file mode 100644
index 000000000..c774f8bc3
--- /dev/null
+++ b/community_server/src/Template/TransactionGroupCreates/view.ctp
@@ -0,0 +1,40 @@
+
+
+
+
= h($transactionGroupCreate->name) ?>
+
+
+ = __('Transaction') ?>
+ = $transactionGroupCreate->has('transaction') ? $this->Html->link($transactionGroupCreate->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionGroupCreate->transaction->id]) : '' ?>
+
+
+ = __('State Group') ?>
+ = $transactionGroupCreate->has('state_group') ? $this->Html->link($transactionGroupCreate->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transactionGroupCreate->state_group->id]) : '' ?>
+
+
+ = __('Name') ?>
+ = h($transactionGroupCreate->name) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transactionGroupCreate->id) ?>
+
+
+
diff --git a/community_server/src/Template/TransactionSendCoins/add.ctp b/community_server/src/Template/TransactionSendCoins/add.ctp
new file mode 100644
index 000000000..8b5a757c4
--- /dev/null
+++ b/community_server/src/Template/TransactionSendCoins/add.ctp
@@ -0,0 +1,30 @@
+
+
+
+ = $this->Form->create($transactionSendCoin) ?>
+
+ = __('Add Transaction Send Coin') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('amount');
+ echo $this->Form->control('sender_final_balance');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionSendCoins/create.ctp b/community_server/src/Template/TransactionSendCoins/create.ctp
new file mode 100644
index 000000000..9b578d0c9
--- /dev/null
+++ b/community_server/src/Template/TransactionSendCoins/create.ctp
@@ -0,0 +1,39 @@
+assign('title', __('Überweisung'));
+// In a View class
+$this->loadHelper('Form', [
+ 'templates' => 'horizontal_form',
+]);
+?>
+
+
+= $this->Html->script(['core', 'vendor.addons']); ?>
+
diff --git a/community_server/src/Template/TransactionSendCoins/create_raw.ctp b/community_server/src/Template/TransactionSendCoins/create_raw.ctp
new file mode 100644
index 000000000..0b3d74e1f
--- /dev/null
+++ b/community_server/src/Template/TransactionSendCoins/create_raw.ctp
@@ -0,0 +1,55 @@
+assign('title', __('Überweisung'));
+// In a View class
+$this->loadHelper('Form', [
+ 'templates' => 'horizontal_form',
+]);
+?>
+
+
+
+
+
+
+
+
+
+ = $this->Form->create($transferRawForm) ?>
+ = $this->Form->control('sender_privkey_hex', ['label' => __('Sender Private Key')]) ?>
+ = $this->Form->control('sender_pubkey_hex', ['label' => __('Sender Public Key')]) ?>
+ = $this->Form->control('receiver_pubkey_hex', ['label' => __('Empfänger Public Key')]) ?>
+ = $this->Form->control('memo', ['label' => __('Verwendungszweck'), 'rows' => 3]) ?>
+ = $this->Form->control('amount', ['label' => __('Betrag in GDD')]) ?>
+ = $this->Form->button(__('Transaktion abschließen'), ['name' => 'next', 'class' => 'btn btn-sm btn-primary']) ?>
+ = $this->Form->end() ?>
+
+
+
+
+
+
+
+
+= $this->Html->script(['core', 'vendor.addons']); ?>
+
diff --git a/community_server/src/Template/TransactionSendCoins/edit.ctp b/community_server/src/Template/TransactionSendCoins/edit.ctp
new file mode 100644
index 000000000..61a6841fe
--- /dev/null
+++ b/community_server/src/Template/TransactionSendCoins/edit.ctp
@@ -0,0 +1,36 @@
+
+
+
+ = $this->Form->create($transactionSendCoin) ?>
+
+ = __('Edit Transaction Send Coin') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ echo $this->Form->control('state_user_id', ['options' => $stateUsers]);
+ echo $this->Form->control('amount');
+ echo $this->Form->control('sender_final_balance');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionSendCoins/index.ctp b/community_server/src/Template/TransactionSendCoins/index.ctp
new file mode 100644
index 000000000..a14083c61
--- /dev/null
+++ b/community_server/src/Template/TransactionSendCoins/index.ctp
@@ -0,0 +1,56 @@
+
+
+
+
= __('Transaction Send Coins') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('transaction_id') ?>
+ = $this->Paginator->sort('state_user_id') ?>
+ = $this->Paginator->sort('amount') ?>
+ = $this->Paginator->sort('sender_final_balance') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($transactionSendCoin->id) ?>
+ = $transactionSendCoin->has('transaction') ? $this->Html->link($transactionSendCoin->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSendCoin->transaction->id]) : '' ?>
+ = $transactionSendCoin->has('state_user') ? $this->Html->link($transactionSendCoin->state_user->getEmailWithName(), ['controller' => 'StateUsers', 'action' => 'view', $transactionSendCoin->state_user->id]) : '' ?>
+ = $this->Number->format($transactionSendCoin->amount) ?>
+ = $this->Number->format($transactionSendCoin->sender_final_balance) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $transactionSendCoin->id]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/TransactionSendCoins/view.ctp b/community_server/src/Template/TransactionSendCoins/view.ctp
new file mode 100644
index 000000000..322621942
--- /dev/null
+++ b/community_server/src/Template/TransactionSendCoins/view.ctp
@@ -0,0 +1,44 @@
+
+
+
+
= h($transactionSendCoin->id) ?>
+
+
+ = __('Transaction') ?>
+ = $transactionSendCoin->has('transaction') ? $this->Html->link($transactionSendCoin->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSendCoin->transaction->id]) : '' ?>
+
+
+ = __('State User') ?>
+ = $transactionSendCoin->has('state_user') ? $this->Html->link($transactionSendCoin->state_user->id, ['controller' => 'StateUsers', 'action' => 'view', $transactionSendCoin->state_user->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transactionSendCoin->id) ?>
+
+
+ = __('Amount') ?>
+ = $this->Number->format($transactionSendCoin->amount) ?>
+
+
+ = __('Sender Final Balance') ?>
+ = $this->Number->format($transactionSendCoin->sender_final_balance) ?>
+
+
+
diff --git a/community_server/src/Template/TransactionSignatures/add.ctp b/community_server/src/Template/TransactionSignatures/add.ctp
new file mode 100644
index 000000000..752389cd7
--- /dev/null
+++ b/community_server/src/Template/TransactionSignatures/add.ctp
@@ -0,0 +1,25 @@
+
+
+
+ = $this->Form->create($transactionSignature) ?>
+
+ = __('Add Transaction Signature') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionSignatures/edit.ctp b/community_server/src/Template/TransactionSignatures/edit.ctp
new file mode 100644
index 000000000..68143712b
--- /dev/null
+++ b/community_server/src/Template/TransactionSignatures/edit.ctp
@@ -0,0 +1,31 @@
+
+
+
+ = $this->Form->create($transactionSignature) ?>
+
+ = __('Edit Transaction Signature') ?>
+ Form->control('transaction_id', ['options' => $transactions]);
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionSignatures/index.ctp b/community_server/src/Template/TransactionSignatures/index.ctp
new file mode 100644
index 000000000..9b8bc2826
--- /dev/null
+++ b/community_server/src/Template/TransactionSignatures/index.ctp
@@ -0,0 +1,49 @@
+
+
+
+
= __('Transaction Signatures') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('transaction_id') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($transactionSignature->id) ?>
+ = $transactionSignature->has('transaction') ? $this->Html->link($transactionSignature->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSignature->transaction->id]) : '' ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $transactionSignature->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $transactionSignature->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $transactionSignature->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionSignature->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/TransactionSignatures/view.ctp b/community_server/src/Template/TransactionSignatures/view.ctp
new file mode 100644
index 000000000..681198125
--- /dev/null
+++ b/community_server/src/Template/TransactionSignatures/view.ctp
@@ -0,0 +1,30 @@
+
+
+
+
= h($transactionSignature->id) ?>
+
+
+ = __('Transaction') ?>
+ = $transactionSignature->has('transaction') ? $this->Html->link($transactionSignature->transaction->id, ['controller' => 'Transactions', 'action' => 'view', $transactionSignature->transaction->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transactionSignature->id) ?>
+
+
+
diff --git a/community_server/src/Template/TransactionTypes/add.ctp b/community_server/src/Template/TransactionTypes/add.ctp
new file mode 100644
index 000000000..97de82122
--- /dev/null
+++ b/community_server/src/Template/TransactionTypes/add.ctp
@@ -0,0 +1,26 @@
+
+
+
+ = $this->Form->create($transactionType) ?>
+
+ = __('Add Transaction Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionTypes/edit.ctp b/community_server/src/Template/TransactionTypes/edit.ctp
new file mode 100644
index 000000000..421184b55
--- /dev/null
+++ b/community_server/src/Template/TransactionTypes/edit.ctp
@@ -0,0 +1,32 @@
+
+
+
+ = $this->Form->create($transactionType) ?>
+
+ = __('Edit Transaction Type') ?>
+ Form->control('name');
+ echo $this->Form->control('text');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/TransactionTypes/index.ctp b/community_server/src/Template/TransactionTypes/index.ctp
new file mode 100644
index 000000000..b2248ae4b
--- /dev/null
+++ b/community_server/src/Template/TransactionTypes/index.ctp
@@ -0,0 +1,51 @@
+
+
+
+
= __('Transaction Types') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('name') ?>
+ = $this->Paginator->sort('text') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($transactionType->id) ?>
+ = h($transactionType->name) ?>
+ = h($transactionType->text) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $transactionType->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $transactionType->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $transactionType->id], ['confirm' => __('Are you sure you want to delete # {0}?', $transactionType->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/TransactionTypes/view.ctp b/community_server/src/Template/TransactionTypes/view.ctp
new file mode 100644
index 000000000..3da64f7e3
--- /dev/null
+++ b/community_server/src/Template/TransactionTypes/view.ctp
@@ -0,0 +1,63 @@
+
+
+
+
= h($transactionType->name) ?>
+
+
+ = __('Name') ?>
+ = h($transactionType->name) ?>
+
+
+ = __('Text') ?>
+ = h($transactionType->text) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transactionType->id) ?>
+
+
+
+
diff --git a/community_server/src/Template/Transactions/add.ctp b/community_server/src/Template/Transactions/add.ctp
new file mode 100644
index 000000000..59782d944
--- /dev/null
+++ b/community_server/src/Template/Transactions/add.ctp
@@ -0,0 +1,43 @@
+
+
+
+ = $this->Form->create($transaction) ?>
+
+ = __('Add Transaction') ?>
+ Form->control('state_group_id', ['options' => $stateGroups]);
+ echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]);
+ echo $this->Form->control('received');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/Transactions/decode.ctp b/community_server/src/Template/Transactions/decode.ctp
new file mode 100644
index 000000000..dddde1cb8
--- /dev/null
+++ b/community_server/src/Template/Transactions/decode.ctp
@@ -0,0 +1,36 @@
+
+ 0) : ?>
+
+
+
+
+ = var_dump($error); ?>
+
+
+
+
+
+
+= $this->Form->create() ?>
+= $this->Form->control('base64', ['type'=> 'textarea', 'rows' => '5', 'cols' => 40]) ?>
+= $this->Form->submit(); ?>
+= $this->Form->end() ?>
+
+
+getTransactionBody();
+?>
+
+ Type = $body->getTransactionTypeName() ?>
+ Memo getMemo() ?>
+
+= var_dump($transaction); ?>
+
diff --git a/community_server/src/Template/Transactions/edit.ctp b/community_server/src/Template/Transactions/edit.ctp
new file mode 100644
index 000000000..4085a60c4
--- /dev/null
+++ b/community_server/src/Template/Transactions/edit.ctp
@@ -0,0 +1,49 @@
+
+
+
+ = $this->Form->create($transaction) ?>
+
+ = __('Edit Transaction') ?>
+ Form->control('state_group_id', ['options' => $stateGroups]);
+ echo $this->Form->control('transaction_type_id', ['options' => $transactionTypes]);
+ echo $this->Form->control('received');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/Transactions/index.ctp b/community_server/src/Template/Transactions/index.ctp
new file mode 100644
index 000000000..25890878a
--- /dev/null
+++ b/community_server/src/Template/Transactions/index.ctp
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
= $this->Number->format($transaction->id) ?>
+
= h($transaction->memo) ?>
+
= $transaction->has('transaction_type') ? $this->Html->link(__($transaction->transaction_type->name), ['controller' => 'TransactionTypes', 'action' => 'view', $transaction->transaction_type->id]) : '' ?>
+
= h($transaction->received) ?>
+
+
+
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/Transactions/send_to_node.ctp b/community_server/src/Template/Transactions/send_to_node.ctp
new file mode 100644
index 000000000..0bb652feb
--- /dev/null
+++ b/community_server/src/Template/Transactions/send_to_node.ctp
@@ -0,0 +1,106 @@
+assign('title', __('Transaktionen an Gradido-Node senden'));
+?>
+
+
+
+
+Bisher keine Transaktionen eingereicht
+
+Letzte eingereichte Transaktion = gTransactionIds[0] - 1 ?>
+
+
+
+ $id) : ?>
+
+ = $id ?> :
+
+
+ Wird verarbeitet
+
+ in Warteschlange
+
+
+
+
+
+= $this->Html->script(['core']); ?>
+
diff --git a/community_server/src/Template/Transactions/view.ctp b/community_server/src/Template/Transactions/view.ctp
new file mode 100644
index 000000000..e15b9dbe3
--- /dev/null
+++ b/community_server/src/Template/Transactions/view.ctp
@@ -0,0 +1,259 @@
+
+
+
+
= h($transaction->id) ?>
+
+
+ = __('State Group') ?>
+ = $transaction->has('state_group') ? $this->Html->link($transaction->state_group->name, ['controller' => 'StateGroups', 'action' => 'view', $transaction->state_group->id]) : '' ?>
+
+
+ = __('Transaction Type') ?>
+ = $transaction->has('transaction_type') ? $this->Html->link($transaction->transaction_type->name, ['controller' => 'TransactionTypes', 'action' => 'view', $transaction->transaction_type->id]) : '' ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($transaction->id) ?>
+
+
+ = __('Received') ?>
+ = h($transaction->received) ?>
+
+
+
+
+
+
+
+
+
+
diff --git a/community_server/src/Template/Users/add.ctp b/community_server/src/Template/Users/add.ctp
new file mode 100644
index 000000000..6f67f02e6
--- /dev/null
+++ b/community_server/src/Template/Users/add.ctp
@@ -0,0 +1,28 @@
+
+
+
+ = $this->Form->create($user) ?>
+
+ = __('Add User') ?>
+ Form->control('email');
+ echo $this->Form->control('first_name');
+ echo $this->Form->control('last_name');
+ echo $this->Form->control('password');
+ echo $this->Form->control('email_checked');
+ echo $this->Form->control('language');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/Users/edit.ctp b/community_server/src/Template/Users/edit.ctp
new file mode 100644
index 000000000..681eacd36
--- /dev/null
+++ b/community_server/src/Template/Users/edit.ctp
@@ -0,0 +1,34 @@
+
+
+
+ = $this->Form->create($user) ?>
+
+ = __('Edit User') ?>
+ Form->control('email');
+ echo $this->Form->control('first_name');
+ echo $this->Form->control('last_name');
+ echo $this->Form->control('password');
+ echo $this->Form->control('email_checked');
+ echo $this->Form->control('language');
+ ?>
+
+ = $this->Form->button(__('Submit')) ?>
+ = $this->Form->end() ?>
+
diff --git a/community_server/src/Template/Users/index.ctp b/community_server/src/Template/Users/index.ctp
new file mode 100644
index 000000000..14566ea26
--- /dev/null
+++ b/community_server/src/Template/Users/index.ctp
@@ -0,0 +1,59 @@
+
+
+
+
= __('Users') ?>
+
+
+
+ = $this->Paginator->sort('id') ?>
+ = $this->Paginator->sort('email') ?>
+ = $this->Paginator->sort('first_name') ?>
+ = $this->Paginator->sort('last_name') ?>
+ = $this->Paginator->sort('password') ?>
+ = $this->Paginator->sort('created') ?>
+ = $this->Paginator->sort('email_checked') ?>
+ = $this->Paginator->sort('language') ?>
+ = __('Actions') ?>
+
+
+
+
+
+ = $this->Number->format($user->id) ?>
+ = h($user->email) ?>
+ = h($user->first_name) ?>
+ = h($user->last_name) ?>
+ = $this->Number->format($user->password) ?>
+ = h($user->created) ?>
+ = h($user->email_checked) ?>
+ = h($user->language) ?>
+
+ = $this->Html->link(__('View'), ['action' => 'view', $user->id]) ?>
+ = $this->Html->link(__('Edit'), ['action' => 'edit', $user->id]) ?>
+ = $this->Form->postLink(__('Delete'), ['action' => 'delete', $user->id], ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)]) ?>
+
+
+
+
+
+
+
+ = $this->Paginator->first('<< ' . __('first')) ?>
+ = $this->Paginator->prev('< ' . __('previous')) ?>
+ = $this->Paginator->numbers() ?>
+ = $this->Paginator->next(__('next') . ' >') ?>
+ = $this->Paginator->last(__('last') . ' >>') ?>
+
+
= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?>
+
+
diff --git a/community_server/src/Template/Users/statistics.ctp b/community_server/src/Template/Users/statistics.ctp
new file mode 100644
index 000000000..76532faa8
--- /dev/null
+++ b/community_server/src/Template/Users/statistics.ctp
@@ -0,0 +1,98 @@
+assign('title', __('Benutzer Statistiken'));
+
+//mdi mdi-account-multiple-plus
+//$newUserPercent = (1 - (b / a)) * 100
+$newUserPercent = 0;
+$percentColor = 'info';
+if($users->count() > 0 && $newUsersLastMonth->count()) {
+ $newUserPercent = round((1 - ($users->count() / $newUsersLastMonth->count())) * 100.0, 2);
+ if($newUserPercent > 0 ) {
+ $percentColor = 'success';
+ } else if($newUserPercent <= 0) {
+ $percentColor = 'alert';
+ }
+}
+
+$userColor = 'info';
+if($users->count() > 0) {
+ if($users->count() > 0 ) {
+ $userColor = 'success';
+ } else if($users->count() <= 0) {
+ $userColor = 'alert';
+ }
+}
+?>
+
+
+
+ people
+
+
= $users->count()?>
+
= __('Alle Anmeldungen'); ?>
+
+
+
+
+
+
+ group_add
+
+
= $newUsersThisMonth->count() ?>
+
= __('Anmeldungen diesen Monat'); ?>
+
+
+ arrow_drop_down
+ 0) : ?>
+ arrow_drop_up
+
+ = $newUserPercent ?> %
+
+
+
+
+
= __('Letzte Anmeldungen'); ?>
+
+
+
+
+
+
+
+
+
= $user->first_name . ' ' . $user->last_name ?>
+
= $user->email ?>
+
= $user->created ?>
+
+
+ toArray()); ?>
+
+
+
+
= __('Anmeldungen detailliert'); ?>
+
+
+
+
+
+
+ $yearEntrys) : ?>
+ $monthEntrys): ?>
+
+
= $year ?>
+
= $month ?>
+
= $monthEntrys['count'] ?>
+
+
+
+
+
+= $this->Html->script(['core', 'vendor.addons']); ?>
+= $this->Html->script('userSearch') ?>
\ No newline at end of file
diff --git a/community_server/src/Template/Users/view.ctp b/community_server/src/Template/Users/view.ctp
new file mode 100644
index 000000000..d3a1e67cd
--- /dev/null
+++ b/community_server/src/Template/Users/view.ctp
@@ -0,0 +1,52 @@
+
+
+
+
= h($user->id) ?>
+
+
+ = __('Email') ?>
+ = h($user->email) ?>
+
+
+ = __('First Name') ?>
+ = h($user->first_name) ?>
+
+
+ = __('Last Name') ?>
+ = h($user->last_name) ?>
+
+
+ = __('Language') ?>
+ = h($user->language) ?>
+
+
+ = __('Id') ?>
+ = $this->Number->format($user->id) ?>
+
+
+ = __('Password') ?>
+ = $this->Number->format($user->password) ?>
+
+
+ = __('Created') ?>
+ = h($user->created) ?>
+
+
+ = __('Email Checked') ?>
+ = $user->email_checked ? __('Yes') : __('No'); ?>
+
+
+
diff --git a/community_server/src/View/AjaxView.php b/community_server/src/View/AjaxView.php
new file mode 100644
index 000000000..3cb786926
--- /dev/null
+++ b/community_server/src/View/AjaxView.php
@@ -0,0 +1,49 @@
+response = $this->response->withType('ajax');
+ }
+}
diff --git a/community_server/src/View/AppView.php b/community_server/src/View/AppView.php
new file mode 100644
index 000000000..242ab6bde
--- /dev/null
+++ b/community_server/src/View/AppView.php
@@ -0,0 +1,40 @@
+loadHelper('Html');`
+ *
+ * @return void
+ */
+ public function initialize()
+ {
+ }
+}
diff --git a/community_server/src/View/Cell/empty b/community_server/src/View/Cell/empty
new file mode 100644
index 000000000..e69de29bb
diff --git a/community_server/src/View/Helper/empty b/community_server/src/View/Helper/empty
new file mode 100644
index 000000000..e69de29bb
diff --git a/community_server/src/protobuf b/community_server/src/protobuf
new file mode 160000
index 000000000..9004e6978
--- /dev/null
+++ b/community_server/src/protobuf
@@ -0,0 +1 @@
+Subproject commit 9004e6978ac3dafcc635b2ffcf8bc6a156451cca
diff --git a/community_server/tests/Fixture/AddressTypesFixture.php b/community_server/tests/Fixture/AddressTypesFixture.php
new file mode 100644
index 000000000..ad440c1cb
--- /dev/null
+++ b/community_server/tests/Fixture/AddressTypesFixture.php
@@ -0,0 +1,46 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'name' => 'Lorem ipsum dolor sit a',
+ 'text' => 'Lorem ipsum dolor sit amet'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/AdminErrorsFixture.php b/community_server/tests/Fixture/AdminErrorsFixture.php
new file mode 100644
index 000000000..0fbc3a067
--- /dev/null
+++ b/community_server/tests/Fixture/AdminErrorsFixture.php
@@ -0,0 +1,56 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'controller' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'action' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'state' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'msg' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'details' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8mb4_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'state_user_id' => 1,
+ 'controller' => 'Lorem ipsum dolor sit amet',
+ 'action' => 'Lorem ipsum dolor sit amet',
+ 'state' => 'Lorem ipsum dolor sit amet',
+ 'msg' => 'Lorem ipsum dolor sit amet',
+ 'details' => 'Lorem ipsum dolor sit amet',
+ 'created' => '2019-12-16 15:08:19'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/CommunityProfilesFixture.php b/community_server/tests/Fixture/CommunityProfilesFixture.php
new file mode 100644
index 000000000..1259d6e25
--- /dev/null
+++ b/community_server/tests/Fixture/CommunityProfilesFixture.php
@@ -0,0 +1,52 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'profile_img' => ['type' => 'binary', 'length' => 4294967295, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null],
+ 'profile_desc' => ['type' => 'string', 'length' => 2000, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_indexes' => [
+ 'state_user_id' => ['type' => 'index', 'columns' => ['state_user_id'], 'length' => []],
+ ],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ 'community_profiles_ibfk_1' => ['type' => 'foreign', 'columns' => ['state_user_id'], 'references' => ['state_users', 'id'], 'update' => 'restrict', 'delete' => 'restrict', 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8mb4_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'state_user_id' => 1,
+ 'profile_img' => 'Lorem ipsum dolor sit amet',
+ 'profile_desc' => 'Lorem ipsum dolor sit amet',
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/ElopageBuysFixture.php b/community_server/tests/Fixture/ElopageBuysFixture.php
new file mode 100644
index 000000000..20be0f4e3
--- /dev/null
+++ b/community_server/tests/Fixture/ElopageBuysFixture.php
@@ -0,0 +1,64 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'elopage_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'affiliate_program_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'publisher_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'order_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'product_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'product_price' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'payer_email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'publisher_email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'payed' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'success_date' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'event' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'elopage_user_id' => 1,
+ 'affiliate_program_id' => 1,
+ 'publisher_id' => 1,
+ 'order_id' => 1,
+ 'product_id' => 1,
+ 'product_price' => 1,
+ 'payer_email' => 'Lorem ipsum dolor sit amet',
+ 'publisher_email' => 'Lorem ipsum dolor sit amet',
+ 'payed' => 1,
+ 'success_date' => '2020-02-13 09:49:46',
+ 'event' => 'Lorem ipsum dolor sit amet',
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/OperatorTypesFixture.php b/community_server/tests/Fixture/OperatorTypesFixture.php
new file mode 100644
index 000000000..dfc589034
--- /dev/null
+++ b/community_server/tests/Fixture/OperatorTypesFixture.php
@@ -0,0 +1,46 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'text' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'name' => 'Lorem ipsum dolor sit a',
+ 'text' => 'Lorem ipsum dolor sit amet'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/OperatorsFixture.php b/community_server/tests/Fixture/OperatorsFixture.php
new file mode 100644
index 000000000..2cb852efc
--- /dev/null
+++ b/community_server/tests/Fixture/OperatorsFixture.php
@@ -0,0 +1,49 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'username' => ['type' => 'string', 'length' => 128, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'operator_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'data_base64' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ 'username' => ['type' => 'unique', 'columns' => ['username'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'username' => 'Lorem ipsum dolor sit amet',
+ 'operator_type_id' => 1,
+ 'data_base64' => 'Lorem ipsum dolor sit amet'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/ServerUsersFixture.php b/community_server/tests/Fixture/ServerUsersFixture.php
new file mode 100644
index 000000000..3aeedab12
--- /dev/null
+++ b/community_server/tests/Fixture/ServerUsersFixture.php
@@ -0,0 +1,58 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'username' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'password' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'email' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'role' => ['type' => 'string', 'length' => 20, 'null' => false, 'default' => 'admin', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'activated' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null],
+ 'last_login' => ['type' => 'datetime', 'length' => null, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'username' => 'Lorem ipsum dolor sit amet',
+ 'password' => 'Lorem ipsum dolor sit amet',
+ 'email' => 'Lorem ipsum dolor sit amet',
+ 'role' => 'Lorem ipsum dolor ',
+ 'activated' => 1,
+ 'last_login' => '2019-09-13 10:30:09',
+ 'created' => '2019-09-13 10:30:09',
+ 'modified' => '2019-09-13 10:30:09'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateBalancesFixture.php b/community_server/tests/Fixture/StateBalancesFixture.php
new file mode 100644
index 000000000..64118f3ed
--- /dev/null
+++ b/community_server/tests/Fixture/StateBalancesFixture.php
@@ -0,0 +1,54 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => true],
+ 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'modified' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'state_user_id' => 1,
+ 'modified' => '2019-11-05 18:02:28',
+ 'amount' => 1200
+ ],
+ [
+ 'id' => 10,
+ 'state_user_id' => 4,
+ 'modified' => '2019-11-11 14:58:54',
+ 'amount' => 1200000
+ ]
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateCreatedFixture.php b/community_server/tests/Fixture/StateCreatedFixture.php
new file mode 100644
index 000000000..2f1abd155
--- /dev/null
+++ b/community_server/tests/Fixture/StateCreatedFixture.php
@@ -0,0 +1,63 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'month' => ['type' => 'tinyinteger', 'length' => 4, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'year' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'short_ident_hash' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ '_indexes' => [
+ 'short_ident_hash' => ['type' => 'index', 'columns' => ['short_ident_hash'], 'length' => []],
+ ],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'transaction_id' => 1,
+ 'month' => 1,
+ 'year' => 1,
+ 'state_user_id' => 1,
+ 'created' => '2019-09-12 11:14:51',
+ 'short_ident_hash' => 1
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateErrorsFixture.php b/community_server/tests/Fixture/StateErrorsFixture.php
new file mode 100644
index 000000000..6f0d95e26
--- /dev/null
+++ b/community_server/tests/Fixture/StateErrorsFixture.php
@@ -0,0 +1,50 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'message_json' => ['type' => 'text', 'length' => null, 'null' => false, 'default' => null, 'collate' => 'utf8mb4_general_ci', 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8mb4_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'state_user_id' => 1,
+ 'transaction_type_id' => 1,
+ 'created' => '2019-11-07 13:13:12',
+ 'message_json' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateGroupAddressesFixture.php b/community_server/tests/Fixture/StateGroupAddressesFixture.php
new file mode 100644
index 000000000..7ab0a37e9
--- /dev/null
+++ b/community_server/tests/Fixture/StateGroupAddressesFixture.php
@@ -0,0 +1,48 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'state_group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'address_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'state_group_id' => 1,
+ 'public_key' => 'Lorem ipsum dolor sit amet',
+ 'address_type_id' => 1
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateGroupRelationshipsFixture.php b/community_server/tests/Fixture/StateGroupRelationshipsFixture.php
new file mode 100644
index 000000000..e50d76f5d
--- /dev/null
+++ b/community_server/tests/Fixture/StateGroupRelationshipsFixture.php
@@ -0,0 +1,48 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'state_group1_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'state_group2_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'state_relationship_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'state_group1_id' => 1,
+ 'state_group2_id' => 1,
+ 'state_relationship_id' => 1
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateGroupsFixture.php b/community_server/tests/Fixture/StateGroupsFixture.php
new file mode 100644
index 000000000..57cde2350
--- /dev/null
+++ b/community_server/tests/Fixture/StateGroupsFixture.php
@@ -0,0 +1,50 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'index_id' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'name' => ['type' => 'string', 'length' => 50, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'root_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'user_count' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'index_id' => 'Lorem ipsum dolor sit amet',
+ 'name' => 'Lorem ipsum dolor sit amet',
+ 'root_public_key' => 'Lorem ipsum dolor sit amet',
+ 'user_count' => 1
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateRelationshipTypesFixture.php b/community_server/tests/Fixture/StateRelationshipTypesFixture.php
new file mode 100644
index 000000000..c461e0ce3
--- /dev/null
+++ b/community_server/tests/Fixture/StateRelationshipTypesFixture.php
@@ -0,0 +1,46 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'name' => ['type' => 'string', 'length' => 25, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'name' => 'Lorem ipsum dolor sit a',
+ 'text' => 'Lorem ipsum dolor sit amet'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/StateUsersFixture.php b/community_server/tests/Fixture/StateUsersFixture.php
new file mode 100644
index 000000000..04654dea9
--- /dev/null
+++ b/community_server/tests/Fixture/StateUsersFixture.php
@@ -0,0 +1,73 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'index_id' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'email' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'first_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'last_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ 'public_key' => ['type' => 'unique', 'columns' => ['public_key'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'index_id' => 0,
+ 'group_id' => 0,
+ 'public_key' => hex2bin('94ae135b93cd9f33752b4e55c41903a3faa13a75bb90bfd411ea1d4a1a5e711f'),
+ 'email' => '***REMOVED***',
+ 'first_name' => 'Dario',
+ 'last_name' => 'Rekowski'
+ ],
+ [
+ 'id' => 4,
+ 'index_id' => 0,
+ 'group_id' => 0,
+ 'public_key' => hex2bin('8190bda585ee5f1d9fbf7d06e81e69ec18e13376104cff54b7457eb7d3ef710d'),
+ 'email' => 'dariofrodo@gmx.de',
+ 'first_name' => 'Dario',
+ 'last_name' => 'Frodo'
+ ],
+ [
+ 'id' => 11,
+ 'index_id' => 0,
+ 'group_id' => 0,
+ 'public_key' => hex2bin('61b923c218cb63a64a8c62f3860121283b9577f374d0a31590ba02cdc2912999'),
+ 'email' => 'em741@gmx.de',
+ 'first_name' => 'Dario',
+ 'last_name' => 'Rekowski'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionCreationsFixture.php b/community_server/tests/Fixture/TransactionCreationsFixture.php
new file mode 100644
index 000000000..d34a235a5
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionCreationsFixture.php
@@ -0,0 +1,69 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'ident_hash' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+
+ // (1, 1, 2, 10000000, 0x3235303332373635330000000000000000000000000000000000000000000000, '2020-12-01 00:00:00'),
+ // (2, 2, 2, 10000000, 0x3235303332373635330000000000000000000000000000000000000000000000, '2021-01-01 00:00:00'),
+ // (3, 3, 2, 10000000, 0x3235303332373635330000000000000000000000000000000000000000000000, '2021-02-01 00:00:00');
+
+ $this->records = [
+ [
+ 'id' => 1,
+ 'transaction_id' => 1,
+ 'state_user_id' => 2,
+ 'amount' => 10000000,
+ 'ident_hash' => hex2bin('3235303332373635330000000000000000000000000000000000000000000000')
+ ],
+ [
+ 'id' => 2,
+ 'transaction_id' => 2,
+ 'state_user_id' => 2,
+ 'amount' => 10000000,
+ 'ident_hash' => hex2bin('3235303332373635330000000000000000000000000000000000000000000000')
+ ],
+ [
+ 'id' => 3,
+ 'transaction_id' => 3,
+ 'state_user_id' => 2,
+ 'amount' => 10000000,
+ 'ident_hash' => hex2bin('3235303332373635330000000000000000000000000000000000000000000000')
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php b/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php
new file mode 100644
index 000000000..7b659386c
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionGroupAddaddressFixture.php
@@ -0,0 +1,54 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'address_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'transaction_id' => 1,
+ 'address_type_id' => 1,
+ 'public_key' => 'Lorem ipsum dolor sit amet'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php b/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php
new file mode 100644
index 000000000..edb745441
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionGroupAllowtradesFixture.php
@@ -0,0 +1,48 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'allow' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'transaction_id' => 1,
+ 'group_id' => 1,
+ 'allow' => 1
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionGroupCreatesFixture.php b/community_server/tests/Fixture/TransactionGroupCreatesFixture.php
new file mode 100644
index 000000000..73db1c751
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionGroupCreatesFixture.php
@@ -0,0 +1,50 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'group_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'state_group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'name' => ['type' => 'string', 'length' => 64, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'transaction_id' => 1,
+ 'group_public_key' => 'Lorem ipsum dolor sit amet',
+ 'state_group_id' => 1,
+ 'name' => 'Lorem ipsum dolor sit amet'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionSendCoinsFixture.php b/community_server/tests/Fixture/TransactionSendCoinsFixture.php
new file mode 100644
index 000000000..9f7bc4a67
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionSendCoinsFixture.php
@@ -0,0 +1,55 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'state_user_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'receiver_public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'receiver_user_id' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'amount' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'sender_final_balance' => ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ // (1, 4, 2, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355, 1, 15000000, 15000000);
+ $this->records = [
+ [
+ 'id' => 1,
+ 'transaction_id' => 4,
+ 'state_user_id' => 2,
+ 'receiver_public_key' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355',
+ 'receiver_user_id' => 1,
+ 'amount' => 150000001,
+ 'sender_final_balance' => 15000000
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionSignaturesFixture.php b/community_server/tests/Fixture/TransactionSignaturesFixture.php
new file mode 100644
index 000000000..c848461e1
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionSignaturesFixture.php
@@ -0,0 +1,70 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'signature' => ['type' => 'binary', 'length' => 64, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'pubkey' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ // (1, 1, 0x911b173577261c8b971b4e6ca56b5125ebd5155de8176ce35f9c95ae6929edf3f1e3095d29b37c8bc7cc2478981a41d8cdd3e5398a2c7aa7c691bd486836b705, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355),
+ // (2, 2, 0x01e76b14190fa14cb5839d1129b04c4043e691895541b16ae1b54c6b3206d7933def3c58ebf195bc67a7cd5773554636c55fe5e7ddb0c81fb247c24761f8120f, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355),
+ // (3, 3, 0x2b8c56cac8993f445a8b41ab6e86a486faa18c1e945df1c0acce2bcb342b96d36c5fcb7e687c97cc89790a386241d4b911e8f7949a2da64eef290c5380fc8602, 0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355),
+ // (4, 4, 0xcb0e9f83b847f630cc6831d62aca8fbfa971af458a12389d7e43abb5bb0936b8e35dbc5b1d641eb2f793e253eb0b149a809860a69897bfe86ba4bfd178da8102, 0xcccb338e003d2abb92178fc4302d1ab83f66b27d9c7e5b6b3ac91e0c23922088);
+ $this->records = [
+ [
+ 'id' => 1,
+ 'transaction_id' => 1,
+ 'signature' => '0x911b173577261c8b971b4e6ca56b5125ebd5155de8176ce35f9c95ae6929edf3f1e3095d29b37c8bc7cc2478981a41d8cdd3e5398a2c7aa7c691bd486836b705',
+ 'pubkey' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355'
+ ],
+ [
+ 'id' => 2,
+ 'transaction_id' => 2,
+ 'signature' => '0x01e76b14190fa14cb5839d1129b04c4043e691895541b16ae1b54c6b3206d7933def3c58ebf195bc67a7cd5773554636c55fe5e7ddb0c81fb247c24761f8120f',
+ 'pubkey' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355'
+ ],
+ [
+ 'id' => 3,
+ 'transaction_id' => 3,
+ 'signature' => '0x2b8c56cac8993f445a8b41ab6e86a486faa18c1e945df1c0acce2bcb342b96d36c5fcb7e687c97cc89790a386241d4b911e8f7949a2da64eef290c5380fc8602',
+ 'pubkey' => '0x80183e03535d17a54ff1fd7dbaed86939d423a19a258c26b8e338ce601338355'
+ ],
+ [
+ 'id' => 4,
+ 'transaction_id' => 4,
+ 'signature' => '0xcb0e9f83b847f630cc6831d62aca8fbfa971af458a12389d7e43abb5bb0936b8e35dbc5b1d641eb2f793e253eb0b149a809860a69897bfe86ba4bfd178da8102',
+ 'pubkey' => '0xcccb338e003d2abb92178fc4302d1ab83f66b27d9c7e5b6b3ac91e0c23922088'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionTypesFixture.php b/community_server/tests/Fixture/TransactionTypesFixture.php
new file mode 100644
index 000000000..48e00e0ec
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionTypesFixture.php
@@ -0,0 +1,51 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'name' => ['type' => 'string', 'length' => 24, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'text' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'name' => 'creation',
+ 'text' => 'Aktives oder Bedingsungsloses Grundeinkommen'
+ ],
+ [
+ 'id' => 2,
+ 'name' => 'transfer',
+ 'text' => 'Einfache Überweisung'
+ ]
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/TransactionsFixture.php b/community_server/tests/Fixture/TransactionsFixture.php
new file mode 100644
index 000000000..0a1be1341
--- /dev/null
+++ b/community_server/tests/Fixture/TransactionsFixture.php
@@ -0,0 +1,79 @@
+ ['type' => 'biginteger', 'length' => 20, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'state_group_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'transaction_type_id' => ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'tx_hash' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null],
+ 'received' => ['type' => 'timestamp', 'length' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '', 'precision' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_bin'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ // (1, NULL, 1, 0x7dc55cf3a1a39b441d87d5452c40cad8e7fd8aab573ed1da0bf118129fc77987, 'AGE Dezember 2020', '2021-02-19 13:18:52'),
+ // (2, NULL, 1, 0xdea38d4dd72af1e0d90621ae8139efbbdb3b44b60be04b0d40cfc157afd2c19c, 'AGE Januar 2021', '2021-02-19 13:25:36'),
+ // (3, NULL, 1, 0x4e7734ed84dcd8ddc5286b87ff85eb12704092d51f485e7c4dbcb4a68ba296ce, 'AGE Februar 2021', '2021-02-19 13:25:37'),
+ // (4, NULL, 2, 0x065b5b75b7f4b156fe2b07b54b1a3df0c4eadc40c0f6940c666fed4d75751f8f, 'Ich teile mit dir\r\n \r\nmiau _=', '2021-02-19 13:27:14');
+ $this->records = [
+ [
+ 'id' => 1,
+ 'group_id' => NULL,
+ 'transaction_type_id' => 1,
+ 'tx_hash' => '0x7dc55cf3a1a39b441d87d5452c40cad8e7fd8aab573ed1da0bf118129fc77987',
+ 'memo' => 'AGE Dezember 2020',
+ 'received' => '2021-02-19 13:18:52'
+ ],
+ [
+ 'id' => 2,
+ 'group_id' => NULL,
+ 'transaction_type_id' => 1,
+ 'tx_hash' => '0xdea38d4dd72af1e0d90621ae8139efbbdb3b44b60be04b0d40cfc157afd2c19c',
+ 'memo' => 'AGE Januar 2021',
+ 'received' => '2021-02-19 13:25:36'
+ ],
+ [
+ 'id' => 3,
+ 'group_id' => NULL,
+ 'transaction_type_id' => 1,
+ 'tx_hash' => '0x4e7734ed84dcd8ddc5286b87ff85eb12704092d51f485e7c4dbcb4a68ba296ce',
+ 'memo' => 'AGE Februar 2021',
+ 'received' => '2021-02-19 13:25:37'
+ ],
+ [
+ 'id' => 4,
+ 'group_id' => NULL,
+ 'transaction_type_id' => 2,
+ 'tx_hash' => '0x065b5b75b7f4b156fe2b07b54b1a3df0c4eadc40c0f6940c666fed4d75751f8f',
+ 'memo' => 'Ich teile mit dir\r\n \r\nmiau _=',
+ 'received' => '2021-02-19 13:27:14'
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/Fixture/UsersFixture.php b/community_server/tests/Fixture/UsersFixture.php
new file mode 100644
index 000000000..fc1a9e620
--- /dev/null
+++ b/community_server/tests/Fixture/UsersFixture.php
@@ -0,0 +1,61 @@
+ ['type' => 'integer', 'length' => 11, 'unsigned' => false, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null],
+ 'email' => ['type' => 'string', 'length' => 255, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'first_name' => ['type' => 'string', 'length' => 150, 'null' => false, 'default' => null, 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'last_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => '', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ 'password' => ['type' => 'biginteger', 'length' => 25, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null, 'autoIncrement' => null],
+ 'pubkey' => ['type' => 'binary', 'length' => 32, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null],
+ 'privkey' => ['type' => 'binary', 'length' => 80, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null],
+ 'created' => ['type' => 'datetime', 'length' => null, 'null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '', 'precision' => null],
+ 'email_checked' => ['type' => 'boolean', 'length' => null, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null],
+ 'language' => ['type' => 'string', 'length' => 4, 'null' => false, 'default' => 'de', 'collate' => 'utf8_bin', 'comment' => '', 'precision' => null, 'fixed' => null],
+ '_constraints' => [
+ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
+ 'email' => ['type' => 'unique', 'columns' => ['email'], 'length' => []],
+ ],
+ '_options' => [
+ 'engine' => 'InnoDB',
+ 'collation' => 'utf8_general_ci'
+ ],
+ ];
+ // @codingStandardsIgnoreEnd
+ /**
+ * Init method
+ *
+ * @return void
+ */
+ public function init()
+ {
+ $this->records = [
+ [
+ 'id' => 1,
+ 'email' => 'Lorem ipsum dolor sit amet',
+ 'first_name' => 'Lorem ipsum dolor sit amet',
+ 'last_name' => 'Lorem ipsum dolor sit amet',
+ 'password' => 1,
+ 'pubkey' => 'Lorem ipsum dolor sit amet',
+ 'privkey' => 'Lorem ipsum dolor sit amet',
+ 'created' => '2020-02-13 10:54:19',
+ 'email_checked' => 1,
+ 'language' => 'Lo',
+ ],
+ ];
+ parent::init();
+ }
+}
diff --git a/community_server/tests/TestCase/ApplicationTest.php b/community_server/tests/TestCase/ApplicationTest.php
new file mode 100644
index 000000000..908b23539
--- /dev/null
+++ b/community_server/tests/TestCase/ApplicationTest.php
@@ -0,0 +1,84 @@
+bootstrap();
+ $plugins = $app->getPlugins();
+
+ $this->assertCount(3, $plugins);
+ $this->assertSame('Bake', $plugins->get('Bake')->getName());
+ $this->assertSame('Migrations', $plugins->get('Migrations')->getName());
+ $this->assertSame('DebugKit', $plugins->get('DebugKit')->getName());
+ }
+
+ /**
+ * testBootstrapPluginWitoutHalt
+ *
+ * @return void
+ */
+ public function testBootstrapPluginWithoutHalt()
+ {
+ $this->expectException(InvalidArgumentException::class);
+
+ $app = $this->getMockBuilder(Application::class)
+ ->setConstructorArgs([dirname(dirname(__DIR__)) . '/config'])
+ ->setMethods(['addPlugin'])
+ ->getMock();
+
+ $app->method('addPlugin')
+ ->will($this->throwException(new InvalidArgumentException('test exception.')));
+
+ $app->bootstrap();
+ }
+
+ /**
+ * testMiddleware
+ *
+ * @return void
+ */
+ public function testMiddleware()
+ {
+ $app = new Application(dirname(dirname(__DIR__)) . '/config');
+ $middleware = new MiddlewareQueue();
+
+ $middleware = $app->middleware($middleware);
+
+ $this->assertInstanceOf(ErrorHandlerMiddleware::class, $middleware->get(0));
+ $this->assertInstanceOf(AssetMiddleware::class, $middleware->get(1));
+ $this->assertInstanceOf(RoutingMiddleware::class, $middleware->get(2));
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php b/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php
new file mode 100644
index 000000000..a9044b4ae
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php
@@ -0,0 +1,76 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/AppControllerTest.php b/community_server/tests/TestCase/Controller/AppControllerTest.php
new file mode 100644
index 000000000..79294cbe0
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/AppControllerTest.php
@@ -0,0 +1,46 @@
+session(['StateUser.id' => 1]);
+ $this->get('/');
+ $this->assertSession(1200, 'StateUser.balance');
+ //$this->markTestIncomplete('Not implemented yet.');
+ }
+
+
+}
diff --git a/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php b/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php
new file mode 100644
index 000000000..35f439dd7
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/CommunityProfilesControllerTest.php
@@ -0,0 +1,75 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php b/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php
new file mode 100644
index 000000000..be6167155
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/Component/GradidoNumberComponentTest.php
@@ -0,0 +1,95 @@
+GradidoNumberComponent = new GradidoNumberComponent($registry);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->GradidoNumberComponent);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test parseInputNumberToCentNumber method
+ *
+ * @return void
+ */
+ /* public function testParseInputNumberToCentNumber()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }*/
+
+ public function test100()
+ {
+ $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(100);
+ $this->assertEquals(1000000, $result);
+ }
+
+ public function test1000()
+ {
+ $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(1000);
+ $this->assertEquals(10000000, $result);
+ }
+
+ public function test100Comma()
+ {
+ $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('100,12');
+ $this->assertEquals(1001200, $result);
+ }
+
+ public function test100Point()
+ {
+ $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('100.12');
+ $this->assertEquals(1001200, $result);
+ }
+
+ public function test100Decimal()
+ {
+ $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber(100.12);
+ $this->assertEquals(1001200, $result);
+ }
+
+ public function test1000Point()
+ {
+ $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('1000.12');
+ $this->assertEquals(10001200, $result);
+ }
+
+ public function test1000Comma()
+ {
+ $result = $this->GradidoNumberComponent->parseInputNumberToCentNumber('1000,12');
+ $this->assertEquals(10001200, $result);
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php b/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php
new file mode 100644
index 000000000..fb882478a
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/Component/JsonRequestClientComponentTest.php
@@ -0,0 +1,84 @@
+JsonRequestClientComponent = new JsonRequestClientComponent($registry);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->JsonRequestClientComponent);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test sendTransaction method
+ *
+ * @return void
+ */
+ public function testSendTransaction()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test getLoginServerUrl method
+ *
+ * @return void
+ */
+ public function testGetLoginServerUrl()
+ {
+ //$this->markTestIncomplete('Not implemented yet.');
+ $serverUrl = $this->JsonRequestClientComponent->getLoginServerUrl();
+ $this->assertEquals($serverUrl, 'http://***REMOVED***');
+ }
+
+ /**
+ * Test is_base64 method
+ *
+ * @return void
+ */
+ public function testIsBase64Valid()
+ {
+ $result = $this->JsonRequestClientComponent->is_base64('CgpIYWxsbyBXZWx0EgYIr6fe7wVKLwonCiDWDyYU4+zldTQdQMIzGpsL20W+vV44JuNVA5hwczIELRDgg5sBELmhkoIE');
+
+ $this->assertEquals($result, true);
+ }
+
+ public function testIsBase64Invalid()
+ {
+ $result = $this->JsonRequestClientComponent->is_base64('CgpIYWxsbyBXZWx0EgYIr6fe7wVKLwonCiDWDyYU4-zldTQdQMIzGpsL20W+vV44JuNVA5hwczIELRDgg5sBELmhkoIE');
+
+ $this->assertEquals($result, false);
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/DashboardControllerTest.php b/community_server/tests/TestCase/Controller/DashboardControllerTest.php
new file mode 100644
index 000000000..cddf0b7ef
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/DashboardControllerTest.php
@@ -0,0 +1,45 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test index method
+ *
+ * @return void
+ */
+ public function testIndex()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php
new file mode 100644
index 000000000..d8a241d7d
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php
@@ -0,0 +1,187 @@
+ 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQJ8wF12eZo3hcMAlAKKJ9WLT-zuSkNmGh7D98UEqH4KoIysnCkXqEya9EBZl9o11_nJ8xmm_nOevuVjR-GfLMQ8qSQoOSGFsbG8gV2VsdCAxMjMSBgiZm4ruBUovCicKIJSuE1uTzZ8zdStOVcQZA6P6oTp1u5C_1BHqHUoaXnEfEKDakwEQtYntlgo',
+ 'validCreation900' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQNVZ8Ae3Zbg3G0wZ840fzKan6N4KtTcSe0KYi17kQwFmsl18oFxXv8_s6j1xXFrIKjy1_1Olq0a7xYLErDMkjwYqORIGCNb5iu4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgNHKCBC1ie2WCg',
+ 'validCreation1200' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQEEey5QMAdldoOTP_jTETHgOQriGsixEY0cziQeRfT_J5YtbI_A6AizEYD-JcxmRmXzv1xjjTgsV39Y32ta2CQkqORIGCIeGi-4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgOy4CxC1ie2WCg',
+ 'notBase64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3',
+ 'validTransfer' => 'GmYKZAoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0SQDddHyKzAX3LBV0PuDiPc6lxkUipss5tyuLRpMtFJQnT30tsbYIkA1FXimjMKOoiuLswf4OLLV3bAIYehW-b9AgqYQoFSGFsbG8SBgiJlaPvBUJQCiYKIIGQvaWF7l8dn799BugeaewY4TN2EEz_VLdFfrfT73ENEICfSRImCiDtdleSLxhUgEbMW9DpqIwsykFj3-z_enKEOuGnXrmW8xCAn0k',
+ 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ==',
+ 'creationValid' => 'GmYKZAogLtKKHPXhFtg2FUBrxXcVIiHC93SlZW9moOdUD3V21xsSQHpXYAGiVmSfhjB3o7OPx0ZJuPXrDk5eu1_AOhQBODU3KpUqBRA9yMX54S_mvGijGubCNRcMLcm7wiYbyAG-3AkqSwoQZWluIE1vbmF0c2dlaGFsdBIGCKqs5vEFSi8KJwoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0QgNrECRDKyd3uAQ'
+ ];
+
+ /*public function setUp() {
+ parent::setUp();
+ }
+*/
+ public function testWrongMethod()
+ {
+ $this->configRequest([
+ 'headers' => ['Accept' => 'application/json']
+ ]);
+ $this->get('/JsonRequestHandler');
+ $this->assertResponseOk();
+
+ $expected = json_encode(['state' => 'error', 'msg' => 'no post']);
+ $this->assertEquals($expected, (string)$this->_response->getBody());
+ }
+
+ public function testInvalidJson()
+ {
+ $this->configRequest([
+ 'headers' => ['Accept' => 'application/json']
+ ]);
+ $this->post('/JsonRequestHandler', '{This isn\'t valid json}');
+ $this->assertResponseOk();
+
+ $expected = json_encode(['state' => 'error', 'msg' => 'parameter error']);
+ $this->assertEquals($expected, (string)$this->_response->getBody());
+ }
+
+ public function testNotSetTransaction()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction'],
+ ['state' => 'error', 'msg' => 'parameter error']
+ );
+ }
+ public function testNotSetMethod()
+ {
+ $this->postAndParse(
+ ['transaction' => $this->transactions['validCreation']],
+ ['state' => 'error', 'msg' => 'parameter error']
+ );
+ }
+
+ public function testUnknownMethod()
+ {
+ //$this->post('/TransactionJsonRequestHandler', ['method' => 'putTransaction', 'transaction' => 'CgpIYWxsbyBXZWx0EgYIyfSG7gVKLwonCiCboKikqwjZfes9xuqgthFH3/cHHaWchkUhWiGhQjB23xCg2pMBELWJ7ZYK']);
+ $this->postAndParse(
+ ['method' => 'foobar', 'transaction' => $this->transactions['validCreation']],
+ ['state' => 'error', 'msg' => 'unknown method', 'details' => 'foobar']
+ );
+
+ }
+
+ public function testInvalidEncodedTransaction() {
+ //"msg":"error parsing transaction","details":[{"Transaction":"base64 decode error"}]
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['notBase64']],
+ ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [
+ ['Transaction' => 'invalid base64 string']
+ ]]
+ );
+ }
+
+ public function testInvalidTransaction() {
+
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => base64_encode('Hallo Miau Welt')],
+ ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [
+ ['Transaction' => 'Error occurred during parsing: Unexpected wire type.']
+ ]]
+ );
+ }
+
+ public function testToLargeCreationSum()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation900']],
+ '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}'
+ );
+ }
+
+ public function testToLargeCreation()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation1200']],
+ '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}'
+ );
+ }
+
+ public function testValidTransfer()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']],
+ ['state' => 'success']
+ );
+ }
+
+ /*public function testMissingPreviousTransaction()
+ {
+
+ }*/
+
+ public function testValidTransaction()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']],
+ ['state' => 'success']
+ );
+ }
+
+ public function testValidCreation()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['creationValid']],
+ ['state' => 'success']
+ );
+ }
+
+ private function postAndParse($params, $expected)
+ {
+ //$this->enableCsrfToken();
+ //$this->enableSecurityToken();
+
+ $token = 'my-csrf-token';
+ $this->cookie('csrfToken', $token);
+
+ $this->configRequest([
+ 'headers' => ['Accept' => 'application/json', 'X-CSRF-Token' => $token]
+ ]);
+
+ $this->disableErrorHandlerMiddleware();
+ $this->post('/JsonRequestHandler', json_encode($params));
+
+ // Check that the response was a 200
+ $this->assertResponseOk();
+
+ $responseBodyString = (string)$this->_response->getBody();
+ $json = json_decode($responseBodyString);
+ $this->assertNotFalse($json);
+
+ if(is_array($expected)) {
+ $expected = json_encode($expected);
+ }
+ $this->assertEquals($expected, $responseBodyString);
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/PagesControllerTest.php b/community_server/tests/TestCase/Controller/PagesControllerTest.php
new file mode 100644
index 000000000..35fe1a13b
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/PagesControllerTest.php
@@ -0,0 +1,97 @@
+get('/');
+ $this->assertRedirect('account/');
+ $this->get('/');
+ $this->assertRedirect('account/');
+ }
+
+ /**
+ * testDisplay method
+ *
+ * @return void
+ */
+ public function testDisplay()
+ {
+ $this->get('/pages/home');
+ $this->assertResponseOk();
+ $this->assertResponseContains('CakePHP');
+ $this->assertResponseContains('');
+ }
+
+ /**
+ * Test that missing template renders 404 page in production
+ *
+ * @return void
+ */
+ public function testMissingTemplate()
+ {
+ Configure::write('debug', false);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseError();
+ $this->assertResponseContains('Error');
+ }
+
+ /**
+ * Test that missing template in debug mode renders missing_template error page
+ *
+ * @return void
+ */
+ public function testMissingTemplateInDebug()
+ {
+ Configure::write('debug', true);
+ $this->get('/pages/not_existing');
+
+ $this->assertResponseFailure();
+ $this->assertResponseContains('Missing Template');
+ $this->assertResponseContains('Stacktrace');
+ $this->assertResponseContains('not_existing.ctp');
+ }
+
+ /**
+ * Test directory traversal protection
+ *
+ * @return void
+ */
+ public function testDirectoryTraversalProtection()
+ {
+ $this->get('/pages/../Layout/ajax');
+ $this->assertResponseCode(403);
+ $this->assertResponseContains('Forbidden');
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/ProfilesControllerTest.php b/community_server/tests/TestCase/Controller/ProfilesControllerTest.php
new file mode 100644
index 000000000..d87558e55
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/ProfilesControllerTest.php
@@ -0,0 +1,76 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php
new file mode 100644
index 000000000..cfa59d80b
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php
@@ -0,0 +1,178 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test index method
+ *
+ * @return void
+ */
+ public function testIndex()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test overview method
+ *
+ * @return void
+ */
+ public function testOverview()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test ajaxGetBalance method
+ *
+ * @return void
+ */
+ public function testAjaxGetBalance()
+ {
+ $session_id = rand();
+ $balance = rand();
+ $this->session([
+ 'session_id' => $session_id,
+ 'Transaction' => ['pending' => 0, 'executing' => 0],
+ 'StateUser' => [
+ 'id' => 2, // 1 don't work, I don't know why
+ 'email_checked' => 1,
+ 'balance' => $balance
+ ]
+ ]);
+ //echo "balance: $balance";
+ $this->getAndParse('/state-balances/ajaxGetBalance/' . $session_id,
+ ['state' => 'success', 'balance' => $balance]
+ );
+ }
+
+ /**
+ * Test ajaxListTransactions method
+ *
+ * @return void
+ */
+ public function testAjaxListTransactions()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test overviewGdt method
+ *
+ * @return void
+ */
+ public function testOverviewGdt()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test sortTransactions method
+ *
+ * @return void
+ */
+ public function testSortTransactions()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+
+ private function getAndParse($path, $expected)
+ {
+ $this->configRequest([
+ 'headers' => ['Accept' => 'application/json']
+ ]);
+
+ $this->disableErrorHandlerMiddleware();
+ $this->get($path);
+
+ // Check that the response was a 200
+ $this->assertResponseOk();
+
+ $responseBodyString = (string)$this->_response->getBody();
+ $json = json_decode($responseBodyString);
+ $this->assertNotFalse($json);
+
+ if(is_array($expected)) {
+ $expected = json_encode($expected);
+ }
+ $this->assertEquals($expected, $responseBodyString);
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php b/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php
new file mode 100644
index 000000000..452af54fc
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php
@@ -0,0 +1,77 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php b/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php
new file mode 100644
index 000000000..74c0e4b1e
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php
@@ -0,0 +1,97 @@
+markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test index method
+ *
+ * @return void
+ */
+ public function testIndex()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test view method
+ *
+ * @return void
+ */
+ public function testView()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test create method
+ *
+ * @return void
+ */
+ public function testCreate()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test add method
+ *
+ * @return void
+ */
+ public function testAdd()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test edit method
+ *
+ * @return void
+ */
+ public function testEdit()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test delete method
+ *
+ * @return void
+ */
+ public function testDelete()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php
new file mode 100644
index 000000000..7ad28760c
--- /dev/null
+++ b/community_server/tests/TestCase/Controller/TransactionJsonRequestHandlerControllerTest.php
@@ -0,0 +1,174 @@
+ 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQJ8wF12eZo3hcMAlAKKJ9WLT-zuSkNmGh7D98UEqH4KoIysnCkXqEya9EBZl9o11_nJ8xmm_nOevuVjR-GfLMQ8qSQoOSGFsbG8gV2VsdCAxMjMSBgiZm4ruBUovCicKIJSuE1uTzZ8zdStOVcQZA6P6oTp1u5C_1BHqHUoaXnEfEKDakwEQtYntlgo',
+ 'validCreation900' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQNVZ8Ae3Zbg3G0wZ840fzKan6N4KtTcSe0KYi17kQwFmsl18oFxXv8_s6j1xXFrIKjy1_1Olq0a7xYLErDMkjwYqORIGCNb5iu4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgNHKCBC1ie2WCg',
+ 'validCreation1200' => 'GmYKZAogYbkjwhjLY6ZKjGLzhgEhKDuVd_N00KMVkLoCzcKRKZkSQEEey5QMAdldoOTP_jTETHgOQriGsixEY0cziQeRfT_J5YtbI_A6AizEYD-JcxmRmXzv1xjjTgsV39Y32ta2CQkqORIGCIeGi-4FSi8KJwoglK4TW5PNnzN1K05VxBkDo_qhOnW7kL_UEeodShpecR8QgOy4CxC1ie2WCg',
+ 'notBase64' => 'CgpIYWxsbyBXZW-0EgYIyfSG7gV_LwonCiCboKikqwjZfes9xuqgthFH3',
+ 'validTransfer' => 'GmYKZAoggZC9pYXuXx2fv30G6B5p7BjhM3YQTP9Ut0V-t9PvcQ0SQDddHyKzAX3LBV0PuDiPc6lxkUipss5tyuLRpMtFJQnT30tsbYIkA1FXimjMKOoiuLswf4OLLV3bAIYehW-b9AgqYQoFSGFsbG8SBgiJlaPvBUJQCiYKIIGQvaWF7l8dn799BugeaewY4TN2EEz_VLdFfrfT73ENEICfSRImCiDtdleSLxhUgEbMW9DpqIwsykFj3-z_enKEOuGnXrmW8xCAn0k',
+ 'errornusTransfer' => 'ClxGcm9oZXMgTmV1ZXMgSmFociB1bmQgREFOS0UsIGRhc3MgZHUgZGljaCBzbyBlaW5zZXR6dCBmw7xyIEdyYWRpZG8hIEhlcnpsaWNoZSBHcsO8w59lIFRlcmVzYRIGCPjjgvEFQlAKJgogUQwFYeVlGlfWDrkXNN7rHwejoCDJKt+YkYJfbJVyj3EQwIQ9EiYKIPXIRnUhVJ/zCs5+y/VaTBjTIoYizJNwS+JC//xsbQrHEMCEPQ=='
+ ];
+
+ /*public function setUp() {
+ parent::setUp();
+ }
+*/
+ public function testWrongMethod()
+ {
+ $this->configRequest([
+ 'headers' => ['Accept' => 'application/json']
+ ]);
+ $this->get('/TransactionJsonRequestHandler');
+ $this->assertResponseOk();
+
+ $expected = json_encode(['state' => 'error', 'msg' => 'no post']);
+ $this->assertEquals($expected, (string)$this->_response->getBody());
+ }
+
+ public function testInvalidJson()
+ {
+ $this->configRequest([
+ 'headers' => ['Accept' => 'application/json']
+ ]);
+ $this->post('/TransactionJsonRequestHandler', '{This isn\'t valid json}');
+ $this->assertResponseOk();
+
+ $expected = json_encode(['state' => 'error', 'msg' => 'parameter error']);
+ $this->assertEquals($expected, (string)$this->_response->getBody());
+ }
+
+ public function testNotSetTransaction()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction'],
+ ['state' => 'error', 'msg' => 'parameter error']
+ );
+ }
+ public function testNotSetMethod()
+ {
+ $this->postAndParse(
+ ['transaction' => $this->transactions['validCreation']],
+ ['state' => 'error', 'msg' => 'parameter error']
+ );
+ }
+
+ public function testUnknownMethod()
+ {
+ //$this->post('/TransactionJsonRequestHandler', ['method' => 'putTransaction', 'transaction' => 'CgpIYWxsbyBXZWx0EgYIyfSG7gVKLwonCiCboKikqwjZfes9xuqgthFH3/cHHaWchkUhWiGhQjB23xCg2pMBELWJ7ZYK']);
+ $this->postAndParse(
+ ['method' => 'foobar', 'transaction' => $this->transactions['validCreation']],
+ ['state' => 'error', 'msg' => 'unknown method', 'details' => 'foobar']
+ );
+
+ }
+
+ public function testInvalidEncodedTransaction() {
+ //"msg":"error parsing transaction","details":[{"Transaction":"base64 decode error"}]
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['notBase64']],
+ ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [
+ ['Transaction' => 'invalid base64 string']
+ ]]
+ );
+ }
+
+ public function testInvalidTransaction() {
+
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => base64_encode('Hallo Miau Welt')],
+ ['state' => 'error', 'msg' => 'error parsing transaction', 'details' => [
+ ['Transaction' => 'Error occurred during parsing: Unexpected wire type.']
+ ]]
+ );
+ }
+
+ public function testToLargeCreationSum()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation900']],
+ '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}'
+ );
+ }
+
+ public function testToLargeCreation()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation1200']],
+ '{"state":"error","msg":"error validate transaction","details":[{"TransactionCreation::validate":"Creation more than 1000 gr per Month not allowed"}]}'
+ );
+ }
+
+ public function testValidTransfer()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validTransfer']],
+ ['state' => 'success']
+ );
+ }
+
+ /*public function testMissingPreviousTransaction()
+ {
+
+ }*/
+
+ public function testValidTransaction()
+ {
+ $this->postAndParse(
+ ['method' => 'putTransaction', 'transaction' => $this->transactions['validCreation']],
+ ['state' => 'success']
+ );
+ }
+
+ private function postAndParse($params, $expected)
+ {
+
+ $this->configRequest([
+ 'headers' => ['Accept' => 'application/json']
+ ]);
+
+ $this->disableErrorHandlerMiddleware();
+ $this->post('/TransactionJsonRequestHandler', json_encode($params));
+
+ // Check that the response was a 200
+ $this->assertResponseOk();
+
+ $responseBodyString = (string)$this->_response->getBody();
+ $json = json_decode($responseBodyString);
+ $this->assertNotFalse($json);
+
+ if(is_array($expected)) {
+ $expected = json_encode($expected);
+ }
+ $this->assertEquals($expected, $responseBodyString);
+ }
+}
diff --git a/community_server/tests/TestCase/Model/Behavior/empty b/community_server/tests/TestCase/Model/Behavior/empty
new file mode 100644
index 000000000..e69de29bb
diff --git a/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php b/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php
new file mode 100644
index 000000000..09d7a35fb
--- /dev/null
+++ b/community_server/tests/TestCase/Model/Table/AdminErrorsTableTest.php
@@ -0,0 +1,83 @@
+exists('AdminErrors') ? [] : ['className' => AdminErrorsTable::class];
+ $this->AdminErrors = TableRegistry::getTableLocator()->get('AdminErrors', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->AdminErrors);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test buildRules method
+ *
+ * @return void
+ */
+ public function testBuildRules()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php b/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php
new file mode 100644
index 000000000..0d7e5fba2
--- /dev/null
+++ b/community_server/tests/TestCase/Model/Table/CommunityProfilesTableTest.php
@@ -0,0 +1,72 @@
+exists('CommunityProfiles') ? [] : ['className' => CommunityProfilesTable::class];
+ $this->CommunityProfiles = TableRegistry::getTableLocator()->get('CommunityProfiles', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->CommunityProfiles);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php b/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php
new file mode 100644
index 000000000..21cbe6128
--- /dev/null
+++ b/community_server/tests/TestCase/Model/Table/StateErrorsTableTest.php
@@ -0,0 +1,84 @@
+exists('StateErrors') ? [] : ['className' => StateErrorsTable::class];
+ $this->StateErrors = TableRegistry::getTableLocator()->get('StateErrors', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->StateErrors);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test buildRules method
+ *
+ * @return void
+ */
+ public function testBuildRules()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php b/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php
new file mode 100644
index 000000000..49deb1166
--- /dev/null
+++ b/community_server/tests/TestCase/Model/Table/StateUsersTableTest.php
@@ -0,0 +1,97 @@
+exists('StateUsers') ? [] : ['className' => StateUsersTable::class];
+ $this->StateUsersTable = TableRegistry::getTableLocator()->get('StateUsers', $config);
+ }
+
+ /**
+ * tearDown method
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ unset($this->StateUsersTable);
+
+ parent::tearDown();
+ }
+
+ /**
+ * Test initialize method
+ *
+ * @return void
+ */
+ public function testInitialize()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test validationDefault method
+ *
+ * @return void
+ */
+ public function testValidationDefault()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test buildRules method
+ *
+ * @return void
+ */
+ public function testBuildRules()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+
+ /**
+ * Test getReceiverProposal method
+ *
+ * @return void
+ */
+ public function testGetReceiverProposal()
+ {
+ $this->markTestIncomplete('Not implemented yet.');
+ }
+}
diff --git a/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php b/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php
new file mode 100644
index 000000000..60a6307ed
--- /dev/null
+++ b/community_server/tests/TestCase/Model/Transactions/TransactionCreationTest.php
@@ -0,0 +1,113 @@
+ 97,
+ "b" => 98,
+ "c" => 99,
+ "d" => 100,
+ "aa" => 12513,
+ "ab" => 12514,
+ "@" => 64,
+ ".d" => 5988,
+ "gmx" => 1701624,
+ "@gmx" => 135919352,
+ "@gmx.de" => 3742152099,
+ "***REMOVED***" => 2928827813,
+ "***REMOVED***" => 1899591683,
+ "***REMOVED***" => 2089074830,
+ "maximilian.muster@gradido.net" => 793144931,
+ "coin-info5@gradido.net" => 1829129963,
+ "coin-info6@gradido.net" => 1830178539,
+ "coin-info8@gradido.net" => 1832275691,
+ "coin-info9@gradido.net" => 1833324267,
+ "coin-info10@gradido.net" => 3877298078,
+ "coin-info11@gradido.net" => 3878346654,
+ "coin-info12@gradido.net" => 3879395230,
+ "***REMOVED***" => 2089074830,
+ "***REMOVED***" => 3996757473,
+ "***REMOVED***" => 3788634614,
+ "***REMOVED***" => 807797884,
+ "***REMOVED***" => 1640973721,
+ "***REMOVED***" => 2025729173,
+ "***REMOVED***" => 1961122507,
+ "***REMOVED***" => 362466358,
+ "***REMOVED***" => 3796728871,
+ "***REMOVED***" => 807797884,
+ "***REMOVED***" => 3794905967,
+ "***REMOVED***" => 3077694284,
+ "***REMOVED***" => 3246159770,
+ "***REMOVED***" => 3123402690,
+ "testneu-11-12-3@gradido.net" => 4092403827,
+ "***REMOVED***" => 3151414199,
+ "***REMOVED***" => 3526188273,
+ "***REMOVED***" => 966804823,
+ "***REMOVED***" => 1309273258,
+ "***REMOVED***" => 995978784,
+ "***REMOVED***" => 310113324,
+ "***REMOVED***" => 1309273258,
+ "***REMOVED***" => 530108573,
+ "***REMOVED***" => 1734855679,
+ "***REMOVED***" => 767779182,
+ "***REMOVED***" => 2247491519,
+ "***REMOVED***" => 3248626267,
+ "***REMOVED***" => 3516649930,
+ "***REMOVED***" => 231214190,
+ "***REMOVED***" => 4247461928,
+ "***REMOVED***" => 324829839,
+ "***REMOVED***" => 3046147747,
+ "***REMOVED***" => 3207307415,
+ "***REMOVED***" => 728893500,
+ "***REMOVED***" => 3905254663,
+ "***REMOVED***" => 3207307415,
+ "***REMOVED***" => 1155733239,
+ "***REMOVED***" => 2013046423,
+ "***REMOVED***" => 4033835283,
+ "***REMOVED***" => 1945541625,
+ "***REMOVED***" => 2310715309,
+ "***REMOVED***" => 1221362064,
+ "***REMOVED***" => 4161339877
+ ];
+ foreach($pairs as $email => $cpp_hash) {
+ $php_hash = TransactionCreation::DRMakeStringHash($email);
+ // assertEquals(mixed $expected, mixed $actual[, string $message = ''])
+ if($php_hash != $cpp_hash) {
+ $this->assertEquals($cpp_hash, $php_hash, "hashes for $email don't match");
+ }
+ }
+ }
+
+
+}
diff --git a/community_server/tests/TestCase/View/Helper/empty b/community_server/tests/TestCase/View/Helper/empty
new file mode 100644
index 000000000..e69de29bb
diff --git a/community_server/tests/bootstrap.php b/community_server/tests/bootstrap.php
new file mode 100644
index 000000000..0ca191e4a
--- /dev/null
+++ b/community_server/tests/bootstrap.php
@@ -0,0 +1,12 @@
+
+ RewriteEngine On
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
diff --git a/community_server/webroot/css/grd_styles.css b/community_server/webroot/css/grd_styles.css
new file mode 100644
index 000000000..08ecdc3a5
--- /dev/null
+++ b/community_server/webroot/css/grd_styles.css
@@ -0,0 +1,1781 @@
+/* ============================================================
+
+ Grid Layout Page
+
+ Datei : layout.less
+ Datum : 2020-04-30
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+/*====================================
+= BREAK POINTS =
+====================================*/
+/* https://scotch.io/courses/getting-started-with-less/responsive-and-media-queries */
+/* GRID */
+.layout {
+ display: grid;
+ grid-template-rows: [top] 8vh [line2] 86vh [footer1] 3vh [footer2] 5vh [end];
+ grid-template-columns: [left1] auto [left2] 1fr [left3] 12fr [right3] 1fr [right2] auto [right1];
+ grid-template-areas: "header header header header header" "left . center center ." "footer footer footer footer footer" "bottom bottom bottom bottom bottom";
+ margin: 0;
+ padding: 0;
+}
+@media (max-width:1199px) {
+ .layout {
+ grid-template-areas: "header header header header header" "left . center center center" "footer footer footer footer footer" "bottom bottom bottom bottom bottom";
+ }
+}
+@media (max-width:767px) {
+ .layout {
+ position: relative;
+ display: grid;
+ grid-template-rows: [top] 12vh [line2] 80vh [footer1] 3vh [footer2] 8vh [end];
+ grid-template-columns: [left1] 100vw [right1];
+ grid-template-areas: "header" "center" "footer" "bottom";
+ margin: 0;
+ padding: 0;
+ }
+}
+.header-notify {
+ grid-area: header;
+ grid-column-start: right3;
+ grid-column-end: right2;
+}
+.header-user {
+ grid-area: header;
+ grid-column-start: right2;
+ grid-column-end: right1;
+}
+.sidebar1 {
+ grid-area: left;
+ grid-row-start: top;
+ grid-row-end: end;
+}
+@media (max-width:767px) {
+ .sidebar1 {
+ position: relative;
+ grid-area: header;
+ z-index: 2;
+ top: -300px;
+ right: 0px;
+ }
+ .header-user,
+ .header-notify {
+ grid-area: header;
+ }
+}
+.center-form-single,
+.content {
+ grid-area: center;
+ grid-row-start: line2;
+ grid-row-end: footer1;
+}
+.footer {
+ grid-area: footer;
+ grid-row-start: footer1;
+ grid-row-end: footer2;
+}
+.nav-bottom {
+ grid-area: bottom;
+ grid-row-start: footer2;
+ grid-row-end: end;
+}
+/* ============================================================
+
+ Generic Color Definitions
+
+ Vars and some generic CSS rules.
+
+ Datei : colors.less
+ Datum : 2020-05-26
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+/* MAIN */
+/* MENU */
+/* CONTENT */
+/* CONTENT-NAV */
+/* CONTENT-ITEMS */
+/* CONTENT-TABLE */
+/* FORMS */
+/* VARIOUS INDIVIDUAL */
+/* XXX TODO XXX */
+/*rgba(0, 0, 0, 0.5) ??? */
+/* NOTIFICATION */
+/* https://www.w3schools.com/colors/colors_shades.asp */
+.info-color {
+ color: grey;
+}
+.success-color {
+ color: #047006;
+}
+.alert-color {
+ color: #ff5f66;
+}
+.orange-color {
+ color: #ffa600;
+}
+.blue-color {
+ color: blue;
+}
+.unobtrusive {
+ color: grey;
+}
+.info-icon {
+ color: grey;
+ background-color: #80808026;
+}
+.success-icon {
+ color: #047006;
+ background-color: rgba(4, 112, 6, 0.2);
+}
+.alert-icon {
+ color: #ff5f66;
+ background-color: #ff5f662e;
+}
+/* =======================
+ Gradido
+ =======================*/
+/* Gradido */
+.grd-negative-currency {
+ color: red;
+}
+/* Gradido Transform */
+.gdt-text-color {
+ color: #a27824;
+}
+.grd_clickable {
+ cursor: pointer;
+}
+/* ============================================================
+
+ Typography Definitions
+
+ Datei : typography.less
+ Datum : 2020-05-26
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+.small-font {
+ font-size: 0.75em;
+ font-weight: 300;
+}
+/* ============================================================
+
+ Basic screen styles.
+
+ Datei : screen.less
+ Datum : 2020-04-30
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+@font-face {
+ font-family: 'Material Icons Outlined';
+ font-style: normal;
+ font-weight: 400;
+ src: url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.eot);
+ /* For IE6-8 */
+ src: local('Material Icons Outlined'), local('Material-Icons-Outlined'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2) format('woff2'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.woff) format('woff'), url(../fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf) format('truetype');
+}
+.material-icons-outlined {
+ font-family: 'Material Icons Outlined';
+ font-weight: normal;
+ font-style: normal;
+ font-size: 24px;
+ line-height: 1;
+ letter-spacing: normal;
+ text-transform: none;
+ vertical-align: middle;
+ display: inline-block;
+ white-space: nowrap;
+ word-wrap: normal;
+ direction: ltr;
+ -webkit-font-feature-settings: 'liga';
+ -webkit-font-smoothing: antialiased;
+}
+@media screen {
+ /* =======================
+ Basis
+ =======================*/
+ html,
+ body {
+ font-family: 'Roboto', sans-serif;
+ font-size: 100%;
+ line-height: 27px;
+ color: #212529;
+ background-color: #f9fafb;
+ margin: 0;
+ overflow: auto;
+ }
+ div {
+ border-collapse: collapse;
+ box-sizing: border-box;
+ }
+ /* =======================
+ Kopfbereich
+ =======================*/
+ .header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex: flex-grow;
+ width: 100%;
+ padding: 1em;
+ background-color: #fff;
+ }
+ /* =======================
+ Fußbereich
+ =======================*/
+ .footer {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: center;
+ font-size: 70%;
+ font-style: italic;
+ line-height: 0;
+ }
+ .bottomright {
+ position: fixed;
+ bottom: 0;
+ right: 0;
+ color: grey;
+ font-size: smaller;
+ line-height: 0.125em;
+ padding-right: 0.25em;
+ text-align: right;
+ }
+ .bottomleft {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ color: grey;
+ font-size: smaller;
+ line-height: 1.125em;
+ padding-left: 0.25em;
+ }
+ /* =======================
+ Sonstige
+ =======================*/
+ /* Hyperlinks */
+ a {
+ text-decoration: none;
+ color: inherit;
+ }
+ main a {
+ text-decoration: underline;
+ font-style: italic;
+ }
+ a:link,
+ a:visited {
+ color: inherit;
+ }
+ a:hover,
+ a:focus {
+ text-decoration: underline;
+ }
+ a:active {
+ background-color: #fff;
+ color: #000;
+ }
+ a:focus,
+ a:active {
+ outline: none;
+ }
+ a.grd_invisible_link {
+ color: #000;
+ text-decoration: none;
+ }
+ a.grd_invisible_link:hover {
+ color: grey;
+ }
+ [type=button]:not(:disabled),
+ [type=reset]:not(:disabled),
+ [type=submit]:not(:disabled),
+ button:not(:disabled) {
+ cursor: pointer;
+ }
+}
+@media screen and (max-width:767px) {
+ .bottomright {
+ font-size: 0.7em;
+ font-weight: 300;
+ line-height: 1em;
+ width: 100px;
+ }
+ .bottomright p {
+ margin-block-start: 0;
+ margin-block-end: 2px;
+ margin-inline-start: 0;
+ margin-inline-end: 0;
+ }
+}
+/* Ende @media screen */
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/* ============================================================
+
+ Screen styles for flash messages.
+
+ Datei : messages.css
+ Datum : 30.10.2019, 16:04:16
+ Autor : einhornimmond, Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+@media screen {
+ .flash-messages {
+ width: 30%;
+ position: absolute;
+ top: 57px;
+ left: 241px;
+ text-align: center;
+ }
+ .flash-messages .alert {
+ margin: 0;
+ padding: 1em;
+ vertical-align: middle;
+ border-radius: 5px;
+ }
+ .flash-messages .alert-success {
+ color: #1A1A1A !important;
+ background-color: #06c50a;
+ border: 1px solid #04700675;
+ }
+ .flash-messages .alert-error {
+ color: #fff !important;
+ background-color: red;
+ border: 1px solid rgba(255, 0, 0, 0.5);
+ }
+ .flash-messages .message {
+ padding: 5px;
+ }
+ .flash-messages .success {
+ color: #047006;
+ }
+ .flash-messages .error {
+ color: red;
+ }
+ .flash-messages.hidden {
+ display: none;
+ }
+ /* messages, update flash */
+ .grd-error {
+ color: red;
+ border: 1px solid rgba(255, 0, 0, 0.5);
+ padding: 5px;
+ }
+ .grd-info {
+ border: 1px dotted gray;
+ padding: 5px;
+ }
+ .grd-success {
+ padding: 5px;
+ color: #047006;
+ }
+}
+@media screen and (max-width:767px) {
+ .flash-messages {
+ width: 90%;
+ top: 0;
+ left: 0;
+ text-align: center;
+ }
+}
+/* ============================================================
+
+ User Menu
+
+ Datei : user.less
+ Datum : 2020-07-03
+ Autor : Christine Slotty
+ Copyright : Gradido
+
+ ============================================================*/
+@media screen {
+ .header-user {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: flex-end;
+ align-content: flex-end;
+ position: relative;
+ width: 100%;
+ min-width: 12em;
+ height: 40px;
+ background-color: #fff;
+ border: 1px solid #f2f4f5;
+ border-radius: 0 0 0 18px;
+ }
+ .user-menu-container {
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+ font-size: 0.8em;
+ font-weight: 300;
+ padding: 0.25em 0.5em;
+ z-index: 20;
+ height: 40px;
+ }
+ .user-name,
+ .user-icon {
+ display: inline-block;
+ vertical-align: middle;
+ cursor: pointer;
+ }
+ .user-name {
+ padding-right: 0.25em;
+ }
+ .nav-vertical.user-menu {
+ display: none;
+ background-color: #fff;
+ border-left: 1px solid #f2f4f5;
+ border-bottom: 1px solid #f2f4f5;
+ border-radius: 0 0 16px 16px;
+ z-index: 15;
+ font-size: 0.9em;
+ margin-top: 0 !important;
+ position: fixed;
+ top: 39px;
+ right: 0;
+ }
+ .nav-vertical.user-menu.visible {
+ display: inherit;
+ }
+ .nav-vertical.user-menu > ul {
+ padding: 2em;
+ padding-top: 0.5em;
+ padding-bottom: 1em;
+ margin-block-end: 0;
+ margin-block-start: 0;
+ }
+ .nav-vertical.user-menu li {
+ padding: 0.0125em;
+ }
+ .nav-top > ul {
+ padding: 0;
+ padding-right: 2em;
+ }
+ .material-icons-outlined.user-info {
+ color: grey;
+ }
+ .material-icons-outlined.user-info.success {
+ color: #047006;
+ }
+}
+@media screen and (max-width:767px) {
+ .header-user {
+ position: relative;
+ min-width: 3em;
+ background-color: transparent;
+ justify-content: center;
+ height: 100%;
+ margin-top: -13px;
+ margin-left: -16px;
+ color: #047006;
+ }
+ .user-menu-container {
+ margin: 0;
+ padding: 0;
+ }
+ .user-name {
+ display: none;
+ }
+ .nav-vertical {
+ margin-top: 55px;
+ }
+ .nav-vertical.user-menu {
+ position: fixed;
+ top: 1px;
+ right: 0;
+ margin-top: 0;
+ }
+ .nav-vertical.user-menu > ul {
+ padding: 1em 1em;
+ padding-top: 3em;
+ }
+}
+/* ============================================================
+
+ Navigation
+
+ Datei : navi.less
+ Datum : 2020-04-30
+ Autor : einhornimmond / Christine Slotty
+ Copyright : Gradido
+
+ ============================================================*/
+@media screen {
+ .logo {
+ display: none;
+ vertical-align: middle;
+ height: 30px;
+ padding: 0.5em;
+ }
+ .logo.big.visible,
+ .logo.small.visible {
+ display: block !important;
+ }
+ .logo.mobile {
+ display: none;
+ }
+ .logo.small.visible {
+ padding-left: 41px;
+ }
+ /*
+ SIDEBARS
+ */
+ .sidebar1 {
+ background-color: #fff;
+ font-size: 0.8em;
+ font-weight: 500;
+ line-height: 2.5em;
+ padding: 0;
+ border-right: 1px solid #f2f4f5;
+ }
+ .sidebar2 {
+ padding: 1em;
+ background-color: #f9fafb;
+ }
+ .sidebar1-header {
+ font-size: 0.75em;
+ font-style: italic;
+ color: grey;
+ }
+ /* set general icons size here! */
+ .nav-icon {
+ font-size: 18px !important;
+ color: #4F4F4F;
+ vertical-align: middle;
+ padding-right: 1em;
+ }
+ /* important! order matters! we need to overwrite the main button's size here */
+ .nav-main-button {
+ font-size: 32px !important;
+ color: grey;
+ margin: 0.3em;
+ }
+ /* Hide mobile menu button! */
+ .nav-main-button.mobile {
+ display: none;
+ }
+ .nav-menu.nav-menu-maximized {
+ width: 280px;
+ height: 100%;
+ }
+ .nav-menu.nav-menu-minimized {
+ width: 120px;
+ height: 100%;
+ }
+ .nav-menu-maximized {
+ -webkit-animation: slide-out 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ animation: slide-out 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ }
+ .nav-menu-minimized {
+ -webkit-animation: slide-in 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ animation: slide-in 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ }
+ .nav-menu-minimized .link-title {
+ display: none;
+ }
+ .nav-menu-minimized .nav-icon,
+ .nav-menu-minimized .nav-main-button {
+ padding-left: 72px;
+ }
+ /**
+ * ----------------------------------------
+ * animations slide-in / slide-out
+ * ----------------------------------------
+ */
+ /* slide-in */
+ @-webkit-keyframes slide-in {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: translateX(-74px);
+ transform: translateX(-74px);
+ opacity: 1;
+ }
+ }
+ @keyframes slide-in {
+ 0% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: translateX(-74px);
+ transform: translateX(-74px);
+ opacity: 1;
+ }
+ }
+ /* slide-out */
+ @-webkit-keyframes slide-out {
+ 0% {
+ -webkit-transform: translateX(-74px);
+ transform: translateX(-74px);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ }
+ @keyframes slide-out {
+ 0% {
+ -webkit-transform: translateX(-74px);
+ transform: translateX(-74px);
+ }
+ 100% {
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ }
+ }
+ /*
+ NAVI MOBILE
+ */
+ /* END navi mobile base */
+ .selected {
+ color: #047006;
+ }
+ .link-title {
+ vertical-align: middle;
+ line-height: normal;
+ background-color: transparent;
+ }
+ .nav-horizontal {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: flex-end;
+ list-style-type: none;
+ gap: 5%;
+ padding: 1em;
+ }
+ .footer .nav-horizontal {
+ gap: 0;
+ padding: 0 1em;
+ padding-inline-start: 0 !important;
+ }
+ .nav-top-smaller {
+ margin: 0;
+ padding: 0;
+ }
+ .nav-smaller {
+ justify-content: left;
+ align-items: flex-start;
+ gap: 0;
+ padding: 0;
+ }
+ .nav-smaller li {
+ padding: 0 !important;
+ padding: 0.2em 0.5em !important;
+ border: 1px solid #047006;
+ margin: 0.1em 0.3em;
+ border-radius: 12px;
+ }
+ .nav-smaller .heading {
+ font-weight: bold;
+ }
+ .nav-vertical {
+ margin-top: -2em;
+ }
+ .nav-horizontal li {
+ padding: 0.5em;
+ }
+ .nav-vertical > ul {
+ display: flex;
+ flex-direction: column;
+ list-style-type: none;
+ gap: 5%;
+ padding: 1em;
+ }
+ .nav-vertical li {
+ padding: 0.5em;
+ }
+ .nav-top > ul {
+ padding: 0;
+ padding-right: 2em;
+ }
+ .nav-bottom {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ list-style-type: none;
+ margin-bottom: 20px;
+ }
+ .nav-bottom p {
+ font-size: 0.9em;
+ color: grey;
+ margin: 0;
+ }
+ nav.grd-left-bar {
+ position: fixed;
+ top: 80.5px;
+ }
+ nav .grd-nav-bn {
+ width: 100px;
+ }
+ nav ul {
+ margin-top: 0;
+ padding-left: 0;
+ }
+ /* buttons */
+ .grd-nav-bn:hover,
+ .grd-active {
+ background-color: lightgray;
+ border-color: #000;
+ }
+ .grd-nav-bn {
+ padding: 10px;
+ border: 1px solid grey;
+ display: table-cell;
+ text-align: center;
+ vertical-align: middle;
+ color: grey;
+ }
+ .grd-nav-bn-large {
+ width: 40vw;
+ height: 18vh;
+ font-size: 35px;
+ }
+ a.grd-nav-bn,
+ a.grd-nav-bn:visited {
+ color: #000;
+ text-decoration: none;
+ }
+}
+@media screen and (max-width:767px) {
+ .logo.big,
+ .logo.small {
+ display: none;
+ }
+ .logo.visible {
+ padding: 0 !important;
+ }
+ .logo,
+ .logo.mobile,
+ .logo.mobile.visible {
+ display: block;
+ position: fixed;
+ top: 12px;
+ left: 12px;
+ }
+ .logo.big,
+ .logo.big.visible {
+ display: none !important;
+ }
+ .nav-main-button {
+ display: none;
+ }
+ .nav-main-button.mobile {
+ display: block;
+ position: fixed;
+ top: 2px;
+ right: 46px;
+ z-index: 3;
+ }
+ .nav-menu.nav-menu-minimized,
+ .nav-menu.nav-menu-maximized {
+ width: 280px;
+ height: 300px;
+ }
+ .nav-menu-minimized .nav-icon,
+ .nav-menu-minimized .nav-main-button {
+ padding-left: 0;
+ }
+ .nav-menu-maximized {
+ -webkit-animation: slide-down 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ animation: slide-down 0.1s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ }
+ .nav-menu-minimized {
+ -webkit-animation: slide-up 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ animation: slide-up 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) both;
+ }
+ @-webkit-keyframes slide-down {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: translateY(300px);
+ transform: translateX(300px);
+ opacity: 1;
+ }
+ }
+ @keyframes slide-down {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: translateY(300px);
+ transform: translateY(300px);
+ opacity: 1;
+ }
+ }
+ @-webkit-keyframes slide-up {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+ 100% {
+ -webkit-transform: translateY(-300px);
+ transform: translateY(-300px);
+ }
+ }
+ @keyframes slide-up {
+ 0% {
+ -webkit-transform: translateY(0);
+ transform: translateY(0);
+ }
+ 100% {
+ -webkit-transform: translateY(-300px);
+ transform: translateY(-300px);
+ }
+ }
+}
+@media screen and (max-width:767px) {
+ .nav-vertical {
+ margin-top: 55px;
+ }
+}
+@media screen and (max-width:767px) {
+ .nav-bottom p {
+ font-size: 0.8em;
+ margin-top: -10px;
+ }
+}
+/* ============================================================
+
+ Notification
+
+ Datei : notification.css
+ Datum : 2020-06-10
+ Autor : Christine Slotty
+ Copyright : Gradido
+
+ ============================================================*/
+@media screen {
+ .header-notify {
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+ z-index: 10;
+ }
+ .notify {
+ display: block;
+ padding: 0.5rem 0.3rem;
+ color: #525c5d;
+ animation: blinkingNotifySymbol 1.2s infinite;
+ }
+ .notify-alert {
+ color: #ff5f66;
+ animation: blinkingAlertSymbol 1.2s infinite;
+ }
+ @keyframes blinkingNotifySymbol {
+ 0% {
+ color: #525c5d;
+ }
+ 49% {
+ color: #525c5d;
+ }
+ 60% {
+ color: #525c5d82;
+ }
+ 99% {
+ color: #525c5d82;
+ }
+ 100% {
+ color: #525c5d;
+ }
+ }
+ @keyframes blinkingAlertSymbol {
+ 0% {
+ color: #ff5f66;
+ }
+ 49% {
+ color: #ff5f66;
+ }
+ 60% {
+ color: #ff5f669e;
+ }
+ 99% {
+ color: #ff5f669e;
+ }
+ 100% {
+ color: #ff5f66;
+ }
+ }
+ /*
+ .notification-indicator-primary {
+ background: #047006;
+ }
+
+ .notification-indicator-warning {
+ background: #f0825f
+ }
+ .notification-indicator-secondary {
+ background: grey
+ }
+
+ .notification-indicator-secondary:before {
+ content: "";
+ background: rgba(128, 128, 128, .5)
+ }
+
+ .notification-indicator-success {
+ background: #00e093
+ }
+
+ .notification-indicator-success:before {
+ content: "";
+ background: rgba(0, 224, 147, .5)
+ }
+
+ .notification-indicator-info {
+ background: #6c61f6
+ }
+
+ .notification-indicator-info:before {
+ content: "";
+ background: rgba(108, 97, 246, .5)
+ }
+
+
+ .notification-indicator-danger {
+ background: #ff5f66
+ }
+
+ .notification-indicator-danger:before {
+ content: "";
+ background: rgba(255, 95, 102, .5)
+ }
+
+ .notification-indicator-light {
+ background: #dfdfdf
+ }
+
+ .notification-indicator-light:before {
+ content: "";
+ background: rgba(223, 223, 223, .5)
+ }
+
+ .notification-indicator-dark {
+ background: #74767b
+ }
+
+ .notification-indicator-dark:before {
+ content: "";
+ background: rgba(116, 118, 123, .5)
+ }
+
+ .notification-indicator-white {
+ background: #fff
+ }
+
+ .notification-indicator-white:before {
+ content: "";
+ background: rgba(255, 255, 255, .5)
+ }
+ */
+}
+@media screen and (max-width:767px) {
+ .header-notify {
+ justify-content: flex-end;
+ margin-right: 93px;
+ margin-top: 8px;
+ }
+}
+/* ============================================================
+
+ Screen styles for the regular center part.
+
+ Datei : center.css
+ Datum : 2020-04-30
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+@media screen {
+ /* =========
+ CONTENT
+ =========*/
+ .content-default {
+ display: flex;
+ justify-content: center;
+ max-width: 90%;
+ }
+ .content {
+ display: flex;
+ justify-content: flex-start;
+ flex-direction: column;
+ overflow: auto;
+ width: 100%;
+ background-color: #f9fafb;
+ line-height: 1.75em;
+ letter-spacing: 0.03rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ font-size: 1rem;
+ padding-right: 5em;
+ }
+ /* Center Navigation Top */
+ .nav-content {
+ position: relative;
+ color: #565656;
+ margin: 0 0.25em;
+ }
+ .nav-content-list {
+ display: flex;
+ list-style-type: none;
+ padding: 0;
+ margin-left: 0.25em;
+ }
+ .nav-content-separator {
+ margin: 0 1em;
+ }
+ /* Center Content Container */
+ .content-container {
+ background-color: #fff;
+ color: #212529;
+ border-radius: 0.5em;
+ box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2);
+ border: 1px solid rgba(238, 238, 238, 0.75);
+ margin: 1em 0.25em;
+ }
+ /* Block Container Above Main */
+ .block-container {
+ width: 100%;
+ display: flex;
+ }
+ /* Top Info Above Main */
+ .info-container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ max-width: 70%;
+ padding: 1em 25px;
+ }
+ /* Main Container */
+ .main-container {
+ width: 100%;
+ }
+ .default-container {
+ width: 90%;
+ margin: auto;
+ padding: 1em;
+ }
+ /* Content Block */
+ .content-block {
+ width: 170px;
+ padding: 20px 25px 20px;
+ border: 1px dashed grey;
+ border-radius: 16px;
+ margin: 1em;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ justify-items: center;
+ align-items: center;
+ }
+ .block-img {
+ width: 40px;
+ height: 40px;
+ line-height: 20px;
+ font-size: 24px;
+ padding: 8px;
+ border-radius: 20px;
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2);
+ overflow: hidden;
+ border-style: none;
+ box-sizing: border-box;
+ }
+ /* Generic Content */
+ .content-region h3 {
+ color: #21252969;
+ }
+ .content-region {
+ border-bottom: 1px dashed #F5F5F5;
+ padding: 0 25px;
+ padding-bottom: 2em;
+ margin: 1em 0.25em;
+ }
+ .content-collection {
+ display: flex;
+ }
+ .content-item {
+ margin: 0.5em 0;
+ margin-right: 5em;
+ width: 220px;
+ padding: 1em 2em;
+ }
+ .action-button {
+ background: #f9fafb;
+ border-left: 3px solid #047006;
+ }
+ .info-item {
+ border-left: 2px solid grey;
+ }
+ .inline-header {
+ display: inline;
+ }
+ .show-profile-img {
+ display: block;
+ height: 100px;
+ vertical-align: middle;
+ border-radius: 10px;
+ border: 2px dotted #80808026;
+ }
+ /* OTHER */
+ .info-item i,
+ .info-item-link,
+ .action-button i,
+ .action-button-link {
+ vertical-align: middle;
+ }
+}
+@media screen and (max-width:767px) {
+ .content {
+ padding-right: 0;
+ }
+}
+@media screen and (max-width:767px) {
+ .nav-content-list {
+ display: flex;
+ font-size: small;
+ margin-bottom: 0;
+ justify-content: center;
+ }
+}
+@media screen and (max-width:1199px) {
+ .info-container {
+ flex-direction: column;
+ max-width: 90%;
+ line-height: 0.25em;
+ }
+}
+@media screen and (max-width:767px) {
+ .main-container {
+ max-width: 97%;
+ }
+}
+@media screen and (max-width:767px) {
+ .content-region {
+ padding-left: 5px;
+ }
+ .content-collection {
+ flex-direction: column;
+ align-items: center;
+ }
+ .content-item {
+ margin: 0.5em 0;
+ margin-right: 0;
+ width: 160px;
+ padding: 1em 2em;
+ }
+}
+/* Ende @media screen */
+/* ============================================================
+
+ Screen styles for the simple center form. (login etc)
+
+ Datei : center-form-single.css
+ Datum : 2020-07-10
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+@media screen {
+ .center-form-single {
+ width: 50%;
+ margin: auto;
+ }
+ .center-form-header {
+ margin-bottom: 50px;
+ }
+ .center-logo {
+ display: block;
+ margin: 0 auto;
+ width: 280px;
+ }
+ .center-logo img {
+ width: 100%;
+ vertical-align: middle;
+ border-style: none;
+ }
+ .center-form-container {
+ display: flex;
+ flex-direction: column;
+ padding: 2em 8em;
+ background-color: #fff;
+ border-radius: 6px;
+ box-shadow: 0 0 10px 0 rgba(183, 192, 206, 0.2);
+ margin-bottom: 1.5rem;
+ border: 1px solid rgba(238, 238, 238, 0.75);
+ }
+ .center-form-title h1 {
+ margin-block-start: 0;
+ }
+ .center-form-selectors {
+ display: flex;
+ justify-content: flex-end;
+ align-items: center;
+ height: 38px;
+ padding: 5px 0;
+ margin-bottom: 2em;
+ }
+ .center-form-form,
+ .center-form-form form {
+ display: flex;
+ flex-direction: column;
+ }
+ .center-form-form .form-label {
+ text-align: left;
+ }
+ .center-form-form .form-control {
+ width: 100%;
+ margin: auto;
+ box-sizing: border-box;
+ margin-bottom: 0.5em;
+ }
+ .center-form-submit {
+ width: 100%;
+ margin: 1em 0;
+ }
+ .reset-pwd-link,
+ .signup-link {
+ padding: 0 20px;
+ }
+ .reset-pwd-link a,
+ .signup-link a {
+ color: #047006;
+ }
+ .reset-pwd-link p,
+ .signup-link p {
+ display: inline-block;
+ margin-block-start: 0;
+ margin-block-end: 0;
+ }
+ .center-bottom {
+ color: grey;
+ text-align: center;
+ padding-top: 30px;
+ }
+ .flag-btn {
+ text-align: center;
+ vertical-align: middle;
+ padding: 3px 11px;
+ }
+ .flag {
+ display: block;
+ }
+ .flag-germany {
+ background: red;
+ border-top: 9px solid #000;
+ border-bottom: 9px solid #fc0;
+ width: 40px;
+ height: 10px;
+ }
+ .flag-england {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==);
+ background-size: cover;
+ width: 40px;
+ height: 28px;
+ }
+ .group {
+ padding-left: 10px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ }
+ .group-is-invalid {
+ background-color: rgba(240, 130, 95, 0.2);
+ border-color: #dc3545;
+ padding-right: calc(1.5em + 0.75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E");
+ background-repeat: no-repeat;
+ background-position: center right calc(0.375em + 0.1875rem);
+ background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
+ }
+ .group-is-invalid .radio label .input-frame::before {
+ border-color: red;
+ }
+}
+@media screen and (max-width:767px) {
+ .center-form-header {
+ margin-bottom: 30px;
+ margin-top: -50px;
+ }
+ .center-form-single {
+ width: 97%;
+ margin: auto;
+ }
+ .center-form-container {
+ padding: 1em 0.5em;
+ }
+}
+/* Ende @media screen */
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/* ============================================================
+
+ Screen styles for plain facts.
+
+ Datei : facts.css
+ Datum : 08.07.2020
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+@media screen {
+ .fact-list {
+ display: flex;
+ flex-direction: column;
+ list-style-type: none;
+ width: 100%;
+ padding-inline-start: 0;
+ font-weight: 300;
+ }
+ .fact {
+ display: inline-block;
+ padding-left: 1em;
+ }
+ .label {
+ width: 150px;
+ text-align: right;
+ font-weight: bold;
+ }
+}
+@media screen and (max-width:767px) {
+ .fact-list {
+ margin-block-start: 0;
+ margin-block-end: 0;
+ }
+ li.fact {
+ display: flex;
+ flex-direction: column;
+ }
+ .fact {
+ padding-left: 0.5em;
+ }
+ .label {
+ width: 250px;
+ text-align: left;
+ font-size: 0.9em;
+ font-weight: normal;
+ }
+}
+/* ============================================================
+
+ Screen styles for lists.
+
+ Datei : list.css
+ Datum : 2020-06-09
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+@media screen {
+ /* =========
+ LISTS
+ =========*/
+ /* List Content */
+ .content-list {
+ width: 100%;
+ }
+ .content-list-title {
+ font-size: 1rem;
+ margin: 0;
+ padding: 20px 25px;
+ color: #313131;
+ }
+ .content-list-table {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ overflow: auto;
+ font-size: 16px;
+ color: #212529;
+ }
+ .row {
+ display: flex;
+ width: 100%;
+ border-top: 1px solid #f2f4f9;
+ -webkit-transition-duration: 0.5s;
+ transition-duration: 0.5s;
+ }
+ .row:hover {
+ background-color: #f6f7f9;
+ }
+ .cell {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ padding: 1em 1.5em;
+ }
+ .cell-dense {
+ padding: 0.1em 0.5em;
+ }
+ .centered {
+ justify-content: center;
+ }
+ .c0 {
+ flex-grow: 5;
+ min-width: 20%;
+ }
+ .c1 {
+ min-width: 40px;
+ flex: 0 0 40px;
+ }
+ .c2 {
+ min-width: 80px;
+ flex: 0 0 80px;
+ }
+ .c3 {
+ min-width: 160px;
+ flex: 0 0 160px;
+ }
+ .c4 {
+ min-width: 240px;
+ flex: 0 0 240px;
+ }
+ .c5 {
+ min-width: 320px;
+ flex: 0 0 320px;
+ }
+ .c6 {
+ min-width: 400px;
+ flex: 0 0 400px;
+ }
+ .header-cell {
+ border-top: 1px solid #f2f4f9;
+ background-color: #fafafa;
+ color: #101010;
+ }
+ .content-list-table img,
+ .content-list-table i {
+ vertical-align: middle;
+ }
+ .content-list-table > span {
+ font-size: 0.8em;
+ padding: 0.5em 2em;
+ vertical-align: middle;
+ }
+ /* Individual Tables XXX rm!! */
+ .error-list {
+ grid-template-columns: 2fr 2fr 5fr 1fr;
+ }
+ .transactions {
+ grid-template-columns: 1fr 4fr 2fr 2fr;
+ }
+ .profile-img {
+ width: 30px;
+ height: 30px;
+ border-radius: 6px;
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2);
+ overflow: hidden;
+ border-style: none;
+ box-sizing: border-box;
+ margin-right: 40px;
+ }
+ .tx-email {
+ cursor: pointer;
+ display: block;
+ color: #101010;
+ font-weight: 400;
+ }
+ .small {
+ font-size: 80%;
+ font-weight: 400;
+ }
+ /*,
+ .cell-icon .material-icons-outlined */
+ .cell-icon {
+ /*noch ungeklärt - icon ist nicht aligned */
+ /*font-size: 1.25em;*/
+ vertical-align: middle;
+ }
+ /* =====================================
+ FORM TOP CONTENT (checkTransaction)
+ =====================================*/
+ .form-content {
+ padding: 35px;
+ padding-top: 20px;
+ max-width: 80%;
+ margin: auto;
+ }
+ .content-table {
+ border: 1px solid #f2f4f9;
+ border-top: none;
+ margin-bottom: 1.5rem;
+ }
+ .content-row {
+ display: flex;
+ justify-content: space-between;
+ font-weight: 400;
+ border-top: 1px solid #f2f4f9;
+ }
+ .content-row-header {
+ font-weight: 500;
+ color: #101010;
+ }
+ .content-row-bg {
+ background-color: #f0f2f5;
+ }
+ .content-cell {
+ display: block;
+ border-collapse: collapse;
+ padding: 10px 15px;
+ }
+ .form-button .material-icons-outlined {
+ font-size: 1.25em;
+ }
+}
+@media screen and (max-width:767px) {
+ .row {
+ flex-direction: column;
+ }
+}
+@media screen and (max-width:767px) {
+ .cell {
+ padding: 0.25em 1.5em;
+ }
+ .c1 {
+ flex-basis: auto;
+ }
+ .c2 {
+ flex-basis: auto;
+ }
+ .c3 {
+ flex-basis: auto;
+ }
+ .c4 {
+ flex-basis: auto;
+ }
+ .c5 {
+ flex-basis: auto;
+ }
+ .c6 {
+ flex-basis: auto;
+ }
+}
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/* ============================================================
+
+ Screen styles for forms.
+
+ Datei : form.css
+ Datum : 2020-06-07
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+@media screen {
+ /* =========
+ FORMS
+ =========*/
+ /* Form Content */
+ .action-form {
+ width: 100%;
+ }
+ .form-header {
+ border-left: 3px solid #047006;
+ background: #f9fafb;
+ padding: 15px 20px;
+ margin: 0;
+ margin-bottom: 15px;
+ border-radius: 0 6px 0 0;
+ }
+ .form-label {
+ grid-column: 0.5;
+ font-weight: 400;
+ text-align: right;
+ padding-right: 0.5em;
+ }
+ .form-control {
+ grid-column: 0.66666667;
+ padding: 0.4em 0.75em;
+ padding-left: 20px;
+ padding-right: 20px;
+ margin: 0;
+ margin-right: 0.5em;
+ color: rgba(16, 16, 16, 0.8);
+ display: block;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #6c757d;
+ background-color: #f6f7f9;
+ background-clip: padding-box;
+ border: 1px solid #f0f2f5;
+ border-radius: 0.25rem;
+ -webkit-transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ }
+ .form-control:focus {
+ color: #495057;
+ background-color: #f6f7f9;
+ border-color: #d7dee5;
+ outline: 0;
+ box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
+ }
+ textarea {
+ resize: vertical;
+ }
+ .badge {
+ display: inline-block;
+ padding: 0.45rem 1rem;
+ font-size: 80%;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: 0.25rem;
+ -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
+ }
+ .badge-warning {
+ color: #fff;
+ background-color: #00e093;
+ }
+ .badge-error {
+ color: #fff;
+ background-color: #ff5f66;
+ }
+ .form-full-width {
+ grid-column-start: 1;
+ grid-column-end: 3;
+ display: flex;
+ flex-direction: column;
+ }
+ .form-button {
+ cursor: pointer;
+ font: 600 13.3333px Arial;
+ font-size: 0.875rem;
+ line-height: 1.5;
+ text-align: center;
+ vertical-align: middle;
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006;
+ border: 1px solid transparent;
+ border-radius: 0.2rem;
+ height: 35px;
+ max-height: 35px;
+ padding: 4px 15px;
+ margin-right: 0.5em;
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.2);
+ }
+ .form-button:hover {
+ background-color: #034b04;
+ border-color: #023f03;
+ }
+ .button-cancel {
+ color: #fff !important;
+ background-color: #f0825f;
+ border-color: #f0825f;
+ }
+ .button-cancel:hover {
+ background-color: #ec5e30;
+ border-color: #eb5425;
+ }
+ .link-button {
+ display: inline-block;
+ background: #f9fafb;
+ color: #fff;
+ height: 17px;
+ padding: 1em 2em;
+ line-height: 1em;
+ border-radius: 6px;
+ text-align: center;
+ vertical-align: middle;
+ }
+ .action-link {
+ color: #047006 !important;
+ }
+ .action-link-button {
+ background-color: #047006 !important;
+ color: #fff !important;
+ margin-top: 1em;
+ padding: 0.5em 1em;
+ }
+ .edit-profile-img {
+ width: 100px;
+ }
+ .note-smaller {
+ font-size: smaller;
+ }
+ .form-row,
+ .grid-row {
+ display: flex;
+ justify-content: flex-start;
+ align-items: center;
+ align-content: center;
+ width: 100%;
+ -webkit-transition-duration: 0.5s;
+ transition-duration: 0.5s;
+ }
+ .justify-end {
+ justify-content: flex-end;
+ }
+ .form-row {
+ border-top: 1px solid #f2f4f9;
+ }
+ .form-row:hover {
+ background-color: #f6f7f9;
+ }
+ /* CENTER FORM SPECIFICS */
+ .form-body form {
+ display: grid;
+ grid-template-columns: 220px 1fr;
+ margin: 36px 75px;
+ grid-gap: 1em;
+ }
+ .center-form {
+ width: 450px;
+ }
+ .center-form .form-control {
+ width: 90%;
+ }
+ .center-form fieldset {
+ margin-bottom: 1em;
+ }
+}
+@media screen and (max-width:767px) {
+ .grid-row {
+ flex-direction: column;
+ }
+}
+@media screen and (max-width:767px) {
+ .form-body form {
+ grid-template-columns: 1fr;
+ margin: 20px;
+ grid-gap: 0.25em;
+ }
+ .form-label {
+ text-align: left;
+ }
+}
diff --git a/community_server/webroot/css/loginServer/style.css b/community_server/webroot/css/loginServer/style.css
new file mode 100644
index 000000000..bf5f617a7
--- /dev/null
+++ b/community_server/webroot/css/loginServer/style.css
@@ -0,0 +1,14488 @@
+.bg-inverse-primary {
+ background: rgba(4, 112, 6, .2)
+}
+
+.bg-inverse-secondary {
+ background: rgba(128, 128, 128, .2)
+}
+
+.bg-inverse-success {
+ background: rgba(0, 224, 147, .2)
+}
+
+.bg-inverse-info {
+ background: rgba(108, 97, 246, .2)
+}
+
+.bg-inverse-warning {
+ background: rgba(240, 130, 95, .2)
+}
+
+.bg-inverse-danger {
+ background: rgba(255, 95, 102, .2)
+}
+
+.bg-inverse-light {
+ background: rgba(223, 223, 223, .2)
+}
+
+.bg-inverse-dark {
+ background: rgba(116, 118, 123, .2)
+}
+
+.bg-inverse-white {
+ background: rgba(255, 255, 255, .2)
+}
+
+.bg-inverse-orange {
+ background: rgba(255, 166, 0, .2)
+}
+
+.animated {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both
+}
+
+.animated.infinite {
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite
+}
+
+@-webkit-keyframes fadeIn {
+ from {
+ opacity: 0
+ }
+
+ to {
+ opacity: 1
+ }
+
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0
+ }
+
+ to {
+ opacity: 1
+ }
+
+}
+
+.fadeIn {
+ -webkit-animation-name: fadeIn;
+ animation-name: fadeIn
+}
+
+@-webkit-keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none
+ }
+
+}
+
+@keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none
+ }
+
+}
+
+.fadeInDown {
+ -webkit-animation-name: fadeInDown;
+ animation-name: fadeInDown
+}
+
+@-webkit-keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0)
+ }
+
+}
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0)
+ }
+
+}
+
+.fadeInUp {
+ -webkit-animation-name: fadeInUp;
+ animation-name: fadeInUp
+}
+
+@-webkit-keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+@keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+.zoomIn {
+ -webkit-animation-name: zoomIn;
+ animation-name: zoomIn
+}
+
+@keyframes bounceIn {
+ 20%,
+ 40%,
+ 60%,
+ 80%,
+ from,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+ animation-timing-function: cubic-bezier(.215, .61, .355, 1)
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.4, 1.4, 1.4);
+ transform: scale3d(1.4, 1.4, 1.4)
+ }
+
+ 40% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9)
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03)
+ }
+
+ 80% {
+ -webkit-transform: scale3d(.97, .97, .97);
+ transform: scale3d(.97, .97, .97)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1)
+ }
+
+}
+
+@-webkit-keyframes rotate360 {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ -webkit-transform-origin: center;
+ transform-origin: center
+ }
+
+}
+
+@keyframes rotate360 {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ -webkit-transform-origin: center;
+ transform-origin: center
+ }
+
+}
+
+@-webkit-keyframes bounceIn {
+ 20%,
+ 40%,
+ 60%,
+ 80%,
+ from,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+ animation-timing-function: cubic-bezier(.215, .61, .355, 1)
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.4, 1.4, 1.4);
+ transform: scale3d(1.4, 1.4, 1.4)
+ }
+
+ 40% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9)
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03)
+ }
+
+ 80% {
+ -webkit-transform: scale3d(.97, .97, .97);
+ transform: scale3d(.97, .97, .97)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1)
+ }
+
+}
+
+@-webkit-keyframes ripple {
+ 0%,
+ 35% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ opacity: 1
+ }
+
+ 50% {
+ -webkit-transform: scale(.6);
+ transform: scale(.6);
+ opacity: .8
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2)
+ }
+
+}
+
+@keyframes ripple {
+ 0%,
+ 35% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ opacity: 1
+ }
+
+ 50% {
+ -webkit-transform: scale(.6);
+ transform: scale(.6);
+ opacity: .8
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2)
+ }
+
+}
+
+body,
+html {
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ letter-spacing: .03rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 400;
+ font-size: 14px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ body,
+ html {
+ font-size: calc(14px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ body,
+ html {
+ font-size: calc(15px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ body,
+ html {
+ font-size: 14px
+ }
+
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+label {
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+}
+
+label,
+p {
+ font-family: Roboto, sans-serif;
+ font-weight: 400;
+ letter-spacing: .03rem
+}
+
+a {
+ font-family: Roboto, sans-serif;
+ font-weight: 400
+}
+
+a:hover {
+ text-decoration: none
+}
+
+pre {
+ font-size: 15px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ pre {
+ font-size: calc(15px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ pre {
+ font-size: calc(16px + 0 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ pre {
+ font-size: 16px
+ }
+
+}
+
+.checkbox label,
+.radio label,
+label {
+ font-family: Roboto, sans-serif;
+ font-weight: 400
+}
+
+b {
+ font-weight: 700
+}
+
+small {
+ font-size: 14px;
+ font-family: Roboto, sans-serif;
+ font-weight: 400;
+ display: inline-block;
+ line-height: 1.4
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ small {
+ font-size: calc(14px + 0 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ small {
+ font-size: calc(14px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ small {
+ font-size: 13px
+ }
+
+}
+
+h1 {
+ font-size: 20px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ h1 {
+ font-size: calc(20px + 4 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ h1 {
+ font-size: calc(24px + 8 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ h1 {
+ font-size: 32px
+ }
+
+}
+
+h2 {
+ font-size: 19px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ h2 {
+ font-size: calc(19px + 3 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ h2 {
+ font-size: calc(22px + 7 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ h2 {
+ font-size: 29px
+ }
+
+}
+
+h3 {
+ font-size: 18px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ h3 {
+ font-size: calc(18px + 3 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ h3 {
+ font-size: calc(21px + 5 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ h3 {
+ font-size: 26px
+ }
+
+}
+
+h4 {
+ font-size: 17px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ h4 {
+ font-size: calc(17px + 2 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ h4 {
+ font-size: calc(19px + 4 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ h4 {
+ font-size: 23px
+ }
+
+}
+
+h5 {
+ font-size: 17px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ h5 {
+ font-size: calc(17px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ h5 {
+ font-size: calc(18px + 2 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ h5 {
+ font-size: 20px
+ }
+
+}
+
+h6 {
+ font-size: 16px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ h6 {
+ font-size: calc(16px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ h6 {
+ font-size: calc(17px + 1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ h6 {
+ font-size: 18px
+ }
+
+}
+
+.display-1 {
+ font-size: 26px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .display-1 {
+ font-size: calc(26px + 7 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .display-1 {
+ font-size: calc(33px + 25 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .display-1 {
+ font-size: 58px
+ }
+
+}
+
+.display-2 {
+ font-size: 24px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .display-2 {
+ font-size: calc(24px + 7 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .display-2 {
+ font-size: calc(31px + 21 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .display-2 {
+ font-size: 52px
+ }
+
+}
+
+.display-3 {
+ font-size: 23px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .display-3 {
+ font-size: calc(23px + 6 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .display-3 {
+ font-size: calc(29px + 17 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .display-3 {
+ font-size: 46px
+ }
+
+}
+
+.display-4 {
+ font-size: 22px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .display-4 {
+ font-size: calc(22px + 5 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .display-4 {
+ font-size: calc(27px + 14 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .display-4 {
+ font-size: 41px
+ }
+
+}
+
+.display-5 {
+ font-size: 21px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .display-5 {
+ font-size: calc(21px + 4 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .display-5 {
+ font-size: calc(25px + 11 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .display-5 {
+ font-size: 36px
+ }
+
+}
+
+.form-control,
+input[type=email],
+input[type=name],
+input[type=number],
+input[type=password],
+input[type=text],
+textarea {
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ font-size: 14px
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .form-control,
+ input[type=email],
+ input[type=name],
+ input[type=number],
+ input[type=password],
+ input[type=text],
+ textarea {
+ font-size: calc(14px + 0 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .form-control,
+ input[type=email],
+ input[type=name],
+ input[type=number],
+ input[type=password],
+ input[type=text],
+ textarea {
+ font-size: calc(14px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .form-control,
+ input[type=email],
+ input[type=name],
+ input[type=number],
+ input[type=password],
+ input[type=text],
+ textarea {
+ font-size: 13px
+ }
+
+}
+
+.form-control.placeholder,
+input[type=email].placeholder,
+input[type=name].placeholder,
+input[type=number].placeholder,
+input[type=password].placeholder,
+input[type=text].placeholder,
+textarea.placeholder {
+ font-family: inherit;
+ font-size: inherit;
+ color: #afb5ba;
+ font-weight: inherit
+}
+
+.form-control:-moz-placeholder,
+input[type=email]:-moz-placeholder,
+input[type=name]:-moz-placeholder,
+input[type=number]:-moz-placeholder,
+input[type=password]:-moz-placeholder,
+input[type=text]:-moz-placeholder,
+textarea:-moz-placeholder {
+ font-family: inherit;
+ font-size: inherit;
+ color: #afb5ba;
+ font-weight: inherit
+}
+
+.form-control::-moz-placeholder,
+input[type=email]::-moz-placeholder,
+input[type=name]::-moz-placeholder,
+input[type=number]::-moz-placeholder,
+input[type=password]::-moz-placeholder,
+input[type=text]::-moz-placeholder,
+textarea::-moz-placeholder {
+ font-family: inherit;
+ font-size: inherit;
+ color: #afb5ba;
+ font-weight: inherit
+}
+
+.form-control:-ms-input-placeholder,
+input[type=email]:-ms-input-placeholder,
+input[type=name]:-ms-input-placeholder,
+input[type=number]:-ms-input-placeholder,
+input[type=password]:-ms-input-placeholder,
+input[type=text]:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+ font-family: inherit;
+ font-size: inherit;
+ color: #afb5ba;
+ font-weight: inherit
+}
+
+.form-control::-webkit-input-placeholder,
+input[type=email]::-webkit-input-placeholder,
+input[type=name]::-webkit-input-placeholder,
+input[type=number]::-webkit-input-placeholder,
+input[type=password]::-webkit-input-placeholder,
+input[type=text]::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+ font-family: inherit;
+ font-size: inherit;
+ color: #afb5ba;
+ font-weight: inherit
+}
+
+.grid-title {
+ font-size: 14px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .grid-title {
+ font-size: calc(14px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .grid-title {
+ font-size: calc(15px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .grid-title {
+ font-size: 14px
+ }
+
+}
+
+.bootstrap-tagsinput .tag {
+ font-size: 14px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .bootstrap-tagsinput .tag {
+ font-size: calc(14px + 0 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .bootstrap-tagsinput .tag {
+ font-size: calc(14px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .bootstrap-tagsinput .tag {
+ font-size: 13px
+ }
+
+}
+
+.font-weight-medium {
+ font-weight: 500 !important
+}
+
+.font-weight-bold,
+.font-weight-bolder,
+.font-weight-medium {
+ letter-spacing: 1px
+}
+
+/*!
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+:root {
+ --blue: #007bff;
+ --indigo: #6610f2;
+ --purple: #6f42c1;
+ --pink: #e83e8c;
+ --red: #dc3545;
+ --orange: #fd7e14;
+ --yellow: #ffc107;
+ --green: #28a745;
+ --teal: #20c997;
+ --cyan: #17a2b8;
+ --white: #fff;
+ --gray: #6c757d;
+ --gray-dark: #343a40;
+ --primary: #047006;
+ --secondary: grey;
+ --success: #00e093;
+ --info: #6c61f6;
+ --warning: #f0825f;
+ --danger: #ff5f66;
+ --light: #dfdfdf;
+ --dark: #74767b;
+ --white: #fff;
+ --orange: #ffa600;
+ --breakpoint-xs: 0;
+ --breakpoint-sm: 576px;
+ --breakpoint-md: 768px;
+ --breakpoint-lg: 992px;
+ --breakpoint-xl: 1200px;
+ --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace
+}
+
+*,
+::after,
+::before {
+ box-sizing: border-box
+}
+
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0)
+}
+
+article,
+aside,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section {
+ display: block
+}
+
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.7;
+ color: #212529;
+ text-align: left;
+ background-color: #fff
+}
+
+[tabindex="-1"]:focus {
+ outline: 0 !important
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-top: 0;
+ margin-bottom: .5rem
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem
+}
+
+abbr[data-original-title],
+abbr[title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+ text-decoration-skip-ink: none
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit
+}
+
+dl,
+ol,
+ul {
+ margin-top: 0;
+ margin-bottom: 1rem
+}
+
+ol ol,
+ol ul,
+ul ol,
+ul ul {
+ margin-bottom: 0
+}
+
+dt {
+ font-weight: 700
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0
+}
+
+blockquote {
+ margin: 0 0 1rem
+}
+
+b,
+strong {
+ font-weight: bolder
+}
+
+small {
+ font-size: 80%
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline
+}
+
+sub {
+ bottom: -.25em
+}
+
+sup {
+ top: -.5em
+}
+
+a {
+ color: #047006;
+ text-decoration: none;
+ background-color: transparent
+}
+
+a:hover {
+ color: #012602;
+ text-decoration: underline
+}
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none
+}
+
+a:not([href]):not([tabindex]):focus,
+a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none
+}
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-size: 1em
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto
+}
+
+figure {
+ margin: 0 0 1rem
+}
+
+img {
+ vertical-align: middle;
+ border-style: none
+}
+
+svg {
+ overflow: hidden;
+ vertical-align: middle
+}
+
+table {
+ border-collapse: collapse
+}
+
+caption {
+ padding-top: 10px 15px;
+ padding-bottom: 10px 15px;
+ color: #6c757d;
+ text-align: left;
+ caption-side: bottom
+}
+
+th {
+ text-align: inherit
+}
+
+label {
+ display: inline-block;
+ margin-bottom: .5rem
+}
+
+button {
+ border-radius: 0
+}
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit
+}
+
+button,
+input {
+ overflow: visible
+}
+
+button,
+select {
+ text-transform: none
+}
+
+select {
+ word-wrap: normal
+}
+
+[type=button],
+[type=reset],
+[type=submit],
+button {
+ -webkit-appearance: button
+}
+
+[type=button]:not(:disabled),
+[type=reset]:not(:disabled),
+[type=submit]:not(:disabled),
+button:not(:disabled) {
+ cursor: pointer
+}
+
+[type=button]::-moz-focus-inner,
+[type=reset]::-moz-focus-inner,
+[type=submit]::-moz-focus-inner,
+button::-moz-focus-inner {
+ padding: 0;
+ border-style: none
+}
+
+input[type=checkbox],
+input[type=radio] {
+ box-sizing: border-box;
+ padding: 0
+}
+
+input[type=date],
+input[type=datetime-local],
+input[type=month],
+input[type=time] {
+ -webkit-appearance: listbox
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal
+}
+
+progress {
+ vertical-align: baseline
+}
+
+[type=number]::-webkit-inner-spin-button,
+[type=number]::-webkit-outer-spin-button {
+ height: auto
+}
+
+[type=search] {
+ outline-offset: -2px;
+ -webkit-appearance: none
+}
+
+[type=search]::-webkit-search-decoration {
+ -webkit-appearance: none
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button
+}
+
+output {
+ display: inline-block
+}
+
+summary {
+ display: list-item;
+ cursor: pointer
+}
+
+template {
+ display: none
+}
+
+[hidden] {
+ display: none !important
+}
+
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-bottom: .5rem;
+ font-weight: 500;
+ line-height: 1.2
+}
+
+.h1,
+h1 {
+ font-size: 2.5rem
+}
+
+.h2,
+h2 {
+ font-size: 2rem
+}
+
+.h3,
+h3 {
+ font-size: 1.75rem
+}
+
+.h4,
+h4 {
+ font-size: 1.5rem
+}
+
+.h5,
+h5 {
+ font-size: 1.25rem
+}
+
+.h6,
+h6 {
+ font-size: 1rem
+}
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300
+}
+
+.display-1 {
+ font-size: 6rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+.display-2 {
+ font-size: 5.5rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+.display-3 {
+ font-size: 4.5rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+.display-4 {
+ font-size: 3.5rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: 1px solid rgba(0, 0, 0, .1)
+}
+
+.small,
+small {
+ font-size: 80%;
+ font-weight: 400
+}
+
+.mark,
+mark {
+ padding: .2em;
+ background-color: #fcf8e3
+}
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none
+}
+
+.list-inline {
+ padding-left: 0;
+ list-style: none
+}
+
+.list-inline-item {
+ display: inline-block
+}
+
+.list-inline-item:not(:last-child) {
+ margin-right: .5rem
+}
+
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase
+}
+
+.blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem
+}
+
+.blockquote-footer {
+ display: block;
+ font-size: 80%;
+ color: #6c757d
+}
+
+.blockquote-footer::before {
+ content: "\2014\00A0"
+}
+
+.img-fluid {
+ max-width: 100%;
+ height: auto
+}
+
+.img-thumbnail {
+ padding: .25rem;
+ background-color: #fff;
+ border: 1px solid #dee2e6;
+ border-radius: .25rem;
+ max-width: 100%;
+ height: auto
+}
+
+.figure {
+ display: inline-block
+}
+
+.figure-img {
+ margin-bottom: .5rem;
+ line-height: 1
+}
+
+.figure-caption {
+ font-size: 90%;
+ color: #6c757d
+}
+
+code {
+ font-size: 90%;
+ color: #bd4147;
+ word-break: break-word
+}
+
+a>code {
+ color: inherit
+}
+
+kbd {
+ padding: .2rem .4rem;
+ font-size: 87.5%;
+ color: #fff;
+ background-color: #212529;
+ border-radius: .2rem
+}
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 700
+}
+
+pre {
+ display: block;
+ font-size: 90%;
+ color: #212529
+}
+
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll
+}
+
+.container {
+ width: 100%;
+ padding-right: 10px;
+ padding-left: 10px;
+ margin-right: auto;
+ margin-left: auto
+}
+
+@media (min-width:576px) {
+ .container {
+ max-width: 540px
+ }
+
+}
+
+@media (min-width:768px) {
+ .container {
+ max-width: 720px
+ }
+
+}
+
+@media (min-width:992px) {
+ .container {
+ max-width: 960px
+ }
+
+}
+
+@media (min-width:1200px) {
+ .container {
+ max-width: 1140px
+ }
+
+}
+
+.container-fluid {
+ width: 100%;
+ padding-right: 10px;
+ padding-left: 10px;
+ margin-right: auto;
+ margin-left: auto
+}
+
+.row {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -10px;
+ margin-left: -10px
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0
+}
+
+.no-gutters>.col,
+.no-gutters>[class*=col-] {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.col,
+.col-1,
+.col-10,
+.col-11,
+.col-12,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-auto,
+.col-lg,
+.col-lg-1,
+.col-lg-10,
+.col-lg-11,
+.col-lg-12,
+.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-auto,
+.col-md,
+.col-md-1,
+.col-md-10,
+.col-md-11,
+.col-md-12,
+.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-auto,
+.col-sm,
+.col-sm-1,
+.col-sm-10,
+.col-sm-11,
+.col-sm-12,
+.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-auto,
+.col-xl,
+.col-xl-1,
+.col-xl-10,
+.col-xl-11,
+.col-xl-12,
+.col-xl-2,
+.col-xl-3,
+.col-xl-4,
+.col-xl-5,
+.col-xl-6,
+.col-xl-7,
+.col-xl-8,
+.col-xl-9,
+.col-xl-auto {
+ position: relative;
+ width: 100%;
+ padding-right: 10px;
+ padding-left: 10px
+}
+
+.col {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+}
+
+.col-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+}
+
+.col-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+}
+
+.col-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+}
+
+.col-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+}
+
+.col-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+}
+
+.col-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+}
+
+.col-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+}
+
+.col-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+}
+
+.col-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+}
+
+.col-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+}
+
+.col-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+}
+
+.col-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+}
+
+.col-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+}
+
+.order-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+}
+
+.order-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+}
+
+.order-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+}
+
+.order-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+}
+
+.order-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+}
+
+.order-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+}
+
+.order-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+}
+
+.order-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+}
+
+.order-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+}
+
+.order-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+}
+
+.order-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+}
+
+.order-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+}
+
+.order-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+}
+
+.order-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+}
+
+.order-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+}
+
+.offset-1 {
+ margin-left: 8.33333%
+}
+
+.offset-2 {
+ margin-left: 16.66667%
+}
+
+.offset-3 {
+ margin-left: 25%
+}
+
+.offset-4 {
+ margin-left: 33.33333%
+}
+
+.offset-5 {
+ margin-left: 41.66667%
+}
+
+.offset-6 {
+ margin-left: 50%
+}
+
+.offset-7 {
+ margin-left: 58.33333%
+}
+
+.offset-8 {
+ margin-left: 66.66667%
+}
+
+.offset-9 {
+ margin-left: 75%
+}
+
+.offset-10 {
+ margin-left: 83.33333%
+}
+
+.offset-11 {
+ margin-left: 91.66667%
+}
+
+@media (min-width:576px) {
+ .col-sm {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-sm-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-sm-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-sm-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-sm-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-sm-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-sm-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-sm-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-sm-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-sm-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-sm-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-sm-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-sm-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-sm-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-sm-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-sm-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-sm-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-sm-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-sm-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-sm-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-sm-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-sm-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-sm-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-sm-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-sm-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-sm-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-sm-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-sm-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-sm-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-sm-0 {
+ margin-left: 0
+ }
+
+ .offset-sm-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-sm-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-sm-3 {
+ margin-left: 25%
+ }
+
+ .offset-sm-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-sm-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-sm-6 {
+ margin-left: 50%
+ }
+
+ .offset-sm-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-sm-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-sm-9 {
+ margin-left: 75%
+ }
+
+ .offset-sm-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-sm-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+@media (min-width:768px) {
+ .col-md {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-md-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-md-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-md-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-md-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-md-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-md-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-md-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-md-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-md-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-md-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-md-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-md-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-md-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-md-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-md-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-md-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-md-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-md-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-md-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-md-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-md-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-md-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-md-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-md-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-md-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-md-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-md-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-md-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-md-0 {
+ margin-left: 0
+ }
+
+ .offset-md-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-md-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-md-3 {
+ margin-left: 25%
+ }
+
+ .offset-md-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-md-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-md-6 {
+ margin-left: 50%
+ }
+
+ .offset-md-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-md-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-md-9 {
+ margin-left: 75%
+ }
+
+ .offset-md-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-md-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+@media (min-width:992px) {
+ .col-lg {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-lg-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-lg-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-lg-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-lg-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-lg-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-lg-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-lg-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-lg-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-lg-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-lg-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-lg-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-lg-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-lg-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-lg-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-lg-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-lg-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-lg-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-lg-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-lg-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-lg-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-lg-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-lg-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-lg-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-lg-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-lg-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-lg-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-lg-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-lg-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-lg-0 {
+ margin-left: 0
+ }
+
+ .offset-lg-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-lg-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-lg-3 {
+ margin-left: 25%
+ }
+
+ .offset-lg-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-lg-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-lg-6 {
+ margin-left: 50%
+ }
+
+ .offset-lg-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-lg-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-lg-9 {
+ margin-left: 75%
+ }
+
+ .offset-lg-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-lg-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+@media (min-width:1200px) {
+ .col-xl {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-xl-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-xl-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-xl-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-xl-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-xl-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-xl-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-xl-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-xl-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-xl-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-xl-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-xl-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-xl-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-xl-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-xl-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-xl-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-xl-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-xl-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-xl-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-xl-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-xl-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-xl-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-xl-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-xl-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-xl-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-xl-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-xl-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-xl-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-xl-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-xl-0 {
+ margin-left: 0
+ }
+
+ .offset-xl-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-xl-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-xl-3 {
+ margin-left: 25%
+ }
+
+ .offset-xl-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-xl-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-xl-6 {
+ margin-left: 50%
+ }
+
+ .offset-xl-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-xl-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-xl-9 {
+ margin-left: 75%
+ }
+
+ .offset-xl-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-xl-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+.table {
+ width: 100%;
+ margin-bottom: 1rem;
+ color: #212529
+}
+
+.table td,
+.table th {
+ padding: 10px 15px;
+ vertical-align: top;
+ border-top: 1px solid #f2f4f9
+}
+
+.table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #f2f4f9
+}
+
+.table tbody+tbody {
+ border-top: 2px solid #f2f4f9
+}
+
+.table-sm td,
+.table-sm th {
+ padding: 10px 15px
+}
+
+.table-bordered {
+ border: 1px solid #f2f4f9
+}
+
+.table-bordered td,
+.table-bordered th {
+ border: 1px solid #f2f4f9
+}
+
+.table-bordered thead td,
+.table-bordered thead th {
+ border-bottom-width: 2px
+}
+
+.table-borderless tbody+tbody,
+.table-borderless td,
+.table-borderless th,
+.table-borderless thead th {
+ border: 0
+}
+
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: #f6f7f9
+}
+
+.table-hover tbody tr:hover {
+ color: #212529;
+ background-color: #f6f7f9
+}
+
+.table-primary,
+.table-primary>td,
+.table-primary>th {
+ background-color: #b9d7b9
+}
+
+.table-primary tbody+tbody,
+.table-primary td,
+.table-primary th,
+.table-primary thead th {
+ border-color: #7cb57e
+}
+
+.table-hover .table-primary:hover {
+ background-color: #a9cea9
+}
+
+.table-hover .table-primary:hover>td,
+.table-hover .table-primary:hover>th {
+ background-color: #a9cea9
+}
+
+.table-secondary,
+.table-secondary>td,
+.table-secondary>th {
+ background-color: #dbdbdb
+}
+
+.table-secondary tbody+tbody,
+.table-secondary td,
+.table-secondary th,
+.table-secondary thead th {
+ border-color: #bdbdbd
+}
+
+.table-hover .table-secondary:hover {
+ background-color: #cecece
+}
+
+.table-hover .table-secondary:hover>td,
+.table-hover .table-secondary:hover>th {
+ background-color: #cecece
+}
+
+.table-success,
+.table-success>td,
+.table-success>th {
+ background-color: #b8f6e1
+}
+
+.table-success tbody+tbody,
+.table-success td,
+.table-success th,
+.table-success thead th {
+ border-color: #7aefc7
+}
+
+.table-hover .table-success:hover {
+ background-color: #a1f3d7
+}
+
+.table-hover .table-success:hover>td,
+.table-hover .table-success:hover>th {
+ background-color: #a1f3d7
+}
+
+.table-info,
+.table-info>td,
+.table-info>th {
+ background-color: #d6d3fc
+}
+
+.table-info tbody+tbody,
+.table-info td,
+.table-info th,
+.table-info thead th {
+ border-color: #b3adfa
+}
+
+.table-hover .table-info:hover {
+ background-color: #c0bbfa
+}
+
+.table-hover .table-info:hover>td,
+.table-hover .table-info:hover>th {
+ background-color: #c0bbfa
+}
+
+.table-warning,
+.table-warning>td,
+.table-warning>th {
+ background-color: #fbdcd2
+}
+
+.table-warning tbody+tbody,
+.table-warning td,
+.table-warning th,
+.table-warning thead th {
+ border-color: #f7beac
+}
+
+.table-hover .table-warning:hover {
+ background-color: #f9cabb
+}
+
+.table-hover .table-warning:hover>td,
+.table-hover .table-warning:hover>th {
+ background-color: #f9cabb
+}
+
+.table-danger,
+.table-danger>td,
+.table-danger>th {
+ background-color: #ffd2d4
+}
+
+.table-danger tbody+tbody,
+.table-danger td,
+.table-danger th,
+.table-danger thead th {
+ border-color: #ffacaf
+}
+
+.table-hover .table-danger:hover {
+ background-color: #ffb9bc
+}
+
+.table-hover .table-danger:hover>td,
+.table-hover .table-danger:hover>th {
+ background-color: #ffb9bc
+}
+
+.table-light,
+.table-light>td,
+.table-light>th {
+ background-color: #f6f6f6
+}
+
+.table-light tbody+tbody,
+.table-light td,
+.table-light th,
+.table-light thead th {
+ border-color: #eee
+}
+
+.table-hover .table-light:hover {
+ background-color: #e9e9e9
+}
+
+.table-hover .table-light:hover>td,
+.table-hover .table-light:hover>th {
+ background-color: #e9e9e9
+}
+
+.table-dark,
+.table-dark>td,
+.table-dark>th {
+ background-color: #d8d9da
+}
+
+.table-dark tbody+tbody,
+.table-dark td,
+.table-dark th,
+.table-dark thead th {
+ border-color: #b7b8ba
+}
+
+.table-hover .table-dark:hover {
+ background-color: #cbccce
+}
+
+.table-hover .table-dark:hover>td,
+.table-hover .table-dark:hover>th {
+ background-color: #cbccce
+}
+
+.table-white,
+.table-white>td,
+.table-white>th {
+ background-color: #fff
+}
+
+.table-white tbody+tbody,
+.table-white td,
+.table-white th,
+.table-white thead th {
+ border-color: #fff
+}
+
+.table-hover .table-white:hover {
+ background-color: #f2f2f2
+}
+
+.table-hover .table-white:hover>td,
+.table-hover .table-white:hover>th {
+ background-color: #f2f2f2
+}
+
+.table-orange,
+.table-orange>td,
+.table-orange>th {
+ background-color: #ffe6b8
+}
+
+.table-orange tbody+tbody,
+.table-orange td,
+.table-orange th,
+.table-orange thead th {
+ border-color: #ffd17a
+}
+
+.table-hover .table-orange:hover {
+ background-color: #ffdd9f
+}
+
+.table-hover .table-orange:hover>td,
+.table-hover .table-orange:hover>th {
+ background-color: #ffdd9f
+}
+
+.table-active,
+.table-active>td,
+.table-active>th {
+ background-color: rgba(0, 0, 0, .075)
+}
+
+.table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, .075)
+}
+
+.table-hover .table-active:hover>td,
+.table-hover .table-active:hover>th {
+ background-color: rgba(0, 0, 0, .075)
+}
+
+.table .thead-dark th {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #454d55
+}
+
+.table .thead-light th {
+ color: #495057;
+ background-color: #e1e4e6;
+ border-color: #f2f4f9
+}
+
+.table-dark {
+ color: #fff;
+ background-color: #343a40
+}
+
+.table-dark td,
+.table-dark th,
+.table-dark thead th {
+ border-color: #454d55
+}
+
+.table-dark.table-bordered {
+ border: 0
+}
+
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(255, 255, 255, .05)
+}
+
+.table-dark.table-hover tbody tr:hover {
+ color: #fff;
+ background-color: rgba(255, 255, 255, .075)
+}
+
+@media (max-width:575.98px) {
+ .table-responsive-sm {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-sm>.table-bordered {
+ border: 0
+ }
+
+}
+
+@media (max-width:767.98px) {
+ .table-responsive-md {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-md>.table-bordered {
+ border: 0
+ }
+
+}
+
+@media (max-width:991.98px) {
+ .table-responsive-lg {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-lg>.table-bordered {
+ border: 0
+ }
+
+}
+
+@media (max-width:1199.98px) {
+ .table-responsive-xl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-xl>.table-bordered {
+ border: 0
+ }
+
+}
+
+.table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+}
+
+.table-responsive>.table-bordered {
+ border: 0
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ padding: .375rem .75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #6c757d;
+ background-color: #f6f7f9;
+ background-clip: padding-box;
+ border: 1px solid #f0f2f5;
+ border-radius: .25rem;
+ -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .form-control {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0
+}
+
+.form-control:focus {
+ color: #495057;
+ background-color: #f6f7f9;
+ border-color: #d7dee5;
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control::-moz-placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control::-ms-input-placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control::placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control:disabled,
+.form-control[readonly] {
+ background-color: #f8f9fa;
+ opacity: 1
+}
+
+select.form-control:focus::-ms-value {
+ color: #6c757d;
+ background-color: #f6f7f9
+}
+
+.form-control-file,
+.form-control-range {
+ display: block;
+ width: 100%
+}
+
+.col-form-label {
+ padding-top: calc(.375rem + 1px);
+ padding-bottom: calc(.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5
+}
+
+.col-form-label-lg {
+ padding-top: calc(.5rem + 1px);
+ padding-bottom: calc(.5rem + 1px);
+ font-size: 1.25rem;
+ line-height: 1.5
+}
+
+.col-form-label-sm {
+ padding-top: calc(.25rem + 1px);
+ padding-bottom: calc(.25rem + 1px);
+ font-size: .875rem;
+ line-height: 1.5
+}
+
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding-top: .375rem;
+ padding-bottom: .375rem;
+ margin-bottom: 0;
+ line-height: 1.5;
+ color: #212529;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0
+}
+
+.form-control-plaintext.form-control-lg,
+.form-control-plaintext.form-control-sm {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.form-control-sm {
+ height: calc(1.5em + .5rem + 2px);
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem
+}
+
+.form-control-lg {
+ height: calc(1.5em + 1rem + 2px);
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem
+}
+
+select.form-control[multiple],
+select.form-control[size] {
+ height: auto
+}
+
+textarea.form-control {
+ height: auto
+}
+
+.form-group {
+ margin-bottom: 1rem
+}
+
+.form-text {
+ display: block;
+ margin-top: .25rem
+}
+
+.form-row {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px
+}
+
+.form-row>.col,
+.form-row>[class*=col-] {
+ padding-right: 5px;
+ padding-left: 5px
+}
+
+.form-check {
+ position: relative;
+ display: block;
+ padding-left: 1.25rem
+}
+
+.form-check-input {
+ position: absolute;
+ margin-top: .3rem;
+ margin-left: -1.25rem
+}
+
+.form-check-input:disabled~.form-check-label {
+ color: #adb5bd
+}
+
+.form-check-label {
+ margin-bottom: 0
+}
+
+.form-check-inline {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ -webkit-box-align: center;
+ align-items: center;
+ padding-left: 0;
+ margin-right: .75rem
+}
+
+.form-check-inline .form-check-input {
+ position: static;
+ margin-top: 0;
+ margin-right: .3125rem;
+ margin-left: 0
+}
+
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: .25rem;
+ font-size: 80%;
+ color: #28a745
+}
+
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: .25rem .5rem;
+ margin-top: .1rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ color: #fff;
+ background-color: rgba(40, 167, 69, .9);
+ border-radius: .25rem
+}
+
+.form-control.is-valid,
+.was-validated .form-control:valid {
+ border-color: #28a745;
+ padding-right: calc(1.5em + .75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: center right calc(.375em + .1875rem);
+ background-size: calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.form-control.is-valid:focus,
+.was-validated .form-control:valid:focus {
+ border-color: #28a745;
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.form-control.is-valid~.valid-feedback,
+.form-control.is-valid~.valid-tooltip,
+.was-validated .form-control:valid~.valid-feedback,
+.was-validated .form-control:valid~.valid-tooltip {
+ display: block
+}
+
+.was-validated textarea.form-control:valid,
+textarea.form-control.is-valid {
+ padding-right: calc(1.5em + .75rem);
+ background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem)
+}
+
+.custom-select.is-valid,
+.was-validated .custom-select:valid {
+ border-color: #28a745;
+ padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem);
+ background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.custom-select.is-valid:focus,
+.was-validated .custom-select:valid:focus {
+ border-color: #28a745;
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.custom-select.is-valid~.valid-feedback,
+.custom-select.is-valid~.valid-tooltip,
+.was-validated .custom-select:valid~.valid-feedback,
+.was-validated .custom-select:valid~.valid-tooltip {
+ display: block
+}
+
+.form-control-file.is-valid~.valid-feedback,
+.form-control-file.is-valid~.valid-tooltip,
+.was-validated .form-control-file:valid~.valid-feedback,
+.was-validated .form-control-file:valid~.valid-tooltip {
+ display: block
+}
+
+.form-check-input.is-valid~.form-check-label,
+.was-validated .form-check-input:valid~.form-check-label {
+ color: #28a745
+}
+
+.form-check-input.is-valid~.valid-feedback,
+.form-check-input.is-valid~.valid-tooltip,
+.was-validated .form-check-input:valid~.valid-feedback,
+.was-validated .form-check-input:valid~.valid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-valid~.custom-control-label,
+.was-validated .custom-control-input:valid~.custom-control-label {
+ color: #28a745
+}
+
+.custom-control-input.is-valid~.custom-control-label::before,
+.was-validated .custom-control-input:valid~.custom-control-label::before {
+ border-color: #28a745
+}
+
+.custom-control-input.is-valid~.valid-feedback,
+.custom-control-input.is-valid~.valid-tooltip,
+.was-validated .custom-control-input:valid~.valid-feedback,
+.was-validated .custom-control-input:valid~.valid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-valid:checked~.custom-control-label::before,
+.was-validated .custom-control-input:valid:checked~.custom-control-label::before {
+ border-color: #34ce57;
+ background-color: #34ce57
+}
+
+.custom-control-input.is-valid:focus~.custom-control-label::before,
+.was-validated .custom-control-input:valid:focus~.custom-control-label::before {
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,
+.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before {
+ border-color: #28a745
+}
+
+.custom-file-input.is-valid~.custom-file-label,
+.was-validated .custom-file-input:valid~.custom-file-label {
+ border-color: #28a745
+}
+
+.custom-file-input.is-valid~.valid-feedback,
+.custom-file-input.is-valid~.valid-tooltip,
+.was-validated .custom-file-input:valid~.valid-feedback,
+.was-validated .custom-file-input:valid~.valid-tooltip {
+ display: block
+}
+
+.custom-file-input.is-valid:focus~.custom-file-label,
+.was-validated .custom-file-input:valid:focus~.custom-file-label {
+ border-color: #28a745;
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: .25rem;
+ font-size: 80%;
+ color: #dc3545
+}
+
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: .25rem .5rem;
+ margin-top: .1rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ color: #fff;
+ background-color: rgba(220, 53, 69, .9);
+ border-radius: .25rem
+}
+
+.form-control.is-invalid,
+.was-validated .form-control:invalid {
+ border-color: #dc3545;
+ padding-right: calc(1.5em + .75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E");
+ background-repeat: no-repeat;
+ background-position: center right calc(.375em + .1875rem);
+ background-size: calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.form-control.is-invalid:focus,
+.was-validated .form-control:invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.form-control.is-invalid~.invalid-feedback,
+.form-control.is-invalid~.invalid-tooltip,
+.was-validated .form-control:invalid~.invalid-feedback,
+.was-validated .form-control:invalid~.invalid-tooltip {
+ display: block
+}
+
+.was-validated textarea.form-control:invalid,
+textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + .75rem);
+ background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem)
+}
+
+.custom-select.is-invalid,
+.was-validated .custom-select:invalid {
+ border-color: #dc3545;
+ padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem);
+ background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.custom-select.is-invalid:focus,
+.was-validated .custom-select:invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.custom-select.is-invalid~.invalid-feedback,
+.custom-select.is-invalid~.invalid-tooltip,
+.was-validated .custom-select:invalid~.invalid-feedback,
+.was-validated .custom-select:invalid~.invalid-tooltip {
+ display: block
+}
+
+.form-control-file.is-invalid~.invalid-feedback,
+.form-control-file.is-invalid~.invalid-tooltip,
+.was-validated .form-control-file:invalid~.invalid-feedback,
+.was-validated .form-control-file:invalid~.invalid-tooltip {
+ display: block
+}
+
+.form-check-input.is-invalid~.form-check-label,
+.was-validated .form-check-input:invalid~.form-check-label {
+ color: #dc3545
+}
+
+.form-check-input.is-invalid~.invalid-feedback,
+.form-check-input.is-invalid~.invalid-tooltip,
+.was-validated .form-check-input:invalid~.invalid-feedback,
+.was-validated .form-check-input:invalid~.invalid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-invalid~.custom-control-label,
+.was-validated .custom-control-input:invalid~.custom-control-label {
+ color: #dc3545
+}
+
+.custom-control-input.is-invalid~.custom-control-label::before,
+.was-validated .custom-control-input:invalid~.custom-control-label::before {
+ border-color: #dc3545
+}
+
+.custom-control-input.is-invalid~.invalid-feedback,
+.custom-control-input.is-invalid~.invalid-tooltip,
+.was-validated .custom-control-input:invalid~.invalid-feedback,
+.was-validated .custom-control-input:invalid~.invalid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-invalid:checked~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:checked~.custom-control-label::before {
+ border-color: #e4606d;
+ background-color: #e4606d
+}
+
+.custom-control-input.is-invalid:focus~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:focus~.custom-control-label::before {
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before {
+ border-color: #dc3545
+}
+
+.custom-file-input.is-invalid~.custom-file-label,
+.was-validated .custom-file-input:invalid~.custom-file-label {
+ border-color: #dc3545
+}
+
+.custom-file-input.is-invalid~.invalid-feedback,
+.custom-file-input.is-invalid~.invalid-tooltip,
+.was-validated .custom-file-input:invalid~.invalid-feedback,
+.was-validated .custom-file-input:invalid~.invalid-tooltip {
+ display: block
+}
+
+.custom-file-input.is-invalid:focus~.custom-file-label,
+.was-validated .custom-file-input:invalid:focus~.custom-file-label {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.form-inline {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.form-inline .form-check {
+ width: 100%
+}
+
+@media (min-width:576px) {
+ .form-inline label {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ margin-bottom: 0
+ }
+
+ .form-inline .form-group {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ align-items: center;
+ margin-bottom: 0
+ }
+
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle
+ }
+
+ .form-inline .form-control-plaintext {
+ display: inline-block
+ }
+
+ .form-inline .custom-select,
+ .form-inline .input-group {
+ width: auto
+ }
+
+ .form-inline .form-check {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ width: auto;
+ padding-left: 0
+ }
+
+ .form-inline .form-check-input {
+ position: relative;
+ flex-shrink: 0;
+ margin-top: 0;
+ margin-right: .25rem;
+ margin-left: 0
+ }
+
+ .form-inline .custom-control {
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center
+ }
+
+ .form-inline .custom-control-label {
+ margin-bottom: 0
+ }
+
+}
+
+.btn {
+ display: inline-block;
+ font-weight: 400;
+ color: #212529;
+ text-align: center;
+ vertical-align: middle;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: transparent;
+ border: 1px solid transparent;
+ padding: .375rem .75rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ border-radius: .25rem;
+ -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .btn {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.btn:hover {
+ color: #212529;
+ text-decoration: none
+}
+
+.btn.focus,
+.btn:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.btn.disabled,
+.btn:disabled {
+ opacity: .65
+}
+
+a.btn.disabled,
+fieldset:disabled a.btn {
+ pointer-events: none
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #034b04;
+ border-color: #023f03
+}
+
+.btn-primary.focus,
+.btn-primary:focus {
+ box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5)
+}
+
+.btn-primary.disabled,
+.btn-primary:disabled {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-primary:not(:disabled):not(.disabled).active,
+.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #023f03;
+ border-color: #023203
+}
+
+.btn-primary:not(:disabled):not(.disabled).active:focus,
+.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5)
+}
+
+.btn-secondary {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-secondary:hover {
+ color: #fff;
+ background-color: #6d6d6d;
+ border-color: #676767
+}
+
+.btn-secondary.focus,
+.btn-secondary:focus {
+ box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5)
+}
+
+.btn-secondary.disabled,
+.btn-secondary:disabled {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-secondary:not(:disabled):not(.disabled).active,
+.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #676767;
+ border-color: #606060
+}
+
+.btn-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5)
+}
+
+.btn-success {
+ color: #fff;
+ background-color: #00e093;
+ border-color: #00e093
+}
+
+.btn-success:hover {
+ color: #fff;
+ background-color: #00ba7a;
+ border-color: #00ad72
+}
+
+.btn-success.focus,
+.btn-success:focus {
+ box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5)
+}
+
+.btn-success.disabled,
+.btn-success:disabled {
+ color: #fff;
+ background-color: #00e093;
+ border-color: #00e093
+}
+
+.btn-success:not(:disabled):not(.disabled).active,
+.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #00ad72;
+ border-color: #00a069
+}
+
+.btn-success:not(:disabled):not(.disabled).active:focus,
+.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5)
+}
+
+.btn-info {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-info:hover {
+ color: #fff;
+ background-color: #4a3df4;
+ border-color: #3f31f3
+}
+
+.btn-info.focus,
+.btn-info:focus {
+ box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5)
+}
+
+.btn-info.disabled,
+.btn-info:disabled {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-info:not(:disabled):not(.disabled).active,
+.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #3f31f3;
+ border-color: #3425f3
+}
+
+.btn-info:not(:disabled):not(.disabled).active:focus,
+.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5)
+}
+
+.btn-warning {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-warning:hover {
+ color: #fff;
+ background-color: #ed673c;
+ border-color: #ec5e30
+}
+
+.btn-warning.focus,
+.btn-warning:focus {
+ box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5)
+}
+
+.btn-warning.disabled,
+.btn-warning:disabled {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-warning:not(:disabled):not(.disabled).active,
+.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec5e30;
+ border-color: #eb5425
+}
+
+.btn-warning:not(:disabled):not(.disabled).active:focus,
+.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5)
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-danger:hover {
+ color: #fff;
+ background-color: #ff3941;
+ border-color: #ff2c35
+}
+
+.btn-danger.focus,
+.btn-danger:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5)
+}
+
+.btn-danger.disabled,
+.btn-danger:disabled {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-danger:not(:disabled):not(.disabled).active,
+.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #ff2c35;
+ border-color: #ff1f29
+}
+
+.btn-danger:not(:disabled):not(.disabled).active:focus,
+.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5)
+}
+
+.btn-light {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-light:hover {
+ color: #212529;
+ background-color: #ccc;
+ border-color: #c6c6c6
+}
+
+.btn-light.focus,
+.btn-light:focus {
+ box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5)
+}
+
+.btn-light.disabled,
+.btn-light:disabled {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-light:not(:disabled):not(.disabled).active,
+.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle {
+ color: #212529;
+ background-color: #c6c6c6;
+ border-color: #bfbfbf
+}
+
+.btn-light:not(:disabled):not(.disabled).active:focus,
+.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5)
+}
+
+.btn-dark {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-dark:hover {
+ color: #fff;
+ background-color: #616367;
+ border-color: #5b5d61
+}
+
+.btn-dark.focus,
+.btn-dark:focus {
+ box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5)
+}
+
+.btn-dark.disabled,
+.btn-dark:disabled {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-dark:not(:disabled):not(.disabled).active,
+.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #5b5d61;
+ border-color: #55575a
+}
+
+.btn-dark:not(:disabled):not(.disabled).active:focus,
+.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5)
+}
+
+.btn-white {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-white:hover {
+ color: #212529;
+ background-color: #ececec;
+ border-color: #e6e6e6
+}
+
+.btn-white.focus,
+.btn-white:focus {
+ box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5)
+}
+
+.btn-white.disabled,
+.btn-white:disabled {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-white:not(:disabled):not(.disabled).active,
+.btn-white:not(:disabled):not(.disabled):active,.show>.btn-white.dropdown-toggle {
+ color: #212529;
+ background-color: #e6e6e6;
+ border-color: #dfdfdf
+}
+
+.btn-white:not(:disabled):not(.disabled).active:focus,
+.btn-white:not(:disabled):not(.disabled):active:focus,.show>.btn-white.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5)
+}
+
+.btn-orange {
+ color: #212529;
+ background-color: #ffa600;
+ border-color: #ffa600
+}
+
+.btn-orange:hover {
+ color: #fff;
+ background-color: #d98d00;
+ border-color: #cc8500
+}
+
+.btn-orange.focus,
+.btn-orange:focus {
+ box-shadow: 0 0 0 .2rem rgba(222, 147, 6, .5)
+}
+
+.btn-orange.disabled,
+.btn-orange:disabled {
+ color: #212529;
+ background-color: #ffa600;
+ border-color: #ffa600
+}
+
+.btn-orange:not(:disabled):not(.disabled).active,
+.btn-orange:not(:disabled):not(.disabled):active,.show>.btn-orange.dropdown-toggle {
+ color: #fff;
+ background-color: #cc8500;
+ border-color: #bf7d00
+}
+
+.btn-orange:not(:disabled):not(.disabled).active:focus,
+.btn-orange:not(:disabled):not(.disabled):active:focus,.show>.btn-orange.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(222, 147, 6, .5)
+}
+
+.btn-outline-primary {
+ color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-primary:hover {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-primary.focus,
+.btn-outline-primary:focus {
+ box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5)
+}
+
+.btn-outline-primary.disabled,
+.btn-outline-primary:disabled {
+ color: #047006;
+ background-color: transparent
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled).active,
+.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5)
+}
+
+.btn-outline-secondary {
+ color: grey;
+ border-color: grey
+}
+
+.btn-outline-secondary:hover {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-outline-secondary.focus,
+.btn-outline-secondary:focus {
+ box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5)
+}
+
+.btn-outline-secondary.disabled,
+.btn-outline-secondary:disabled {
+ color: grey;
+ background-color: transparent
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active,
+.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5)
+}
+
+.btn-outline-success {
+ color: #00e093;
+ border-color: #00e093
+}
+
+.btn-outline-success:hover {
+ color: #fff;
+ background-color: #00e093;
+ border-color: #00e093
+}
+
+.btn-outline-success.focus,
+.btn-outline-success:focus {
+ box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5)
+}
+
+.btn-outline-success.disabled,
+.btn-outline-success:disabled {
+ color: #00e093;
+ background-color: transparent
+}
+
+.btn-outline-success:not(:disabled):not(.disabled).active,
+.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle {
+ color: #fff;
+ background-color: #00e093;
+ border-color: #00e093
+}
+
+.btn-outline-success:not(:disabled):not(.disabled).active:focus,
+.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5)
+}
+
+.btn-outline-info {
+ color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-outline-info:hover {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-outline-info.focus,
+.btn-outline-info:focus {
+ box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5)
+}
+
+.btn-outline-info.disabled,
+.btn-outline-info:disabled {
+ color: #6c61f6;
+ background-color: transparent
+}
+
+.btn-outline-info:not(:disabled):not(.disabled).active,
+.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-outline-info:not(:disabled):not(.disabled).active:focus,
+.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5)
+}
+
+.btn-outline-warning {
+ color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-outline-warning:hover {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-outline-warning.focus,
+.btn-outline-warning:focus {
+ box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5)
+}
+
+.btn-outline-warning.disabled,
+.btn-outline-warning:disabled {
+ color: #f0825f;
+ background-color: transparent
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled).active,
+.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled).active:focus,
+.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5)
+}
+
+.btn-outline-danger {
+ color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-outline-danger:hover {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-outline-danger.focus,
+.btn-outline-danger:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5)
+}
+
+.btn-outline-danger.disabled,
+.btn-outline-danger:disabled {
+ color: #ff5f66;
+ background-color: transparent
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled).active,
+.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled).active:focus,
+.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5)
+}
+
+.btn-outline-light {
+ color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-outline-light:hover {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-outline-light.focus,
+.btn-outline-light:focus {
+ box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5)
+}
+
+.btn-outline-light.disabled,
+.btn-outline-light:disabled {
+ color: #dfdfdf;
+ background-color: transparent
+}
+
+.btn-outline-light:not(:disabled):not(.disabled).active,
+.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-outline-light:not(:disabled):not(.disabled).active:focus,
+.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5)
+}
+
+.btn-outline-dark {
+ color: #74767b;
+ border-color: #74767b
+}
+
+.btn-outline-dark:hover {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-outline-dark.focus,
+.btn-outline-dark:focus {
+ box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5)
+}
+
+.btn-outline-dark.disabled,
+.btn-outline-dark:disabled {
+ color: #74767b;
+ background-color: transparent
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled).active,
+.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled).active:focus,
+.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5)
+}
+
+.btn-outline-white {
+ color: #fff;
+ border-color: #fff
+}
+
+.btn-outline-white:hover {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-outline-white.focus,
+.btn-outline-white:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5)
+}
+
+.btn-outline-white.disabled,
+.btn-outline-white:disabled {
+ color: #fff;
+ background-color: transparent
+}
+
+.btn-outline-white:not(:disabled):not(.disabled).active,
+.btn-outline-white:not(:disabled):not(.disabled):active,.show>.btn-outline-white.dropdown-toggle {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-outline-white:not(:disabled):not(.disabled).active:focus,
+.btn-outline-white:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-white.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5)
+}
+
+.btn-outline-orange {
+ color: #ffa600;
+ border-color: #ffa600
+}
+
+.btn-outline-orange:hover {
+ color: #212529;
+ background-color: #ffa600;
+ border-color: #ffa600
+}
+
+.btn-outline-orange.focus,
+.btn-outline-orange:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5)
+}
+
+.btn-outline-orange.disabled,
+.btn-outline-orange:disabled {
+ color: #ffa600;
+ background-color: transparent
+}
+
+.btn-outline-orange:not(:disabled):not(.disabled).active,
+.btn-outline-orange:not(:disabled):not(.disabled):active,.show>.btn-outline-orange.dropdown-toggle {
+ color: #212529;
+ background-color: #ffa600;
+ border-color: #ffa600
+}
+
+.btn-outline-orange:not(:disabled):not(.disabled).active:focus,
+.btn-outline-orange:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-orange.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5)
+}
+
+.btn-link {
+ font-weight: 400;
+ color: #047006;
+ text-decoration: none
+}
+
+.btn-link:hover {
+ color: #012602;
+ text-decoration: underline
+}
+
+.btn-link.focus,
+.btn-link:focus {
+ text-decoration: underline;
+ box-shadow: none
+}
+
+.btn-link.disabled,
+.btn-link:disabled {
+ color: #6c757d;
+ pointer-events: none
+}
+
+.btn-group-lg>.btn,
+.btn-lg {
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem
+}
+
+.btn-group-sm>.btn,
+.btn-sm {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem
+}
+
+.btn-block {
+ display: block;
+ width: 100%
+}
+
+.btn-block+.btn-block {
+ margin-top: .5rem
+}
+
+input[type=button].btn-block,
+input[type=reset].btn-block,
+input[type=submit].btn-block {
+ width: 100%
+}
+
+.fade {
+ -webkit-transition: opacity .15s linear;
+ transition: opacity .15s linear
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .fade {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.fade:not(.show) {
+ opacity: 0
+}
+
+.collapse:not(.show) {
+ display: none
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition: height .35s ease;
+ transition: height .35s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .collapsing {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.dropdown,
+.dropleft,
+.dropright,
+.dropup {
+ position: relative
+}
+
+.dropdown-toggle {
+ white-space: nowrap
+}
+
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: 'http://www.w3.org/2000/svg';
+ border-top: .3em solid;
+ border-right: .3em solid transparent;
+ border-bottom: 0;
+ border-left: .3em solid transparent
+}
+
+.dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 10rem;
+ padding: .5rem 0;
+ margin: .125rem 0 0;
+ font-size: 1rem;
+ color: #212529;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .15);
+ border-radius: .25rem
+}
+
+.dropdown-menu-left {
+ right: auto;
+ left: 0
+}
+
+.dropdown-menu-right {
+ right: 0;
+ left: auto
+}
+
+@media (min-width:576px) {
+ .dropdown-menu-sm-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-sm-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+@media (min-width:768px) {
+ .dropdown-menu-md-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-md-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+@media (min-width:992px) {
+ .dropdown-menu-lg-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-lg-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+@media (min-width:1200px) {
+ .dropdown-menu-xl-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-xl-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+.dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: .125rem
+}
+
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: '0 0 8 8';
+ border-top: 0;
+ border-right: .3em solid transparent;
+ border-bottom: .3em solid;
+ border-left: .3em solid transparent
+}
+
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropright .dropdown-menu {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: .125rem
+}
+
+.dropright .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: '%2328a745';
+ border-top: .3em solid transparent;
+ border-right: 0;
+ border-bottom: .3em solid transparent;
+ border-left: .3em solid
+}
+
+.dropright .dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropright .dropdown-toggle::after {
+ vertical-align: 0
+}
+
+.dropleft .dropdown-menu {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: .125rem
+}
+
+.dropleft .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'
+}
+
+.dropleft .dropdown-toggle::after {
+ display: none
+}
+
+.dropleft .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: .255em;
+ vertical-align: .255em;
+ content: 'http://www.w3.org/2000/svg';
+ border-top: .3em solid transparent;
+ border-right: .3em solid;
+ border-bottom: .3em solid transparent
+}
+
+.dropleft .dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropleft .dropdown-toggle::before {
+ vertical-align: 0
+}
+
+.dropdown-menu[x-placement^=bottom],
+.dropdown-menu[x-placement^=left],
+.dropdown-menu[x-placement^=right],
+.dropdown-menu[x-placement^=top] {
+ right: auto;
+ bottom: auto
+}
+
+.dropdown-divider {
+ height: 0;
+ margin: .5rem 0;
+ overflow: hidden;
+ border-top: 1px solid #e9ecef
+}
+
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: .25rem 1.5rem;
+ clear: both;
+ font-weight: 400;
+ color: #212529;
+ text-align: inherit;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0
+}
+
+.dropdown-item:focus,
+.dropdown-item:hover {
+ color: #16181b;
+ text-decoration: none;
+ background-color: #f8f9fa
+}
+
+.dropdown-item.active,
+.dropdown-item:active {
+ color: #fff;
+ text-decoration: none;
+ background-color: #007bff
+}
+
+.dropdown-item.disabled,
+.dropdown-item:disabled {
+ color: #6c757d;
+ pointer-events: none;
+ background-color: transparent
+}
+
+.dropdown-menu.show {
+ display: block
+}
+
+.dropdown-header {
+ display: block;
+ padding: .5rem 1.5rem;
+ margin-bottom: 0;
+ font-size: .875rem;
+ color: #6c757d;
+ white-space: nowrap
+}
+
+.dropdown-item-text {
+ display: block;
+ padding: .25rem 1.5rem;
+ color: #212529
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: -webkit-inline-box;
+ display: inline-flex;
+ vertical-align: middle
+}
+
+.btn-group-vertical>.btn,
+.btn-group>.btn {
+ position: relative;
+ -webkit-box-flex: 1;
+ flex: 1 1 auto
+}
+
+.btn-group-vertical>.btn:hover,
+.btn-group>.btn:hover {
+ z-index: 1
+}
+
+.btn-group-vertical>.btn.active,
+.btn-group-vertical>.btn:active,
+.btn-group-vertical>.btn:focus,
+.btn-group>.btn.active,
+.btn-group>.btn:active,
+.btn-group>.btn:focus {
+ z-index: 1
+}
+
+.btn-toolbar {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+}
+
+.btn-toolbar .input-group {
+ width: auto
+}
+
+.btn-group>.btn-group:not(:first-child),
+.btn-group>.btn:not(:first-child) {
+ margin-left: -1px
+}
+
+.btn-group>.btn-group:not(:last-child)>.btn,
+.btn-group>.btn:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.btn-group>.btn-group:not(:first-child)>.btn,
+.btn-group>.btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.dropdown-toggle-split {
+ padding-right: .5625rem;
+ padding-left: .5625rem
+}
+
+.dropdown-toggle-split::after,
+.dropright .dropdown-toggle-split::after,
+.dropup .dropdown-toggle-split::after {
+ margin-left: 0
+}
+
+.dropleft .dropdown-toggle-split::before {
+ margin-right: 0
+}
+
+.btn-group-sm>.btn+.dropdown-toggle-split,
+.btn-sm+.dropdown-toggle-split {
+ padding-right: .375rem;
+ padding-left: .375rem
+}
+
+.btn-group-lg>.btn+.dropdown-toggle-split,
+.btn-lg+.dropdown-toggle-split {
+ padding-right: .75rem;
+ padding-left: .75rem
+}
+
+.btn-group-vertical {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: center;
+ justify-content: center
+}
+
+.btn-group-vertical>.btn,
+.btn-group-vertical>.btn-group {
+ width: 100%
+}
+
+.btn-group-vertical>.btn-group:not(:first-child),
+.btn-group-vertical>.btn:not(:first-child) {
+ margin-top: -1px
+}
+
+.btn-group-vertical>.btn-group:not(:last-child)>.btn,
+.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.btn-group-vertical>.btn-group:not(:first-child)>.btn,
+.btn-group-vertical>.btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0
+}
+
+.btn-group-toggle>.btn,
+.btn-group-toggle>.btn-group>.btn {
+ margin-bottom: 0
+}
+
+.btn-group-toggle>.btn input[type=checkbox],
+.btn-group-toggle>.btn input[type=radio],
+.btn-group-toggle>.btn-group>.btn input[type=checkbox],
+.btn-group-toggle>.btn-group>.btn input[type=radio] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none
+}
+
+.input-group {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-align: stretch;
+ align-items: stretch;
+ width: 100%
+}
+
+.input-group>.custom-file,
+.input-group>.custom-select,
+.input-group>.form-control,
+.input-group>.form-control-plaintext {
+ position: relative;
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0
+}
+
+.input-group>.custom-file+.custom-file,
+.input-group>.custom-file+.custom-select,
+.input-group>.custom-file+.form-control,
+.input-group>.custom-select+.custom-file,
+.input-group>.custom-select+.custom-select,
+.input-group>.custom-select+.form-control,
+.input-group>.form-control+.custom-file,
+.input-group>.form-control+.custom-select,
+.input-group>.form-control+.form-control,
+.input-group>.form-control-plaintext+.custom-file,
+.input-group>.form-control-plaintext+.custom-select,
+.input-group>.form-control-plaintext+.form-control {
+ margin-left: -1px
+}
+
+.input-group>.custom-file .custom-file-input:focus~.custom-file-label,
+.input-group>.custom-select:focus,
+.input-group>.form-control:focus {
+ z-index: 3
+}
+
+.input-group>.custom-file .custom-file-input:focus {
+ z-index: 4
+}
+
+.input-group>.custom-select:not(:last-child),
+.input-group>.form-control:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.input-group>.custom-select:not(:first-child),
+.input-group>.form-control:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.input-group>.custom-file {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.input-group>.custom-file:not(:last-child) .custom-file-label,
+.input-group>.custom-file:not(:last-child) .custom-file-label::after {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.input-group>.custom-file:not(:first-child) .custom-file-label {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.input-group-append,
+.input-group-prepend {
+ display: -webkit-box;
+ display: flex
+}
+
+.input-group-append .btn,
+.input-group-prepend .btn {
+ position: relative;
+ z-index: 2
+}
+
+.input-group-append .btn:focus,
+.input-group-prepend .btn:focus {
+ z-index: 3
+}
+
+.input-group-append .btn+.btn,
+.input-group-append .btn+.input-group-text,
+.input-group-append .input-group-text+.btn,
+.input-group-append .input-group-text+.input-group-text,
+.input-group-prepend .btn+.btn,
+.input-group-prepend .btn+.input-group-text,
+.input-group-prepend .input-group-text+.btn,
+.input-group-prepend .input-group-text+.input-group-text {
+ margin-left: -1px
+}
+
+.input-group-prepend {
+ margin-right: -1px
+}
+
+.input-group-append {
+ margin-left: -1px
+}
+
+.input-group-text {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ padding: .375rem .75rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #6c757d;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #f0f2f5;
+ border-radius: .25rem
+}
+
+.input-group-text input[type=checkbox],
+.input-group-text input[type=radio] {
+ margin-top: 0
+}
+
+.input-group-lg>.custom-select,
+.input-group-lg>.form-control:not(textarea) {
+ height: calc(1.5em + 1rem + 2px)
+}
+
+.input-group-lg>.custom-select,
+.input-group-lg>.form-control,
+.input-group-lg>.input-group-append>.btn,
+.input-group-lg>.input-group-append>.input-group-text,
+.input-group-lg>.input-group-prepend>.btn,
+.input-group-lg>.input-group-prepend>.input-group-text {
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem
+}
+
+.input-group-sm>.custom-select,
+.input-group-sm>.form-control:not(textarea) {
+ height: calc(1.5em + .5rem + 2px)
+}
+
+.input-group-sm>.custom-select,
+.input-group-sm>.form-control,
+.input-group-sm>.input-group-append>.btn,
+.input-group-sm>.input-group-append>.input-group-text,
+.input-group-sm>.input-group-prepend>.btn,
+.input-group-sm>.input-group-prepend>.input-group-text {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem
+}
+
+.input-group-lg>.custom-select,
+.input-group-sm>.custom-select {
+ padding-right: 1.75rem
+}
+
+.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),
+.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),
+.input-group>.input-group-append:not(:last-child)>.btn,
+.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.input-group>.input-group-append>.btn,
+.input-group>.input-group-append>.input-group-text,
+.input-group>.input-group-prepend:first-child>.btn:not(:first-child),
+.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),
+.input-group>.input-group-prepend:not(:first-child)>.btn,
+.input-group>.input-group-prepend:not(:first-child)>.input-group-text {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-control {
+ position: relative;
+ display: block;
+ min-height: 1.7rem;
+ padding-left: 1.9rem
+}
+
+.custom-control-inline {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ margin-right: 1rem
+}
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0
+}
+
+.custom-control-input:checked~.custom-control-label::before {
+ color: #fff;
+ border-color: #00e093;
+ background-color: #00e093
+}
+
+.custom-control-input:focus~.custom-control-label::before {
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-control-input:focus:not(:checked)~.custom-control-label::before {
+ border-color: #80bdff
+}
+
+.custom-control-input:not(:disabled):active~.custom-control-label::before {
+ color: #fff;
+ background-color: #b3d7ff;
+ border-color: #b3d7ff
+}
+
+.custom-control-input:disabled~.custom-control-label {
+ color: #6c757d
+}
+
+.custom-control-input:disabled~.custom-control-label::before {
+ background-color: #e9ecef
+}
+
+.custom-control-label {
+ position: relative;
+ margin-bottom: 0;
+ vertical-align: top
+}
+
+.custom-control-label::before {
+ position: absolute;
+ top: .15rem;
+ left: -1.9rem;
+ display: block;
+ width: 1.4rem;
+ height: 1.4rem;
+ pointer-events: none;
+ content: '0 0 4 5';
+ background-color: #fff;
+ border: #e1e5f1 solid 1px
+}
+
+.custom-control-label::after {
+ position: absolute;
+ top: .15rem;
+ left: -1.9rem;
+ display: block;
+ width: 1.4rem;
+ height: 1.4rem;
+ content: '%23343a40';
+ background: no-repeat 50%/50% 50%
+}
+
+.custom-checkbox .custom-control-label::before {
+ border-radius: .25rem
+}
+
+.custom-checkbox .custom-control-input:checked~.custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before {
+ border-color: #007bff;
+ background-color: #007bff
+}
+
+.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-radio .custom-control-label::before {
+ border-radius: 50%
+}
+
+.custom-radio .custom-control-input:checked~.custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3ccircle r=!string!fill=!string!/%3e%3c/svg%3e")
+}
+
+.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-switch {
+ padding-left: 2.8rem
+}
+
+.custom-switch .custom-control-label::before {
+ left: -2.8rem;
+ width: 2.3rem;
+ pointer-events: all;
+ border-radius: 25px
+}
+
+.custom-switch .custom-control-label::after {
+ top: calc(.15rem + 2px);
+ left: calc(-2.8rem + 2px);
+ width: 1.1rem;
+ height: 1.1rem;
+ background-color: #e1e5f1;
+ border-radius: 25px;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out;
+ transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-switch .custom-control-label::after {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-switch .custom-control-input:checked~.custom-control-label::after {
+ background-color: #fff;
+ -webkit-transform: translateX(.9rem);
+ transform: translateX(.9rem)
+}
+
+.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-select {
+ display: inline-block;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ padding: .375rem 1.75rem .375rem .75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #495057;
+ vertical-align: middle;
+ background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;
+ background-color: #fff;
+ border: 1px solid #ced4da;
+ border-radius: .25rem;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none
+}
+
+.custom-select:focus {
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-select:focus::-ms-value {
+ color: #6c757d;
+ background-color: #f6f7f9
+}
+
+.custom-select[multiple],
+.custom-select[size]:not([size='M2 0L0 2h4zm0 5L0 3h4z']) {
+ height: auto;
+ padding-right: .75rem;
+ background-image: none
+}
+
+.custom-select:disabled {
+ color: #6c757d;
+ background-color: #e9ecef
+}
+
+.custom-select::-ms-expand {
+ display: none
+}
+
+.custom-select-sm {
+ height: calc(1.5em + .5rem + 2px);
+ padding-top: .25rem;
+ padding-bottom: .25rem;
+ padding-left: .5rem;
+ font-size: .875rem
+}
+
+.custom-select-lg {
+ height: calc(1.5em + 1rem + 2px);
+ padding-top: .5rem;
+ padding-bottom: .5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem
+}
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ margin-bottom: 0
+}
+
+.custom-file-input {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ margin: 0;
+ opacity: 0
+}
+
+.custom-file-input:focus~.custom-file-label {
+ border-color: #80bdff;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-file-input:disabled~.custom-file-label {
+ background-color: #e9ecef
+}
+
+.custom-file-input:lang(en)~.custom-file-label::after {
+ content: 'http://www.w3.org/2000/svg'
+}
+
+.custom-file-input~.custom-file-label[data-browse]::after {
+ content: attr(data-browse)
+}
+
+.custom-file-label {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1;
+ height: calc(1.5em + .75rem + 2px);
+ padding: .375rem .75rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #6c757d;
+ background-color: #f6f7f9;
+ border: 1px solid #f0f2f5;
+ border-radius: .25rem
+}
+
+.custom-file-label::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 3;
+ display: block;
+ height: calc(1.5em + .75rem);
+ padding: .375rem .75rem;
+ line-height: 1.5;
+ color: #495057;
+ content: '0 0 8 8';
+ background-color: #e9ecef;
+ border-left: inherit;
+ border-radius: 0 .25rem .25rem 0
+}
+
+.custom-range {
+ width: 100%;
+ height: calc(1rem + .4rem);
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none
+}
+
+.custom-range:focus {
+ outline: 0
+}
+
+.custom-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-range:focus::-ms-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-range::-moz-focus-outer {
+ border: 0
+}
+
+.custom-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -.25rem;
+ background-color: #007bff;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-range::-webkit-slider-thumb:active {
+ background-color: #b3d7ff
+}
+
+.custom-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: .5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem
+}
+
+.custom-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #007bff;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-range::-moz-range-thumb {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-range::-moz-range-thumb:active {
+ background-color: #b3d7ff
+}
+
+.custom-range::-moz-range-track {
+ width: 100%;
+ height: .5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem
+}
+
+.custom-range::-ms-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: 0;
+ margin-right: .2rem;
+ margin-left: .2rem;
+ background-color: #007bff;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ appearance: none
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-range::-ms-thumb {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-range::-ms-thumb:active {
+ background-color: #b3d7ff
+}
+
+.custom-range::-ms-track {
+ width: 100%;
+ height: .5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: transparent;
+ border-color: transparent;
+ border-width: .5rem
+}
+
+.custom-range::-ms-fill-lower {
+ background-color: #dee2e6;
+ border-radius: 1rem
+}
+
+.custom-range::-ms-fill-upper {
+ margin-right: 15px;
+ background-color: #dee2e6;
+ border-radius: 1rem
+}
+
+.custom-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd
+}
+
+.custom-range:disabled::-webkit-slider-runnable-track {
+ cursor: default
+}
+
+.custom-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd
+}
+
+.custom-range:disabled::-moz-range-track {
+ cursor: default
+}
+
+.custom-range:disabled::-ms-thumb {
+ background-color: #adb5bd
+}
+
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-control-label::before,
+ .custom-file-label,
+ .custom-select {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.nav {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none
+}
+
+.nav-link {
+ display: block;
+ padding: .5rem 1rem
+}
+
+.nav-link:focus,
+.nav-link:hover {
+ text-decoration: none
+}
+
+.nav-link.disabled {
+ color: #6c757d;
+ pointer-events: none;
+ cursor: default
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #dee2e6
+}
+
+.nav-tabs .nav-item {
+ margin-bottom: -1px
+}
+
+.nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px
+}
+
+.nav-tabs .nav-link:focus,
+.nav-tabs .nav-link:hover {
+ border-color: #e9ecef #e9ecef #dee2e6
+}
+
+.nav-tabs .nav-link.disabled {
+ color: #6c757d;
+ background-color: transparent;
+ border-color: transparent
+}
+
+.nav-tabs .nav-item.show .nav-link,
+.nav-tabs .nav-link.active {
+ color: #495057;
+ background-color: #fff;
+ border-color: #dee2e6 #dee2e6 #fff
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0
+}
+
+.nav-pills .nav-link {
+ border-radius: 2px
+}
+
+.nav-pills .nav-link.active,
+.nav-pills .show>.nav-link {
+ color: #fff;
+ background-color: #007bff
+}
+
+.nav-fill .nav-item {
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ text-align: center
+}
+
+.nav-justified .nav-item {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ text-align: center
+}
+
+.tab-content>.tab-pane {
+ display: none
+}
+
+.tab-content>.active {
+ display: block
+}
+
+.navbar {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ justify-content: space-between;
+ padding: .5rem 1rem
+}
+
+.navbar>.container,
+.navbar>.container-fluid {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ justify-content: space-between
+}
+
+.navbar-brand {
+ display: inline-block;
+ padding-top: .3125rem;
+ padding-bottom: .3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ line-height: inherit;
+ white-space: nowrap
+}
+
+.navbar-brand:focus,
+.navbar-brand:hover {
+ text-decoration: none
+}
+
+.navbar-nav {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none
+}
+
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.navbar-nav .dropdown-menu {
+ position: static;
+ float: none
+}
+
+.navbar-text {
+ display: inline-block;
+ padding-top: .5rem;
+ padding-bottom: .5rem
+}
+
+.navbar-collapse {
+ flex-basis: 100%;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.navbar-toggler {
+ padding: .25rem .75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: .25rem
+}
+
+.navbar-toggler:focus,
+.navbar-toggler:hover {
+ text-decoration: none
+}
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: '%2328a745';
+ background: no-repeat center center;
+ background-size: 100% 100%
+}
+
+@media (max-width:575.98px) {
+ .navbar-expand-sm>.container,
+ .navbar-expand-sm>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:576px) {
+ .navbar-expand-sm {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-sm .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-sm>.container,
+ .navbar-expand-sm>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-sm .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-sm .navbar-toggler {
+ display: none
+ }
+
+}
+
+@media (max-width:767.98px) {
+ .navbar-expand-md>.container,
+ .navbar-expand-md>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:768px) {
+ .navbar-expand-md {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-md .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-md>.container,
+ .navbar-expand-md>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-md .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-md .navbar-toggler {
+ display: none
+ }
+
+}
+
+@media (max-width:991.98px) {
+ .navbar-expand-lg>.container,
+ .navbar-expand-lg>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:992px) {
+ .navbar-expand-lg {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-lg .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-lg>.container,
+ .navbar-expand-lg>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-lg .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-lg .navbar-toggler {
+ display: none
+ }
+
+}
+
+@media (max-width:1199.98px) {
+ .navbar-expand-xl>.container,
+ .navbar-expand-xl>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:1200px) {
+ .navbar-expand-xl {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-xl .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-xl>.container,
+ .navbar-expand-xl>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-xl .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-xl .navbar-toggler {
+ display: none
+ }
+
+}
+
+.navbar-expand {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+}
+
+.navbar-expand>.container,
+.navbar-expand>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.navbar-expand .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute
+}
+
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+}
+
+.navbar-expand>.container,
+.navbar-expand>.container-fluid {
+ flex-wrap: nowrap
+}
+
+.navbar-expand .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+}
+
+.navbar-expand .navbar-toggler {
+ display: none
+}
+
+.navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-brand:focus,
+.navbar-light .navbar-brand:hover {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, .5)
+}
+
+.navbar-light .navbar-nav .nav-link:focus,
+.navbar-light .navbar-nav .nav-link:hover {
+ color: rgba(0, 0, 0, .7)
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, .3)
+}
+
+.navbar-light .navbar-nav .active>.nav-link,
+.navbar-light .navbar-nav .nav-link.active,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .show>.nav-link {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-toggler {
+ color: rgba(0, 0, 0, .5);
+ border-color: rgba(0, 0, 0, .1)
+}
+
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.navbar-light .navbar-text {
+ color: rgba(0, 0, 0, .5)
+}
+
+.navbar-light .navbar-text a {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-text a:focus,
+.navbar-light .navbar-text a:hover {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-dark .navbar-brand {
+ color: #fff
+}
+
+.navbar-dark .navbar-brand:focus,
+.navbar-dark .navbar-brand:hover {
+ color: #fff
+}
+
+.navbar-dark .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, .5)
+}
+
+.navbar-dark .navbar-nav .nav-link:focus,
+.navbar-dark .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, .75)
+}
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, .25)
+}
+
+.navbar-dark .navbar-nav .active>.nav-link,
+.navbar-dark .navbar-nav .nav-link.active,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .show>.nav-link {
+ color: #fff
+}
+
+.navbar-dark .navbar-toggler {
+ color: rgba(255, 255, 255, .5);
+ border-color: rgba(255, 255, 255, .1)
+}
+
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.navbar-dark .navbar-text {
+ color: rgba(255, 255, 255, .5)
+}
+
+.navbar-dark .navbar-text a {
+ color: #fff
+}
+
+.navbar-dark .navbar-text a:focus,
+.navbar-dark .navbar-text a:hover {
+ color: #fff
+}
+
+.card {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: border-box;
+ border: 1px solid rgba(238, 238, 238, .75);
+ border-radius: .25rem
+}
+
+.card>hr {
+ margin-right: 0;
+ margin-left: 0
+}
+
+.card>.list-group:first-child .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem
+}
+
+.card>.list-group:last-child .list-group-item:last-child {
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: .25rem
+}
+
+.card-body {
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ padding: 1.25rem
+}
+
+.card-title {
+ margin-bottom: .75rem
+}
+
+.card-subtitle {
+ margin-top: -.375rem;
+ margin-bottom: 0
+}
+
+.card-text:last-child {
+ margin-bottom: 0
+}
+
+.card-link:hover {
+ text-decoration: none
+}
+
+.card-link+.card-link {
+ margin-left: 1.25rem
+}
+
+.card-header {
+ padding: .75rem 1.25rem;
+ margin-bottom: 0;
+ background-color: rgba(0, 0, 0, .03);
+ border-bottom: 1px solid rgba(238, 238, 238, .75)
+}
+
+.card-header:first-child {
+ border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0
+}
+
+.card-header+.list-group .list-group-item:first-child {
+ border-top: 0
+}
+
+.card-footer {
+ padding: .75rem 1.25rem;
+ background-color: rgba(0, 0, 0, .03);
+ border-top: 1px solid rgba(238, 238, 238, .75)
+}
+
+.card-footer:last-child {
+ border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px)
+}
+
+.card-header-tabs {
+ margin-right: -.625rem;
+ margin-bottom: -.75rem;
+ margin-left: -.625rem;
+ border-bottom: 0
+}
+
+.card-header-pills {
+ margin-right: -.625rem;
+ margin-left: -.625rem
+}
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1.25rem
+}
+
+.card-img {
+ width: 100%;
+ border-radius: calc(.25rem - 1px)
+}
+
+.card-img-top {
+ width: 100%;
+ border-top-left-radius: calc(.25rem - 1px);
+ border-top-right-radius: calc(.25rem - 1px)
+}
+
+.card-img-bottom {
+ width: 100%;
+ border-bottom-right-radius: calc(.25rem - 1px);
+ border-bottom-left-radius: calc(.25rem - 1px)
+}
+
+.card-deck {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column
+}
+
+.card-deck .card {
+ margin-bottom: 15px
+}
+
+@media (min-width:576px) {
+ .card-deck {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap;
+ margin-right: -15px;
+ margin-left: -15px
+ }
+
+ .card-deck .card {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-flex: 1;
+ flex: 1 0 0%;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ margin-right: 15px;
+ margin-bottom: 0;
+ margin-left: 15px
+ }
+
+}
+
+.card-group {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column
+}
+
+.card-group>.card {
+ margin-bottom: 15px
+}
+
+@media (min-width:576px) {
+ .card-group {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap
+ }
+
+ .card-group>.card {
+ -webkit-box-flex: 1;
+ flex: 1 0 0%;
+ margin-bottom: 0
+ }
+
+ .card-group>.card+.card {
+ margin-left: 0;
+ border-left: 0
+ }
+
+ .card-group>.card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+ }
+
+ .card-group>.card:not(:last-child) .card-header,
+ .card-group>.card:not(:last-child) .card-img-top {
+ border-top-right-radius: 0
+ }
+
+ .card-group>.card:not(:last-child) .card-footer,
+ .card-group>.card:not(:last-child) .card-img-bottom {
+ border-bottom-right-radius: 0
+ }
+
+ .card-group>.card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+ }
+
+ .card-group>.card:not(:first-child) .card-header,
+ .card-group>.card:not(:first-child) .card-img-top {
+ border-top-left-radius: 0
+ }
+
+ .card-group>.card:not(:first-child) .card-footer,
+ .card-group>.card:not(:first-child) .card-img-bottom {
+ border-bottom-left-radius: 0
+ }
+
+}
+
+.card-columns .card {
+ margin-bottom: .75rem
+}
+
+@media (min-width:576px) {
+ .card-columns {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ -webkit-column-gap: 1.25rem;
+ -moz-column-gap: 1.25rem;
+ column-gap: 1.25rem;
+ orphans: 1;
+ widows: 1
+ }
+
+ .card-columns .card {
+ display: inline-block;
+ width: 100%
+ }
+
+}
+
+.accordion>.card {
+ overflow: hidden
+}
+
+.accordion>.card:not(:first-of-type) .card-header:first-child {
+ border-radius: 0
+}
+
+.accordion>.card:not(:first-of-type):not(:last-of-type) {
+ border-bottom: 0;
+ border-radius: 0
+}
+
+.accordion>.card:first-of-type {
+ border-bottom: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.accordion>.card:last-of-type {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0
+}
+
+.accordion>.card .card-header {
+ margin-bottom: -1px
+}
+
+.breadcrumb {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ padding: .75rem 1rem;
+ margin-bottom: 1rem;
+ list-style: none;
+ background-color: #f7f9fa;
+ border-radius: .25rem
+}
+
+.breadcrumb-item+.breadcrumb-item {
+ padding-left: .5rem
+}
+
+.breadcrumb-item+.breadcrumb-item::before {
+ display: inline-block;
+ padding-right: .5rem;
+ color: #a8a9ad;
+ content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'
+}
+
+.breadcrumb-item+.breadcrumb-item:hover::before {
+ text-decoration: underline
+}
+
+.breadcrumb-item+.breadcrumb-item:hover::before {
+ text-decoration: none
+}
+
+.breadcrumb-item.active {
+ color: #6c757d
+}
+
+.pagination {
+ display: -webkit-box;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+ border-radius: 2px
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: .5rem .75rem;
+ margin-left: -1px;
+ line-height: 1.25;
+ color: #007bff;
+ background-color: #fff;
+ border: 1px solid #dee2e6
+}
+
+.page-link:hover {
+ z-index: 2;
+ color: #0056b3;
+ text-decoration: none;
+ background-color: #e9ecef;
+ border-color: #dee2e6
+}
+
+.page-link:focus {
+ z-index: 2;
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.page-item:first-child .page-link {
+ margin-left: 0;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px
+}
+
+.page-item:last-child .page-link {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px
+}
+
+.page-item.active .page-link {
+ z-index: 1;
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff
+}
+
+.page-item.disabled .page-link {
+ color: #6c757d;
+ pointer-events: none;
+ cursor: auto;
+ background-color: #fff;
+ border-color: #dee2e6
+}
+
+.pagination-lg .page-link {
+ padding: .75rem 1.5rem;
+ font-size: 1.25rem;
+ line-height: 1.5
+}
+
+.pagination-lg .page-item:first-child .page-link {
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 6px
+}
+
+.pagination-lg .page-item:last-child .page-link {
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px
+}
+
+.pagination-sm .page-link {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5
+}
+
+.pagination-sm .page-item:first-child .page-link {
+ border-top-left-radius: .2rem;
+ border-bottom-left-radius: .2rem
+}
+
+.pagination-sm .page-item:last-child .page-link {
+ border-top-right-radius: .2rem;
+ border-bottom-right-radius: .2rem
+}
+
+.badge {
+ display: inline-block;
+ padding: .45rem 1rem;
+ font-size: 80%;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25rem;
+ -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .badge {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+a.badge:focus,
+a.badge:hover {
+ text-decoration: none
+}
+
+.badge:empty {
+ display: none
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px
+}
+
+.badge-pill {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ border-radius: 10rem
+}
+
+.badge-primary {
+ color: #fff;
+ background-color: #047006
+}
+
+a.badge-primary:focus,
+a.badge-primary:hover {
+ color: #fff;
+ background-color: #023f03
+}
+
+a.badge-primary.focus,
+a.badge-primary:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5)
+}
+
+.badge-secondary {
+ color: #fff;
+ background-color: grey
+}
+
+a.badge-secondary:focus,
+a.badge-secondary:hover {
+ color: #fff;
+ background-color: #676767
+}
+
+a.badge-secondary.focus,
+a.badge-secondary:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5)
+}
+
+.badge-success {
+ color: #fff;
+ background-color: #00e093
+}
+
+a.badge-success:focus,
+a.badge-success:hover {
+ color: #fff;
+ background-color: #00ad72
+}
+
+a.badge-success.focus,
+a.badge-success:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5)
+}
+
+.badge-info {
+ color: #fff;
+ background-color: #6c61f6
+}
+
+a.badge-info:focus,
+a.badge-info:hover {
+ color: #fff;
+ background-color: #3f31f3
+}
+
+a.badge-info.focus,
+a.badge-info:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5)
+}
+
+.badge-warning {
+ color: #212529;
+ background-color: #f0825f
+}
+
+a.badge-warning:focus,
+a.badge-warning:hover {
+ color: #212529;
+ background-color: #ec5e30
+}
+
+a.badge-warning.focus,
+a.badge-warning:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5)
+}
+
+.badge-danger {
+ color: #fff;
+ background-color: #ff5f66
+}
+
+a.badge-danger:focus,
+a.badge-danger:hover {
+ color: #fff;
+ background-color: #ff2c35
+}
+
+a.badge-danger.focus,
+a.badge-danger:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5)
+}
+
+.badge-light {
+ color: #212529;
+ background-color: #dfdfdf
+}
+
+a.badge-light:focus,
+a.badge-light:hover {
+ color: #212529;
+ background-color: #c6c6c6
+}
+
+a.badge-light.focus,
+a.badge-light:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5)
+}
+
+.badge-dark {
+ color: #fff;
+ background-color: #74767b
+}
+
+a.badge-dark:focus,
+a.badge-dark:hover {
+ color: #fff;
+ background-color: #5b5d61
+}
+
+a.badge-dark.focus,
+a.badge-dark:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5)
+}
+
+.badge-white {
+ color: #212529;
+ background-color: #fff
+}
+
+a.badge-white:focus,
+a.badge-white:hover {
+ color: #212529;
+ background-color: #e6e6e6
+}
+
+a.badge-white.focus,
+a.badge-white:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5)
+}
+
+.badge-orange {
+ color: #212529;
+ background-color: #ffa600
+}
+
+a.badge-orange:focus,
+a.badge-orange:hover {
+ color: #212529;
+ background-color: #cc8500
+}
+
+a.badge-orange.focus,
+a.badge-orange:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(255, 166, 0, .5)
+}
+
+.jumbotron {
+ padding: 2rem 1rem;
+ margin-bottom: 2rem;
+ background-color: #e9ecef;
+ border-radius: 6px
+}
+
+@media (min-width:576px) {
+ .jumbotron {
+ padding: 4rem 2rem
+ }
+
+}
+
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ border-radius: 0
+}
+
+.alert {
+ position: relative;
+ padding: 1.15rem 1.15rem;
+ margin-bottom: 1rem;
+ border: 1px solid transparent;
+ border-radius: 2px
+}
+
+.alert-heading {
+ color: inherit
+}
+
+.alert-link {
+ font-weight: 700
+}
+
+.alert-dismissible {
+ padding-right: 3.8rem
+}
+
+.alert-dismissible .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 1.15rem 1.15rem;
+ color: inherit
+}
+
+.alert-primary {
+ color: #023a03;
+ background-color: #cde2cd;
+ border-color: #b9d7b9
+}
+
+.alert-primary hr {
+ border-top-color: #a9cea9
+}
+
+.alert-primary .alert-link {
+ color: #000900
+}
+
+.alert-secondary {
+ color: #434343;
+ background-color: #e6e6e6;
+ border-color: #dbdbdb
+}
+
+.alert-secondary hr {
+ border-top-color: #cecece
+}
+
+.alert-secondary .alert-link {
+ color: #2a2a2a
+}
+
+.alert-success {
+ color: #00744c;
+ background-color: #ccf9e9;
+ border-color: #b8f6e1
+}
+
+.alert-success hr {
+ border-top-color: #a1f3d7
+}
+
+.alert-success .alert-link {
+ color: #00412b
+}
+
+.alert-info {
+ color: #383280;
+ background-color: #e2dffd;
+ border-color: #d6d3fc
+}
+
+.alert-info hr {
+ border-top-color: #c0bbfa
+}
+
+.alert-info .alert-link {
+ color: #28245b
+}
+
+.alert-warning {
+ color: #7d4431;
+ background-color: #fce6df;
+ border-color: #fbdcd2
+}
+
+.alert-warning hr {
+ border-top-color: #f9cabb
+}
+
+.alert-warning .alert-link {
+ color: #583023
+}
+
+.alert-danger {
+ color: #853135;
+ background-color: #ffdfe0;
+ border-color: #ffd2d4
+}
+
+.alert-danger hr {
+ border-top-color: #ffb9bc
+}
+
+.alert-danger .alert-link {
+ color: #602326
+}
+
+.alert-light {
+ color: #747474;
+ background-color: #f9f9f9;
+ border-color: #f6f6f6
+}
+
+.alert-light hr {
+ border-top-color: #e9e9e9
+}
+
+.alert-light .alert-link {
+ color: #5b5b5b
+}
+
+.alert-dark {
+ color: #3c3d40;
+ background-color: #e3e4e5;
+ border-color: #d8d9da
+}
+
+.alert-dark hr {
+ border-top-color: #cbccce
+}
+
+.alert-dark .alert-link {
+ color: #232426
+}
+
+.alert-white {
+ color: #858585;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.alert-white hr {
+ border-top-color: #f2f2f2
+}
+
+.alert-white .alert-link {
+ color: #6c6c6c
+}
+
+.alert-orange {
+ color: #855600;
+ background-color: #ffedcc;
+ border-color: #ffe6b8
+}
+
+.alert-orange hr {
+ border-top-color: #ffdd9f
+}
+
+.alert-orange .alert-link {
+ color: #523500
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0
+ }
+
+ to {
+ background-position: 0 0
+ }
+
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0
+ }
+
+ to {
+ background-position: 0 0
+ }
+
+}
+
+.progress {
+ display: -webkit-box;
+ display: flex;
+ height: 1rem;
+ overflow: hidden;
+ font-size: .75rem;
+ background-color: #f3f5f7;
+ border-radius: 2px
+}
+
+.progress-bar {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-pack: center;
+ justify-content: center;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #007bff;
+ -webkit-transition: width .6s ease;
+ transition: width .6s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .progress-bar {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-size: 1rem 1rem
+}
+
+.progress-bar-animated {
+ -webkit-animation: progress-bar-stripes 1s linear infinite;
+ animation: progress-bar-stripes 1s linear infinite
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none
+ }
+
+}
+
+.media {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: start;
+ align-items: flex-start
+}
+
+.media-body {
+ -webkit-box-flex: 1;
+ flex: 1
+}
+
+.list-group {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0
+}
+
+.list-group-item-action {
+ width: 100%;
+ color: #495057;
+ text-align: inherit
+}
+
+.list-group-item-action:focus,
+.list-group-item-action:hover {
+ z-index: 1;
+ color: #495057;
+ text-decoration: none;
+ background-color: #f8f9fa
+}
+
+.list-group-item-action:active {
+ color: #212529;
+ background-color: #e9ecef
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: .75rem 1.25rem;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, .125)
+}
+
+.list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: .25rem
+}
+
+.list-group-item.disabled,
+.list-group-item:disabled {
+ color: #6c757d;
+ pointer-events: none;
+ background-color: #fff
+}
+
+.list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff
+}
+
+.list-group-horizontal {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+}
+
+.list-group-horizontal .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+}
+
+.list-group-horizontal .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+}
+
+.list-group-horizontal .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+}
+
+@media (min-width:576px) {
+ .list-group-horizontal-sm {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-sm .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-sm .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-sm .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+@media (min-width:768px) {
+ .list-group-horizontal-md {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-md .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-md .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-md .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+@media (min-width:992px) {
+ .list-group-horizontal-lg {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-lg .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-lg .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-lg .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+@media (min-width:1200px) {
+ .list-group-horizontal-xl {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-xl .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-xl .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-xl .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+.list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0
+}
+
+.list-group-flush .list-group-item:last-child {
+ margin-bottom: -1px
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0
+}
+
+.list-group-flush:last-child .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom: 0
+}
+
+.list-group-item-primary {
+ color: #023a03;
+ background-color: #b9d7b9
+}
+
+.list-group-item-primary.list-group-item-action:focus,
+.list-group-item-primary.list-group-item-action:hover {
+ color: #023a03;
+ background-color: #a9cea9
+}
+
+.list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #023a03;
+ border-color: #023a03
+}
+
+.list-group-item-secondary {
+ color: #434343;
+ background-color: #dbdbdb
+}
+
+.list-group-item-secondary.list-group-item-action:focus,
+.list-group-item-secondary.list-group-item-action:hover {
+ color: #434343;
+ background-color: #cecece
+}
+
+.list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #434343;
+ border-color: #434343
+}
+
+.list-group-item-success {
+ color: #00744c;
+ background-color: #b8f6e1
+}
+
+.list-group-item-success.list-group-item-action:focus,
+.list-group-item-success.list-group-item-action:hover {
+ color: #00744c;
+ background-color: #a1f3d7
+}
+
+.list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #00744c;
+ border-color: #00744c
+}
+
+.list-group-item-info {
+ color: #383280;
+ background-color: #d6d3fc
+}
+
+.list-group-item-info.list-group-item-action:focus,
+.list-group-item-info.list-group-item-action:hover {
+ color: #383280;
+ background-color: #c0bbfa
+}
+
+.list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #383280;
+ border-color: #383280
+}
+
+.list-group-item-warning {
+ color: #7d4431;
+ background-color: #fbdcd2
+}
+
+.list-group-item-warning.list-group-item-action:focus,
+.list-group-item-warning.list-group-item-action:hover {
+ color: #7d4431;
+ background-color: #f9cabb
+}
+
+.list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #7d4431;
+ border-color: #7d4431
+}
+
+.list-group-item-danger {
+ color: #853135;
+ background-color: #ffd2d4
+}
+
+.list-group-item-danger.list-group-item-action:focus,
+.list-group-item-danger.list-group-item-action:hover {
+ color: #853135;
+ background-color: #ffb9bc
+}
+
+.list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #853135;
+ border-color: #853135
+}
+
+.list-group-item-light {
+ color: #747474;
+ background-color: #f6f6f6
+}
+
+.list-group-item-light.list-group-item-action:focus,
+.list-group-item-light.list-group-item-action:hover {
+ color: #747474;
+ background-color: #e9e9e9
+}
+
+.list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #747474;
+ border-color: #747474
+}
+
+.list-group-item-dark {
+ color: #3c3d40;
+ background-color: #d8d9da
+}
+
+.list-group-item-dark.list-group-item-action:focus,
+.list-group-item-dark.list-group-item-action:hover {
+ color: #3c3d40;
+ background-color: #cbccce
+}
+
+.list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #3c3d40;
+ border-color: #3c3d40
+}
+
+.list-group-item-white {
+ color: #858585;
+ background-color: #fff
+}
+
+.list-group-item-white.list-group-item-action:focus,
+.list-group-item-white.list-group-item-action:hover {
+ color: #858585;
+ background-color: #f2f2f2
+}
+
+.list-group-item-white.list-group-item-action.active {
+ color: #fff;
+ background-color: #858585;
+ border-color: #858585
+}
+
+.list-group-item-orange {
+ color: #855600;
+ background-color: #ffe6b8
+}
+
+.list-group-item-orange.list-group-item-action:focus,
+.list-group-item-orange.list-group-item-action:hover {
+ color: #855600;
+ background-color: #ffdd9f
+}
+
+.list-group-item-orange.list-group-item-action.active {
+ color: #fff;
+ background-color: #855600;
+ border-color: #855600
+}
+
+.close {
+ float: right;
+ font-size: 1.5rem;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: .5
+}
+
+.close:hover {
+ color: #000;
+ text-decoration: none
+}
+
+.close:not(:disabled):not(.disabled):focus,
+.close:not(:disabled):not(.disabled):hover {
+ opacity: .75
+}
+
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none
+}
+
+a.close.disabled {
+ pointer-events: none
+}
+
+.toast {
+ max-width: 350px;
+ overflow: hidden;
+ font-size: .875rem;
+ background-color: rgba(255, 255, 255, .85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .1);
+ box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .1);
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ opacity: 0;
+ border-radius: .25rem
+}
+
+.toast:not(:last-child) {
+ margin-bottom: .75rem
+}
+
+.toast.showing {
+ opacity: 1
+}
+
+.toast.show {
+ display: block;
+ opacity: 1
+}
+
+.toast.hide {
+ display: none
+}
+
+.toast-header {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ padding: .25rem .75rem;
+ color: #6c757d;
+ background-color: rgba(255, 255, 255, .85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, .05)
+}
+
+.toast-body {
+ padding: .75rem
+}
+
+.modal-open {
+ overflow: hidden
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto
+}
+
+.modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1050;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ outline: 0
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: .5rem;
+ pointer-events: none
+}
+
+.modal.fade .modal-dialog {
+ -webkit-transition: -webkit-transform .3s ease-out;
+ transition: -webkit-transform .3s ease-out;
+ transition: transform .3s ease-out;
+ transition: transform .3s ease-out, -webkit-transform .3s ease-out;
+ -webkit-transform: translate(0, -50px);
+ transform: translate(0, -50px)
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .modal.fade .modal-dialog {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.modal.show .modal-dialog {
+ -webkit-transform: none;
+ transform: none
+}
+
+.modal-dialog-scrollable {
+ display: -webkit-box;
+ display: flex;
+ max-height: calc(100% - 1rem)
+}
+
+.modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 1rem);
+ overflow: hidden
+}
+
+.modal-dialog-scrollable .modal-footer,
+.modal-dialog-scrollable .modal-header {
+ flex-shrink: 0
+}
+
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto
+}
+
+.modal-dialog-centered {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ min-height: calc(100% - 1rem)
+}
+
+.modal-dialog-centered::before {
+ display: block;
+ height: calc(100vh - 1rem);
+ content: 'http://www.w3.org/2000/svg'
+}
+
+.modal-dialog-centered.modal-dialog-scrollable {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-pack: center;
+ justify-content: center;
+ height: 100%
+}
+
+.modal-dialog-centered.modal-dialog-scrollable .modal-content {
+ max-height: none
+}
+
+.modal-dialog-centered.modal-dialog-scrollable::before {
+ content: none
+}
+
+.modal-content {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ width: 100%;
+ pointer-events: auto;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: .3rem;
+ outline: 0
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000
+}
+
+.modal-backdrop.fade {
+ opacity: 0
+}
+
+.modal-backdrop.show {
+ opacity: .8
+}
+
+.modal-header {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: justify;
+ justify-content: space-between;
+ padding: 1rem 1rem;
+ border-bottom: 1px solid #dee2e6;
+ border-top-left-radius: .3rem;
+ border-top-right-radius: .3rem
+}
+
+.modal-header .close {
+ padding: 1rem 1rem;
+ margin: -1rem -1rem -1rem auto
+}
+
+.modal-title {
+ margin-bottom: 0;
+ line-height: 1.5
+}
+
+.modal-body {
+ position: relative;
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ padding: 1rem
+}
+
+.modal-footer {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: end;
+ justify-content: flex-end;
+ padding: 1rem;
+ border-top: 1px solid #dee2e6;
+ border-bottom-right-radius: .3rem;
+ border-bottom-left-radius: .3rem
+}
+
+.modal-footer>:not(:first-child) {
+ margin-left: .25rem
+}
+
+.modal-footer>:not(:last-child) {
+ margin-right: .25rem
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll
+}
+
+@media (min-width:576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto
+ }
+
+ .modal-dialog-scrollable {
+ max-height: calc(100% - 3.5rem)
+ }
+
+ .modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 3.5rem)
+ }
+
+ .modal-dialog-centered {
+ min-height: calc(100% - 3.5rem)
+ }
+
+ .modal-dialog-centered::before {
+ height: calc(100vh - 3.5rem)
+ }
+
+ .modal-sm {
+ max-width: 300px
+ }
+
+}
+
+@media (min-width:992px) {
+ .modal-lg,
+ .modal-xl {
+ max-width: 800px
+ }
+
+}
+
+@media (min-width:1200px) {
+ .modal-xl {
+ max-width: 1140px
+ }
+
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.7;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: .875rem;
+ word-wrap: break-word;
+ opacity: 0
+}
+
+.tooltip.show {
+ opacity: .9
+}
+
+.tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: .8rem;
+ height: .4rem
+}
+
+.tooltip .arrow::before {
+ position: absolute;
+ content: '%23dc3545';
+ border-color: transparent;
+ border-style: solid
+}
+
+.bs-tooltip-auto[x-placement^=top],
+.bs-tooltip-top {
+ padding: .4rem 0
+}
+
+.bs-tooltip-auto[x-placement^=top] .arrow,
+.bs-tooltip-top .arrow {
+ bottom: 0
+}
+
+.bs-tooltip-auto[x-placement^=top] .arrow::before,
+.bs-tooltip-top .arrow::before {
+ top: 0;
+ border-width: .4rem .4rem 0;
+ border-top-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=right],
+.bs-tooltip-right {
+ padding: 0 .4rem
+}
+
+.bs-tooltip-auto[x-placement^=right] .arrow,
+.bs-tooltip-right .arrow {
+ left: 0;
+ width: .4rem;
+ height: .8rem
+}
+
+.bs-tooltip-auto[x-placement^=right] .arrow::before,
+.bs-tooltip-right .arrow::before {
+ right: 0;
+ border-width: .4rem .4rem .4rem 0;
+ border-right-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=bottom],
+.bs-tooltip-bottom {
+ padding: .4rem 0
+}
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow,
+.bs-tooltip-bottom .arrow {
+ top: 0
+}
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow::before,
+.bs-tooltip-bottom .arrow::before {
+ bottom: 0;
+ border-width: 0 .4rem .4rem;
+ border-bottom-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=left],
+.bs-tooltip-left {
+ padding: 0 .4rem
+}
+
+.bs-tooltip-auto[x-placement^=left] .arrow,
+.bs-tooltip-left .arrow {
+ right: 0;
+ width: .4rem;
+ height: .8rem
+}
+
+.bs-tooltip-auto[x-placement^=left] .arrow::before,
+.bs-tooltip-left .arrow::before {
+ left: 0;
+ border-width: .4rem 0 .4rem .4rem;
+ border-left-color: #000
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: .25rem .5rem;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: .25rem
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: block;
+ max-width: 276px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.7;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: .875rem;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: .3rem
+}
+
+.popover .arrow {
+ position: absolute;
+ display: block;
+ width: 1rem;
+ height: .5rem;
+ margin: 0 6px
+}
+
+.popover .arrow::after,
+.popover .arrow::before {
+ position: absolute;
+ display: block;
+ content: '-2 -2 7 7';
+ border-color: transparent;
+ border-style: solid
+}
+
+.bs-popover-auto[x-placement^=top],
+.bs-popover-top {
+ margin-bottom: .5rem
+}
+
+.bs-popover-auto[x-placement^=top]>.arrow,
+.bs-popover-top>.arrow {
+ bottom: calc((.5rem + 1px) * -1)
+}
+
+.bs-popover-auto[x-placement^=top]>.arrow::before,
+.bs-popover-top>.arrow::before {
+ bottom: 0;
+ border-width: .5rem .5rem 0;
+ border-top-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=top]>.arrow::after,
+.bs-popover-top>.arrow::after {
+ bottom: 1px;
+ border-width: .5rem .5rem 0;
+ border-top-color: #fff
+}
+
+.bs-popover-auto[x-placement^=right],
+.bs-popover-right {
+ margin-left: .5rem
+}
+
+.bs-popover-auto[x-placement^=right]>.arrow,
+.bs-popover-right>.arrow {
+ left: calc((.5rem + 1px) * -1);
+ width: .5rem;
+ height: 1rem;
+ margin: 6px 0
+}
+
+.bs-popover-auto[x-placement^=right]>.arrow::before,
+.bs-popover-right>.arrow::before {
+ left: 0;
+ border-width: .5rem .5rem .5rem 0;
+ border-right-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=right]>.arrow::after,
+.bs-popover-right>.arrow::after {
+ left: 1px;
+ border-width: .5rem .5rem .5rem 0;
+ border-right-color: #fff
+}
+
+.bs-popover-auto[x-placement^=bottom],
+.bs-popover-bottom {
+ margin-top: .5rem
+}
+
+.bs-popover-auto[x-placement^=bottom]>.arrow,
+.bs-popover-bottom>.arrow {
+ top: calc((.5rem + 1px) * -1)
+}
+
+.bs-popover-auto[x-placement^=bottom]>.arrow::before,
+.bs-popover-bottom>.arrow::before {
+ top: 0;
+ border-width: 0 .5rem .5rem .5rem;
+ border-bottom-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=bottom]>.arrow::after,
+.bs-popover-bottom>.arrow::after {
+ top: 1px;
+ border-width: 0 .5rem .5rem .5rem;
+ border-bottom-color: #fff
+}
+
+.bs-popover-auto[x-placement^=bottom] .popover-header::before,
+.bs-popover-bottom .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 1rem;
+ margin-left: -.5rem;
+ content: '%23dc3545';
+ border-bottom: 1px solid #f7f7f7
+}
+
+.bs-popover-auto[x-placement^=left],
+.bs-popover-left {
+ margin-right: .5rem
+}
+
+.bs-popover-auto[x-placement^=left]>.arrow,
+.bs-popover-left>.arrow {
+ right: calc((.5rem + 1px) * -1);
+ width: .5rem;
+ height: 1rem;
+ margin: 6px 0
+}
+
+.bs-popover-auto[x-placement^=left]>.arrow::before,
+.bs-popover-left>.arrow::before {
+ right: 0;
+ border-width: .5rem 0 .5rem .5rem;
+ border-left-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=left]>.arrow::after,
+.bs-popover-left>.arrow::after {
+ right: 1px;
+ border-width: .5rem 0 .5rem .5rem;
+ border-left-color: #fff
+}
+
+.popover-header {
+ padding: .5rem .75rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-top-left-radius: calc(6px - 1px);
+ border-top-right-radius: calc(6px - 1px)
+}
+
+.popover-header:empty {
+ display: none
+}
+
+.popover-body {
+ padding: .5rem .75rem;
+ color: #212529
+}
+
+.carousel {
+ position: relative
+}
+
+.carousel.pointer-event {
+ touch-action: pan-y
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden
+}
+
+.carousel-inner::after {
+ display: block;
+ clear: both;
+ content: 'M0 0l3 3m0-3L0 3'
+}
+
+.carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-transition: -webkit-transform .6s ease-in-out;
+ transition: -webkit-transform .6s ease-in-out;
+ transition: transform .6s ease-in-out;
+ transition: transform .6s ease-in-out, -webkit-transform .6s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-item {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-item-next,
+.carousel-item-prev,
+.carousel-item.active {
+ display: block
+}
+
+.active.carousel-item-right,
+.carousel-item-next:not(.carousel-item-left) {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%)
+}
+
+.active.carousel-item-left,
+.carousel-item-prev:not(.carousel-item-right) {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%)
+}
+
+.carousel-fade .carousel-item {
+ opacity: 0;
+ -webkit-transition-property: opacity;
+ transition-property: opacity;
+ -webkit-transform: none;
+ transform: none
+}
+
+.carousel-fade .carousel-item-next.carousel-item-left,
+.carousel-fade .carousel-item-prev.carousel-item-right,
+.carousel-fade .carousel-item.active {
+ z-index: 1;
+ opacity: 1
+}
+
+.carousel-fade .active.carousel-item-left,
+.carousel-fade .active.carousel-item-right {
+ z-index: 0;
+ opacity: 0;
+ -webkit-transition: 0s .6s opacity;
+ transition: 0s .6s opacity
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-fade .active.carousel-item-left,
+ .carousel-fade .active.carousel-item-right {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-control-next,
+.carousel-control-prev {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ width: 15%;
+ color: #fff;
+ text-align: center;
+ opacity: .5;
+ -webkit-transition: opacity .15s ease;
+ transition: opacity .15s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-control-next,
+ .carousel-control-prev {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-control-next:focus,
+.carousel-control-next:hover,
+.carousel-control-prev:focus,
+.carousel-control-prev:hover {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: .9
+}
+
+.carousel-control-prev {
+ left: 0
+}
+
+.carousel-control-next {
+ right: 0
+}
+
+.carousel-control-next-icon,
+.carousel-control-prev-icon {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: no-repeat 50%/100% 100%
+}
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e")
+}
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e")
+}
+
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 15;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ padding-left: 0;
+ margin-right: 15%;
+ margin-left: 15%;
+ list-style: none
+}
+
+.carousel-indicators li {
+ box-sizing: content-box;
+ -webkit-box-flex: 0;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #fff;
+ background-clip: padding-box;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: .5;
+ -webkit-transition: opacity .6s ease;
+ transition: opacity .6s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-indicators li {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-indicators .active {
+ opacity: 1
+}
+
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+
+}
+
+@keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+
+}
+
+.spinner-border {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ border: .25em solid currentColor;
+ border-right-color: transparent;
+ border-radius: 50%;
+ -webkit-animation: spinner-border .75s linear infinite;
+ animation: spinner-border .75s linear infinite
+}
+
+.spinner-border-sm {
+ width: 1rem;
+ height: 1rem;
+ border-width: .2em
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+@keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+.spinner-grow {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ background-color: currentColor;
+ border-radius: 50%;
+ opacity: 0;
+ -webkit-animation: spinner-grow .75s linear infinite;
+ animation: spinner-grow .75s linear infinite
+}
+
+.spinner-grow-sm {
+ width: 1rem;
+ height: 1rem
+}
+
+.align-baseline {
+ vertical-align: baseline !important
+}
+
+.align-top {
+ vertical-align: top !important
+}
+
+.align-middle {
+ vertical-align: middle !important
+}
+
+.align-bottom {
+ vertical-align: bottom !important
+}
+
+.align-text-bottom {
+ vertical-align: text-bottom !important
+}
+
+.align-text-top {
+ vertical-align: text-top !important
+}
+
+.bg-primary {
+ background-color: #047006 !important
+}
+
+a.bg-primary:focus,
+a.bg-primary:hover,
+button.bg-primary:focus,
+button.bg-primary:hover {
+ background-color: #023f03 !important
+}
+
+.bg-secondary {
+ background-color: grey !important
+}
+
+a.bg-secondary:focus,
+a.bg-secondary:hover,
+button.bg-secondary:focus,
+button.bg-secondary:hover {
+ background-color: #676767 !important
+}
+
+.bg-success {
+ background-color: #00e093 !important
+}
+
+a.bg-success:focus,
+a.bg-success:hover,
+button.bg-success:focus,
+button.bg-success:hover {
+ background-color: #00ad72 !important
+}
+
+.bg-info {
+ background-color: #6c61f6 !important
+}
+
+a.bg-info:focus,
+a.bg-info:hover,
+button.bg-info:focus,
+button.bg-info:hover {
+ background-color: #3f31f3 !important
+}
+
+.bg-warning {
+ background-color: #f0825f !important
+}
+
+a.bg-warning:focus,
+a.bg-warning:hover,
+button.bg-warning:focus,
+button.bg-warning:hover {
+ background-color: #ec5e30 !important
+}
+
+.bg-danger {
+ background-color: #ff5f66 !important
+}
+
+a.bg-danger:focus,
+a.bg-danger:hover,
+button.bg-danger:focus,
+button.bg-danger:hover {
+ background-color: #ff2c35 !important
+}
+
+.bg-light {
+ background-color: #dfdfdf !important
+}
+
+a.bg-light:focus,
+a.bg-light:hover,
+button.bg-light:focus,
+button.bg-light:hover {
+ background-color: #c6c6c6 !important
+}
+
+.bg-dark {
+ background-color: #74767b !important
+}
+
+a.bg-dark:focus,
+a.bg-dark:hover,
+button.bg-dark:focus,
+button.bg-dark:hover {
+ background-color: #5b5d61 !important
+}
+
+.bg-white {
+ background-color: #fff !important
+}
+
+a.bg-white:focus,
+a.bg-white:hover,
+button.bg-white:focus,
+button.bg-white:hover {
+ background-color: #e6e6e6 !important
+}
+
+.bg-orange {
+ background-color: #ffa600 !important
+}
+
+a.bg-orange:focus,
+a.bg-orange:hover,
+button.bg-orange:focus,
+button.bg-orange:hover {
+ background-color: #cc8500 !important
+}
+
+.bg-white {
+ background-color: #fff !important
+}
+
+.bg-transparent {
+ background-color: transparent !important
+}
+
+.border {
+ border: 1px solid #f2f4f9 !important
+}
+
+.border-top {
+ border-top: 1px solid #f2f4f9 !important
+}
+
+.border-right {
+ border-right: 1px solid #f2f4f9 !important
+}
+
+.border-bottom {
+ border-bottom: 1px solid #f2f4f9 !important
+}
+
+.border-left {
+ border-left: 1px solid #f2f4f9 !important
+}
+
+.border-0 {
+ border: 0 !important
+}
+
+.border-top-0 {
+ border-top: 0 !important
+}
+
+.border-right-0 {
+ border-right: 0 !important
+}
+
+.border-bottom-0 {
+ border-bottom: 0 !important
+}
+
+.border-left-0 {
+ border-left: 0 !important
+}
+
+.border-primary {
+ border-color: #047006 !important
+}
+
+.border-secondary {
+ border-color: grey !important
+}
+
+.border-success {
+ border-color: #00e093 !important
+}
+
+.border-info {
+ border-color: #6c61f6 !important
+}
+
+.border-warning {
+ border-color: #f0825f !important
+}
+
+.border-danger {
+ border-color: #ff5f66 !important
+}
+
+.border-light {
+ border-color: #dfdfdf !important
+}
+
+.border-dark {
+ border-color: #74767b !important
+}
+
+.border-white {
+ border-color: #fff !important
+}
+
+.border-orange {
+ border-color: #ffa600 !important
+}
+
+.border-white {
+ border-color: #fff !important
+}
+
+.rounded-sm {
+ border-radius: .2rem !important
+}
+
+.rounded {
+ border-radius: 2px !important
+}
+
+.rounded-top {
+ border-top-left-radius: 2px !important;
+ border-top-right-radius: 2px !important
+}
+
+.rounded-right {
+ border-top-right-radius: 2px !important;
+ border-bottom-right-radius: 2px !important
+}
+
+.rounded-bottom {
+ border-bottom-right-radius: 2px !important;
+ border-bottom-left-radius: 2px !important
+}
+
+.rounded-left {
+ border-top-left-radius: 2px !important;
+ border-bottom-left-radius: 2px !important
+}
+
+.rounded-lg {
+ border-radius: 6px !important
+}
+
+.rounded-circle {
+ border-radius: 50% !important
+}
+
+.rounded-pill {
+ border-radius: 50rem !important
+}
+
+.rounded-0 {
+ border-radius: 0 !important
+}
+
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: '.5'
+}
+
+.d-none {
+ display: none !important
+}
+
+.d-inline {
+ display: inline !important
+}
+
+.d-inline-block {
+ display: inline-block !important
+}
+
+.d-block {
+ display: block !important
+}
+
+.d-table {
+ display: table !important
+}
+
+.d-table-row {
+ display: table-row !important
+}
+
+.d-table-cell {
+ display: table-cell !important
+}
+
+.d-flex {
+ display: -webkit-box !important;
+ display: flex !important
+}
+
+.d-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+}
+
+@media (min-width:576px) {
+ .d-sm-none {
+ display: none !important
+ }
+
+ .d-sm-inline {
+ display: inline !important
+ }
+
+ .d-sm-inline-block {
+ display: inline-block !important
+ }
+
+ .d-sm-block {
+ display: block !important
+ }
+
+ .d-sm-table {
+ display: table !important
+ }
+
+ .d-sm-table-row {
+ display: table-row !important
+ }
+
+ .d-sm-table-cell {
+ display: table-cell !important
+ }
+
+ .d-sm-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-sm-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .d-md-none {
+ display: none !important
+ }
+
+ .d-md-inline {
+ display: inline !important
+ }
+
+ .d-md-inline-block {
+ display: inline-block !important
+ }
+
+ .d-md-block {
+ display: block !important
+ }
+
+ .d-md-table {
+ display: table !important
+ }
+
+ .d-md-table-row {
+ display: table-row !important
+ }
+
+ .d-md-table-cell {
+ display: table-cell !important
+ }
+
+ .d-md-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-md-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .d-lg-none {
+ display: none !important
+ }
+
+ .d-lg-inline {
+ display: inline !important
+ }
+
+ .d-lg-inline-block {
+ display: inline-block !important
+ }
+
+ .d-lg-block {
+ display: block !important
+ }
+
+ .d-lg-table {
+ display: table !important
+ }
+
+ .d-lg-table-row {
+ display: table-row !important
+ }
+
+ .d-lg-table-cell {
+ display: table-cell !important
+ }
+
+ .d-lg-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-lg-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .d-xl-none {
+ display: none !important
+ }
+
+ .d-xl-inline {
+ display: inline !important
+ }
+
+ .d-xl-inline-block {
+ display: inline-block !important
+ }
+
+ .d-xl-block {
+ display: block !important
+ }
+
+ .d-xl-table {
+ display: table !important
+ }
+
+ .d-xl-table-row {
+ display: table-row !important
+ }
+
+ .d-xl-table-cell {
+ display: table-cell !important
+ }
+
+ .d-xl-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-xl-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media print {
+ .d-print-none {
+ display: none !important
+ }
+
+ .d-print-inline {
+ display: inline !important
+ }
+
+ .d-print-inline-block {
+ display: inline-block !important
+ }
+
+ .d-print-block {
+ display: block !important
+ }
+
+ .d-print-table {
+ display: table !important
+ }
+
+ .d-print-table-row {
+ display: table-row !important
+ }
+
+ .d-print-table-cell {
+ display: table-cell !important
+ }
+
+ .d-print-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-print-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden
+}
+
+.embed-responsive::before {
+ display: block;
+ content: '3'
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive embed,
+.embed-responsive iframe,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0
+}
+
+.embed-responsive-21by9::before {
+ padding-top: 42.85714%
+}
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%
+}
+
+.embed-responsive-4by3::before {
+ padding-top: 75%
+}
+
+.embed-responsive-1by1::before {
+ padding-top: 100%
+}
+
+.embed-responsive-21by9::before {
+ padding-top: 42.85714%
+}
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%
+}
+
+.embed-responsive-4by3::before {
+ padding-top: 75%
+}
+
+.embed-responsive-1by1::before {
+ padding-top: 100%
+}
+
+.flex-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+}
+
+.flex-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+}
+
+.flex-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+}
+
+.flex-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+}
+
+.flex-wrap {
+ flex-wrap: wrap !important
+}
+
+.flex-nowrap {
+ flex-wrap: nowrap !important
+}
+
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+}
+
+.flex-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+}
+
+.flex-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+}
+
+.flex-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0 !important
+}
+
+.flex-shrink-1 {
+ flex-shrink: 1 !important
+}
+
+.justify-content-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+}
+
+.justify-content-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+}
+
+.justify-content-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+}
+
+.justify-content-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+}
+
+.justify-content-around {
+ justify-content: space-around !important
+}
+
+.align-items-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+}
+
+.align-items-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+}
+
+.align-items-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+}
+
+.align-items-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+}
+
+.align-items-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+}
+
+.align-content-start {
+ align-content: flex-start !important
+}
+
+.align-content-end {
+ align-content: flex-end !important
+}
+
+.align-content-center {
+ align-content: center !important
+}
+
+.align-content-between {
+ align-content: space-between !important
+}
+
+.align-content-around {
+ align-content: space-around !important
+}
+
+.align-content-stretch {
+ align-content: stretch !important
+}
+
+.align-self-auto {
+ align-self: auto !important
+}
+
+.align-self-start {
+ align-self: flex-start !important
+}
+
+.align-self-end {
+ align-self: flex-end !important
+}
+
+.align-self-center {
+ align-self: center !important
+}
+
+.align-self-baseline {
+ align-self: baseline !important
+}
+
+.align-self-stretch {
+ align-self: stretch !important
+}
+
+@media (min-width:576px) {
+ .flex-sm-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-sm-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-sm-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-sm-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-sm-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-sm-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-sm-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-sm-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-sm-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-sm-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-sm-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-sm-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-sm-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-sm-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-sm-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-sm-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-sm-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-sm-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-sm-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-sm-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-sm-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-sm-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-sm-center {
+ align-content: center !important
+ }
+
+ .align-content-sm-between {
+ align-content: space-between !important
+ }
+
+ .align-content-sm-around {
+ align-content: space-around !important
+ }
+
+ .align-content-sm-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-sm-auto {
+ align-self: auto !important
+ }
+
+ .align-self-sm-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-sm-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-sm-center {
+ align-self: center !important
+ }
+
+ .align-self-sm-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-sm-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .flex-md-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-md-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-md-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-md-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-md-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-md-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-md-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-md-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-md-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-md-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-md-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-md-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-md-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-md-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-md-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-md-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-md-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-md-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-md-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-md-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-md-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-md-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-md-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-md-center {
+ align-content: center !important
+ }
+
+ .align-content-md-between {
+ align-content: space-between !important
+ }
+
+ .align-content-md-around {
+ align-content: space-around !important
+ }
+
+ .align-content-md-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-md-auto {
+ align-self: auto !important
+ }
+
+ .align-self-md-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-md-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-md-center {
+ align-self: center !important
+ }
+
+ .align-self-md-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-md-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .flex-lg-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-lg-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-lg-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-lg-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-lg-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-lg-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-lg-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-lg-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-lg-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-lg-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-lg-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-lg-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-lg-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-lg-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-lg-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-lg-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-lg-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-lg-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-lg-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-lg-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-lg-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-lg-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-lg-center {
+ align-content: center !important
+ }
+
+ .align-content-lg-between {
+ align-content: space-between !important
+ }
+
+ .align-content-lg-around {
+ align-content: space-around !important
+ }
+
+ .align-content-lg-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-lg-auto {
+ align-self: auto !important
+ }
+
+ .align-self-lg-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-lg-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-lg-center {
+ align-self: center !important
+ }
+
+ .align-self-lg-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-lg-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .flex-xl-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-xl-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-xl-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-xl-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-xl-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-xl-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-xl-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-xl-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-xl-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-xl-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-xl-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-xl-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-xl-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-xl-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-xl-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-xl-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-xl-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-xl-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-xl-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-xl-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-xl-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-xl-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-xl-center {
+ align-content: center !important
+ }
+
+ .align-content-xl-between {
+ align-content: space-between !important
+ }
+
+ .align-content-xl-around {
+ align-content: space-around !important
+ }
+
+ .align-content-xl-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-xl-auto {
+ align-self: auto !important
+ }
+
+ .align-self-xl-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-xl-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-xl-center {
+ align-self: center !important
+ }
+
+ .align-self-xl-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-xl-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+.float-left {
+ float: left !important
+}
+
+.float-right {
+ float: right !important
+}
+
+.float-none {
+ float: none !important
+}
+
+@media (min-width:576px) {
+ .float-sm-left {
+ float: left !important
+ }
+
+ .float-sm-right {
+ float: right !important
+ }
+
+ .float-sm-none {
+ float: none !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .float-md-left {
+ float: left !important
+ }
+
+ .float-md-right {
+ float: right !important
+ }
+
+ .float-md-none {
+ float: none !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .float-lg-left {
+ float: left !important
+ }
+
+ .float-lg-right {
+ float: right !important
+ }
+
+ .float-lg-none {
+ float: none !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .float-xl-left {
+ float: left !important
+ }
+
+ .float-xl-right {
+ float: right !important
+ }
+
+ .float-xl-none {
+ float: none !important
+ }
+
+}
+
+.overflow-auto {
+ overflow: auto !important
+}
+
+.overflow-hidden {
+ overflow: hidden !important
+}
+
+.position-static {
+ position: static !important
+}
+
+.position-relative {
+ position: relative !important
+}
+
+.position-absolute {
+ position: absolute !important
+}
+
+.position-fixed {
+ position: fixed !important
+}
+
+.position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important
+}
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030
+}
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030
+}
+
+@supports ((position:-webkit-sticky) or (position:sticky)) {
+ .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020
+ }
+
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal
+}
+
+.shadow-sm {
+ box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important
+}
+
+.shadow {
+ box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important
+}
+
+.shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important
+}
+
+.shadow-none {
+ box-shadow: none !important
+}
+
+.w-25 {
+ width: 25% !important
+}
+
+.w-50 {
+ width: 50% !important
+}
+
+.w-75 {
+ width: 75% !important
+}
+
+.w-100 {
+ width: 100% !important
+}
+
+.w-auto {
+ width: auto !important
+}
+
+.h-25 {
+ height: 25% !important
+}
+
+.h-50 {
+ height: 50% !important
+}
+
+.h-75 {
+ height: 75% !important
+}
+
+.h-100 {
+ height: 100% !important
+}
+
+.h-auto {
+ height: auto !important
+}
+
+.mw-100 {
+ max-width: 100% !important
+}
+
+.mh-100 {
+ max-height: 100% !important
+}
+
+.min-vw-100 {
+ min-width: 100vw !important
+}
+
+.min-vh-100 {
+ min-height: 100vh !important
+}
+
+.vw-100 {
+ width: 100vw !important
+}
+
+.vh-100 {
+ height: 100vh !important
+}
+
+.stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ pointer-events: auto;
+ content: '.5';
+ background-color: rgba(0, 0, 0, 0)
+}
+
+.m-0 {
+ margin: 0 !important
+}
+
+.mt-0,
+.my-0 {
+ margin-top: 0 !important
+}
+
+.mr-0,
+.mx-0 {
+ margin-right: 0 !important
+}
+
+.mb-0,
+.my-0 {
+ margin-bottom: 0 !important
+}
+
+.ml-0,
+.mx-0 {
+ margin-left: 0 !important
+}
+
+.m-1 {
+ margin: .25rem !important
+}
+
+.mt-1,
+.my-1 {
+ margin-top: .25rem !important
+}
+
+.mr-1,
+.mx-1 {
+ margin-right: .25rem !important
+}
+
+.mb-1,
+.my-1 {
+ margin-bottom: .25rem !important
+}
+
+.ml-1,
+.mx-1 {
+ margin-left: .25rem !important
+}
+
+.m-2 {
+ margin: .5rem !important
+}
+
+.mt-2,
+.my-2 {
+ margin-top: .5rem !important
+}
+
+.mr-2,
+.mx-2 {
+ margin-right: .5rem !important
+}
+
+.mb-2,
+.my-2 {
+ margin-bottom: .5rem !important
+}
+
+.ml-2,
+.mx-2 {
+ margin-left: .5rem !important
+}
+
+.m-3 {
+ margin: 1rem !important
+}
+
+.mt-3,
+.my-3 {
+ margin-top: 1rem !important
+}
+
+.mr-3,
+.mx-3 {
+ margin-right: 1rem !important
+}
+
+.mb-3,
+.my-3 {
+ margin-bottom: 1rem !important
+}
+
+.ml-3,
+.mx-3 {
+ margin-left: 1rem !important
+}
+
+.m-4 {
+ margin: 1.5rem !important
+}
+
+.mt-4,
+.my-4 {
+ margin-top: 1.5rem !important
+}
+
+.mr-4,
+.mx-4 {
+ margin-right: 1.5rem !important
+}
+
+.mb-4,
+.my-4 {
+ margin-bottom: 1.5rem !important
+}
+
+.ml-4,
+.mx-4 {
+ margin-left: 1.5rem !important
+}
+
+.m-5 {
+ margin: 3rem !important
+}
+
+.mt-5,
+.my-5 {
+ margin-top: 3rem !important
+}
+
+.mr-5,
+.mx-5 {
+ margin-right: 3rem !important
+}
+
+.mb-5,
+.my-5 {
+ margin-bottom: 3rem !important
+}
+
+.ml-5,
+.mx-5 {
+ margin-left: 3rem !important
+}
+
+.p-0 {
+ padding: 0 !important
+}
+
+.pt-0,
+.py-0 {
+ padding-top: 0 !important
+}
+
+.pr-0,
+.px-0 {
+ padding-right: 0 !important
+}
+
+.pb-0,
+.py-0 {
+ padding-bottom: 0 !important
+}
+
+.pl-0,
+.px-0 {
+ padding-left: 0 !important
+}
+
+.p-1 {
+ padding: .25rem !important
+}
+
+.pt-1,
+.py-1 {
+ padding-top: .25rem !important
+}
+
+.pr-1,
+.px-1 {
+ padding-right: .25rem !important
+}
+
+.pb-1,
+.py-1 {
+ padding-bottom: .25rem !important
+}
+
+.pl-1,
+.px-1 {
+ padding-left: .25rem !important
+}
+
+.p-2 {
+ padding: .5rem !important
+}
+
+.pt-2,
+.py-2 {
+ padding-top: .5rem !important
+}
+
+.pr-2,
+.px-2 {
+ padding-right: .5rem !important
+}
+
+.pb-2,
+.py-2 {
+ padding-bottom: .5rem !important
+}
+
+.pl-2,
+.px-2 {
+ padding-left: .5rem !important
+}
+
+.p-3 {
+ padding: 1rem !important
+}
+
+.pt-3,
+.py-3 {
+ padding-top: 1rem !important
+}
+
+.pr-3,
+.px-3 {
+ padding-right: 1rem !important
+}
+
+.pb-3,
+.py-3 {
+ padding-bottom: 1rem !important
+}
+
+.pl-3,
+.px-3 {
+ padding-left: 1rem !important
+}
+
+.p-4 {
+ padding: 1.5rem !important
+}
+
+.pt-4,
+.py-4 {
+ padding-top: 1.5rem !important
+}
+
+.pr-4,
+.px-4 {
+ padding-right: 1.5rem !important
+}
+
+.pb-4,
+.py-4 {
+ padding-bottom: 1.5rem !important
+}
+
+.pl-4,
+.px-4 {
+ padding-left: 1.5rem !important
+}
+
+.p-5 {
+ padding: 3rem !important
+}
+
+.pt-5,
+.py-5 {
+ padding-top: 3rem !important
+}
+
+.pr-5,
+.px-5 {
+ padding-right: 3rem !important
+}
+
+.pb-5,
+.py-5 {
+ padding-bottom: 3rem !important
+}
+
+.pl-5,
+.px-5 {
+ padding-left: 3rem !important
+}
+
+.m-n1 {
+ margin: -.25rem !important
+}
+
+.mt-n1,
+.my-n1 {
+ margin-top: -.25rem !important
+}
+
+.mr-n1,
+.mx-n1 {
+ margin-right: -.25rem !important
+}
+
+.mb-n1,
+.my-n1 {
+ margin-bottom: -.25rem !important
+}
+
+.ml-n1,
+.mx-n1 {
+ margin-left: -.25rem !important
+}
+
+.m-n2 {
+ margin: -.5rem !important
+}
+
+.mt-n2,
+.my-n2 {
+ margin-top: -.5rem !important
+}
+
+.mr-n2,
+.mx-n2 {
+ margin-right: -.5rem !important
+}
+
+.mb-n2,
+.my-n2 {
+ margin-bottom: -.5rem !important
+}
+
+.ml-n2,
+.mx-n2 {
+ margin-left: -.5rem !important
+}
+
+.m-n3 {
+ margin: -1rem !important
+}
+
+.mt-n3,
+.my-n3 {
+ margin-top: -1rem !important
+}
+
+.mr-n3,
+.mx-n3 {
+ margin-right: -1rem !important
+}
+
+.mb-n3,
+.my-n3 {
+ margin-bottom: -1rem !important
+}
+
+.ml-n3,
+.mx-n3 {
+ margin-left: -1rem !important
+}
+
+.m-n4 {
+ margin: -1.5rem !important
+}
+
+.mt-n4,
+.my-n4 {
+ margin-top: -1.5rem !important
+}
+
+.mr-n4,
+.mx-n4 {
+ margin-right: -1.5rem !important
+}
+
+.mb-n4,
+.my-n4 {
+ margin-bottom: -1.5rem !important
+}
+
+.ml-n4,
+.mx-n4 {
+ margin-left: -1.5rem !important
+}
+
+.m-n5 {
+ margin: -3rem !important
+}
+
+.mt-n5,
+.my-n5 {
+ margin-top: -3rem !important
+}
+
+.mr-n5,
+.mx-n5 {
+ margin-right: -3rem !important
+}
+
+.mb-n5,
+.my-n5 {
+ margin-bottom: -3rem !important
+}
+
+.ml-n5,
+.mx-n5 {
+ margin-left: -3rem !important
+}
+
+.m-auto {
+ margin: auto !important
+}
+
+.mt-auto,
+.my-auto {
+ margin-top: auto !important
+}
+
+.mr-auto,
+.mx-auto {
+ margin-right: auto !important
+}
+
+.mb-auto,
+.my-auto {
+ margin-bottom: auto !important
+}
+
+.ml-auto,
+.mx-auto {
+ margin-left: auto !important
+}
+
+@media (min-width:576px) {
+ .m-sm-0 {
+ margin: 0 !important
+ }
+
+ .mt-sm-0,
+ .my-sm-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-sm-0,
+ .mx-sm-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-sm-0,
+ .my-sm-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-sm-0,
+ .mx-sm-0 {
+ margin-left: 0 !important
+ }
+
+ .m-sm-1 {
+ margin: .25rem !important
+ }
+
+ .mt-sm-1,
+ .my-sm-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-sm-1,
+ .mx-sm-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-sm-1,
+ .my-sm-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-sm-1,
+ .mx-sm-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-sm-2 {
+ margin: .5rem !important
+ }
+
+ .mt-sm-2,
+ .my-sm-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-sm-2,
+ .mx-sm-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-sm-2,
+ .my-sm-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-sm-2,
+ .mx-sm-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-sm-3 {
+ margin: 1rem !important
+ }
+
+ .mt-sm-3,
+ .my-sm-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-sm-3,
+ .mx-sm-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-sm-3,
+ .my-sm-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-sm-3,
+ .mx-sm-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-sm-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-sm-4,
+ .my-sm-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-sm-4,
+ .mx-sm-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-sm-4,
+ .my-sm-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-sm-4,
+ .mx-sm-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-sm-5 {
+ margin: 3rem !important
+ }
+
+ .mt-sm-5,
+ .my-sm-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-sm-5,
+ .mx-sm-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-sm-5,
+ .my-sm-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-sm-5,
+ .mx-sm-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-sm-0 {
+ padding: 0 !important
+ }
+
+ .pt-sm-0,
+ .py-sm-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-sm-0,
+ .px-sm-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-sm-0,
+ .py-sm-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-sm-0,
+ .px-sm-0 {
+ padding-left: 0 !important
+ }
+
+ .p-sm-1 {
+ padding: .25rem !important
+ }
+
+ .pt-sm-1,
+ .py-sm-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-sm-1,
+ .px-sm-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-sm-1,
+ .py-sm-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-sm-1,
+ .px-sm-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-sm-2 {
+ padding: .5rem !important
+ }
+
+ .pt-sm-2,
+ .py-sm-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-sm-2,
+ .px-sm-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-sm-2,
+ .py-sm-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-sm-2,
+ .px-sm-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-sm-3 {
+ padding: 1rem !important
+ }
+
+ .pt-sm-3,
+ .py-sm-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-sm-3,
+ .px-sm-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-sm-3,
+ .py-sm-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-sm-3,
+ .px-sm-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-sm-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-sm-4,
+ .py-sm-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-sm-4,
+ .px-sm-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-sm-4,
+ .py-sm-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-sm-4,
+ .px-sm-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-sm-5 {
+ padding: 3rem !important
+ }
+
+ .pt-sm-5,
+ .py-sm-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-sm-5,
+ .px-sm-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-sm-5,
+ .py-sm-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-sm-5,
+ .px-sm-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-sm-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-sm-n1,
+ .my-sm-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-sm-n1,
+ .mx-sm-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-sm-n1,
+ .my-sm-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-sm-n1,
+ .mx-sm-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-sm-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-sm-n2,
+ .my-sm-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-sm-n2,
+ .mx-sm-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-sm-n2,
+ .my-sm-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-sm-n2,
+ .mx-sm-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-sm-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-sm-n3,
+ .my-sm-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-sm-n3,
+ .mx-sm-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-sm-n3,
+ .my-sm-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-sm-n3,
+ .mx-sm-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-sm-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-sm-n4,
+ .my-sm-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-sm-n4,
+ .mx-sm-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-sm-n4,
+ .my-sm-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-sm-n4,
+ .mx-sm-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-sm-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-sm-n5,
+ .my-sm-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-sm-n5,
+ .mx-sm-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-sm-n5,
+ .my-sm-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-sm-n5,
+ .mx-sm-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-sm-auto {
+ margin: auto !important
+ }
+
+ .mt-sm-auto,
+ .my-sm-auto {
+ margin-top: auto !important
+ }
+
+ .mr-sm-auto,
+ .mx-sm-auto {
+ margin-right: auto !important
+ }
+
+ .mb-sm-auto,
+ .my-sm-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-sm-auto,
+ .mx-sm-auto {
+ margin-left: auto !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .m-md-0 {
+ margin: 0 !important
+ }
+
+ .mt-md-0,
+ .my-md-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-md-0,
+ .mx-md-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-md-0,
+ .my-md-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-md-0,
+ .mx-md-0 {
+ margin-left: 0 !important
+ }
+
+ .m-md-1 {
+ margin: .25rem !important
+ }
+
+ .mt-md-1,
+ .my-md-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-md-1,
+ .mx-md-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-md-1,
+ .my-md-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-md-1,
+ .mx-md-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-md-2 {
+ margin: .5rem !important
+ }
+
+ .mt-md-2,
+ .my-md-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-md-2,
+ .mx-md-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-md-2,
+ .my-md-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-md-2,
+ .mx-md-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-md-3 {
+ margin: 1rem !important
+ }
+
+ .mt-md-3,
+ .my-md-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-md-3,
+ .mx-md-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-md-3,
+ .my-md-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-md-3,
+ .mx-md-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-md-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-md-4,
+ .my-md-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-md-4,
+ .mx-md-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-md-4,
+ .my-md-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-md-4,
+ .mx-md-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-md-5 {
+ margin: 3rem !important
+ }
+
+ .mt-md-5,
+ .my-md-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-md-5,
+ .mx-md-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-md-5,
+ .my-md-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-md-5,
+ .mx-md-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-md-0 {
+ padding: 0 !important
+ }
+
+ .pt-md-0,
+ .py-md-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-md-0,
+ .px-md-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-md-0,
+ .py-md-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-md-0,
+ .px-md-0 {
+ padding-left: 0 !important
+ }
+
+ .p-md-1 {
+ padding: .25rem !important
+ }
+
+ .pt-md-1,
+ .py-md-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-md-1,
+ .px-md-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-md-1,
+ .py-md-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-md-1,
+ .px-md-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-md-2 {
+ padding: .5rem !important
+ }
+
+ .pt-md-2,
+ .py-md-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-md-2,
+ .px-md-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-md-2,
+ .py-md-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-md-2,
+ .px-md-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-md-3 {
+ padding: 1rem !important
+ }
+
+ .pt-md-3,
+ .py-md-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-md-3,
+ .px-md-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-md-3,
+ .py-md-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-md-3,
+ .px-md-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-md-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-md-4,
+ .py-md-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-md-4,
+ .px-md-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-md-4,
+ .py-md-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-md-4,
+ .px-md-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-md-5 {
+ padding: 3rem !important
+ }
+
+ .pt-md-5,
+ .py-md-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-md-5,
+ .px-md-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-md-5,
+ .py-md-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-md-5,
+ .px-md-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-md-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-md-n1,
+ .my-md-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-md-n1,
+ .mx-md-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-md-n1,
+ .my-md-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-md-n1,
+ .mx-md-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-md-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-md-n2,
+ .my-md-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-md-n2,
+ .mx-md-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-md-n2,
+ .my-md-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-md-n2,
+ .mx-md-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-md-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-md-n3,
+ .my-md-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-md-n3,
+ .mx-md-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-md-n3,
+ .my-md-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-md-n3,
+ .mx-md-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-md-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-md-n4,
+ .my-md-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-md-n4,
+ .mx-md-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-md-n4,
+ .my-md-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-md-n4,
+ .mx-md-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-md-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-md-n5,
+ .my-md-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-md-n5,
+ .mx-md-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-md-n5,
+ .my-md-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-md-n5,
+ .mx-md-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-md-auto {
+ margin: auto !important
+ }
+
+ .mt-md-auto,
+ .my-md-auto {
+ margin-top: auto !important
+ }
+
+ .mr-md-auto,
+ .mx-md-auto {
+ margin-right: auto !important
+ }
+
+ .mb-md-auto,
+ .my-md-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-md-auto,
+ .mx-md-auto {
+ margin-left: auto !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .m-lg-0 {
+ margin: 0 !important
+ }
+
+ .mt-lg-0,
+ .my-lg-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-lg-0,
+ .mx-lg-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-lg-0,
+ .my-lg-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-lg-0,
+ .mx-lg-0 {
+ margin-left: 0 !important
+ }
+
+ .m-lg-1 {
+ margin: .25rem !important
+ }
+
+ .mt-lg-1,
+ .my-lg-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-lg-1,
+ .mx-lg-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-lg-1,
+ .my-lg-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-lg-1,
+ .mx-lg-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-lg-2 {
+ margin: .5rem !important
+ }
+
+ .mt-lg-2,
+ .my-lg-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-lg-2,
+ .mx-lg-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-lg-2,
+ .my-lg-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-lg-2,
+ .mx-lg-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-lg-3 {
+ margin: 1rem !important
+ }
+
+ .mt-lg-3,
+ .my-lg-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-lg-3,
+ .mx-lg-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-lg-3,
+ .my-lg-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-lg-3,
+ .mx-lg-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-lg-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-lg-4,
+ .my-lg-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-lg-4,
+ .mx-lg-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-lg-4,
+ .my-lg-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-lg-4,
+ .mx-lg-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-lg-5 {
+ margin: 3rem !important
+ }
+
+ .mt-lg-5,
+ .my-lg-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-lg-5,
+ .mx-lg-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-lg-5,
+ .my-lg-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-lg-5,
+ .mx-lg-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-lg-0 {
+ padding: 0 !important
+ }
+
+ .pt-lg-0,
+ .py-lg-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-lg-0,
+ .px-lg-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-lg-0,
+ .py-lg-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-lg-0,
+ .px-lg-0 {
+ padding-left: 0 !important
+ }
+
+ .p-lg-1 {
+ padding: .25rem !important
+ }
+
+ .pt-lg-1,
+ .py-lg-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-lg-1,
+ .px-lg-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-lg-1,
+ .py-lg-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-lg-1,
+ .px-lg-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-lg-2 {
+ padding: .5rem !important
+ }
+
+ .pt-lg-2,
+ .py-lg-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-lg-2,
+ .px-lg-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-lg-2,
+ .py-lg-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-lg-2,
+ .px-lg-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-lg-3 {
+ padding: 1rem !important
+ }
+
+ .pt-lg-3,
+ .py-lg-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-lg-3,
+ .px-lg-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-lg-3,
+ .py-lg-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-lg-3,
+ .px-lg-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-lg-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-lg-4,
+ .py-lg-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-lg-4,
+ .px-lg-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-lg-4,
+ .py-lg-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-lg-4,
+ .px-lg-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-lg-5 {
+ padding: 3rem !important
+ }
+
+ .pt-lg-5,
+ .py-lg-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-lg-5,
+ .px-lg-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-lg-5,
+ .py-lg-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-lg-5,
+ .px-lg-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-lg-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-lg-n1,
+ .my-lg-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-lg-n1,
+ .mx-lg-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-lg-n1,
+ .my-lg-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-lg-n1,
+ .mx-lg-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-lg-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-lg-n2,
+ .my-lg-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-lg-n2,
+ .mx-lg-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-lg-n2,
+ .my-lg-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-lg-n2,
+ .mx-lg-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-lg-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-lg-n3,
+ .my-lg-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-lg-n3,
+ .mx-lg-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-lg-n3,
+ .my-lg-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-lg-n3,
+ .mx-lg-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-lg-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-lg-n4,
+ .my-lg-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-lg-n4,
+ .mx-lg-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-lg-n4,
+ .my-lg-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-lg-n4,
+ .mx-lg-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-lg-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-lg-n5,
+ .my-lg-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-lg-n5,
+ .mx-lg-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-lg-n5,
+ .my-lg-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-lg-n5,
+ .mx-lg-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-lg-auto {
+ margin: auto !important
+ }
+
+ .mt-lg-auto,
+ .my-lg-auto {
+ margin-top: auto !important
+ }
+
+ .mr-lg-auto,
+ .mx-lg-auto {
+ margin-right: auto !important
+ }
+
+ .mb-lg-auto,
+ .my-lg-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-lg-auto,
+ .mx-lg-auto {
+ margin-left: auto !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .m-xl-0 {
+ margin: 0 !important
+ }
+
+ .mt-xl-0,
+ .my-xl-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-xl-0,
+ .mx-xl-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-xl-0,
+ .my-xl-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-xl-0,
+ .mx-xl-0 {
+ margin-left: 0 !important
+ }
+
+ .m-xl-1 {
+ margin: .25rem !important
+ }
+
+ .mt-xl-1,
+ .my-xl-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-xl-1,
+ .mx-xl-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-xl-1,
+ .my-xl-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-xl-1,
+ .mx-xl-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-xl-2 {
+ margin: .5rem !important
+ }
+
+ .mt-xl-2,
+ .my-xl-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-xl-2,
+ .mx-xl-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-xl-2,
+ .my-xl-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-xl-2,
+ .mx-xl-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-xl-3 {
+ margin: 1rem !important
+ }
+
+ .mt-xl-3,
+ .my-xl-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-xl-3,
+ .mx-xl-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-xl-3,
+ .my-xl-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-xl-3,
+ .mx-xl-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-xl-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-xl-4,
+ .my-xl-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-xl-4,
+ .mx-xl-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-xl-4,
+ .my-xl-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-xl-4,
+ .mx-xl-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-xl-5 {
+ margin: 3rem !important
+ }
+
+ .mt-xl-5,
+ .my-xl-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-xl-5,
+ .mx-xl-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-xl-5,
+ .my-xl-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-xl-5,
+ .mx-xl-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-xl-0 {
+ padding: 0 !important
+ }
+
+ .pt-xl-0,
+ .py-xl-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-xl-0,
+ .px-xl-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-xl-0,
+ .py-xl-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-xl-0,
+ .px-xl-0 {
+ padding-left: 0 !important
+ }
+
+ .p-xl-1 {
+ padding: .25rem !important
+ }
+
+ .pt-xl-1,
+ .py-xl-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-xl-1,
+ .px-xl-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-xl-1,
+ .py-xl-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-xl-1,
+ .px-xl-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-xl-2 {
+ padding: .5rem !important
+ }
+
+ .pt-xl-2,
+ .py-xl-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-xl-2,
+ .px-xl-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-xl-2,
+ .py-xl-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-xl-2,
+ .px-xl-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-xl-3 {
+ padding: 1rem !important
+ }
+
+ .pt-xl-3,
+ .py-xl-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-xl-3,
+ .px-xl-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-xl-3,
+ .py-xl-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-xl-3,
+ .px-xl-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-xl-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-xl-4,
+ .py-xl-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-xl-4,
+ .px-xl-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-xl-4,
+ .py-xl-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-xl-4,
+ .px-xl-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-xl-5 {
+ padding: 3rem !important
+ }
+
+ .pt-xl-5,
+ .py-xl-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-xl-5,
+ .px-xl-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-xl-5,
+ .py-xl-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-xl-5,
+ .px-xl-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-xl-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-xl-n1,
+ .my-xl-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-xl-n1,
+ .mx-xl-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-xl-n1,
+ .my-xl-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-xl-n1,
+ .mx-xl-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-xl-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-xl-n2,
+ .my-xl-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-xl-n2,
+ .mx-xl-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-xl-n2,
+ .my-xl-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-xl-n2,
+ .mx-xl-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-xl-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-xl-n3,
+ .my-xl-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-xl-n3,
+ .mx-xl-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-xl-n3,
+ .my-xl-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-xl-n3,
+ .mx-xl-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-xl-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-xl-n4,
+ .my-xl-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-xl-n4,
+ .mx-xl-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-xl-n4,
+ .my-xl-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-xl-n4,
+ .mx-xl-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-xl-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-xl-n5,
+ .my-xl-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-xl-n5,
+ .mx-xl-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-xl-n5,
+ .my-xl-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-xl-n5,
+ .mx-xl-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-xl-auto {
+ margin: auto !important
+ }
+
+ .mt-xl-auto,
+ .my-xl-auto {
+ margin-top: auto !important
+ }
+
+ .mr-xl-auto,
+ .mx-xl-auto {
+ margin-right: auto !important
+ }
+
+ .mb-xl-auto,
+ .my-xl-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-xl-auto,
+ .mx-xl-auto {
+ margin-left: auto !important
+ }
+
+}
+
+.text-monospace {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important
+}
+
+.text-justify {
+ text-align: justify !important
+}
+
+.text-wrap {
+ white-space: normal !important
+}
+
+.text-nowrap {
+ white-space: nowrap !important
+}
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap
+}
+
+.text-left {
+ text-align: left !important
+}
+
+.text-right {
+ text-align: right !important
+}
+
+.text-center {
+ text-align: center !important
+}
+
+@media (min-width:576px) {
+ .text-sm-left {
+ text-align: left !important
+ }
+
+ .text-sm-right {
+ text-align: right !important
+ }
+
+ .text-sm-center {
+ text-align: center !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .text-md-left {
+ text-align: left !important
+ }
+
+ .text-md-right {
+ text-align: right !important
+ }
+
+ .text-md-center {
+ text-align: center !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .text-lg-left {
+ text-align: left !important
+ }
+
+ .text-lg-right {
+ text-align: right !important
+ }
+
+ .text-lg-center {
+ text-align: center !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .text-xl-left {
+ text-align: left !important
+ }
+
+ .text-xl-right {
+ text-align: right !important
+ }
+
+ .text-xl-center {
+ text-align: center !important
+ }
+
+}
+
+.text-lowercase {
+ text-transform: lowercase !important
+}
+
+.text-uppercase {
+ text-transform: uppercase !important
+}
+
+.text-capitalize {
+ text-transform: capitalize !important
+}
+
+.font-weight-light {
+ font-weight: 300 !important
+}
+
+.font-weight-lighter {
+ font-weight: lighter !important
+}
+
+.font-weight-normal {
+ font-weight: 400 !important
+}
+
+.font-weight-bold {
+ font-weight: 700 !important
+}
+
+.font-weight-bolder {
+ font-weight: bolder !important
+}
+
+.font-italic {
+ font-style: italic !important
+}
+
+.text-white {
+ color: #fff !important
+}
+
+.text-primary {
+ color: #047006 !important
+}
+
+a.text-primary:focus,
+a.text-primary:hover {
+ color: #012602 !important
+}
+
+.text-secondary {
+ color: grey !important
+}
+
+a.text-secondary:focus,
+a.text-secondary:hover {
+ color: #5a5a5a !important
+}
+
+.text-success {
+ color: #00e093 !important
+}
+
+a.text-success:focus,
+a.text-success:hover {
+ color: #009461 !important
+}
+
+.text-info {
+ color: #6c61f6 !important
+}
+
+a.text-info:focus,
+a.text-info:hover {
+ color: #2919f2 !important
+}
+
+.text-warning {
+ color: #f0825f !important
+}
+
+a.text-warning:focus,
+a.text-warning:hover {
+ color: #e94b19 !important
+}
+
+.text-danger {
+ color: #ff5f66 !important
+}
+
+a.text-danger:focus,
+a.text-danger:hover {
+ color: #ff131d !important
+}
+
+.text-light {
+ color: #dfdfdf !important
+}
+
+a.text-light:focus,
+a.text-light:hover {
+ color: #b9b9b9 !important
+}
+
+.text-dark {
+ color: #74767b !important
+}
+
+a.text-dark:focus,
+a.text-dark:hover {
+ color: #4f5054 !important
+}
+
+.text-white {
+ color: #fff !important
+}
+
+a.text-white:focus,
+a.text-white:hover {
+ color: #d9d9d9 !important
+}
+
+.text-orange {
+ color: #ffa600 !important
+}
+
+a.text-orange:focus,
+a.text-orange:hover {
+ color: #b37400 !important
+}
+
+.text-body {
+ color: #212529 !important
+}
+
+.text-muted {
+ color: #adb5bd !important
+}
+
+.text-black-50 {
+ color: rgba(0, 0, 0, .5) !important
+}
+
+.text-white-50 {
+ color: rgba(255, 255, 255, .5) !important
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0
+}
+
+.text-decoration-none {
+ text-decoration: none !important
+}
+
+.text-break {
+ word-break: break-word !important;
+ overflow-wrap: break-word !important
+}
+
+.text-reset {
+ color: inherit !important
+}
+
+.visible {
+ visibility: visible !important
+}
+
+.invisible {
+ visibility: hidden !important
+}
+
+@media print {
+ *,
+ ::after,
+ ::before {
+ text-shadow: none !important;
+ box-shadow: none !important
+ }
+
+ a:not(.btn) {
+ text-decoration: underline
+ }
+
+ abbr[title]::after {
+ content: '3'attr(title) ")"
+ }
+
+ pre {
+ white-space: pre-wrap !important
+ }
+
+ blockquote,
+ pre {
+ border: 1px solid #adb5bd;
+ page-break-inside: avoid
+ }
+
+ thead {
+ display: table-header-group
+ }
+
+ img,
+ tr {
+ page-break-inside: avoid
+ }
+
+ h2,
+ h3,
+ p {
+ orphans: 3;
+ widows: 3
+ }
+
+ h2,
+ h3 {
+ page-break-after: avoid
+ }
+
+ @page {
+ size: a3
+ }
+
+ body {
+ min-width: 992px !important
+ }
+
+ .container {
+ min-width: 992px !important
+ }
+
+ .navbar {
+ display: none
+ }
+
+ .badge {
+ border: 1px solid #000
+ }
+
+ .table {
+ border-collapse: collapse !important
+ }
+
+ .table td,
+ .table th {
+ background-color: #fff !important
+ }
+
+ .table-bordered td,
+ .table-bordered th {
+ border: 1px solid #dee2e6 !important
+ }
+
+ .table-dark {
+ color: inherit
+ }
+
+ .table-dark tbody+tbody,
+ .table-dark td,
+ .table-dark th,
+ .table-dark thead th {
+ border-color: #f2f4f9
+ }
+
+ .table .thead-dark th {
+ color: inherit;
+ border-color: #f2f4f9
+ }
+
+}
+
+.dev-info {
+ position: fixed;
+ color: grey;
+ font-size: smaller;
+ left: 8px;
+ z-index: 120
+}
+
+.versionstring {
+ top: 70px;
+ right: 8px;
+ left: auto
+}
+
+.grd-time-used {
+ bottom: 0
+}
+
+footer {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 2rem 2.5rem;
+ max-width: 1140px;
+ margin-left: auto;
+ margin-right: auto
+}
+
+@media (max-width:991.98px) {
+ footer {
+ padding: 20px 0 30px 0
+ }
+
+}
+
+footer ul {
+ margin-left: 0;
+ padding-left: 0
+}
+
+footer ul li {
+ display: inline-block;
+ padding: 0 10px 0 0;
+ line-height: 1
+}
+
+footer ul li:not(:last-child) {
+ margin-right: 10px;
+ border-right: 1px solid #f2f4f9
+}
+
+footer ul li a {
+ font-size: 14px;
+ font-family: Roboto, sans-serif;
+ font-weight: 400;
+ letter-spacing: .03rem;
+ color: #565656
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ footer ul li a {
+ font-size: calc(14px + 0 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ footer ul li a {
+ font-size: calc(14px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ footer ul li a {
+ font-size: 13px
+ }
+
+}
+
+.alert {
+ border: none;
+ font-size: 14px;
+ font-family: Roboto, sans-serif;
+ font-weight: 400
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .alert {
+ font-size: calc(14px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .alert {
+ font-size: calc(15px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .alert {
+ font-size: 14px
+ }
+
+}
+
+.alert .alert-heading {
+ margin-top: 20px;
+ margin-bottom: 10px
+}
+
+.alert .btn-dismmiss {
+ margin-top: 20px
+}
+
+.alert.dismissible-alert {
+ position: relative;
+ padding-right: 40px
+}
+
+.alert.dismissible-alert .alert-close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ padding: 10px;
+ font-size: 18px;
+ display: -webkit-box;
+ display: flex;
+ cursor: pointer;
+ height: inherit;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.alert-notification-wrapper {
+ position: fixed;
+ left: 17rem;
+ right: 0;
+ z-index: 999
+}
+
+@media (max-width:991.98px) {
+ .alert-notification-wrapper {
+ left: 0
+ }
+
+}
+
+.alert-notification-wrapper.top {
+ top: 70px
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter {
+ border: 2px solid #55acee;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter i {
+ color: #55acee
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link {
+ background: 0 0;
+ color: #55acee
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link:hover {
+ color: #2795e9
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook {
+ border: 2px solid #0084ff;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook i {
+ color: #0084ff
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link {
+ background: 0 0;
+ color: #0084ff
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link:hover {
+ color: #006acc
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google {
+ border: 2px solid #dd4b39;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google i {
+ color: #dd4b39
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link {
+ background: 0 0;
+ color: #dd4b39
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link:hover {
+ color: #c23321
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin {
+ border: 2px solid #0077b5;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin i {
+ color: #0077b5
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link {
+ background: 0 0;
+ color: #0077b5
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link:hover {
+ color: #005582
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest {
+ border: 2px solid #bd081c;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest i {
+ color: #bd081c
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link {
+ background: 0 0;
+ color: #bd081c
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link:hover {
+ color: #8c0615
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube {
+ border: 2px solid #cd201f;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube i {
+ color: #cd201f
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link {
+ background: 0 0;
+ color: #cd201f
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link:hover {
+ color: #a11918
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github {
+ border: 2px solid #333;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github i {
+ color: #333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link {
+ background: 0 0;
+ color: #333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link:hover {
+ color: #1a1a1a
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance {
+ border: 2px solid #0454f6;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance i {
+ color: #0454f6
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link {
+ background: 0 0;
+ color: #0454f6
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link:hover {
+ color: #0343c4
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble {
+ border: 2px solid #ea4c89;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble i {
+ color: #ea4c89
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link {
+ background: 0 0;
+ color: #ea4c89
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link:hover {
+ color: #e51e6b
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit {
+ border: 2px solid #ed4333;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit i {
+ color: #ed4333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link {
+ background: 0 0;
+ color: #ed4333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link:hover {
+ color: #da2413
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram {
+ border: 2px solid #ff759b;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram i {
+ color: #ff759b
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link {
+ background: 0 0;
+ color: #ff759b
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link:hover {
+ color: #ff4276
+}
+
+.btn-inverse-primary {
+ background: rgba(4, 112, 6, .15);
+ color: #047006
+}
+
+.btn-inverse-primary i {
+ color: inherit
+}
+
+.btn-inverse-primary:hover {
+ background: rgba(4, 112, 6, .8);
+ color: #fff
+}
+
+.btn-inverse-secondary {
+ background: rgba(128, 128, 128, .15);
+ color: grey
+}
+
+.btn-inverse-secondary i {
+ color: inherit
+}
+
+.btn-inverse-secondary:hover {
+ background: rgba(128, 128, 128, .8);
+ color: #fff
+}
+
+.btn-inverse-success {
+ background: rgba(0, 224, 147, .15);
+ color: #00e093
+}
+
+.btn-inverse-success i {
+ color: inherit
+}
+
+.btn-inverse-success:hover {
+ background: rgba(0, 224, 147, .8);
+ color: #fff
+}
+
+.btn-inverse-info {
+ background: rgba(108, 97, 246, .15);
+ color: #6c61f6
+}
+
+.btn-inverse-info i {
+ color: inherit
+}
+
+.btn-inverse-info:hover {
+ background: rgba(108, 97, 246, .8);
+ color: #fff
+}
+
+.btn-inverse-warning {
+ background: rgba(240, 130, 95, .15);
+ color: #f0825f
+}
+
+.btn-inverse-warning i {
+ color: inherit
+}
+
+.btn-inverse-warning:hover {
+ background: rgba(240, 130, 95, .8);
+ color: #fff
+}
+
+.btn-inverse-danger {
+ background: rgba(255, 95, 102, .15);
+ color: #ff5f66
+}
+
+.btn-inverse-danger i {
+ color: inherit
+}
+
+.btn-inverse-danger:hover {
+ background: rgba(255, 95, 102, .8);
+ color: #fff
+}
+
+.btn-inverse-light {
+ background: rgba(223, 223, 223, .15);
+ color: #dfdfdf
+}
+
+.btn-inverse-light i {
+ color: inherit
+}
+
+.btn-inverse-light:hover {
+ background: rgba(223, 223, 223, .8);
+ color: #fff
+}
+
+.btn-inverse-dark {
+ background: rgba(116, 118, 123, .15);
+ color: #74767b
+}
+
+.btn-inverse-dark i {
+ color: inherit
+}
+
+.btn-inverse-dark:hover {
+ background: rgba(116, 118, 123, .8);
+ color: #fff
+}
+
+.btn-inverse-white {
+ background: rgba(255, 255, 255, .15);
+ color: #fff
+}
+
+.btn-inverse-white i {
+ color: inherit
+}
+
+.btn-inverse-white:hover {
+ background: rgba(255, 255, 255, .8);
+ color: #fff
+}
+
+.btn-inverse-orange {
+ background: rgba(255, 166, 0, .15);
+ color: #ffa600
+}
+
+.btn-inverse-orange i {
+ color: inherit
+}
+
+.btn-inverse-orange:hover {
+ background: rgba(255, 166, 0, .8);
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-twitter {
+ background: #55acee;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-twitter:hover {
+ background: #2795e9
+}
+
+.btn:not(.social-btn-outlined).btn-twitter.btn-link {
+ background: 0 0;
+ color: #55acee
+}
+
+.btn:not(.social-btn-outlined).btn-twitter.btn-link:hover {
+ color: #2795e9
+}
+
+.btn:not(.social-btn-outlined).btn-facebook {
+ background: #0084ff;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-facebook:hover {
+ background: #006acc
+}
+
+.btn:not(.social-btn-outlined).btn-facebook.btn-link {
+ background: 0 0;
+ color: #0084ff
+}
+
+.btn:not(.social-btn-outlined).btn-facebook.btn-link:hover {
+ color: #006acc
+}
+
+.btn:not(.social-btn-outlined).btn-google {
+ background: #dd4b39;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-google:hover {
+ background: #c23321
+}
+
+.btn:not(.social-btn-outlined).btn-google.btn-link {
+ background: 0 0;
+ color: #dd4b39
+}
+
+.btn:not(.social-btn-outlined).btn-google.btn-link:hover {
+ color: #c23321
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin {
+ background: #0077b5;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin:hover {
+ background: #005582
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin.btn-link {
+ background: 0 0;
+ color: #0077b5
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin.btn-link:hover {
+ color: #005582
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest {
+ background: #bd081c;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest:hover {
+ background: #8c0615
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest.btn-link {
+ background: 0 0;
+ color: #bd081c
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest.btn-link:hover {
+ color: #8c0615
+}
+
+.btn:not(.social-btn-outlined).btn-youtube {
+ background: #cd201f;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-youtube:hover {
+ background: #a11918
+}
+
+.btn:not(.social-btn-outlined).btn-youtube.btn-link {
+ background: 0 0;
+ color: #cd201f
+}
+
+.btn:not(.social-btn-outlined).btn-youtube.btn-link:hover {
+ color: #a11918
+}
+
+.btn:not(.social-btn-outlined).btn-github {
+ background: #333;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-github:hover {
+ background: #1a1a1a
+}
+
+.btn:not(.social-btn-outlined).btn-github.btn-link {
+ background: 0 0;
+ color: #333
+}
+
+.btn:not(.social-btn-outlined).btn-github.btn-link:hover {
+ color: #1a1a1a
+}
+
+.btn:not(.social-btn-outlined).btn-behance {
+ background: #0454f6;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-behance:hover {
+ background: #0343c4
+}
+
+.btn:not(.social-btn-outlined).btn-behance.btn-link {
+ background: 0 0;
+ color: #0454f6
+}
+
+.btn:not(.social-btn-outlined).btn-behance.btn-link:hover {
+ color: #0343c4
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble {
+ background: #ea4c89;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble:hover {
+ background: #e51e6b
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble.btn-link {
+ background: 0 0;
+ color: #ea4c89
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble.btn-link:hover {
+ color: #e51e6b
+}
+
+.btn:not(.social-btn-outlined).btn-reddit {
+ background: #ed4333;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-reddit:hover {
+ background: #da2413
+}
+
+.btn:not(.social-btn-outlined).btn-reddit.btn-link {
+ background: 0 0;
+ color: #ed4333
+}
+
+.btn:not(.social-btn-outlined).btn-reddit.btn-link:hover {
+ color: #da2413
+}
+
+.btn:not(.social-btn-outlined).btn-instagram {
+ background: #ff759b;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-instagram:hover {
+ background: #ff4276
+}
+
+.btn:not(.social-btn-outlined).btn-instagram.btn-link {
+ background: 0 0;
+ color: #ff759b
+}
+
+.btn:not(.social-btn-outlined).btn-instagram.btn-link:hover {
+ color: #ff4276
+}
+
+.btn-group label.btn.btn-primary:not(:disabled):not(.disabled).active {
+ background: #000e01
+}
+
+.btn-group label.btn.btn-secondary:not(:disabled):not(.disabled).active {
+ background: #4d4d4d
+}
+
+.btn-group label.btn.btn-success:not(:disabled):not(.disabled).active {
+ background: #007a50
+}
+
+.btn-group label.btn.btn-info:not(:disabled):not(.disabled).active {
+ background: #1d0de4
+}
+
+.btn-group label.btn.btn-warning:not(:disabled):not(.disabled).active {
+ background: #d54314
+}
+
+.btn-group label.btn.btn-danger:not(:disabled):not(.disabled).active {
+ background: #f8000b
+}
+
+.btn-group label.btn.btn-light:not(:disabled):not(.disabled).active {
+ background: #acacac
+}
+
+.btn-group label.btn.btn-dark:not(:disabled):not(.disabled).active {
+ background: #424447
+}
+
+.btn-group label.btn.btn-white:not(:disabled):not(.disabled).active {
+ background: #ccc
+}
+
+.btn-group label.btn.btn-orange:not(:disabled):not(.disabled).active {
+ background: #996400
+}
+
+.btn-outline-primary {
+ border: 2px solid #047006
+}
+
+.btn-outline-secondary {
+ border: 2px solid grey
+}
+
+.btn-outline-success {
+ border: 2px solid #00e093
+}
+
+.btn-outline-info {
+ border: 2px solid #6c61f6
+}
+
+.btn-outline-warning {
+ border: 2px solid #f0825f
+}
+
+.btn-outline-danger {
+ border: 2px solid #ff5f66
+}
+
+.btn-outline-light {
+ border: 2px solid #dfdfdf
+}
+
+.btn-outline-dark {
+ border: 2px solid #74767b
+}
+
+.btn-outline-white {
+ border: 2px solid #fff
+}
+
+.btn-outline-orange {
+ border: 2px solid #ffa600
+}
+
+.btn-group label.btn input {
+ display: none
+}
+
+.btn {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-transition: .3s ease;
+ transition: .3s ease;
+ -webkit-transition-property: background, color;
+ transition-property: background, color;
+ font-size: .875rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 600;
+ letter-spacing: .03rem
+}
+
+.btn:not([class*=btn-inverse]):not(.component-flat) {
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2)
+}
+
+.btn i {
+ font-size: 1.25rem
+}
+
+.btn-group-lg>.btn,
+.btn.btn-lg {
+ height: 55px;
+ max-height: 55px;
+ padding: 15px 30px;
+ font-size: 1.125rem
+}
+
+.btn-group-sm>.btn,
+.btn.btn-sm {
+ height: 35px;
+ max-height: 35px;
+ padding: 4px 15px;
+ font-size: .875rem
+}
+
+.btn.btn-xs {
+ height: 25px;
+ max-height: 25px;
+ padding: 0 10px;
+ line-height: 1;
+ font-size: .75rem
+}
+
+.btn.btn-xs.has-icon i,
+.btn.btn-xs.has-icon span {
+ font-size: .8125rem;
+ margin-right: 5px
+}
+
+.btn {
+ height: 40px;
+ max-height: 40px;
+ padding: 5px 20px
+}
+
+.btn.active {
+ box-shadow: none
+}
+
+.btn.social-icon-btn {
+ height: 40px;
+ width: 40px
+}
+
+.btn.social-btn i {
+ margin-right: 10px
+}
+
+.btn.social-btn-outlined i {
+ margin-right: 10px
+}
+
+.btn.has-icon i,
+.btn.has-icon span {
+ font-size: 1.25rem;
+ margin-right: 10px;
+ line-height: 1
+}
+
+.btn.btn-outline-secondary {
+ color: #1a1a1a;
+ border-color: #676767
+}
+
+.btn.btn-info,
+.btn.btn-warning {
+ color: #fff
+}
+
+.btn.btn-light {
+ background: #fff;
+ color: #000
+}
+
+.btn.dropdown-dotted-list {
+ background: #fff
+}
+
+.btn.dropdown-toggle-split {
+ padding: 0 8px
+}
+
+.btn.action-btn {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ padding: 0;
+ height: 40px;
+ width: 40px
+}
+
+.btn.action-btn i {
+ font-size: 1.25rem;
+ width: 26px;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ line-height: 23px;
+ vertical-align: middle;
+ font-size: 1.25rem
+}
+
+.btn.action-btn i:before {
+ width: inherit;
+ height: inherit;
+ line-height: inherit;
+ font-size: inherit
+}
+
+.btn.action-btn.btn-xs {
+ height: 30px;
+ width: 30px
+}
+
+.btn-group-sm>.btn.action-btn,
+.btn.action-btn.btn-sm {
+ height: 35px;
+ width: 35px
+}
+
+.btn-group-lg>.btn.action-btn,
+.btn.action-btn.btn-lg {
+ height: 50px;
+ width: 50px
+}
+
+.btn-group-lg>.btn.action-btn i,
+.btn.action-btn.btn-lg i {
+ font-size: 1.875rem;
+ line-height: 24px
+}
+
+.btn.action-btn.btn-refresh.clicked i {
+ color: #047006;
+ -webkit-animation: rotate360 .8s linear infinite;
+ animation: rotate360 .8s linear infinite
+}
+
+.btn.action-btn.btn-like.clicked i {
+ color: #ff5f66;
+ -webkit-animation: bounceIn .8s linear 1;
+ animation: bounceIn .8s linear 1
+}
+
+.btn.action-btn.btn-like.clicked:hover i {
+ color: #fff
+}
+
+.btn.btn-rounded {
+ border-radius: 50px
+}
+
+.flag-germany {
+ width: 40px;
+ height: 28px;
+ background: red;
+ border-top: 9px solid #000;
+ border-bottom: 9px solid #fc0;
+ display: block
+}
+
+.flag-england {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==);
+ background-size: cover;
+ width: 40px;
+ height: 28px;
+ display: block
+}
+
+.language-active {
+ background-color: #f9fafb;
+ padding: 2px
+}
+
+.language-inactive {
+ padding: 2px;
+ background-color: transparent
+}
+
+.is-invalid .form-control {
+ background-color: rgba(240, 130, 95, .2);
+ border: none
+}
+
+.is-invalid .invalid-feedback {
+ display: block
+}
+
+.is-valid .form-control {
+ background-color: rgba(4, 112, 6, .2);
+ border: none
+}
+
+.form-control {
+ padding-left: 20px;
+ padding-right: 20px;
+ color: rgba(16, 16, 16, .8)
+}
+
+.form-control.placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control:-moz-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control::-moz-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control:-ms-input-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control::-webkit-input-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control.is-invalid {
+ background-color: rgba(240, 130, 95, .2);
+ border: none
+}
+
+.form-control.is-valid {
+ background-color: rgba(4, 112, 6, .2);
+ border: none
+}
+
+.input-group-text {
+ background-color: #f6f7f9;
+ color: #101010;
+ border-color: #f2f4f9;
+ padding: 0 10px;
+ font-size: 17px
+}
+
+.is-valid .input-group-text {
+ background-color: rgba(4, 112, 6, .2);
+ color: #047006
+}
+
+.is-invalid .input-group-text {
+ background-color: rgba(240, 130, 95, .2);
+ color: #f0825f
+}
+
+.form-group {
+ margin-bottom: 20px
+}
+
+.form-group.input-rounded .form-control {
+ border-radius: 25px
+}
+
+.custom-file .custom-file-label {
+ padding: 8px .75rem;
+ height: 41px
+}
+
+.custom-file .custom-file-label:after {
+ padding: 1.45rem .8rem;
+ line-height: 0
+}
+
+.custom-select,
+.custom-select[multiple] {
+ background: #f6f7f9;
+ border-color: #f0f2f5;
+ color: rgba(16, 16, 16, .8)
+}
+
+.custom-select option,
+.custom-select[multiple] option {
+ background: #f6f7f9;
+ color: rgba(16, 16, 16, .8);
+ display: block;
+ border-bottom: 1px solid #f2f4f9;
+ padding: 5px 10px
+}
+
+.custom-select option:checked,
+.custom-select[multiple] option:checked {
+ background: #f6f7f9
+}
+
+.custom-select option[selected],
+.custom-select[multiple] option[selected] {
+ background: #f6f7f9;
+ display: block
+}
+
+.custom-select[multiple] {
+ padding: 0;
+ border-radius: 2px
+}
+
+.custom-control-input:focus~.custom-control-label::before {
+ box-shadow: none
+}
+
+.custom-switch .custom-control-label::after {
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2);
+ background: #047006
+}
+
+.checkbox,
+.radio {
+ position: relative;
+ display: block;
+ margin-top: 2px;
+ margin-bottom: 20px
+}
+
+.checkbox label,
+.radio label {
+ display: block;
+ padding-left: 30px;
+ line-height: 1.42857143;
+ font-size: .875rem
+}
+
+.checkbox label input,
+.radio label input {
+ position: absolute;
+ margin-left: -20px;
+ margin-top: 4px\9;
+ top: 0;
+ left: 0;
+ margin-left: 0 !important;
+ z-index: 1;
+ cursor: pointer;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ margin-top: 0
+}
+
+.checkbox label input:checked+.input-frame:before,
+.radio label input:checked+.input-frame:before {
+ background-color: #fff
+}
+
+.checkbox label input:checked+.input-frame:after,
+.radio label input:checked+.input-frame:after {
+ color: #047006;
+ opacity: 1;
+ line-height: 1.5;
+ filter: alpha(opacity=100);
+ -webkit-transform: scale(1);
+ transform: scale(1)
+}
+
+.checkbox label input:disabled+.input-frame:before,
+.radio label input:disabled+.input-frame:before {
+ border-color: #fff
+}
+
+.checkbox label input:disabled:checked+.input-frame:before,
+.radio label input:disabled:checked+.input-frame:before {
+ background: #047006
+}
+
+.checkbox label .input-frame:before,
+.radio label .input-frame:before {
+ position: absolute;
+ content: '.5';
+ top: 0;
+ width: 19px;
+ height: 19px;
+ border-radius: 2px;
+ left: 0;
+ border: 2px solid #f2f4f9;
+ -webkit-transition: all;
+ transition: all;
+ -webkit-transition-duration: 250ms;
+ transition-duration: 250ms
+}
+
+.checkbox label .input-frame:after,
+.radio label .input-frame:after {
+ line-height: 1.5;
+ -webkit-transition: all;
+ transition: all;
+ -webkit-transition-duration: 250ms;
+ transition-duration: 250ms;
+ font-family: Material Design Icons;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ content: '3';
+ position: absolute;
+ font-size: .9375rem;
+ left: 1px;
+ top: -2px;
+ color: #fff
+}
+
+.checkbox label {
+ font-size: 16;
+ line-height: 1.5;
+ padding-left: 30px
+}
+
+.checkbox label input:checked+.input-helper:before {
+ background-color: #fff
+}
+
+.checkbox label input:checked+.input-helper:after {
+ width: 18px;
+ opacity: 1;
+ line-height: 18px;
+ filter: alpha(opacity=100);
+ -webkit-transform: scale(1);
+ transform: scale(1)
+}
+
+.checkbox label input:disabled+.input-helper:before {
+ border-color: #f2f4f9
+}
+
+.checkbox label input:disabled:checked+.input-helper:after {
+ color: #f2f4f9
+}
+
+.checkbox label .input-frame:before {
+ position: absolute;
+ content: '3';
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+ width: 18px;
+ height: 18px;
+ border-radius: 2px;
+ left: 0;
+ border: 2px solid #f2f4f9;
+ -webkit-transition: all;
+ transition: all;
+ transition-duration: 0s;
+ -webkit-transition-duration: 250ms;
+ transition-duration: 250ms
+}
+
+.rtl .checkbox label .input-frame:before {
+ left: auto;
+ right: 0
+}
+
+.checkbox label .input-frame:after {
+ -webkit-transition: all;
+ transition: all;
+ transition-duration: 0s;
+ -webkit-transition-duration: 250ms;
+ transition-duration: 250ms;
+ font-family: Material Design Icons;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ content: '.5';
+ position: absolute;
+ font-size: 15px;
+ font-weight: 700;
+ left: 0;
+ top: 0;
+ -webkit-transform: translateY(-14%);
+ transform: translateY(-14%);
+ color: #047006
+}
+
+.rtl .checkbox label .input-frame:after {
+ left: auto;
+ right: 0
+}
+
+.radio label input:checked+.input-frame:before {
+ background-color: #fff
+}
+
+.radio label input:checked:disabled+.input-frame:before {
+ background-color: #fff;
+ border-color: #fff
+}
+
+.radio label input:checked:disabled+.input-frame:after {
+ background-color: #047006
+}
+
+.radio label .input-frame:before {
+ border-radius: 50%
+}
+
+.radio label .input-frame:after {
+ content: 'http://www.w3.org/2000/svg';
+ width: 9px;
+ height: 9px;
+ background: #047006;
+ border-radius: 50%;
+ top: 5px;
+ left: 5px;
+ -webkit-transform: scale(0);
+ transform: scale(0)
+}
+
+.form-inline .checkbox,
+.form-inline .radio {
+ margin-right: 30px
+}
+
+.form-inline .checkbox:last-child,
+.form-inline .radio:last-child {
+ margin-right: 0
+}
+
+.form-inline .form-check-input {
+ display: none
+}
+
+.bootstrap-tagsinput {
+ background: #f6f7f9;
+ border-color: #f0f2f5;
+ box-shadow: none;
+ min-width: 100%;
+ width: 100%;
+ max-width: 100%
+}
+
+.bootstrap-tagsinput .tag {
+ display: inline-block;
+ background: #047006;
+ color: #fff;
+ padding: 2px 9px;
+ border-radius: 2px;
+ margin-bottom: 5px
+}
+
+.bootstrap-tagsinput .tag:nth-child(5n+1) {
+ background: #047006
+}
+
+.bootstrap-tagsinput .tag:nth-child(5n+2) {
+ background: #00e093
+}
+
+.bootstrap-tagsinput .tag:nth-child(5n+3) {
+ background: #6c61f6
+}
+
+.bootstrap-tagsinput .tag:nth-child(5n+4) {
+ background: #f0825f
+}
+
+.bootstrap-tagsinput .tag:nth-child(5n+5) {
+ background: #ff5f66
+}
+
+.page-body {
+ background: #fff
+}
+
+.page-content-wrapper {
+ background: #f9fafb;
+ border-left: 1px solid #f2f4f9
+}
+
+@media (min-width:992px) {
+ .t-header .t-header-content-wrapper {
+ border-left: 1px solid #f2f4f9
+ }
+
+}
+
+@media (min-width:768px) {
+ .page-body {
+ position: relative;
+ display: grid;
+ max-width: 100%;
+ grid-template-columns: 17rem calc(100vw - 17rem);
+ -webkit-transition: .3s;
+ transition: .3s
+ }
+
+ .page-body .page-content-wrapper {
+ position: relative;
+ width: 100%;
+ min-height: 100vh;
+ padding: 1.5rem 2.5rem calc(90px + 1.5rem);
+ margin-top: 70px
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner {
+ max-width: 1140px;
+ margin-left: auto;
+ margin-right: auto
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 70px;
+ background: #f9fafb;
+ z-index: 99
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb {
+ padding: 1rem 1rem 1rem 21px;
+ margin-left: -20px;
+ margin-right: -20px;
+ background: #f9fafb
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item {
+ color: #565656;
+ letter-spacing: .03rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item a {
+ color: inherit
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item.active {
+ color: #047006
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-title-heading {
+ color: #565656;
+ font-size: 1.5rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ margin-bottom: 0
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-description {
+ opacity: .7;
+ margin-top: 15px
+ }
+
+ body.sidebar-minimized .t-header .t-header-brand-wrapper {
+ background: #f9fafb
+ }
+
+ body.sidebar-minimized .t-header .t-header-content-wrapper {
+ border-left: #f9fafb
+ }
+
+ body.sidebar-minimized .page-body {
+ grid-template-columns: 0 100%
+ }
+
+ body.sidebar-minimized .page-body .sidebar .sidebar_footer {
+ left: -17rem
+ }
+
+ body.sidebar-minimized .page-body .sidebar .nav-category-divider {
+ position: initial
+ }
+
+}
+
+@media (max-width:991.98px) {
+ .t-header {
+ width: 100vw
+ }
+
+ .t-header .t-header-brand-wrapper {
+ background: #f9fafb;
+ width: 4rem;
+ min-width: 4rem;
+ max-width: 4rem
+ }
+
+ .t-header .t-header-brand-wrapper a .logo {
+ -webkit-animation-name: menuItemFadeIn;
+ animation-name: menuItemFadeIn;
+ -webkit-animation-duration: .25s;
+ animation-duration: .25s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+ display: none
+ }
+
+ @-webkit-keyframes menuItemFadeIn {
+ from {
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ display: none;
+ opacity: 0
+ }
+
+ to {
+ display: block;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+
+ }
+
+ @keyframes menuItemFadeIn {
+ from {
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ display: none;
+ opacity: 0
+ }
+
+ to {
+ display: block;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+
+ }
+
+ .t-header .t-header-brand-wrapper a .logo-mini {
+ display: block
+ }
+
+ .page-body {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row;
+ overflow: hidden;
+ max-width: 100%
+ }
+
+ .page-body .sidebar {
+ position: relative;
+ left: 0;
+ z-index: 99;
+ width: 15rem;
+ min-width: 15rem;
+ max-width: 15rem;
+ margin-left: -15rem;
+ -webkit-transition-duration: .2s;
+ transition-duration: .2s;
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-property: margin-left, width;
+ transition-property: margin-left, width
+ }
+
+ .page-body .sidebar .sidebar_footer {
+ -webkit-transition-duration: .2s;
+ transition-duration: .2s;
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-property: left;
+ transition-property: left;
+ left: -15rem
+ }
+
+ .page-body .page-content-wrapper {
+ padding: 20px 20px;
+ min-width: 100vw;
+ margin-left: 0;
+ -webkit-transition-duration: .2s;
+ transition-duration: .2s;
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-property: margin-left;
+ transition-property: margin-left
+ }
+
+ .page-body .page-content-wrapper .viewport-header .breadcrumb {
+ background: 0 0;
+ padding-left: 0
+ }
+
+ .page-body .page-content-wrapper footer {
+ position: relative
+ }
+
+ .page-body.sidebar-collpased .sidebar {
+ margin-left: 0;
+ min-width: 15rem
+ }
+
+ .page-body.sidebar-collpased .sidebar .sidebar_footer {
+ left: 0
+ }
+
+}
+
+@media (max-width:767.98px) {
+ .page-body .page-content-wrapper {
+ padding: 80px 20px 0 20px
+ }
+
+}
+
+.logo {
+ display: block;
+ margin: 0 auto;
+ width: 280px
+}
+
+.logo img {
+ width: 100%
+}
+
+.grid {
+ background: #fff;
+ border-radius: 6px;
+ box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2);
+ margin-bottom: 1.5rem;
+ border: 1px solid rgba(238, 238, 238, .75)
+}
+
+.grid-header {
+ padding: 15px 20px;
+ margin-bottom: 15px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ font-size: 14px;
+ letter-spacing: .03rem;
+ background: #f9fafb;
+ border-left: 3px solid #047006;
+ border-radius: 0 6px 0 0
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .grid-header {
+ font-size: calc(14px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .grid-header {
+ font-size: calc(15px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .grid-header {
+ font-size: 14px
+ }
+
+}
+
+.grid-title {
+ opacity: .9;
+ margin-bottom: 25px
+}
+
+.close {
+ color: #101010
+}
+
+.split-header {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: justify;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.split-header .content-wrapper {
+ display: -webkit-box;
+ display: flex
+}
+
+.split-header .content-wrapper a i,
+.split-header .content-wrapper span i {
+ font-size: 20px;
+ color: #adb5bd;
+ -webkit-transition: .3s ease color;
+ transition: .3s ease color
+}
+
+.split-header .content-wrapper a i:hover,
+.split-header .content-wrapper span i:hover {
+ color: #047006
+}
+
+.split-header .content-wrapper.v-centered {
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.split-header .content-wrapper.h-centered {
+ -webkit-box-pack: center;
+ justify-content: center
+}
+
+.grid-body {
+ padding: 20px 25px 20px
+}
+
+.card-title {
+ font-size: 14px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ color: #313131;
+ margin-bottom: 0
+}
+
+@media (min-width:768px) and (max-width:991px) {
+ .card-title {
+ font-size: calc(14px + 1 * ((100vw - 768px)/ 223))
+ }
+
+}
+
+@media (min-width:991px) and (max-width:1200px) {
+ .card-title {
+ font-size: calc(15px + -1 * ((100vw - 991px)/ 209))
+ }
+
+}
+
+@media (min-width:1200px) {
+ .card-title {
+ font-size: 14px
+ }
+
+}
+
+.equel-grid {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: stretch;
+ align-items: stretch
+}
+
+.equel-grid .grid {
+ width: 100%;
+ min-width: 100%
+}
+
+.showcase_row_area {
+ margin-bottom: 20px
+}
+
+.showcase_row_area .showcase_text_area {
+ text-align: right
+}
+
+@media (max-width:767.98px) {
+ .showcase_row_area .showcase_text_area {
+ text-align: left
+ }
+
+}
+
+.showcase_row_area .showcase_content_area {
+ margin-bottom: -10px
+}
+
+.showcase_row_area .showcase_content_area .btn {
+ margin-right: 5px;
+ margin-bottom: 10px
+}
+
+.showcase_row_area:last-child {
+ margin-bottom: 0
+}
+
+.content-preview {
+ width: 45px;
+ height: 45px
+}
+
+.content-preview.rounded {
+ border-radius: 100%
+}
+
+.btn:not(.disabled),.cursor_pointer,a {
+ cursor: pointer
+}
+
+.grd-positive-currency {
+ color: #047006
+}
+
+.grd-negative-currency {
+ color: red
+}
+
+.color-success {
+ color: var(--success)
+}
+
+.color-danger {
+ color: var(--danger)
+}
+
+.color-warning {
+ color: var(--warning)
+}
+
+.color-primary {
+ color: var(--primary)
+}
+
+.btn-gradido-orange {
+ color: #fff;
+ background-color: #ffa600;
+ border-color: #ffa600
+}
+
+.visible-modal {
+ display: block
+}
+
+.margin-top-10 {
+ margin-top: 10px
+}
+
+.pull-right {
+ float: right
+}
+
+.pull-right-row {
+ display: block;
+ margin-right: 10px
+}
+
+.display-block {
+ display: block
+}
+
+p.grd_small {
+ margin-top: 2px;
+ margin-bottom: 2px
+}
+
+ul.grd-no-style {
+ list-style-type: none
+}
+
+.center-ul-container ul {
+ padding-left: 0;
+ margin-bottom: 0;
+ text-align: center
+}
+
+.center-ul-container ul .grd-error {
+ margin-top: 5px;
+ color: #8b0000
+}
+
+.grd-alert-color {
+ color: #ff5f66 !important
+}
+
+.grd-success-color {
+ color: #047006 !important
+}
+
+.grd-orange-color {
+ color: #ffa600
+}
+
+.hidden {
+ display: none
+}
+
+.alert {
+ cursor: pointer
+}
+
+.table.table-auto-break td,
+.table.table-auto-break th {
+ white-space: pre-line
+}
+
+.grd-passphrase-words {
+ cursor: pointer
+}
+
+.authentication-theme .reset-pwd-link,
+.authentication-theme .signup-link {
+ margin: 20px auto 0 auto;
+ text-align: center;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center
+}
+
+.authentication-theme .reset-pwd-link a,
+.authentication-theme .signup-link a {
+ display: inline-block;
+ margin-left: 10px
+}
+
+.authentication-theme .auth_footer {
+ margin-top: 30px
+}
+
+.authentication-theme.auth-style_1 {
+ min-height: 100vh;
+ width: 100%;
+ background: #f9fafb;
+ padding: 10% 0 2px 0
+}
+
+.authentication-theme.auth-style_1 .logo-section {
+ margin-bottom: 50px
+}
+
+.authentication-theme.auth-style_1 .grid-body {
+ padding: 60px 15px;
+ padding-bottom: 80px;
+ position: relative
+}
+
+.authentication-theme.auth-style_1 .grid-body .form-wrapper {
+ position: unset
+}
+
+.authentication-theme.auth-style_1 .grid-body-small {
+ padding: 15px 5px;
+ position: relative
+}
+
+.authentication-theme.auth-style_1 .signup-link {
+ position: absolute;
+ bottom: 25px;
+ left: 0;
+ right: 0
+}
+
+.authentication-theme.auth-style_1 .reset-pwd-link {
+ position: absolute;
+ bottom: 20px;
+ left: 0;
+ right: 0
+}
+
+.authentication-theme.auth-style_2 {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: stretch;
+ align-items: stretch;
+ -webkit-box-pack: center;
+ justify-content: center;
+ min-height: 100vh
+}
+
+.authentication-theme.auth-style_2 .inner-wrapper {
+ width: 100%
+}
+
+.authentication-theme.auth-style_2 .banner-section {
+ background: url(http://www.placehold.it/1200x800) no-repeat center;
+ background-size: 60%;
+ background-color: #fff;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: end;
+ align-items: flex-end
+}
+
+.authentication-theme.auth-style_2 .banner-section .auth_footer {
+ padding: 20px 20px
+}
+
+@media (max-width:767.98px) {
+ .authentication-theme.auth-style_2 .banner-section {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 0
+ }
+
+}
+
+.authentication-theme.auth-style_2 .form-section {
+ background-color: #fff;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.authentication-theme.auth-style_2 .form-section .logo-section {
+ margin: 0 auto 50px auto
+}
+
+.authentication-theme.auth-style_2 .form-section form {
+ width: 100%;
+ max-width: 350px;
+ margin: 0 auto
+}
+
+@media (max-width:767.98px) {
+ .authentication-theme.auth-style_2 .form-section {
+ background: rgba(255, 255, 255, .96)
+ }
+
+}
+
+.authentication-theme.auth-style_3 {
+ background: url(http://www.placehold.it/1200x800) no-repeat center;
+ background-size: cover;
+ background-color: #fff;
+ min-height: 100vh;
+ height: 100%;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: stretch;
+ align-items: stretch;
+ -webkit-box-pack: center;
+ justify-content: center
+}
+
+.authentication-theme.auth-style_3 .inner-wrapper {
+ width: 100%
+}
+
+.authentication-theme.auth-style_3 .logo-section {
+ margin: 0 auto 50px auto
+}
+
+.authentication-theme.auth-style_3 .form-section {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center
+}
+
+.authentication-theme.auth-style_3 .form-section form {
+ width: 100%;
+ max-width: 400px;
+ margin: 0 auto
+}
+
+@media (max-width:767.98px) {
+ .authentication-theme.auth-style_3 .form-section form {
+ max-width: 300px
+ }
+
+}
diff --git a/community_server/webroot/css/main.css b/community_server/webroot/css/main.css
new file mode 100644
index 000000000..3e16f1164
--- /dev/null
+++ b/community_server/webroot/css/main.css
@@ -0,0 +1,25 @@
+@charset "UTF-8";
+/* ============================================================
+
+ Common CSS file, importing other files.
+
+ Datei : main.css
+ Datum : 2020-04-30
+ Autor : Christine Slotty
+ Copyright : Gradio
+
+ ============================================================*/
+
+@import url(normalize.css);
+@import url(grd_styles.css);
+
+/*! debug.css v0.0.3 | MIT License | https://gist.github.com/zaydek/6b2e55258734deabbd2b4a284321d6f6 */
+[debug],
+[debug] * {
+ color: hsla(210, 100%, 100%, 0.9) !important;
+ background: hsla(210, 100%, 50%, 0.5) !important;
+ outline: solid 0.25rem hsla(210, 100%, 100%, 0.5) !important;
+
+ box-shadow: none !important;
+ filter: none !important;
+}
diff --git a/community_server/webroot/css/materialdesignicons.min.css b/community_server/webroot/css/materialdesignicons.min.css
new file mode 100644
index 000000000..07688156b
--- /dev/null
+++ b/community_server/webroot/css/materialdesignicons.min.css
@@ -0,0 +1,2 @@
+/* MaterialDesignIcons.com */@font-face{font-family:"Material Design Icons";src:url("../fonts/materialdesignicons-webfont.eot?v=3.5.95");src:url("../fonts/materialdesignicons-webfont.eot?#iefix&v=3.5.95") format("embedded-opentype"),url("../fonts/materialdesignicons-webfont.woff2?v=3.5.95") format("woff2"),url("../fonts/materialdesignicons-webfont.woff?v=3.5.95") format("woff"),url("../fonts/materialdesignicons-webfont.ttf?v=3.5.95") format("truetype"),url("../fonts/materialdesignicons-webfont.svg?v=3.5.95#materialdesigniconsregular") format("svg");font-weight:normal;font-style:normal}.mdi:before,.mdi-set{display:inline-block;font:normal normal normal 24px/1 "Material Design Icons";font-size:inherit;text-rendering:auto;line-height:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.mdi-access-point:before{content:"\F002"}.mdi-access-point-network:before{content:"\F003"}.mdi-access-point-network-off:before{content:"\FBBD"}.mdi-account:before{content:"\F004"}.mdi-account-alert:before{content:"\F005"}.mdi-account-alert-outline:before{content:"\FB2C"}.mdi-account-arrow-left:before{content:"\FB2D"}.mdi-account-arrow-left-outline:before{content:"\FB2E"}.mdi-account-arrow-right:before{content:"\FB2F"}.mdi-account-arrow-right-outline:before{content:"\FB30"}.mdi-account-badge:before{content:"\FD83"}.mdi-account-badge-alert:before{content:"\FD84"}.mdi-account-badge-alert-outline:before{content:"\FD85"}.mdi-account-badge-outline:before{content:"\FD86"}.mdi-account-box:before{content:"\F006"}.mdi-account-box-multiple:before{content:"\F933"}.mdi-account-box-outline:before{content:"\F007"}.mdi-account-card-details:before{content:"\F5D2"}.mdi-account-card-details-outline:before{content:"\FD87"}.mdi-account-check:before{content:"\F008"}.mdi-account-check-outline:before{content:"\FBBE"}.mdi-account-child:before{content:"\FA88"}.mdi-account-child-circle:before{content:"\FA89"}.mdi-account-circle:before{content:"\F009"}.mdi-account-circle-outline:before{content:"\FB31"}.mdi-account-clock:before{content:"\FB32"}.mdi-account-clock-outline:before{content:"\FB33"}.mdi-account-convert:before{content:"\F00A"}.mdi-account-details:before{content:"\F631"}.mdi-account-edit:before{content:"\F6BB"}.mdi-account-group:before{content:"\F848"}.mdi-account-group-outline:before{content:"\FB34"}.mdi-account-heart:before{content:"\F898"}.mdi-account-heart-outline:before{content:"\FBBF"}.mdi-account-key:before{content:"\F00B"}.mdi-account-key-outline:before{content:"\FBC0"}.mdi-account-minus:before{content:"\F00D"}.mdi-account-minus-outline:before{content:"\FAEB"}.mdi-account-multiple:before{content:"\F00E"}.mdi-account-multiple-check:before{content:"\F8C4"}.mdi-account-multiple-minus:before{content:"\F5D3"}.mdi-account-multiple-minus-outline:before{content:"\FBC1"}.mdi-account-multiple-outline:before{content:"\F00F"}.mdi-account-multiple-plus:before{content:"\F010"}.mdi-account-multiple-plus-outline:before{content:"\F7FF"}.mdi-account-network:before{content:"\F011"}.mdi-account-network-outline:before{content:"\FBC2"}.mdi-account-off:before{content:"\F012"}.mdi-account-off-outline:before{content:"\FBC3"}.mdi-account-outline:before{content:"\F013"}.mdi-account-plus:before{content:"\F014"}.mdi-account-plus-outline:before{content:"\F800"}.mdi-account-question:before{content:"\FB35"}.mdi-account-question-outline:before{content:"\FB36"}.mdi-account-remove:before{content:"\F015"}.mdi-account-remove-outline:before{content:"\FAEC"}.mdi-account-search:before{content:"\F016"}.mdi-account-search-outline:before{content:"\F934"}.mdi-account-settings:before{content:"\F630"}.mdi-account-star:before{content:"\F017"}.mdi-account-star-outline:before{content:"\FBC4"}.mdi-account-supervisor:before{content:"\FA8A"}.mdi-account-supervisor-circle:before{content:"\FA8B"}.mdi-account-switch:before{content:"\F019"}.mdi-account-tie:before{content:"\FCBF"}.mdi-accusoft:before{content:"\F849"}.mdi-adchoices:before{content:"\FD1E"}.mdi-adjust:before{content:"\F01A"}.mdi-adobe:before{content:"\F935"}.mdi-air-conditioner:before{content:"\F01B"}.mdi-air-filter:before{content:"\FD1F"}.mdi-air-horn:before{content:"\FD88"}.mdi-air-purifier:before{content:"\FD20"}.mdi-airbag:before{content:"\FBC5"}.mdi-airballoon:before{content:"\F01C"}.mdi-airplane:before{content:"\F01D"}.mdi-airplane-landing:before{content:"\F5D4"}.mdi-airplane-off:before{content:"\F01E"}.mdi-airplane-takeoff:before{content:"\F5D5"}.mdi-airplay:before{content:"\F01F"}.mdi-airport:before{content:"\F84A"}.mdi-alarm:before{content:"\F020"}.mdi-alarm-bell:before{content:"\F78D"}.mdi-alarm-check:before{content:"\F021"}.mdi-alarm-light:before{content:"\F78E"}.mdi-alarm-light-outline:before{content:"\FBC6"}.mdi-alarm-multiple:before{content:"\F022"}.mdi-alarm-off:before{content:"\F023"}.mdi-alarm-plus:before{content:"\F024"}.mdi-alarm-snooze:before{content:"\F68D"}.mdi-album:before{content:"\F025"}.mdi-alert:before{content:"\F026"}.mdi-alert-box:before{content:"\F027"}.mdi-alert-box-outline:before{content:"\FCC0"}.mdi-alert-circle:before{content:"\F028"}.mdi-alert-circle-outline:before{content:"\F5D6"}.mdi-alert-decagram:before{content:"\F6BC"}.mdi-alert-decagram-outline:before{content:"\FCC1"}.mdi-alert-octagon:before{content:"\F029"}.mdi-alert-octagon-outline:before{content:"\FCC2"}.mdi-alert-octagram:before{content:"\F766"}.mdi-alert-octagram-outline:before{content:"\FCC3"}.mdi-alert-outline:before{content:"\F02A"}.mdi-alien:before{content:"\F899"}.mdi-all-inclusive:before{content:"\F6BD"}.mdi-alpha:before{content:"\F02B"}.mdi-alpha-a:before{content:"\41"}.mdi-alpha-a-box:before{content:"\FAED"}.mdi-alpha-a-box-outline:before{content:"\FBC7"}.mdi-alpha-a-circle:before{content:"\FBC8"}.mdi-alpha-a-circle-outline:before{content:"\FBC9"}.mdi-alpha-b:before{content:"\42"}.mdi-alpha-b-box:before{content:"\FAEE"}.mdi-alpha-b-box-outline:before{content:"\FBCA"}.mdi-alpha-b-circle:before{content:"\FBCB"}.mdi-alpha-b-circle-outline:before{content:"\FBCC"}.mdi-alpha-c:before{content:"\43"}.mdi-alpha-c-box:before{content:"\FAEF"}.mdi-alpha-c-box-outline:before{content:"\FBCD"}.mdi-alpha-c-circle:before{content:"\FBCE"}.mdi-alpha-c-circle-outline:before{content:"\FBCF"}.mdi-alpha-d:before{content:"\44"}.mdi-alpha-d-box:before{content:"\FAF0"}.mdi-alpha-d-box-outline:before{content:"\FBD0"}.mdi-alpha-d-circle:before{content:"\FBD1"}.mdi-alpha-d-circle-outline:before{content:"\FBD2"}.mdi-alpha-e:before{content:"\45"}.mdi-alpha-e-box:before{content:"\FAF1"}.mdi-alpha-e-box-outline:before{content:"\FBD3"}.mdi-alpha-e-circle:before{content:"\FBD4"}.mdi-alpha-e-circle-outline:before{content:"\FBD5"}.mdi-alpha-f:before{content:"\46"}.mdi-alpha-f-box:before{content:"\FAF2"}.mdi-alpha-f-box-outline:before{content:"\FBD6"}.mdi-alpha-f-circle:before{content:"\FBD7"}.mdi-alpha-f-circle-outline:before{content:"\FBD8"}.mdi-alpha-g:before{content:"\47"}.mdi-alpha-g-box:before{content:"\FAF3"}.mdi-alpha-g-box-outline:before{content:"\FBD9"}.mdi-alpha-g-circle:before{content:"\FBDA"}.mdi-alpha-g-circle-outline:before{content:"\FBDB"}.mdi-alpha-h:before{content:"\48"}.mdi-alpha-h-box:before{content:"\FAF4"}.mdi-alpha-h-box-outline:before{content:"\FBDC"}.mdi-alpha-h-circle:before{content:"\FBDD"}.mdi-alpha-h-circle-outline:before{content:"\FBDE"}.mdi-alpha-i:before{content:"\49"}.mdi-alpha-i-box:before{content:"\FAF5"}.mdi-alpha-i-box-outline:before{content:"\FBDF"}.mdi-alpha-i-circle:before{content:"\FBE0"}.mdi-alpha-i-circle-outline:before{content:"\FBE1"}.mdi-alpha-j:before{content:"\4A"}.mdi-alpha-j-box:before{content:"\FAF6"}.mdi-alpha-j-box-outline:before{content:"\FBE2"}.mdi-alpha-j-circle:before{content:"\FBE3"}.mdi-alpha-j-circle-outline:before{content:"\FBE4"}.mdi-alpha-k:before{content:"\4B"}.mdi-alpha-k-box:before{content:"\FAF7"}.mdi-alpha-k-box-outline:before{content:"\FBE5"}.mdi-alpha-k-circle:before{content:"\FBE6"}.mdi-alpha-k-circle-outline:before{content:"\FBE7"}.mdi-alpha-l:before{content:"\4C"}.mdi-alpha-l-box:before{content:"\FAF8"}.mdi-alpha-l-box-outline:before{content:"\FBE8"}.mdi-alpha-l-circle:before{content:"\FBE9"}.mdi-alpha-l-circle-outline:before{content:"\FBEA"}.mdi-alpha-m:before{content:"\4D"}.mdi-alpha-m-box:before{content:"\FAF9"}.mdi-alpha-m-box-outline:before{content:"\FBEB"}.mdi-alpha-m-circle:before{content:"\FBEC"}.mdi-alpha-m-circle-outline:before{content:"\FBED"}.mdi-alpha-n:before{content:"\4E"}.mdi-alpha-n-box:before{content:"\FAFA"}.mdi-alpha-n-box-outline:before{content:"\FBEE"}.mdi-alpha-n-circle:before{content:"\FBEF"}.mdi-alpha-n-circle-outline:before{content:"\FBF0"}.mdi-alpha-o:before{content:"\4F"}.mdi-alpha-o-box:before{content:"\FAFB"}.mdi-alpha-o-box-outline:before{content:"\FBF1"}.mdi-alpha-o-circle:before{content:"\FBF2"}.mdi-alpha-o-circle-outline:before{content:"\FBF3"}.mdi-alpha-p:before{content:"\50"}.mdi-alpha-p-box:before{content:"\FAFC"}.mdi-alpha-p-box-outline:before{content:"\FBF4"}.mdi-alpha-p-circle:before{content:"\FBF5"}.mdi-alpha-p-circle-outline:before{content:"\FBF6"}.mdi-alpha-q:before{content:"\51"}.mdi-alpha-q-box:before{content:"\FAFD"}.mdi-alpha-q-box-outline:before{content:"\FBF7"}.mdi-alpha-q-circle:before{content:"\FBF8"}.mdi-alpha-q-circle-outline:before{content:"\FBF9"}.mdi-alpha-r:before{content:"\52"}.mdi-alpha-r-box:before{content:"\FAFE"}.mdi-alpha-r-box-outline:before{content:"\FBFA"}.mdi-alpha-r-circle:before{content:"\FBFB"}.mdi-alpha-r-circle-outline:before{content:"\FBFC"}.mdi-alpha-s:before{content:"\53"}.mdi-alpha-s-box:before{content:"\FAFF"}.mdi-alpha-s-box-outline:before{content:"\FBFD"}.mdi-alpha-s-circle:before{content:"\FBFE"}.mdi-alpha-s-circle-outline:before{content:"\FBFF"}.mdi-alpha-t:before{content:"\54"}.mdi-alpha-t-box:before{content:"\FB00"}.mdi-alpha-t-box-outline:before{content:"\FC00"}.mdi-alpha-t-circle:before{content:"\FC01"}.mdi-alpha-t-circle-outline:before{content:"\FC02"}.mdi-alpha-u:before{content:"\55"}.mdi-alpha-u-box:before{content:"\FB01"}.mdi-alpha-u-box-outline:before{content:"\FC03"}.mdi-alpha-u-circle:before{content:"\FC04"}.mdi-alpha-u-circle-outline:before{content:"\FC05"}.mdi-alpha-v:before{content:"\56"}.mdi-alpha-v-box:before{content:"\FB02"}.mdi-alpha-v-box-outline:before{content:"\FC06"}.mdi-alpha-v-circle:before{content:"\FC07"}.mdi-alpha-v-circle-outline:before{content:"\FC08"}.mdi-alpha-w:before{content:"\57"}.mdi-alpha-w-box:before{content:"\FB03"}.mdi-alpha-w-box-outline:before{content:"\FC09"}.mdi-alpha-w-circle:before{content:"\FC0A"}.mdi-alpha-w-circle-outline:before{content:"\FC0B"}.mdi-alpha-x:before{content:"\58"}.mdi-alpha-x-box:before{content:"\FB04"}.mdi-alpha-x-box-outline:before{content:"\FC0C"}.mdi-alpha-x-circle:before{content:"\FC0D"}.mdi-alpha-x-circle-outline:before{content:"\FC0E"}.mdi-alpha-y:before{content:"\59"}.mdi-alpha-y-box:before{content:"\FB05"}.mdi-alpha-y-box-outline:before{content:"\FC0F"}.mdi-alpha-y-circle:before{content:"\FC10"}.mdi-alpha-y-circle-outline:before{content:"\FC11"}.mdi-alpha-z:before{content:"\5A"}.mdi-alpha-z-box:before{content:"\FB06"}.mdi-alpha-z-box-outline:before{content:"\FC12"}.mdi-alpha-z-circle:before{content:"\FC13"}.mdi-alpha-z-circle-outline:before{content:"\FC14"}.mdi-alphabetical:before{content:"\F02C"}.mdi-altimeter:before{content:"\F5D7"}.mdi-amazon:before{content:"\F02D"}.mdi-amazon-alexa:before{content:"\F8C5"}.mdi-amazon-drive:before{content:"\F02E"}.mdi-ambulance:before{content:"\F02F"}.mdi-ammunition:before{content:"\FCC4"}.mdi-ampersand:before{content:"\FA8C"}.mdi-amplifier:before{content:"\F030"}.mdi-anchor:before{content:"\F031"}.mdi-android:before{content:"\F032"}.mdi-android-auto:before{content:"\FA8D"}.mdi-android-debug-bridge:before{content:"\F033"}.mdi-android-head:before{content:"\F78F"}.mdi-android-messages:before{content:"\FD21"}.mdi-android-studio:before{content:"\F034"}.mdi-angle-acute:before{content:"\F936"}.mdi-angle-obtuse:before{content:"\F937"}.mdi-angle-right:before{content:"\F938"}.mdi-angular:before{content:"\F6B1"}.mdi-angularjs:before{content:"\F6BE"}.mdi-animation:before{content:"\F5D8"}.mdi-animation-outline:before{content:"\FA8E"}.mdi-animation-play:before{content:"\F939"}.mdi-animation-play-outline:before{content:"\FA8F"}.mdi-anvil:before{content:"\F89A"}.mdi-apple:before{content:"\F035"}.mdi-apple-finder:before{content:"\F036"}.mdi-apple-icloud:before{content:"\F038"}.mdi-apple-ios:before{content:"\F037"}.mdi-apple-keyboard-caps:before{content:"\F632"}.mdi-apple-keyboard-command:before{content:"\F633"}.mdi-apple-keyboard-control:before{content:"\F634"}.mdi-apple-keyboard-option:before{content:"\F635"}.mdi-apple-keyboard-shift:before{content:"\F636"}.mdi-apple-safari:before{content:"\F039"}.mdi-application:before{content:"\F614"}.mdi-application-export:before{content:"\FD89"}.mdi-application-import:before{content:"\FD8A"}.mdi-apps:before{content:"\F03B"}.mdi-apps-box:before{content:"\FD22"}.mdi-arch:before{content:"\F8C6"}.mdi-archive:before{content:"\F03C"}.mdi-arrange-bring-forward:before{content:"\F03D"}.mdi-arrange-bring-to-front:before{content:"\F03E"}.mdi-arrange-send-backward:before{content:"\F03F"}.mdi-arrange-send-to-back:before{content:"\F040"}.mdi-arrow-all:before{content:"\F041"}.mdi-arrow-bottom-left:before{content:"\F042"}.mdi-arrow-bottom-left-bold-outline:before{content:"\F9B6"}.mdi-arrow-bottom-left-thick:before{content:"\F9B7"}.mdi-arrow-bottom-right:before{content:"\F043"}.mdi-arrow-bottom-right-bold-outline:before{content:"\F9B8"}.mdi-arrow-bottom-right-thick:before{content:"\F9B9"}.mdi-arrow-collapse:before{content:"\F615"}.mdi-arrow-collapse-all:before{content:"\F044"}.mdi-arrow-collapse-down:before{content:"\F791"}.mdi-arrow-collapse-horizontal:before{content:"\F84B"}.mdi-arrow-collapse-left:before{content:"\F792"}.mdi-arrow-collapse-right:before{content:"\F793"}.mdi-arrow-collapse-up:before{content:"\F794"}.mdi-arrow-collapse-vertical:before{content:"\F84C"}.mdi-arrow-decision:before{content:"\F9BA"}.mdi-arrow-decision-auto:before{content:"\F9BB"}.mdi-arrow-decision-auto-outline:before{content:"\F9BC"}.mdi-arrow-decision-outline:before{content:"\F9BD"}.mdi-arrow-down:before{content:"\F045"}.mdi-arrow-down-bold:before{content:"\F72D"}.mdi-arrow-down-bold-box:before{content:"\F72E"}.mdi-arrow-down-bold-box-outline:before{content:"\F72F"}.mdi-arrow-down-bold-circle:before{content:"\F047"}.mdi-arrow-down-bold-circle-outline:before{content:"\F048"}.mdi-arrow-down-bold-hexagon-outline:before{content:"\F049"}.mdi-arrow-down-bold-outline:before{content:"\F9BE"}.mdi-arrow-down-box:before{content:"\F6BF"}.mdi-arrow-down-circle:before{content:"\FCB7"}.mdi-arrow-down-circle-outline:before{content:"\FCB8"}.mdi-arrow-down-drop-circle:before{content:"\F04A"}.mdi-arrow-down-drop-circle-outline:before{content:"\F04B"}.mdi-arrow-down-thick:before{content:"\F046"}.mdi-arrow-expand:before{content:"\F616"}.mdi-arrow-expand-all:before{content:"\F04C"}.mdi-arrow-expand-down:before{content:"\F795"}.mdi-arrow-expand-horizontal:before{content:"\F84D"}.mdi-arrow-expand-left:before{content:"\F796"}.mdi-arrow-expand-right:before{content:"\F797"}.mdi-arrow-expand-up:before{content:"\F798"}.mdi-arrow-expand-vertical:before{content:"\F84E"}.mdi-arrow-left:before{content:"\F04D"}.mdi-arrow-left-bold:before{content:"\F730"}.mdi-arrow-left-bold-box:before{content:"\F731"}.mdi-arrow-left-bold-box-outline:before{content:"\F732"}.mdi-arrow-left-bold-circle:before{content:"\F04F"}.mdi-arrow-left-bold-circle-outline:before{content:"\F050"}.mdi-arrow-left-bold-hexagon-outline:before{content:"\F051"}.mdi-arrow-left-bold-outline:before{content:"\F9BF"}.mdi-arrow-left-box:before{content:"\F6C0"}.mdi-arrow-left-circle:before{content:"\FCB9"}.mdi-arrow-left-circle-outline:before{content:"\FCBA"}.mdi-arrow-left-drop-circle:before{content:"\F052"}.mdi-arrow-left-drop-circle-outline:before{content:"\F053"}.mdi-arrow-left-right-bold-outline:before{content:"\F9C0"}.mdi-arrow-left-thick:before{content:"\F04E"}.mdi-arrow-right:before{content:"\F054"}.mdi-arrow-right-bold:before{content:"\F733"}.mdi-arrow-right-bold-box:before{content:"\F734"}.mdi-arrow-right-bold-box-outline:before{content:"\F735"}.mdi-arrow-right-bold-circle:before{content:"\F056"}.mdi-arrow-right-bold-circle-outline:before{content:"\F057"}.mdi-arrow-right-bold-hexagon-outline:before{content:"\F058"}.mdi-arrow-right-bold-outline:before{content:"\F9C1"}.mdi-arrow-right-box:before{content:"\F6C1"}.mdi-arrow-right-circle:before{content:"\FCBB"}.mdi-arrow-right-circle-outline:before{content:"\FCBC"}.mdi-arrow-right-drop-circle:before{content:"\F059"}.mdi-arrow-right-drop-circle-outline:before{content:"\F05A"}.mdi-arrow-right-thick:before{content:"\F055"}.mdi-arrow-split-horizontal:before{content:"\F93A"}.mdi-arrow-split-vertical:before{content:"\F93B"}.mdi-arrow-top-left:before{content:"\F05B"}.mdi-arrow-top-left-bold-outline:before{content:"\F9C2"}.mdi-arrow-top-left-thick:before{content:"\F9C3"}.mdi-arrow-top-right:before{content:"\F05C"}.mdi-arrow-top-right-bold-outline:before{content:"\F9C4"}.mdi-arrow-top-right-thick:before{content:"\F9C5"}.mdi-arrow-up:before{content:"\F05D"}.mdi-arrow-up-bold:before{content:"\F736"}.mdi-arrow-up-bold-box:before{content:"\F737"}.mdi-arrow-up-bold-box-outline:before{content:"\F738"}.mdi-arrow-up-bold-circle:before{content:"\F05F"}.mdi-arrow-up-bold-circle-outline:before{content:"\F060"}.mdi-arrow-up-bold-hexagon-outline:before{content:"\F061"}.mdi-arrow-up-bold-outline:before{content:"\F9C6"}.mdi-arrow-up-box:before{content:"\F6C2"}.mdi-arrow-up-circle:before{content:"\FCBD"}.mdi-arrow-up-circle-outline:before{content:"\FCBE"}.mdi-arrow-up-down-bold-outline:before{content:"\F9C7"}.mdi-arrow-up-drop-circle:before{content:"\F062"}.mdi-arrow-up-drop-circle-outline:before{content:"\F063"}.mdi-arrow-up-thick:before{content:"\F05E"}.mdi-artist:before{content:"\F802"}.mdi-artist-outline:before{content:"\FCC5"}.mdi-artstation:before{content:"\FB37"}.mdi-aspect-ratio:before{content:"\FA23"}.mdi-assistant:before{content:"\F064"}.mdi-asterisk:before{content:"\F6C3"}.mdi-at:before{content:"\F065"}.mdi-atlassian:before{content:"\F803"}.mdi-atm:before{content:"\FD23"}.mdi-atom:before{content:"\F767"}.mdi-attachment:before{content:"\F066"}.mdi-audio-video:before{content:"\F93C"}.mdi-audiobook:before{content:"\F067"}.mdi-augmented-reality:before{content:"\F84F"}.mdi-auto-fix:before{content:"\F068"}.mdi-auto-upload:before{content:"\F069"}.mdi-autorenew:before{content:"\F06A"}.mdi-av-timer:before{content:"\F06B"}.mdi-axe:before{content:"\F8C7"}.mdi-axis:before{content:"\FD24"}.mdi-axis-arrow:before{content:"\FD25"}.mdi-axis-arrow-lock:before{content:"\FD26"}.mdi-axis-lock:before{content:"\FD27"}.mdi-axis-x-arrow:before{content:"\FD28"}.mdi-axis-x-arrow-lock:before{content:"\FD29"}.mdi-axis-x-rotate-clockwise:before{content:"\FD2A"}.mdi-axis-x-rotate-counterclockwise:before{content:"\FD2B"}.mdi-axis-x-y-arrow-lock:before{content:"\FD2C"}.mdi-axis-y-arrow:before{content:"\FD2D"}.mdi-axis-y-arrow-lock:before{content:"\FD2E"}.mdi-axis-y-rotate-clockwise:before{content:"\FD2F"}.mdi-axis-y-rotate-counterclockwise:before{content:"\FD30"}.mdi-axis-z-arrow:before{content:"\FD31"}.mdi-axis-z-arrow-lock:before{content:"\FD32"}.mdi-axis-z-rotate-clockwise:before{content:"\FD33"}.mdi-axis-z-rotate-counterclockwise:before{content:"\FD34"}.mdi-azure:before{content:"\F804"}.mdi-babel:before{content:"\FA24"}.mdi-baby:before{content:"\F06C"}.mdi-baby-buggy:before{content:"\F68E"}.mdi-backburger:before{content:"\F06D"}.mdi-backspace:before{content:"\F06E"}.mdi-backspace-outline:before{content:"\FB38"}.mdi-backup-restore:before{content:"\F06F"}.mdi-badminton:before{content:"\F850"}.mdi-balloon:before{content:"\FA25"}.mdi-ballot:before{content:"\F9C8"}.mdi-ballot-outline:before{content:"\F9C9"}.mdi-ballot-recount:before{content:"\FC15"}.mdi-ballot-recount-outline:before{content:"\FC16"}.mdi-bandage:before{content:"\FD8B"}.mdi-bandcamp:before{content:"\F674"}.mdi-bank:before{content:"\F070"}.mdi-bank-minus:before{content:"\FD8C"}.mdi-bank-plus:before{content:"\FD8D"}.mdi-bank-remove:before{content:"\FD8E"}.mdi-bank-transfer:before{content:"\FA26"}.mdi-bank-transfer-in:before{content:"\FA27"}.mdi-bank-transfer-out:before{content:"\FA28"}.mdi-barcode:before{content:"\F071"}.mdi-barcode-scan:before{content:"\F072"}.mdi-barley:before{content:"\F073"}.mdi-barley-off:before{content:"\FB39"}.mdi-barn:before{content:"\FB3A"}.mdi-barrel:before{content:"\F074"}.mdi-baseball:before{content:"\F851"}.mdi-baseball-bat:before{content:"\F852"}.mdi-basecamp:before{content:"\F075"}.mdi-basket:before{content:"\F076"}.mdi-basket-fill:before{content:"\F077"}.mdi-basket-unfill:before{content:"\F078"}.mdi-basketball:before{content:"\F805"}.mdi-basketball-hoop:before{content:"\FC17"}.mdi-basketball-hoop-outline:before{content:"\FC18"}.mdi-bat:before{content:"\FB3B"}.mdi-battery:before{content:"\F079"}.mdi-battery-10:before{content:"\F07A"}.mdi-battery-10-bluetooth:before{content:"\F93D"}.mdi-battery-20:before{content:"\F07B"}.mdi-battery-20-bluetooth:before{content:"\F93E"}.mdi-battery-30:before{content:"\F07C"}.mdi-battery-30-bluetooth:before{content:"\F93F"}.mdi-battery-40:before{content:"\F07D"}.mdi-battery-40-bluetooth:before{content:"\F940"}.mdi-battery-50:before{content:"\F07E"}.mdi-battery-50-bluetooth:before{content:"\F941"}.mdi-battery-60:before{content:"\F07F"}.mdi-battery-60-bluetooth:before{content:"\F942"}.mdi-battery-70:before{content:"\F080"}.mdi-battery-70-bluetooth:before{content:"\F943"}.mdi-battery-80:before{content:"\F081"}.mdi-battery-80-bluetooth:before{content:"\F944"}.mdi-battery-90:before{content:"\F082"}.mdi-battery-90-bluetooth:before{content:"\F945"}.mdi-battery-alert:before{content:"\F083"}.mdi-battery-alert-bluetooth:before{content:"\F946"}.mdi-battery-bluetooth:before{content:"\F947"}.mdi-battery-bluetooth-variant:before{content:"\F948"}.mdi-battery-charging:before{content:"\F084"}.mdi-battery-charging-10:before{content:"\F89B"}.mdi-battery-charging-100:before{content:"\F085"}.mdi-battery-charging-20:before{content:"\F086"}.mdi-battery-charging-30:before{content:"\F087"}.mdi-battery-charging-40:before{content:"\F088"}.mdi-battery-charging-50:before{content:"\F89C"}.mdi-battery-charging-60:before{content:"\F089"}.mdi-battery-charging-70:before{content:"\F89D"}.mdi-battery-charging-80:before{content:"\F08A"}.mdi-battery-charging-90:before{content:"\F08B"}.mdi-battery-charging-outline:before{content:"\F89E"}.mdi-battery-charging-wireless:before{content:"\F806"}.mdi-battery-charging-wireless-10:before{content:"\F807"}.mdi-battery-charging-wireless-20:before{content:"\F808"}.mdi-battery-charging-wireless-30:before{content:"\F809"}.mdi-battery-charging-wireless-40:before{content:"\F80A"}.mdi-battery-charging-wireless-50:before{content:"\F80B"}.mdi-battery-charging-wireless-60:before{content:"\F80C"}.mdi-battery-charging-wireless-70:before{content:"\F80D"}.mdi-battery-charging-wireless-80:before{content:"\F80E"}.mdi-battery-charging-wireless-90:before{content:"\F80F"}.mdi-battery-charging-wireless-alert:before{content:"\F810"}.mdi-battery-charging-wireless-outline:before{content:"\F811"}.mdi-battery-minus:before{content:"\F08C"}.mdi-battery-negative:before{content:"\F08D"}.mdi-battery-outline:before{content:"\F08E"}.mdi-battery-plus:before{content:"\F08F"}.mdi-battery-positive:before{content:"\F090"}.mdi-battery-unknown:before{content:"\F091"}.mdi-battery-unknown-bluetooth:before{content:"\F949"}.mdi-battlenet:before{content:"\FB3C"}.mdi-beach:before{content:"\F092"}.mdi-beaker:before{content:"\FCC6"}.mdi-beaker-outline:before{content:"\F68F"}.mdi-beats:before{content:"\F097"}.mdi-bed-empty:before{content:"\F89F"}.mdi-beer:before{content:"\F098"}.mdi-behance:before{content:"\F099"}.mdi-bell:before{content:"\F09A"}.mdi-bell-alert:before{content:"\FD35"}.mdi-bell-circle:before{content:"\FD36"}.mdi-bell-circle-outline:before{content:"\FD37"}.mdi-bell-off:before{content:"\F09B"}.mdi-bell-off-outline:before{content:"\FA90"}.mdi-bell-outline:before{content:"\F09C"}.mdi-bell-plus:before{content:"\F09D"}.mdi-bell-plus-outline:before{content:"\FA91"}.mdi-bell-ring:before{content:"\F09E"}.mdi-bell-ring-outline:before{content:"\F09F"}.mdi-bell-sleep:before{content:"\F0A0"}.mdi-bell-sleep-outline:before{content:"\FA92"}.mdi-beta:before{content:"\F0A1"}.mdi-betamax:before{content:"\F9CA"}.mdi-bible:before{content:"\F0A2"}.mdi-bike:before{content:"\F0A3"}.mdi-billiards:before{content:"\FB3D"}.mdi-billiards-rack:before{content:"\FB3E"}.mdi-bing:before{content:"\F0A4"}.mdi-binoculars:before{content:"\F0A5"}.mdi-bio:before{content:"\F0A6"}.mdi-biohazard:before{content:"\F0A7"}.mdi-bitbucket:before{content:"\F0A8"}.mdi-bitcoin:before{content:"\F812"}.mdi-black-mesa:before{content:"\F0A9"}.mdi-blackberry:before{content:"\F0AA"}.mdi-blender:before{content:"\FCC7"}.mdi-blender-software:before{content:"\F0AB"}.mdi-blinds:before{content:"\F0AC"}.mdi-block-helper:before{content:"\F0AD"}.mdi-blogger:before{content:"\F0AE"}.mdi-blood-bag:before{content:"\FCC8"}.mdi-bluetooth:before{content:"\F0AF"}.mdi-bluetooth-audio:before{content:"\F0B0"}.mdi-bluetooth-connect:before{content:"\F0B1"}.mdi-bluetooth-off:before{content:"\F0B2"}.mdi-bluetooth-settings:before{content:"\F0B3"}.mdi-bluetooth-transfer:before{content:"\F0B4"}.mdi-blur:before{content:"\F0B5"}.mdi-blur-linear:before{content:"\F0B6"}.mdi-blur-off:before{content:"\F0B7"}.mdi-blur-radial:before{content:"\F0B8"}.mdi-bolnisi-cross:before{content:"\FCC9"}.mdi-bolt:before{content:"\FD8F"}.mdi-bomb:before{content:"\F690"}.mdi-bomb-off:before{content:"\F6C4"}.mdi-bone:before{content:"\F0B9"}.mdi-book:before{content:"\F0BA"}.mdi-book-lock:before{content:"\F799"}.mdi-book-lock-open:before{content:"\F79A"}.mdi-book-minus:before{content:"\F5D9"}.mdi-book-multiple:before{content:"\F0BB"}.mdi-book-multiple-minus:before{content:"\FA93"}.mdi-book-multiple-plus:before{content:"\FA94"}.mdi-book-multiple-remove:before{content:"\FA95"}.mdi-book-multiple-variant:before{content:"\F0BC"}.mdi-book-open:before{content:"\F0BD"}.mdi-book-open-outline:before{content:"\FB3F"}.mdi-book-open-page-variant:before{content:"\F5DA"}.mdi-book-open-variant:before{content:"\F0BE"}.mdi-book-outline:before{content:"\FB40"}.mdi-book-plus:before{content:"\F5DB"}.mdi-book-remove:before{content:"\FA96"}.mdi-book-variant:before{content:"\F0BF"}.mdi-bookmark:before{content:"\F0C0"}.mdi-bookmark-check:before{content:"\F0C1"}.mdi-bookmark-minus:before{content:"\F9CB"}.mdi-bookmark-minus-outline:before{content:"\F9CC"}.mdi-bookmark-music:before{content:"\F0C2"}.mdi-bookmark-off:before{content:"\F9CD"}.mdi-bookmark-off-outline:before{content:"\F9CE"}.mdi-bookmark-outline:before{content:"\F0C3"}.mdi-bookmark-plus:before{content:"\F0C5"}.mdi-bookmark-plus-outline:before{content:"\F0C4"}.mdi-bookmark-remove:before{content:"\F0C6"}.mdi-boombox:before{content:"\F5DC"}.mdi-bootstrap:before{content:"\F6C5"}.mdi-border-all:before{content:"\F0C7"}.mdi-border-all-variant:before{content:"\F8A0"}.mdi-border-bottom:before{content:"\F0C8"}.mdi-border-bottom-variant:before{content:"\F8A1"}.mdi-border-color:before{content:"\F0C9"}.mdi-border-horizontal:before{content:"\F0CA"}.mdi-border-inside:before{content:"\F0CB"}.mdi-border-left:before{content:"\F0CC"}.mdi-border-left-variant:before{content:"\F8A2"}.mdi-border-none:before{content:"\F0CD"}.mdi-border-none-variant:before{content:"\F8A3"}.mdi-border-outside:before{content:"\F0CE"}.mdi-border-right:before{content:"\F0CF"}.mdi-border-right-variant:before{content:"\F8A4"}.mdi-border-style:before{content:"\F0D0"}.mdi-border-top:before{content:"\F0D1"}.mdi-border-top-variant:before{content:"\F8A5"}.mdi-border-vertical:before{content:"\F0D2"}.mdi-bottle-wine:before{content:"\F853"}.mdi-bow-tie:before{content:"\F677"}.mdi-bowl:before{content:"\F617"}.mdi-bowling:before{content:"\F0D3"}.mdi-box:before{content:"\F0D4"}.mdi-box-cutter:before{content:"\F0D5"}.mdi-box-shadow:before{content:"\F637"}.mdi-boxing-glove:before{content:"\FB41"}.mdi-braille:before{content:"\F9CF"}.mdi-brain:before{content:"\F9D0"}.mdi-bread-slice:before{content:"\FCCA"}.mdi-bread-slice-outline:before{content:"\FCCB"}.mdi-bridge:before{content:"\F618"}.mdi-briefcase:before{content:"\F0D6"}.mdi-briefcase-account:before{content:"\FCCC"}.mdi-briefcase-account-outline:before{content:"\FCCD"}.mdi-briefcase-check:before{content:"\F0D7"}.mdi-briefcase-download:before{content:"\F0D8"}.mdi-briefcase-download-outline:before{content:"\FC19"}.mdi-briefcase-edit:before{content:"\FA97"}.mdi-briefcase-edit-outline:before{content:"\FC1A"}.mdi-briefcase-minus:before{content:"\FA29"}.mdi-briefcase-minus-outline:before{content:"\FC1B"}.mdi-briefcase-outline:before{content:"\F813"}.mdi-briefcase-plus:before{content:"\FA2A"}.mdi-briefcase-plus-outline:before{content:"\FC1C"}.mdi-briefcase-remove:before{content:"\FA2B"}.mdi-briefcase-remove-outline:before{content:"\FC1D"}.mdi-briefcase-search:before{content:"\FA2C"}.mdi-briefcase-search-outline:before{content:"\FC1E"}.mdi-briefcase-upload:before{content:"\F0D9"}.mdi-briefcase-upload-outline:before{content:"\FC1F"}.mdi-brightness-1:before{content:"\F0DA"}.mdi-brightness-2:before{content:"\F0DB"}.mdi-brightness-3:before{content:"\F0DC"}.mdi-brightness-4:before{content:"\F0DD"}.mdi-brightness-5:before{content:"\F0DE"}.mdi-brightness-6:before{content:"\F0DF"}.mdi-brightness-7:before{content:"\F0E0"}.mdi-brightness-auto:before{content:"\F0E1"}.mdi-brightness-percent:before{content:"\FCCE"}.mdi-broom:before{content:"\F0E2"}.mdi-brush:before{content:"\F0E3"}.mdi-buddhism:before{content:"\F94A"}.mdi-buffer:before{content:"\F619"}.mdi-bug:before{content:"\F0E4"}.mdi-bug-check:before{content:"\FA2D"}.mdi-bug-check-outline:before{content:"\FA2E"}.mdi-bug-outline:before{content:"\FA2F"}.mdi-bugle:before{content:"\FD90"}.mdi-bulldozer:before{content:"\FB07"}.mdi-bullet:before{content:"\FCCF"}.mdi-bulletin-board:before{content:"\F0E5"}.mdi-bullhorn:before{content:"\F0E6"}.mdi-bullhorn-outline:before{content:"\FB08"}.mdi-bullseye:before{content:"\F5DD"}.mdi-bullseye-arrow:before{content:"\F8C8"}.mdi-bus:before{content:"\F0E7"}.mdi-bus-alert:before{content:"\FA98"}.mdi-bus-articulated-end:before{content:"\F79B"}.mdi-bus-articulated-front:before{content:"\F79C"}.mdi-bus-clock:before{content:"\F8C9"}.mdi-bus-double-decker:before{content:"\F79D"}.mdi-bus-school:before{content:"\F79E"}.mdi-bus-side:before{content:"\F79F"}.mdi-cached:before{content:"\F0E8"}.mdi-cactus:before{content:"\FD91"}.mdi-cake:before{content:"\F0E9"}.mdi-cake-layered:before{content:"\F0EA"}.mdi-cake-variant:before{content:"\F0EB"}.mdi-calculator:before{content:"\F0EC"}.mdi-calculator-variant:before{content:"\FA99"}.mdi-calendar:before{content:"\F0ED"}.mdi-calendar-alert:before{content:"\FA30"}.mdi-calendar-blank:before{content:"\F0EE"}.mdi-calendar-blank-outline:before{content:"\FB42"}.mdi-calendar-check:before{content:"\F0EF"}.mdi-calendar-check-outline:before{content:"\FC20"}.mdi-calendar-clock:before{content:"\F0F0"}.mdi-calendar-edit:before{content:"\F8A6"}.mdi-calendar-export:before{content:"\FB09"}.mdi-calendar-heart:before{content:"\F9D1"}.mdi-calendar-import:before{content:"\FB0A"}.mdi-calendar-minus:before{content:"\FD38"}.mdi-calendar-multiple:before{content:"\F0F1"}.mdi-calendar-multiple-check:before{content:"\F0F2"}.mdi-calendar-multiselect:before{content:"\FA31"}.mdi-calendar-outline:before{content:"\FB43"}.mdi-calendar-plus:before{content:"\F0F3"}.mdi-calendar-question:before{content:"\F691"}.mdi-calendar-range:before{content:"\F678"}.mdi-calendar-range-outline:before{content:"\FB44"}.mdi-calendar-remove:before{content:"\F0F4"}.mdi-calendar-remove-outline:before{content:"\FC21"}.mdi-calendar-search:before{content:"\F94B"}.mdi-calendar-star:before{content:"\F9D2"}.mdi-calendar-text:before{content:"\F0F5"}.mdi-calendar-text-outline:before{content:"\FC22"}.mdi-calendar-today:before{content:"\F0F6"}.mdi-calendar-week:before{content:"\FA32"}.mdi-calendar-week-begin:before{content:"\FA33"}.mdi-call-made:before{content:"\F0F7"}.mdi-call-merge:before{content:"\F0F8"}.mdi-call-missed:before{content:"\F0F9"}.mdi-call-received:before{content:"\F0FA"}.mdi-call-split:before{content:"\F0FB"}.mdi-camcorder:before{content:"\F0FC"}.mdi-camcorder-box:before{content:"\F0FD"}.mdi-camcorder-box-off:before{content:"\F0FE"}.mdi-camcorder-off:before{content:"\F0FF"}.mdi-camera:before{content:"\F100"}.mdi-camera-account:before{content:"\F8CA"}.mdi-camera-burst:before{content:"\F692"}.mdi-camera-control:before{content:"\FB45"}.mdi-camera-enhance:before{content:"\F101"}.mdi-camera-enhance-outline:before{content:"\FB46"}.mdi-camera-front:before{content:"\F102"}.mdi-camera-front-variant:before{content:"\F103"}.mdi-camera-gopro:before{content:"\F7A0"}.mdi-camera-image:before{content:"\F8CB"}.mdi-camera-iris:before{content:"\F104"}.mdi-camera-metering-center:before{content:"\F7A1"}.mdi-camera-metering-matrix:before{content:"\F7A2"}.mdi-camera-metering-partial:before{content:"\F7A3"}.mdi-camera-metering-spot:before{content:"\F7A4"}.mdi-camera-off:before{content:"\F5DF"}.mdi-camera-outline:before{content:"\FD39"}.mdi-camera-party-mode:before{content:"\F105"}.mdi-camera-rear:before{content:"\F106"}.mdi-camera-rear-variant:before{content:"\F107"}.mdi-camera-switch:before{content:"\F108"}.mdi-camera-timer:before{content:"\F109"}.mdi-camera-wireless:before{content:"\FD92"}.mdi-camera-wireless-outline:before{content:"\FD93"}.mdi-cancel:before{content:"\F739"}.mdi-candle:before{content:"\F5E2"}.mdi-candycane:before{content:"\F10A"}.mdi-cannabis:before{content:"\F7A5"}.mdi-caps-lock:before{content:"\FA9A"}.mdi-car:before{content:"\F10B"}.mdi-car-battery:before{content:"\F10C"}.mdi-car-brake-abs:before{content:"\FC23"}.mdi-car-brake-alert:before{content:"\FC24"}.mdi-car-brake-hold:before{content:"\FD3A"}.mdi-car-brake-parking:before{content:"\FD3B"}.mdi-car-connected:before{content:"\F10D"}.mdi-car-convertible:before{content:"\F7A6"}.mdi-car-cruise-control:before{content:"\FD3C"}.mdi-car-defrost-front:before{content:"\FD3D"}.mdi-car-defrost-rear:before{content:"\FD3E"}.mdi-car-door:before{content:"\FB47"}.mdi-car-electric:before{content:"\FB48"}.mdi-car-esp:before{content:"\FC25"}.mdi-car-estate:before{content:"\F7A7"}.mdi-car-hatchback:before{content:"\F7A8"}.mdi-car-key:before{content:"\FB49"}.mdi-car-light-dimmed:before{content:"\FC26"}.mdi-car-light-fog:before{content:"\FC27"}.mdi-car-light-high:before{content:"\FC28"}.mdi-car-limousine:before{content:"\F8CC"}.mdi-car-multiple:before{content:"\FB4A"}.mdi-car-parking-lights:before{content:"\FD3F"}.mdi-car-pickup:before{content:"\F7A9"}.mdi-car-side:before{content:"\F7AA"}.mdi-car-sports:before{content:"\F7AB"}.mdi-car-tire-alert:before{content:"\FC29"}.mdi-car-traction-control:before{content:"\FD40"}.mdi-car-wash:before{content:"\F10E"}.mdi-caravan:before{content:"\F7AC"}.mdi-card:before{content:"\FB4B"}.mdi-card-bulleted:before{content:"\FB4C"}.mdi-card-bulleted-off:before{content:"\FB4D"}.mdi-card-bulleted-off-outline:before{content:"\FB4E"}.mdi-card-bulleted-outline:before{content:"\FB4F"}.mdi-card-bulleted-settings:before{content:"\FB50"}.mdi-card-bulleted-settings-outline:before{content:"\FB51"}.mdi-card-outline:before{content:"\FB52"}.mdi-card-text:before{content:"\FB53"}.mdi-card-text-outline:before{content:"\FB54"}.mdi-cards:before{content:"\F638"}.mdi-cards-club:before{content:"\F8CD"}.mdi-cards-diamond:before{content:"\F8CE"}.mdi-cards-heart:before{content:"\F8CF"}.mdi-cards-outline:before{content:"\F639"}.mdi-cards-playing-outline:before{content:"\F63A"}.mdi-cards-spade:before{content:"\F8D0"}.mdi-cards-variant:before{content:"\F6C6"}.mdi-carrot:before{content:"\F10F"}.mdi-carry-on-bag-check:before{content:"\FD41"}.mdi-cart:before{content:"\F110"}.mdi-cart-arrow-down:before{content:"\FD42"}.mdi-cart-arrow-right:before{content:"\FC2A"}.mdi-cart-arrow-up:before{content:"\FD43"}.mdi-cart-minus:before{content:"\FD44"}.mdi-cart-off:before{content:"\F66B"}.mdi-cart-outline:before{content:"\F111"}.mdi-cart-plus:before{content:"\F112"}.mdi-cart-remove:before{content:"\FD45"}.mdi-case-sensitive-alt:before{content:"\F113"}.mdi-cash:before{content:"\F114"}.mdi-cash-100:before{content:"\F115"}.mdi-cash-marker:before{content:"\FD94"}.mdi-cash-multiple:before{content:"\F116"}.mdi-cash-refund:before{content:"\FA9B"}.mdi-cash-register:before{content:"\FCD0"}.mdi-cash-usd:before{content:"\F117"}.mdi-cassette:before{content:"\F9D3"}.mdi-cast:before{content:"\F118"}.mdi-cast-connected:before{content:"\F119"}.mdi-cast-off:before{content:"\F789"}.mdi-castle:before{content:"\F11A"}.mdi-cat:before{content:"\F11B"}.mdi-cctv:before{content:"\F7AD"}.mdi-ceiling-light:before{content:"\F768"}.mdi-cellphone:before{content:"\F11C"}.mdi-cellphone-android:before{content:"\F11D"}.mdi-cellphone-arrow-down:before{content:"\F9D4"}.mdi-cellphone-basic:before{content:"\F11E"}.mdi-cellphone-dock:before{content:"\F11F"}.mdi-cellphone-erase:before{content:"\F94C"}.mdi-cellphone-iphone:before{content:"\F120"}.mdi-cellphone-key:before{content:"\F94D"}.mdi-cellphone-link:before{content:"\F121"}.mdi-cellphone-link-off:before{content:"\F122"}.mdi-cellphone-lock:before{content:"\F94E"}.mdi-cellphone-message:before{content:"\F8D2"}.mdi-cellphone-off:before{content:"\F94F"}.mdi-cellphone-screenshot:before{content:"\FA34"}.mdi-cellphone-settings:before{content:"\F123"}.mdi-cellphone-settings-variant:before{content:"\F950"}.mdi-cellphone-sound:before{content:"\F951"}.mdi-cellphone-text:before{content:"\F8D1"}.mdi-cellphone-wireless:before{content:"\F814"}.mdi-celtic-cross:before{content:"\FCD1"}.mdi-certificate:before{content:"\F124"}.mdi-chair-school:before{content:"\F125"}.mdi-charity:before{content:"\FC2B"}.mdi-chart-arc:before{content:"\F126"}.mdi-chart-areaspline:before{content:"\F127"}.mdi-chart-bar:before{content:"\F128"}.mdi-chart-bar-stacked:before{content:"\F769"}.mdi-chart-bell-curve:before{content:"\FC2C"}.mdi-chart-bubble:before{content:"\F5E3"}.mdi-chart-donut:before{content:"\F7AE"}.mdi-chart-donut-variant:before{content:"\F7AF"}.mdi-chart-gantt:before{content:"\F66C"}.mdi-chart-histogram:before{content:"\F129"}.mdi-chart-line:before{content:"\F12A"}.mdi-chart-line-stacked:before{content:"\F76A"}.mdi-chart-line-variant:before{content:"\F7B0"}.mdi-chart-multiline:before{content:"\F8D3"}.mdi-chart-pie:before{content:"\F12B"}.mdi-chart-scatterplot-hexbin:before{content:"\F66D"}.mdi-chart-timeline:before{content:"\F66E"}.mdi-chat:before{content:"\FB55"}.mdi-chat-alert:before{content:"\FB56"}.mdi-chat-processing:before{content:"\FB57"}.mdi-check:before{content:"\F12C"}.mdi-check-all:before{content:"\F12D"}.mdi-check-box-multiple-outline:before{content:"\FC2D"}.mdi-check-box-outline:before{content:"\FC2E"}.mdi-check-circle:before{content:"\F5E0"}.mdi-check-circle-outline:before{content:"\F5E1"}.mdi-check-decagram:before{content:"\F790"}.mdi-check-network:before{content:"\FC2F"}.mdi-check-network-outline:before{content:"\FC30"}.mdi-check-outline:before{content:"\F854"}.mdi-checkbook:before{content:"\FA9C"}.mdi-checkbox-blank:before{content:"\F12E"}.mdi-checkbox-blank-circle:before{content:"\F12F"}.mdi-checkbox-blank-circle-outline:before{content:"\F130"}.mdi-checkbox-blank-outline:before{content:"\F131"}.mdi-checkbox-intermediate:before{content:"\F855"}.mdi-checkbox-marked:before{content:"\F132"}.mdi-checkbox-marked-circle:before{content:"\F133"}.mdi-checkbox-marked-circle-outline:before{content:"\F134"}.mdi-checkbox-marked-outline:before{content:"\F135"}.mdi-checkbox-multiple-blank:before{content:"\F136"}.mdi-checkbox-multiple-blank-circle:before{content:"\F63B"}.mdi-checkbox-multiple-blank-circle-outline:before{content:"\F63C"}.mdi-checkbox-multiple-blank-outline:before{content:"\F137"}.mdi-checkbox-multiple-marked:before{content:"\F138"}.mdi-checkbox-multiple-marked-circle:before{content:"\F63D"}.mdi-checkbox-multiple-marked-circle-outline:before{content:"\F63E"}.mdi-checkbox-multiple-marked-outline:before{content:"\F139"}.mdi-checkerboard:before{content:"\F13A"}.mdi-chef-hat:before{content:"\FB58"}.mdi-chemical-weapon:before{content:"\F13B"}.mdi-chess-bishop:before{content:"\F85B"}.mdi-chess-king:before{content:"\F856"}.mdi-chess-knight:before{content:"\F857"}.mdi-chess-pawn:before{content:"\F858"}.mdi-chess-queen:before{content:"\F859"}.mdi-chess-rook:before{content:"\F85A"}.mdi-chevron-double-down:before{content:"\F13C"}.mdi-chevron-double-left:before{content:"\F13D"}.mdi-chevron-double-right:before{content:"\F13E"}.mdi-chevron-double-up:before{content:"\F13F"}.mdi-chevron-down:before{content:"\F140"}.mdi-chevron-down-box:before{content:"\F9D5"}.mdi-chevron-down-box-outline:before{content:"\F9D6"}.mdi-chevron-down-circle:before{content:"\FB0B"}.mdi-chevron-down-circle-outline:before{content:"\FB0C"}.mdi-chevron-left:before{content:"\F141"}.mdi-chevron-left-box:before{content:"\F9D7"}.mdi-chevron-left-box-outline:before{content:"\F9D8"}.mdi-chevron-left-circle:before{content:"\FB0D"}.mdi-chevron-left-circle-outline:before{content:"\FB0E"}.mdi-chevron-right:before{content:"\F142"}.mdi-chevron-right-box:before{content:"\F9D9"}.mdi-chevron-right-box-outline:before{content:"\F9DA"}.mdi-chevron-right-circle:before{content:"\FB0F"}.mdi-chevron-right-circle-outline:before{content:"\FB10"}.mdi-chevron-triple-down:before{content:"\FD95"}.mdi-chevron-triple-left:before{content:"\FD96"}.mdi-chevron-triple-right:before{content:"\FD97"}.mdi-chevron-triple-up:before{content:"\FD98"}.mdi-chevron-up:before{content:"\F143"}.mdi-chevron-up-box:before{content:"\F9DB"}.mdi-chevron-up-box-outline:before{content:"\F9DC"}.mdi-chevron-up-circle:before{content:"\FB11"}.mdi-chevron-up-circle-outline:before{content:"\FB12"}.mdi-chili-hot:before{content:"\F7B1"}.mdi-chili-medium:before{content:"\F7B2"}.mdi-chili-mild:before{content:"\F7B3"}.mdi-chip:before{content:"\F61A"}.mdi-christianity:before{content:"\F952"}.mdi-christianity-outline:before{content:"\FCD2"}.mdi-church:before{content:"\F144"}.mdi-circle:before{content:"\F764"}.mdi-circle-edit-outline:before{content:"\F8D4"}.mdi-circle-medium:before{content:"\F9DD"}.mdi-circle-outline:before{content:"\F765"}.mdi-circle-slice-1:before{content:"\FA9D"}.mdi-circle-slice-2:before{content:"\FA9E"}.mdi-circle-slice-3:before{content:"\FA9F"}.mdi-circle-slice-4:before{content:"\FAA0"}.mdi-circle-slice-5:before{content:"\FAA1"}.mdi-circle-slice-6:before{content:"\FAA2"}.mdi-circle-slice-7:before{content:"\FAA3"}.mdi-circle-slice-8:before{content:"\FAA4"}.mdi-circle-small:before{content:"\F9DE"}.mdi-cisco-webex:before{content:"\F145"}.mdi-city:before{content:"\F146"}.mdi-city-variant:before{content:"\FA35"}.mdi-city-variant-outline:before{content:"\FA36"}.mdi-clipboard:before{content:"\F147"}.mdi-clipboard-account:before{content:"\F148"}.mdi-clipboard-account-outline:before{content:"\FC31"}.mdi-clipboard-alert:before{content:"\F149"}.mdi-clipboard-alert-outline:before{content:"\FCD3"}.mdi-clipboard-arrow-down:before{content:"\F14A"}.mdi-clipboard-arrow-down-outline:before{content:"\FC32"}.mdi-clipboard-arrow-left:before{content:"\F14B"}.mdi-clipboard-arrow-left-outline:before{content:"\FCD4"}.mdi-clipboard-arrow-right:before{content:"\FCD5"}.mdi-clipboard-arrow-right-outline:before{content:"\FCD6"}.mdi-clipboard-arrow-up:before{content:"\FC33"}.mdi-clipboard-arrow-up-outline:before{content:"\FC34"}.mdi-clipboard-check:before{content:"\F14C"}.mdi-clipboard-check-outline:before{content:"\F8A7"}.mdi-clipboard-flow:before{content:"\F6C7"}.mdi-clipboard-outline:before{content:"\F14D"}.mdi-clipboard-play:before{content:"\FC35"}.mdi-clipboard-play-outline:before{content:"\FC36"}.mdi-clipboard-plus:before{content:"\F750"}.mdi-clipboard-pulse:before{content:"\F85C"}.mdi-clipboard-pulse-outline:before{content:"\F85D"}.mdi-clipboard-text:before{content:"\F14E"}.mdi-clipboard-text-outline:before{content:"\FA37"}.mdi-clipboard-text-play:before{content:"\FC37"}.mdi-clipboard-text-play-outline:before{content:"\FC38"}.mdi-clippy:before{content:"\F14F"}.mdi-clock:before{content:"\F953"}.mdi-clock-alert:before{content:"\F954"}.mdi-clock-alert-outline:before{content:"\F5CE"}.mdi-clock-end:before{content:"\F151"}.mdi-clock-fast:before{content:"\F152"}.mdi-clock-in:before{content:"\F153"}.mdi-clock-out:before{content:"\F154"}.mdi-clock-outline:before{content:"\F150"}.mdi-clock-start:before{content:"\F155"}.mdi-close:before{content:"\F156"}.mdi-close-box:before{content:"\F157"}.mdi-close-box-multiple:before{content:"\FC39"}.mdi-close-box-multiple-outline:before{content:"\FC3A"}.mdi-close-box-outline:before{content:"\F158"}.mdi-close-circle:before{content:"\F159"}.mdi-close-circle-outline:before{content:"\F15A"}.mdi-close-network:before{content:"\F15B"}.mdi-close-network-outline:before{content:"\FC3B"}.mdi-close-octagon:before{content:"\F15C"}.mdi-close-octagon-outline:before{content:"\F15D"}.mdi-close-outline:before{content:"\F6C8"}.mdi-closed-caption:before{content:"\F15E"}.mdi-closed-caption-outline:before{content:"\FD99"}.mdi-cloud:before{content:"\F15F"}.mdi-cloud-alert:before{content:"\F9DF"}.mdi-cloud-braces:before{content:"\F7B4"}.mdi-cloud-check:before{content:"\F160"}.mdi-cloud-circle:before{content:"\F161"}.mdi-cloud-download:before{content:"\F162"}.mdi-cloud-download-outline:before{content:"\FB59"}.mdi-cloud-off-outline:before{content:"\F164"}.mdi-cloud-outline:before{content:"\F163"}.mdi-cloud-print:before{content:"\F165"}.mdi-cloud-print-outline:before{content:"\F166"}.mdi-cloud-question:before{content:"\FA38"}.mdi-cloud-search:before{content:"\F955"}.mdi-cloud-search-outline:before{content:"\F956"}.mdi-cloud-sync:before{content:"\F63F"}.mdi-cloud-tags:before{content:"\F7B5"}.mdi-cloud-upload:before{content:"\F167"}.mdi-cloud-upload-outline:before{content:"\FB5A"}.mdi-clover:before{content:"\F815"}.mdi-code-array:before{content:"\F168"}.mdi-code-braces:before{content:"\F169"}.mdi-code-brackets:before{content:"\F16A"}.mdi-code-equal:before{content:"\F16B"}.mdi-code-greater-than:before{content:"\F16C"}.mdi-code-greater-than-or-equal:before{content:"\F16D"}.mdi-code-less-than:before{content:"\F16E"}.mdi-code-less-than-or-equal:before{content:"\F16F"}.mdi-code-not-equal:before{content:"\F170"}.mdi-code-not-equal-variant:before{content:"\F171"}.mdi-code-parentheses:before{content:"\F172"}.mdi-code-string:before{content:"\F173"}.mdi-code-tags:before{content:"\F174"}.mdi-code-tags-check:before{content:"\F693"}.mdi-codepen:before{content:"\F175"}.mdi-coffee:before{content:"\F176"}.mdi-coffee-outline:before{content:"\F6C9"}.mdi-coffee-to-go:before{content:"\F177"}.mdi-coffin:before{content:"\FB5B"}.mdi-cogs:before{content:"\F8D5"}.mdi-coin:before{content:"\F178"}.mdi-coins:before{content:"\F694"}.mdi-collage:before{content:"\F640"}.mdi-collapse-all:before{content:"\FAA5"}.mdi-collapse-all-outline:before{content:"\FAA6"}.mdi-color-helper:before{content:"\F179"}.mdi-comment:before{content:"\F17A"}.mdi-comment-account:before{content:"\F17B"}.mdi-comment-account-outline:before{content:"\F17C"}.mdi-comment-alert:before{content:"\F17D"}.mdi-comment-alert-outline:before{content:"\F17E"}.mdi-comment-arrow-left:before{content:"\F9E0"}.mdi-comment-arrow-left-outline:before{content:"\F9E1"}.mdi-comment-arrow-right:before{content:"\F9E2"}.mdi-comment-arrow-right-outline:before{content:"\F9E3"}.mdi-comment-check:before{content:"\F17F"}.mdi-comment-check-outline:before{content:"\F180"}.mdi-comment-eye:before{content:"\FA39"}.mdi-comment-eye-outline:before{content:"\FA3A"}.mdi-comment-multiple:before{content:"\F85E"}.mdi-comment-multiple-outline:before{content:"\F181"}.mdi-comment-outline:before{content:"\F182"}.mdi-comment-plus:before{content:"\F9E4"}.mdi-comment-plus-outline:before{content:"\F183"}.mdi-comment-processing:before{content:"\F184"}.mdi-comment-processing-outline:before{content:"\F185"}.mdi-comment-question:before{content:"\F816"}.mdi-comment-question-outline:before{content:"\F186"}.mdi-comment-remove:before{content:"\F5DE"}.mdi-comment-remove-outline:before{content:"\F187"}.mdi-comment-search:before{content:"\FA3B"}.mdi-comment-search-outline:before{content:"\FA3C"}.mdi-comment-text:before{content:"\F188"}.mdi-comment-text-multiple:before{content:"\F85F"}.mdi-comment-text-multiple-outline:before{content:"\F860"}.mdi-comment-text-outline:before{content:"\F189"}.mdi-compare:before{content:"\F18A"}.mdi-compass:before{content:"\F18B"}.mdi-compass-off:before{content:"\FB5C"}.mdi-compass-off-outline:before{content:"\FB5D"}.mdi-compass-outline:before{content:"\F18C"}.mdi-console:before{content:"\F18D"}.mdi-console-line:before{content:"\F7B6"}.mdi-console-network:before{content:"\F8A8"}.mdi-console-network-outline:before{content:"\FC3C"}.mdi-contact-mail:before{content:"\F18E"}.mdi-contactless-payment:before{content:"\FD46"}.mdi-contacts:before{content:"\F6CA"}.mdi-contain:before{content:"\FA3D"}.mdi-contain-end:before{content:"\FA3E"}.mdi-contain-start:before{content:"\FA3F"}.mdi-content-copy:before{content:"\F18F"}.mdi-content-cut:before{content:"\F190"}.mdi-content-duplicate:before{content:"\F191"}.mdi-content-paste:before{content:"\F192"}.mdi-content-save:before{content:"\F193"}.mdi-content-save-all:before{content:"\F194"}.mdi-content-save-edit:before{content:"\FCD7"}.mdi-content-save-edit-outline:before{content:"\FCD8"}.mdi-content-save-outline:before{content:"\F817"}.mdi-content-save-settings:before{content:"\F61B"}.mdi-content-save-settings-outline:before{content:"\FB13"}.mdi-contrast:before{content:"\F195"}.mdi-contrast-box:before{content:"\F196"}.mdi-contrast-circle:before{content:"\F197"}.mdi-controller-classic:before{content:"\FB5E"}.mdi-controller-classic-outline:before{content:"\FB5F"}.mdi-cookie:before{content:"\F198"}.mdi-copyright:before{content:"\F5E6"}.mdi-cordova:before{content:"\F957"}.mdi-corn:before{content:"\F7B7"}.mdi-counter:before{content:"\F199"}.mdi-cow:before{content:"\F19A"}.mdi-crane:before{content:"\F861"}.mdi-creation:before{content:"\F1C9"}.mdi-creative-commons:before{content:"\FD47"}.mdi-credit-card:before{content:"\F19B"}.mdi-credit-card-marker:before{content:"\FD9A"}.mdi-credit-card-multiple:before{content:"\F19C"}.mdi-credit-card-off:before{content:"\F5E4"}.mdi-credit-card-plus:before{content:"\F675"}.mdi-credit-card-refund:before{content:"\FAA7"}.mdi-credit-card-scan:before{content:"\F19D"}.mdi-credit-card-settings:before{content:"\F8D6"}.mdi-credit-card-wireless:before{content:"\FD48"}.mdi-cricket:before{content:"\FD49"}.mdi-crop:before{content:"\F19E"}.mdi-crop-free:before{content:"\F19F"}.mdi-crop-landscape:before{content:"\F1A0"}.mdi-crop-portrait:before{content:"\F1A1"}.mdi-crop-rotate:before{content:"\F695"}.mdi-crop-square:before{content:"\F1A2"}.mdi-crosshairs:before{content:"\F1A3"}.mdi-crosshairs-gps:before{content:"\F1A4"}.mdi-crown:before{content:"\F1A5"}.mdi-cryengine:before{content:"\F958"}.mdi-crystal-ball:before{content:"\FB14"}.mdi-cube:before{content:"\F1A6"}.mdi-cube-outline:before{content:"\F1A7"}.mdi-cube-scan:before{content:"\FB60"}.mdi-cube-send:before{content:"\F1A8"}.mdi-cube-unfolded:before{content:"\F1A9"}.mdi-cup:before{content:"\F1AA"}.mdi-cup-off:before{content:"\F5E5"}.mdi-cup-water:before{content:"\F1AB"}.mdi-cupcake:before{content:"\F959"}.mdi-curling:before{content:"\F862"}.mdi-currency-bdt:before{content:"\F863"}.mdi-currency-brl:before{content:"\FB61"}.mdi-currency-btc:before{content:"\F1AC"}.mdi-currency-chf:before{content:"\F7B8"}.mdi-currency-cny:before{content:"\F7B9"}.mdi-currency-eth:before{content:"\F7BA"}.mdi-currency-eur:before{content:"\F1AD"}.mdi-currency-gbp:before{content:"\F1AE"}.mdi-currency-ils:before{content:"\FC3D"}.mdi-currency-inr:before{content:"\F1AF"}.mdi-currency-jpy:before{content:"\F7BB"}.mdi-currency-krw:before{content:"\F7BC"}.mdi-currency-kzt:before{content:"\F864"}.mdi-currency-ngn:before{content:"\F1B0"}.mdi-currency-php:before{content:"\F9E5"}.mdi-currency-rub:before{content:"\F1B1"}.mdi-currency-sign:before{content:"\F7BD"}.mdi-currency-try:before{content:"\F1B2"}.mdi-currency-twd:before{content:"\F7BE"}.mdi-currency-usd:before{content:"\F1B3"}.mdi-currency-usd-off:before{content:"\F679"}.mdi-current-ac:before{content:"\F95A"}.mdi-current-dc:before{content:"\F95B"}.mdi-cursor-default:before{content:"\F1B4"}.mdi-cursor-default-click:before{content:"\FCD9"}.mdi-cursor-default-click-outline:before{content:"\FCDA"}.mdi-cursor-default-outline:before{content:"\F1B5"}.mdi-cursor-move:before{content:"\F1B6"}.mdi-cursor-pointer:before{content:"\F1B7"}.mdi-cursor-text:before{content:"\F5E7"}.mdi-database:before{content:"\F1B8"}.mdi-database-check:before{content:"\FAA8"}.mdi-database-edit:before{content:"\FB62"}.mdi-database-export:before{content:"\F95D"}.mdi-database-import:before{content:"\F95C"}.mdi-database-lock:before{content:"\FAA9"}.mdi-database-minus:before{content:"\F1B9"}.mdi-database-plus:before{content:"\F1BA"}.mdi-database-refresh:before{content:"\FCDB"}.mdi-database-remove:before{content:"\FCDC"}.mdi-database-search:before{content:"\F865"}.mdi-database-settings:before{content:"\FCDD"}.mdi-death-star:before{content:"\F8D7"}.mdi-death-star-variant:before{content:"\F8D8"}.mdi-deathly-hallows:before{content:"\FB63"}.mdi-debian:before{content:"\F8D9"}.mdi-debug-step-into:before{content:"\F1BB"}.mdi-debug-step-out:before{content:"\F1BC"}.mdi-debug-step-over:before{content:"\F1BD"}.mdi-decagram:before{content:"\F76B"}.mdi-decagram-outline:before{content:"\F76C"}.mdi-decimal-decrease:before{content:"\F1BE"}.mdi-decimal-increase:before{content:"\F1BF"}.mdi-delete:before{content:"\F1C0"}.mdi-delete-circle:before{content:"\F682"}.mdi-delete-circle-outline:before{content:"\FB64"}.mdi-delete-empty:before{content:"\F6CB"}.mdi-delete-forever:before{content:"\F5E8"}.mdi-delete-forever-outline:before{content:"\FB65"}.mdi-delete-outline:before{content:"\F9E6"}.mdi-delete-restore:before{content:"\F818"}.mdi-delete-sweep:before{content:"\F5E9"}.mdi-delete-sweep-outline:before{content:"\FC3E"}.mdi-delete-variant:before{content:"\F1C1"}.mdi-delta:before{content:"\F1C2"}.mdi-desk-lamp:before{content:"\F95E"}.mdi-deskphone:before{content:"\F1C3"}.mdi-desktop-classic:before{content:"\F7BF"}.mdi-desktop-mac:before{content:"\F1C4"}.mdi-desktop-mac-dashboard:before{content:"\F9E7"}.mdi-desktop-tower:before{content:"\F1C5"}.mdi-desktop-tower-monitor:before{content:"\FAAA"}.mdi-details:before{content:"\F1C6"}.mdi-dev-to:before{content:"\FD4A"}.mdi-developer-board:before{content:"\F696"}.mdi-deviantart:before{content:"\F1C7"}.mdi-dialpad:before{content:"\F61C"}.mdi-diameter:before{content:"\FC3F"}.mdi-diameter-outline:before{content:"\FC40"}.mdi-diameter-variant:before{content:"\FC41"}.mdi-diamond:before{content:"\FB66"}.mdi-diamond-outline:before{content:"\FB67"}.mdi-diamond-stone:before{content:"\F1C8"}.mdi-dice-1:before{content:"\F1CA"}.mdi-dice-2:before{content:"\F1CB"}.mdi-dice-3:before{content:"\F1CC"}.mdi-dice-4:before{content:"\F1CD"}.mdi-dice-5:before{content:"\F1CE"}.mdi-dice-6:before{content:"\F1CF"}.mdi-dice-d10:before{content:"\F76E"}.mdi-dice-d12:before{content:"\F866"}.mdi-dice-d20:before{content:"\F5EA"}.mdi-dice-d4:before{content:"\F5EB"}.mdi-dice-d6:before{content:"\F5EC"}.mdi-dice-d8:before{content:"\F5ED"}.mdi-dice-multiple:before{content:"\F76D"}.mdi-dictionary:before{content:"\F61D"}.mdi-dip-switch:before{content:"\F7C0"}.mdi-directions:before{content:"\F1D0"}.mdi-directions-fork:before{content:"\F641"}.mdi-disc:before{content:"\F5EE"}.mdi-disc-alert:before{content:"\F1D1"}.mdi-disc-player:before{content:"\F95F"}.mdi-discord:before{content:"\F66F"}.mdi-dishwasher:before{content:"\FAAB"}.mdi-disqus:before{content:"\F1D2"}.mdi-disqus-outline:before{content:"\F1D3"}.mdi-diving-flippers:before{content:"\FD9B"}.mdi-diving-helmet:before{content:"\FD9C"}.mdi-diving-scuba:before{content:"\FD9D"}.mdi-diving-scuba-flag:before{content:"\FD9E"}.mdi-diving-scuba-tank:before{content:"\FD9F"}.mdi-diving-scuba-tank-multiple:before{content:"\FDA0"}.mdi-diving-snorkel:before{content:"\FDA1"}.mdi-division:before{content:"\F1D4"}.mdi-division-box:before{content:"\F1D5"}.mdi-dlna:before{content:"\FA40"}.mdi-dna:before{content:"\F683"}.mdi-dns:before{content:"\F1D6"}.mdi-dns-outline:before{content:"\FB68"}.mdi-do-not-disturb:before{content:"\F697"}.mdi-do-not-disturb-off:before{content:"\F698"}.mdi-docker:before{content:"\F867"}.mdi-doctor:before{content:"\FA41"}.mdi-dog:before{content:"\FA42"}.mdi-dog-service:before{content:"\FAAC"}.mdi-dog-side:before{content:"\FA43"}.mdi-dolby:before{content:"\F6B2"}.mdi-domain:before{content:"\F1D7"}.mdi-domain-off:before{content:"\FD4B"}.mdi-donkey:before{content:"\F7C1"}.mdi-door:before{content:"\F819"}.mdi-door-closed:before{content:"\F81A"}.mdi-door-open:before{content:"\F81B"}.mdi-doorbell-video:before{content:"\F868"}.mdi-dot-net:before{content:"\FAAD"}.mdi-dots-horizontal:before{content:"\F1D8"}.mdi-dots-horizontal-circle:before{content:"\F7C2"}.mdi-dots-horizontal-circle-outline:before{content:"\FB69"}.mdi-dots-vertical:before{content:"\F1D9"}.mdi-dots-vertical-circle:before{content:"\F7C3"}.mdi-dots-vertical-circle-outline:before{content:"\FB6A"}.mdi-douban:before{content:"\F699"}.mdi-download:before{content:"\F1DA"}.mdi-download-multiple:before{content:"\F9E8"}.mdi-download-network:before{content:"\F6F3"}.mdi-download-network-outline:before{content:"\FC42"}.mdi-download-outline:before{content:"\FB6B"}.mdi-drag:before{content:"\F1DB"}.mdi-drag-horizontal:before{content:"\F1DC"}.mdi-drag-variant:before{content:"\FB6C"}.mdi-drag-vertical:before{content:"\F1DD"}.mdi-drama-masks:before{content:"\FCDE"}.mdi-drawing:before{content:"\F1DE"}.mdi-drawing-box:before{content:"\F1DF"}.mdi-dribbble:before{content:"\F1E0"}.mdi-dribbble-box:before{content:"\F1E1"}.mdi-drone:before{content:"\F1E2"}.mdi-dropbox:before{content:"\F1E3"}.mdi-drupal:before{content:"\F1E4"}.mdi-duck:before{content:"\F1E5"}.mdi-dumbbell:before{content:"\F1E6"}.mdi-dump-truck:before{content:"\FC43"}.mdi-ear-hearing:before{content:"\F7C4"}.mdi-ear-hearing-off:before{content:"\FA44"}.mdi-earth:before{content:"\F1E7"}.mdi-earth-box:before{content:"\F6CC"}.mdi-earth-box-off:before{content:"\F6CD"}.mdi-earth-off:before{content:"\F1E8"}.mdi-edge:before{content:"\F1E9"}.mdi-egg:before{content:"\FAAE"}.mdi-egg-easter:before{content:"\FAAF"}.mdi-eight-track:before{content:"\F9E9"}.mdi-eject:before{content:"\F1EA"}.mdi-eject-outline:before{content:"\FB6D"}.mdi-elephant:before{content:"\F7C5"}.mdi-elevation-decline:before{content:"\F1EB"}.mdi-elevation-rise:before{content:"\F1EC"}.mdi-elevator:before{content:"\F1ED"}.mdi-email:before{content:"\F1EE"}.mdi-email-alert:before{content:"\F6CE"}.mdi-email-box:before{content:"\FCDF"}.mdi-email-check:before{content:"\FAB0"}.mdi-email-check-outline:before{content:"\FAB1"}.mdi-email-lock:before{content:"\F1F1"}.mdi-email-mark-as-unread:before{content:"\FB6E"}.mdi-email-open:before{content:"\F1EF"}.mdi-email-open-outline:before{content:"\F5EF"}.mdi-email-outline:before{content:"\F1F0"}.mdi-email-plus:before{content:"\F9EA"}.mdi-email-plus-outline:before{content:"\F9EB"}.mdi-email-search:before{content:"\F960"}.mdi-email-search-outline:before{content:"\F961"}.mdi-email-variant:before{content:"\F5F0"}.mdi-ember:before{content:"\FB15"}.mdi-emby:before{content:"\F6B3"}.mdi-emoticon:before{content:"\FC44"}.mdi-emoticon-angry:before{content:"\FC45"}.mdi-emoticon-angry-outline:before{content:"\FC46"}.mdi-emoticon-cool:before{content:"\FC47"}.mdi-emoticon-cool-outline:before{content:"\F1F3"}.mdi-emoticon-cry:before{content:"\FC48"}.mdi-emoticon-cry-outline:before{content:"\FC49"}.mdi-emoticon-dead:before{content:"\FC4A"}.mdi-emoticon-dead-outline:before{content:"\F69A"}.mdi-emoticon-devil:before{content:"\FC4B"}.mdi-emoticon-devil-outline:before{content:"\F1F4"}.mdi-emoticon-excited:before{content:"\FC4C"}.mdi-emoticon-excited-outline:before{content:"\F69B"}.mdi-emoticon-happy:before{content:"\FC4D"}.mdi-emoticon-happy-outline:before{content:"\F1F5"}.mdi-emoticon-kiss:before{content:"\FC4E"}.mdi-emoticon-kiss-outline:before{content:"\FC4F"}.mdi-emoticon-neutral:before{content:"\FC50"}.mdi-emoticon-neutral-outline:before{content:"\F1F6"}.mdi-emoticon-outline:before{content:"\F1F2"}.mdi-emoticon-poop:before{content:"\F1F7"}.mdi-emoticon-poop-outline:before{content:"\FC51"}.mdi-emoticon-sad:before{content:"\FC52"}.mdi-emoticon-sad-outline:before{content:"\F1F8"}.mdi-emoticon-tongue:before{content:"\F1F9"}.mdi-emoticon-tongue-outline:before{content:"\FC53"}.mdi-emoticon-wink:before{content:"\FC54"}.mdi-emoticon-wink-outline:before{content:"\FC55"}.mdi-engine:before{content:"\F1FA"}.mdi-engine-off:before{content:"\FA45"}.mdi-engine-off-outline:before{content:"\FA46"}.mdi-engine-outline:before{content:"\F1FB"}.mdi-equal:before{content:"\F1FC"}.mdi-equal-box:before{content:"\F1FD"}.mdi-eraser:before{content:"\F1FE"}.mdi-eraser-variant:before{content:"\F642"}.mdi-escalator:before{content:"\F1FF"}.mdi-eslint:before{content:"\FC56"}.mdi-et:before{content:"\FAB2"}.mdi-ethereum:before{content:"\F869"}.mdi-ethernet:before{content:"\F200"}.mdi-ethernet-cable:before{content:"\F201"}.mdi-ethernet-cable-off:before{content:"\F202"}.mdi-etsy:before{content:"\F203"}.mdi-ev-station:before{content:"\F5F1"}.mdi-eventbrite:before{content:"\F7C6"}.mdi-evernote:before{content:"\F204"}.mdi-exclamation:before{content:"\F205"}.mdi-exit-run:before{content:"\FA47"}.mdi-exit-to-app:before{content:"\F206"}.mdi-expand-all:before{content:"\FAB3"}.mdi-expand-all-outline:before{content:"\FAB4"}.mdi-exponent:before{content:"\F962"}.mdi-exponent-box:before{content:"\F963"}.mdi-export:before{content:"\F207"}.mdi-export-variant:before{content:"\FB6F"}.mdi-eye:before{content:"\F208"}.mdi-eye-check:before{content:"\FCE0"}.mdi-eye-check-outline:before{content:"\FCE1"}.mdi-eye-circle:before{content:"\FB70"}.mdi-eye-circle-outline:before{content:"\FB71"}.mdi-eye-off:before{content:"\F209"}.mdi-eye-off-outline:before{content:"\F6D0"}.mdi-eye-outline:before{content:"\F6CF"}.mdi-eye-plus:before{content:"\F86A"}.mdi-eye-plus-outline:before{content:"\F86B"}.mdi-eye-settings:before{content:"\F86C"}.mdi-eye-settings-outline:before{content:"\F86D"}.mdi-eyedropper:before{content:"\F20A"}.mdi-eyedropper-variant:before{content:"\F20B"}.mdi-face:before{content:"\F643"}.mdi-face-agent:before{content:"\FD4C"}.mdi-face-outline:before{content:"\FB72"}.mdi-face-profile:before{content:"\F644"}.mdi-face-recognition:before{content:"\FC57"}.mdi-facebook:before{content:"\F20C"}.mdi-facebook-box:before{content:"\F20D"}.mdi-facebook-messenger:before{content:"\F20E"}.mdi-facebook-workplace:before{content:"\FB16"}.mdi-factory:before{content:"\F20F"}.mdi-fan:before{content:"\F210"}.mdi-fan-off:before{content:"\F81C"}.mdi-fast-forward:before{content:"\F211"}.mdi-fast-forward-10:before{content:"\FD4D"}.mdi-fast-forward-30:before{content:"\FCE2"}.mdi-fast-forward-outline:before{content:"\F6D1"}.mdi-fax:before{content:"\F212"}.mdi-feather:before{content:"\F6D2"}.mdi-feature-search:before{content:"\FA48"}.mdi-feature-search-outline:before{content:"\FA49"}.mdi-fedora:before{content:"\F8DA"}.mdi-ferry:before{content:"\F213"}.mdi-file:before{content:"\F214"}.mdi-file-account:before{content:"\F73A"}.mdi-file-alert:before{content:"\FA4A"}.mdi-file-alert-outline:before{content:"\FA4B"}.mdi-file-cabinet:before{content:"\FAB5"}.mdi-file-cancel:before{content:"\FDA2"}.mdi-file-cancel-outline:before{content:"\FDA3"}.mdi-file-chart:before{content:"\F215"}.mdi-file-check:before{content:"\F216"}.mdi-file-cloud:before{content:"\F217"}.mdi-file-compare:before{content:"\F8A9"}.mdi-file-delimited:before{content:"\F218"}.mdi-file-document:before{content:"\F219"}.mdi-file-document-box:before{content:"\F21A"}.mdi-file-document-box-multiple:before{content:"\FAB6"}.mdi-file-document-box-multiple-outline:before{content:"\FAB7"}.mdi-file-document-box-outline:before{content:"\F9EC"}.mdi-file-document-edit:before{content:"\FDA4"}.mdi-file-document-edit-outline:before{content:"\FDA5"}.mdi-file-document-outline:before{content:"\F9ED"}.mdi-file-download:before{content:"\F964"}.mdi-file-download-outline:before{content:"\F965"}.mdi-file-excel:before{content:"\F21B"}.mdi-file-excel-box:before{content:"\F21C"}.mdi-file-export:before{content:"\F21D"}.mdi-file-eye:before{content:"\FDA6"}.mdi-file-eye-outline:before{content:"\FDA7"}.mdi-file-find:before{content:"\F21E"}.mdi-file-find-outline:before{content:"\FB73"}.mdi-file-hidden:before{content:"\F613"}.mdi-file-image:before{content:"\F21F"}.mdi-file-import:before{content:"\F220"}.mdi-file-lock:before{content:"\F221"}.mdi-file-move:before{content:"\FAB8"}.mdi-file-multiple:before{content:"\F222"}.mdi-file-music:before{content:"\F223"}.mdi-file-outline:before{content:"\F224"}.mdi-file-pdf:before{content:"\F225"}.mdi-file-pdf-box:before{content:"\F226"}.mdi-file-percent:before{content:"\F81D"}.mdi-file-plus:before{content:"\F751"}.mdi-file-powerpoint:before{content:"\F227"}.mdi-file-powerpoint-box:before{content:"\F228"}.mdi-file-presentation-box:before{content:"\F229"}.mdi-file-question:before{content:"\F86E"}.mdi-file-remove:before{content:"\FB74"}.mdi-file-replace:before{content:"\FB17"}.mdi-file-replace-outline:before{content:"\FB18"}.mdi-file-restore:before{content:"\F670"}.mdi-file-search:before{content:"\FC58"}.mdi-file-search-outline:before{content:"\FC59"}.mdi-file-send:before{content:"\F22A"}.mdi-file-table:before{content:"\FC5A"}.mdi-file-table-outline:before{content:"\FC5B"}.mdi-file-tree:before{content:"\F645"}.mdi-file-undo:before{content:"\F8DB"}.mdi-file-upload:before{content:"\FA4C"}.mdi-file-upload-outline:before{content:"\FA4D"}.mdi-file-video:before{content:"\F22B"}.mdi-file-word:before{content:"\F22C"}.mdi-file-word-box:before{content:"\F22D"}.mdi-file-xml:before{content:"\F22E"}.mdi-film:before{content:"\F22F"}.mdi-filmstrip:before{content:"\F230"}.mdi-filmstrip-off:before{content:"\F231"}.mdi-filter:before{content:"\F232"}.mdi-filter-outline:before{content:"\F233"}.mdi-filter-remove:before{content:"\F234"}.mdi-filter-remove-outline:before{content:"\F235"}.mdi-filter-variant:before{content:"\F236"}.mdi-finance:before{content:"\F81E"}.mdi-find-replace:before{content:"\F6D3"}.mdi-fingerprint:before{content:"\F237"}.mdi-fire:before{content:"\F238"}.mdi-fire-truck:before{content:"\F8AA"}.mdi-firebase:before{content:"\F966"}.mdi-firefox:before{content:"\F239"}.mdi-fish:before{content:"\F23A"}.mdi-flag:before{content:"\F23B"}.mdi-flag-checkered:before{content:"\F23C"}.mdi-flag-minus:before{content:"\FB75"}.mdi-flag-outline:before{content:"\F23D"}.mdi-flag-plus:before{content:"\FB76"}.mdi-flag-remove:before{content:"\FB77"}.mdi-flag-triangle:before{content:"\F23F"}.mdi-flag-variant:before{content:"\F240"}.mdi-flag-variant-outline:before{content:"\F23E"}.mdi-flare:before{content:"\FD4E"}.mdi-flash:before{content:"\F241"}.mdi-flash-auto:before{content:"\F242"}.mdi-flash-circle:before{content:"\F81F"}.mdi-flash-off:before{content:"\F243"}.mdi-flash-outline:before{content:"\F6D4"}.mdi-flash-red-eye:before{content:"\F67A"}.mdi-flashlight:before{content:"\F244"}.mdi-flashlight-off:before{content:"\F245"}.mdi-flask:before{content:"\F093"}.mdi-flask-empty:before{content:"\F094"}.mdi-flask-empty-outline:before{content:"\F095"}.mdi-flask-outline:before{content:"\F096"}.mdi-flattr:before{content:"\F246"}.mdi-flickr:before{content:"\FCE3"}.mdi-flip-to-back:before{content:"\F247"}.mdi-flip-to-front:before{content:"\F248"}.mdi-floor-lamp:before{content:"\F8DC"}.mdi-floor-plan:before{content:"\F820"}.mdi-floppy:before{content:"\F249"}.mdi-floppy-variant:before{content:"\F9EE"}.mdi-flower:before{content:"\F24A"}.mdi-flower-outline:before{content:"\F9EF"}.mdi-flower-poppy:before{content:"\FCE4"}.mdi-flower-tulip:before{content:"\F9F0"}.mdi-flower-tulip-outline:before{content:"\F9F1"}.mdi-folder:before{content:"\F24B"}.mdi-folder-account:before{content:"\F24C"}.mdi-folder-account-outline:before{content:"\FB78"}.mdi-folder-alert:before{content:"\FDA8"}.mdi-folder-alert-outline:before{content:"\FDA9"}.mdi-folder-clock:before{content:"\FAB9"}.mdi-folder-clock-outline:before{content:"\FABA"}.mdi-folder-download:before{content:"\F24D"}.mdi-folder-edit:before{content:"\F8DD"}.mdi-folder-edit-outline:before{content:"\FDAA"}.mdi-folder-google-drive:before{content:"\F24E"}.mdi-folder-image:before{content:"\F24F"}.mdi-folder-key:before{content:"\F8AB"}.mdi-folder-key-network:before{content:"\F8AC"}.mdi-folder-key-network-outline:before{content:"\FC5C"}.mdi-folder-lock:before{content:"\F250"}.mdi-folder-lock-open:before{content:"\F251"}.mdi-folder-move:before{content:"\F252"}.mdi-folder-multiple:before{content:"\F253"}.mdi-folder-multiple-image:before{content:"\F254"}.mdi-folder-multiple-outline:before{content:"\F255"}.mdi-folder-network:before{content:"\F86F"}.mdi-folder-network-outline:before{content:"\FC5D"}.mdi-folder-open:before{content:"\F76F"}.mdi-folder-open-outline:before{content:"\FDAB"}.mdi-folder-outline:before{content:"\F256"}.mdi-folder-plus:before{content:"\F257"}.mdi-folder-plus-outline:before{content:"\FB79"}.mdi-folder-pound:before{content:"\FCE5"}.mdi-folder-pound-outline:before{content:"\FCE6"}.mdi-folder-remove:before{content:"\F258"}.mdi-folder-remove-outline:before{content:"\FB7A"}.mdi-folder-search:before{content:"\F967"}.mdi-folder-search-outline:before{content:"\F968"}.mdi-folder-star:before{content:"\F69C"}.mdi-folder-star-outline:before{content:"\FB7B"}.mdi-folder-sync:before{content:"\FCE7"}.mdi-folder-sync-outline:before{content:"\FCE8"}.mdi-folder-text:before{content:"\FC5E"}.mdi-folder-text-outline:before{content:"\FC5F"}.mdi-folder-upload:before{content:"\F259"}.mdi-font-awesome:before{content:"\F03A"}.mdi-food:before{content:"\F25A"}.mdi-food-apple:before{content:"\F25B"}.mdi-food-apple-outline:before{content:"\FC60"}.mdi-food-croissant:before{content:"\F7C7"}.mdi-food-fork-drink:before{content:"\F5F2"}.mdi-food-off:before{content:"\F5F3"}.mdi-food-variant:before{content:"\F25C"}.mdi-football:before{content:"\F25D"}.mdi-football-australian:before{content:"\F25E"}.mdi-football-helmet:before{content:"\F25F"}.mdi-forklift:before{content:"\F7C8"}.mdi-format-align-bottom:before{content:"\F752"}.mdi-format-align-center:before{content:"\F260"}.mdi-format-align-justify:before{content:"\F261"}.mdi-format-align-left:before{content:"\F262"}.mdi-format-align-middle:before{content:"\F753"}.mdi-format-align-right:before{content:"\F263"}.mdi-format-align-top:before{content:"\F754"}.mdi-format-annotation-minus:before{content:"\FABB"}.mdi-format-annotation-plus:before{content:"\F646"}.mdi-format-bold:before{content:"\F264"}.mdi-format-clear:before{content:"\F265"}.mdi-format-color-fill:before{content:"\F266"}.mdi-format-color-text:before{content:"\F69D"}.mdi-format-columns:before{content:"\F8DE"}.mdi-format-float-center:before{content:"\F267"}.mdi-format-float-left:before{content:"\F268"}.mdi-format-float-none:before{content:"\F269"}.mdi-format-float-right:before{content:"\F26A"}.mdi-format-font:before{content:"\F6D5"}.mdi-format-font-size-decrease:before{content:"\F9F2"}.mdi-format-font-size-increase:before{content:"\F9F3"}.mdi-format-header-1:before{content:"\F26B"}.mdi-format-header-2:before{content:"\F26C"}.mdi-format-header-3:before{content:"\F26D"}.mdi-format-header-4:before{content:"\F26E"}.mdi-format-header-5:before{content:"\F26F"}.mdi-format-header-6:before{content:"\F270"}.mdi-format-header-decrease:before{content:"\F271"}.mdi-format-header-equal:before{content:"\F272"}.mdi-format-header-increase:before{content:"\F273"}.mdi-format-header-pound:before{content:"\F274"}.mdi-format-horizontal-align-center:before{content:"\F61E"}.mdi-format-horizontal-align-left:before{content:"\F61F"}.mdi-format-horizontal-align-right:before{content:"\F620"}.mdi-format-indent-decrease:before{content:"\F275"}.mdi-format-indent-increase:before{content:"\F276"}.mdi-format-italic:before{content:"\F277"}.mdi-format-letter-case:before{content:"\FB19"}.mdi-format-letter-case-lower:before{content:"\FB1A"}.mdi-format-letter-case-upper:before{content:"\FB1B"}.mdi-format-line-spacing:before{content:"\F278"}.mdi-format-line-style:before{content:"\F5C8"}.mdi-format-line-weight:before{content:"\F5C9"}.mdi-format-list-bulleted:before{content:"\F279"}.mdi-format-list-bulleted-square:before{content:"\FDAC"}.mdi-format-list-bulleted-type:before{content:"\F27A"}.mdi-format-list-checkbox:before{content:"\F969"}.mdi-format-list-checks:before{content:"\F755"}.mdi-format-list-numbered:before{content:"\F27B"}.mdi-format-list-numbered-rtl:before{content:"\FCE9"}.mdi-format-page-break:before{content:"\F6D6"}.mdi-format-paint:before{content:"\F27C"}.mdi-format-paragraph:before{content:"\F27D"}.mdi-format-pilcrow:before{content:"\F6D7"}.mdi-format-quote-close:before{content:"\F27E"}.mdi-format-quote-open:before{content:"\F756"}.mdi-format-rotate-90:before{content:"\F6A9"}.mdi-format-section:before{content:"\F69E"}.mdi-format-size:before{content:"\F27F"}.mdi-format-strikethrough:before{content:"\F280"}.mdi-format-strikethrough-variant:before{content:"\F281"}.mdi-format-subscript:before{content:"\F282"}.mdi-format-superscript:before{content:"\F283"}.mdi-format-text:before{content:"\F284"}.mdi-format-text-rotation-down:before{content:"\FD4F"}.mdi-format-text-rotation-none:before{content:"\FD50"}.mdi-format-text-wrapping-clip:before{content:"\FCEA"}.mdi-format-text-wrapping-overflow:before{content:"\FCEB"}.mdi-format-text-wrapping-wrap:before{content:"\FCEC"}.mdi-format-textbox:before{content:"\FCED"}.mdi-format-textdirection-l-to-r:before{content:"\F285"}.mdi-format-textdirection-r-to-l:before{content:"\F286"}.mdi-format-title:before{content:"\F5F4"}.mdi-format-underline:before{content:"\F287"}.mdi-format-vertical-align-bottom:before{content:"\F621"}.mdi-format-vertical-align-center:before{content:"\F622"}.mdi-format-vertical-align-top:before{content:"\F623"}.mdi-format-wrap-inline:before{content:"\F288"}.mdi-format-wrap-square:before{content:"\F289"}.mdi-format-wrap-tight:before{content:"\F28A"}.mdi-format-wrap-top-bottom:before{content:"\F28B"}.mdi-forum:before{content:"\F28C"}.mdi-forum-outline:before{content:"\F821"}.mdi-forward:before{content:"\F28D"}.mdi-forwardburger:before{content:"\FD51"}.mdi-fountain:before{content:"\F96A"}.mdi-fountain-pen:before{content:"\FCEE"}.mdi-fountain-pen-tip:before{content:"\FCEF"}.mdi-foursquare:before{content:"\F28E"}.mdi-freebsd:before{content:"\F8DF"}.mdi-fridge:before{content:"\F290"}.mdi-fridge-bottom:before{content:"\F292"}.mdi-fridge-outline:before{content:"\F28F"}.mdi-fridge-top:before{content:"\F291"}.mdi-fuel:before{content:"\F7C9"}.mdi-fullscreen:before{content:"\F293"}.mdi-fullscreen-exit:before{content:"\F294"}.mdi-function:before{content:"\F295"}.mdi-function-variant:before{content:"\F870"}.mdi-fuse:before{content:"\FC61"}.mdi-fuse-blade:before{content:"\FC62"}.mdi-gamepad:before{content:"\F296"}.mdi-gamepad-variant:before{content:"\F297"}.mdi-gantry-crane:before{content:"\FDAD"}.mdi-garage:before{content:"\F6D8"}.mdi-garage-alert:before{content:"\F871"}.mdi-garage-open:before{content:"\F6D9"}.mdi-gas-cylinder:before{content:"\F647"}.mdi-gas-station:before{content:"\F298"}.mdi-gate:before{content:"\F299"}.mdi-gate-and:before{content:"\F8E0"}.mdi-gate-nand:before{content:"\F8E1"}.mdi-gate-nor:before{content:"\F8E2"}.mdi-gate-not:before{content:"\F8E3"}.mdi-gate-or:before{content:"\F8E4"}.mdi-gate-xnor:before{content:"\F8E5"}.mdi-gate-xor:before{content:"\F8E6"}.mdi-gauge:before{content:"\F29A"}.mdi-gauge-empty:before{content:"\F872"}.mdi-gauge-full:before{content:"\F873"}.mdi-gauge-low:before{content:"\F874"}.mdi-gavel:before{content:"\F29B"}.mdi-gender-female:before{content:"\F29C"}.mdi-gender-male:before{content:"\F29D"}.mdi-gender-male-female:before{content:"\F29E"}.mdi-gender-transgender:before{content:"\F29F"}.mdi-gentoo:before{content:"\F8E7"}.mdi-gesture:before{content:"\F7CA"}.mdi-gesture-double-tap:before{content:"\F73B"}.mdi-gesture-pinch:before{content:"\FABC"}.mdi-gesture-spread:before{content:"\FABD"}.mdi-gesture-swipe:before{content:"\FD52"}.mdi-gesture-swipe-down:before{content:"\F73C"}.mdi-gesture-swipe-horizontal:before{content:"\FABE"}.mdi-gesture-swipe-left:before{content:"\F73D"}.mdi-gesture-swipe-right:before{content:"\F73E"}.mdi-gesture-swipe-up:before{content:"\F73F"}.mdi-gesture-swipe-vertical:before{content:"\FABF"}.mdi-gesture-tap:before{content:"\F740"}.mdi-gesture-tap-hold:before{content:"\FD53"}.mdi-gesture-two-double-tap:before{content:"\F741"}.mdi-gesture-two-tap:before{content:"\F742"}.mdi-ghost:before{content:"\F2A0"}.mdi-ghost-off:before{content:"\F9F4"}.mdi-gif:before{content:"\FD54"}.mdi-gift:before{content:"\F2A1"}.mdi-git:before{content:"\F2A2"}.mdi-github-box:before{content:"\F2A3"}.mdi-github-circle:before{content:"\F2A4"}.mdi-github-face:before{content:"\F6DA"}.mdi-gitlab:before{content:"\FB7C"}.mdi-glass-cocktail:before{content:"\F356"}.mdi-glass-flute:before{content:"\F2A5"}.mdi-glass-mug:before{content:"\F2A6"}.mdi-glass-stange:before{content:"\F2A7"}.mdi-glass-tulip:before{content:"\F2A8"}.mdi-glass-wine:before{content:"\F875"}.mdi-glassdoor:before{content:"\F2A9"}.mdi-glasses:before{content:"\F2AA"}.mdi-globe-model:before{content:"\F8E8"}.mdi-gmail:before{content:"\F2AB"}.mdi-gnome:before{content:"\F2AC"}.mdi-go-kart:before{content:"\FD55"}.mdi-go-kart-track:before{content:"\FD56"}.mdi-gog:before{content:"\FB7D"}.mdi-golf:before{content:"\F822"}.mdi-gondola:before{content:"\F685"}.mdi-goodreads:before{content:"\FD57"}.mdi-google:before{content:"\F2AD"}.mdi-google-adwords:before{content:"\FC63"}.mdi-google-allo:before{content:"\F801"}.mdi-google-analytics:before{content:"\F7CB"}.mdi-google-assistant:before{content:"\F7CC"}.mdi-google-cardboard:before{content:"\F2AE"}.mdi-google-chrome:before{content:"\F2AF"}.mdi-google-circles:before{content:"\F2B0"}.mdi-google-circles-communities:before{content:"\F2B1"}.mdi-google-circles-extended:before{content:"\F2B2"}.mdi-google-circles-group:before{content:"\F2B3"}.mdi-google-classroom:before{content:"\F2C0"}.mdi-google-controller:before{content:"\F2B4"}.mdi-google-controller-off:before{content:"\F2B5"}.mdi-google-drive:before{content:"\F2B6"}.mdi-google-earth:before{content:"\F2B7"}.mdi-google-fit:before{content:"\F96B"}.mdi-google-glass:before{content:"\F2B8"}.mdi-google-hangouts:before{content:"\F2C9"}.mdi-google-home:before{content:"\F823"}.mdi-google-keep:before{content:"\F6DB"}.mdi-google-lens:before{content:"\F9F5"}.mdi-google-maps:before{content:"\F5F5"}.mdi-google-nearby:before{content:"\F2B9"}.mdi-google-pages:before{content:"\F2BA"}.mdi-google-photos:before{content:"\F6DC"}.mdi-google-physical-web:before{content:"\F2BB"}.mdi-google-play:before{content:"\F2BC"}.mdi-google-plus:before{content:"\F2BD"}.mdi-google-plus-box:before{content:"\F2BE"}.mdi-google-spreadsheet:before{content:"\F9F6"}.mdi-google-street-view:before{content:"\FC64"}.mdi-google-translate:before{content:"\F2BF"}.mdi-gpu:before{content:"\F8AD"}.mdi-gradient:before{content:"\F69F"}.mdi-grain:before{content:"\FD58"}.mdi-graphql:before{content:"\F876"}.mdi-grave-stone:before{content:"\FB7E"}.mdi-grease-pencil:before{content:"\F648"}.mdi-greater-than:before{content:"\F96C"}.mdi-greater-than-or-equal:before{content:"\F96D"}.mdi-grid:before{content:"\F2C1"}.mdi-grid-large:before{content:"\F757"}.mdi-grid-off:before{content:"\F2C2"}.mdi-group:before{content:"\F2C3"}.mdi-guitar-acoustic:before{content:"\F770"}.mdi-guitar-electric:before{content:"\F2C4"}.mdi-guitar-pick:before{content:"\F2C5"}.mdi-guitar-pick-outline:before{content:"\F2C6"}.mdi-guy-fawkes-mask:before{content:"\F824"}.mdi-hackernews:before{content:"\F624"}.mdi-hail:before{content:"\FAC0"}.mdi-halloween:before{content:"\FB7F"}.mdi-hamburger:before{content:"\F684"}.mdi-hammer:before{content:"\F8E9"}.mdi-hand:before{content:"\FA4E"}.mdi-hand-okay:before{content:"\FA4F"}.mdi-hand-peace:before{content:"\FA50"}.mdi-hand-peace-variant:before{content:"\FA51"}.mdi-hand-pointing-down:before{content:"\FA52"}.mdi-hand-pointing-left:before{content:"\FA53"}.mdi-hand-pointing-right:before{content:"\F2C7"}.mdi-hand-pointing-up:before{content:"\FA54"}.mdi-hanger:before{content:"\F2C8"}.mdi-hard-hat:before{content:"\F96E"}.mdi-harddisk:before{content:"\F2CA"}.mdi-hat-fedora:before{content:"\FB80"}.mdi-hazard-lights:before{content:"\FC65"}.mdi-hdr:before{content:"\FD59"}.mdi-hdr-off:before{content:"\FD5A"}.mdi-headphones:before{content:"\F2CB"}.mdi-headphones-bluetooth:before{content:"\F96F"}.mdi-headphones-box:before{content:"\F2CC"}.mdi-headphones-off:before{content:"\F7CD"}.mdi-headphones-settings:before{content:"\F2CD"}.mdi-headset:before{content:"\F2CE"}.mdi-headset-dock:before{content:"\F2CF"}.mdi-headset-off:before{content:"\F2D0"}.mdi-heart:before{content:"\F2D1"}.mdi-heart-box:before{content:"\F2D2"}.mdi-heart-box-outline:before{content:"\F2D3"}.mdi-heart-broken:before{content:"\F2D4"}.mdi-heart-broken-outline:before{content:"\FCF0"}.mdi-heart-circle:before{content:"\F970"}.mdi-heart-circle-outline:before{content:"\F971"}.mdi-heart-half:before{content:"\F6DE"}.mdi-heart-half-full:before{content:"\F6DD"}.mdi-heart-half-outline:before{content:"\F6DF"}.mdi-heart-multiple:before{content:"\FA55"}.mdi-heart-multiple-outline:before{content:"\FA56"}.mdi-heart-off:before{content:"\F758"}.mdi-heart-outline:before{content:"\F2D5"}.mdi-heart-pulse:before{content:"\F5F6"}.mdi-helicopter:before{content:"\FAC1"}.mdi-help:before{content:"\F2D6"}.mdi-help-box:before{content:"\F78A"}.mdi-help-circle:before{content:"\F2D7"}.mdi-help-circle-outline:before{content:"\F625"}.mdi-help-network:before{content:"\F6F4"}.mdi-help-network-outline:before{content:"\FC66"}.mdi-help-rhombus:before{content:"\FB81"}.mdi-help-rhombus-outline:before{content:"\FB82"}.mdi-hexagon:before{content:"\F2D8"}.mdi-hexagon-multiple:before{content:"\F6E0"}.mdi-hexagon-outline:before{content:"\F2D9"}.mdi-hexagon-slice-1:before{content:"\FAC2"}.mdi-hexagon-slice-2:before{content:"\FAC3"}.mdi-hexagon-slice-3:before{content:"\FAC4"}.mdi-hexagon-slice-4:before{content:"\FAC5"}.mdi-hexagon-slice-5:before{content:"\FAC6"}.mdi-hexagon-slice-6:before{content:"\FAC7"}.mdi-hexagram:before{content:"\FAC8"}.mdi-hexagram-outline:before{content:"\FAC9"}.mdi-high-definition:before{content:"\F7CE"}.mdi-high-definition-box:before{content:"\F877"}.mdi-highway:before{content:"\F5F7"}.mdi-hiking:before{content:"\FD5B"}.mdi-hinduism:before{content:"\F972"}.mdi-history:before{content:"\F2DA"}.mdi-hockey-puck:before{content:"\F878"}.mdi-hockey-sticks:before{content:"\F879"}.mdi-hololens:before{content:"\F2DB"}.mdi-home:before{content:"\F2DC"}.mdi-home-account:before{content:"\F825"}.mdi-home-alert:before{content:"\F87A"}.mdi-home-assistant:before{content:"\F7CF"}.mdi-home-automation:before{content:"\F7D0"}.mdi-home-circle:before{content:"\F7D1"}.mdi-home-city:before{content:"\FCF1"}.mdi-home-city-outline:before{content:"\FCF2"}.mdi-home-currency-usd:before{content:"\F8AE"}.mdi-home-floor-0:before{content:"\FDAE"}.mdi-home-floor-1:before{content:"\FD5C"}.mdi-home-floor-2:before{content:"\FD5D"}.mdi-home-floor-3:before{content:"\FD5E"}.mdi-home-floor-a:before{content:"\FD5F"}.mdi-home-floor-b:before{content:"\FD60"}.mdi-home-floor-g:before{content:"\FD61"}.mdi-home-floor-l:before{content:"\FD62"}.mdi-home-floor-negative-1:before{content:"\FDAF"}.mdi-home-group:before{content:"\FDB0"}.mdi-home-heart:before{content:"\F826"}.mdi-home-lock:before{content:"\F8EA"}.mdi-home-lock-open:before{content:"\F8EB"}.mdi-home-map-marker:before{content:"\F5F8"}.mdi-home-minus:before{content:"\F973"}.mdi-home-modern:before{content:"\F2DD"}.mdi-home-outline:before{content:"\F6A0"}.mdi-home-plus:before{content:"\F974"}.mdi-home-variant:before{content:"\F2DE"}.mdi-home-variant-outline:before{content:"\FB83"}.mdi-hook:before{content:"\F6E1"}.mdi-hook-off:before{content:"\F6E2"}.mdi-hops:before{content:"\F2DF"}.mdi-horseshoe:before{content:"\FA57"}.mdi-hospital:before{content:"\F2E0"}.mdi-hospital-building:before{content:"\F2E1"}.mdi-hospital-marker:before{content:"\F2E2"}.mdi-hot-tub:before{content:"\F827"}.mdi-hotel:before{content:"\F2E3"}.mdi-houzz:before{content:"\F2E4"}.mdi-houzz-box:before{content:"\F2E5"}.mdi-hubspot:before{content:"\FCF3"}.mdi-hulu:before{content:"\F828"}.mdi-human:before{content:"\F2E6"}.mdi-human-child:before{content:"\F2E7"}.mdi-human-female:before{content:"\F649"}.mdi-human-female-boy:before{content:"\FA58"}.mdi-human-female-female:before{content:"\FA59"}.mdi-human-female-girl:before{content:"\FA5A"}.mdi-human-greeting:before{content:"\F64A"}.mdi-human-handsdown:before{content:"\F64B"}.mdi-human-handsup:before{content:"\F64C"}.mdi-human-male:before{content:"\F64D"}.mdi-human-male-boy:before{content:"\FA5B"}.mdi-human-male-female:before{content:"\F2E8"}.mdi-human-male-girl:before{content:"\FA5C"}.mdi-human-male-male:before{content:"\FA5D"}.mdi-human-pregnant:before{content:"\F5CF"}.mdi-humble-bundle:before{content:"\F743"}.mdi-ice-cream:before{content:"\F829"}.mdi-iframe:before{content:"\FC67"}.mdi-iframe-outline:before{content:"\FC68"}.mdi-image:before{content:"\F2E9"}.mdi-image-album:before{content:"\F2EA"}.mdi-image-area:before{content:"\F2EB"}.mdi-image-area-close:before{content:"\F2EC"}.mdi-image-broken:before{content:"\F2ED"}.mdi-image-broken-variant:before{content:"\F2EE"}.mdi-image-filter:before{content:"\F2EF"}.mdi-image-filter-black-white:before{content:"\F2F0"}.mdi-image-filter-center-focus:before{content:"\F2F1"}.mdi-image-filter-center-focus-weak:before{content:"\F2F2"}.mdi-image-filter-drama:before{content:"\F2F3"}.mdi-image-filter-frames:before{content:"\F2F4"}.mdi-image-filter-hdr:before{content:"\F2F5"}.mdi-image-filter-none:before{content:"\F2F6"}.mdi-image-filter-tilt-shift:before{content:"\F2F7"}.mdi-image-filter-vintage:before{content:"\F2F8"}.mdi-image-move:before{content:"\F9F7"}.mdi-image-multiple:before{content:"\F2F9"}.mdi-image-off:before{content:"\F82A"}.mdi-image-outline:before{content:"\F975"}.mdi-image-plus:before{content:"\F87B"}.mdi-image-search:before{content:"\F976"}.mdi-image-search-outline:before{content:"\F977"}.mdi-image-size-select-actual:before{content:"\FC69"}.mdi-image-size-select-large:before{content:"\FC6A"}.mdi-image-size-select-small:before{content:"\FC6B"}.mdi-import:before{content:"\F2FA"}.mdi-inbox:before{content:"\F686"}.mdi-inbox-arrow-down:before{content:"\F2FB"}.mdi-inbox-arrow-up:before{content:"\F3D1"}.mdi-inbox-multiple:before{content:"\F8AF"}.mdi-inbox-multiple-outline:before{content:"\FB84"}.mdi-incognito:before{content:"\F5F9"}.mdi-infinity:before{content:"\F6E3"}.mdi-information:before{content:"\F2FC"}.mdi-information-outline:before{content:"\F2FD"}.mdi-information-variant:before{content:"\F64E"}.mdi-instagram:before{content:"\F2FE"}.mdi-instapaper:before{content:"\F2FF"}.mdi-internet-explorer:before{content:"\F300"}.mdi-invert-colors:before{content:"\F301"}.mdi-ip:before{content:"\FA5E"}.mdi-ip-network:before{content:"\FA5F"}.mdi-ip-network-outline:before{content:"\FC6C"}.mdi-ipod:before{content:"\FC6D"}.mdi-islam:before{content:"\F978"}.mdi-itunes:before{content:"\F676"}.mdi-jabber:before{content:"\FDB1"}.mdi-jeepney:before{content:"\F302"}.mdi-jira:before{content:"\F303"}.mdi-jquery:before{content:"\F87C"}.mdi-jsfiddle:before{content:"\F304"}.mdi-json:before{content:"\F626"}.mdi-judaism:before{content:"\F979"}.mdi-kabaddi:before{content:"\FD63"}.mdi-karate:before{content:"\F82B"}.mdi-keg:before{content:"\F305"}.mdi-kettle:before{content:"\F5FA"}.mdi-key:before{content:"\F306"}.mdi-key-change:before{content:"\F307"}.mdi-key-minus:before{content:"\F308"}.mdi-key-outline:before{content:"\FDB2"}.mdi-key-plus:before{content:"\F309"}.mdi-key-remove:before{content:"\F30A"}.mdi-key-variant:before{content:"\F30B"}.mdi-keyboard:before{content:"\F30C"}.mdi-keyboard-backspace:before{content:"\F30D"}.mdi-keyboard-caps:before{content:"\F30E"}.mdi-keyboard-close:before{content:"\F30F"}.mdi-keyboard-off:before{content:"\F310"}.mdi-keyboard-outline:before{content:"\F97A"}.mdi-keyboard-return:before{content:"\F311"}.mdi-keyboard-settings:before{content:"\F9F8"}.mdi-keyboard-settings-outline:before{content:"\F9F9"}.mdi-keyboard-tab:before{content:"\F312"}.mdi-keyboard-variant:before{content:"\F313"}.mdi-kickstarter:before{content:"\F744"}.mdi-knife:before{content:"\F9FA"}.mdi-knife-military:before{content:"\F9FB"}.mdi-kodi:before{content:"\F314"}.mdi-label:before{content:"\F315"}.mdi-label-off:before{content:"\FACA"}.mdi-label-off-outline:before{content:"\FACB"}.mdi-label-outline:before{content:"\F316"}.mdi-label-variant:before{content:"\FACC"}.mdi-label-variant-outline:before{content:"\FACD"}.mdi-ladybug:before{content:"\F82C"}.mdi-lambda:before{content:"\F627"}.mdi-lamp:before{content:"\F6B4"}.mdi-lan:before{content:"\F317"}.mdi-lan-connect:before{content:"\F318"}.mdi-lan-disconnect:before{content:"\F319"}.mdi-lan-pending:before{content:"\F31A"}.mdi-language-c:before{content:"\F671"}.mdi-language-cpp:before{content:"\F672"}.mdi-language-csharp:before{content:"\F31B"}.mdi-language-css3:before{content:"\F31C"}.mdi-language-go:before{content:"\F7D2"}.mdi-language-haskell:before{content:"\FC6E"}.mdi-language-html5:before{content:"\F31D"}.mdi-language-java:before{content:"\FB1C"}.mdi-language-javascript:before{content:"\F31E"}.mdi-language-lua:before{content:"\F8B0"}.mdi-language-php:before{content:"\F31F"}.mdi-language-python:before{content:"\F320"}.mdi-language-python-text:before{content:"\F321"}.mdi-language-r:before{content:"\F7D3"}.mdi-language-ruby-on-rails:before{content:"\FACE"}.mdi-language-swift:before{content:"\F6E4"}.mdi-language-typescript:before{content:"\F6E5"}.mdi-laptop:before{content:"\F322"}.mdi-laptop-chromebook:before{content:"\F323"}.mdi-laptop-mac:before{content:"\F324"}.mdi-laptop-off:before{content:"\F6E6"}.mdi-laptop-windows:before{content:"\F325"}.mdi-laravel:before{content:"\FACF"}.mdi-lastfm:before{content:"\F326"}.mdi-lastpass:before{content:"\F446"}.mdi-launch:before{content:"\F327"}.mdi-lava-lamp:before{content:"\F7D4"}.mdi-layers:before{content:"\F328"}.mdi-layers-off:before{content:"\F329"}.mdi-layers-off-outline:before{content:"\F9FC"}.mdi-layers-outline:before{content:"\F9FD"}.mdi-lead-pencil:before{content:"\F64F"}.mdi-leaf:before{content:"\F32A"}.mdi-leaf-maple:before{content:"\FC6F"}.mdi-leak:before{content:"\FDB3"}.mdi-leak-off:before{content:"\FDB4"}.mdi-led-off:before{content:"\F32B"}.mdi-led-on:before{content:"\F32C"}.mdi-led-outline:before{content:"\F32D"}.mdi-led-strip:before{content:"\F7D5"}.mdi-led-variant-off:before{content:"\F32E"}.mdi-led-variant-on:before{content:"\F32F"}.mdi-led-variant-outline:before{content:"\F330"}.mdi-less-than:before{content:"\F97B"}.mdi-less-than-or-equal:before{content:"\F97C"}.mdi-library:before{content:"\F331"}.mdi-library-books:before{content:"\F332"}.mdi-library-movie:before{content:"\FCF4"}.mdi-library-music:before{content:"\F333"}.mdi-library-plus:before{content:"\F334"}.mdi-library-shelves:before{content:"\FB85"}.mdi-library-video:before{content:"\FCF5"}.mdi-lifebuoy:before{content:"\F87D"}.mdi-light-switch:before{content:"\F97D"}.mdi-lightbulb:before{content:"\F335"}.mdi-lightbulb-on:before{content:"\F6E7"}.mdi-lightbulb-on-outline:before{content:"\F6E8"}.mdi-lightbulb-outline:before{content:"\F336"}.mdi-lighthouse:before{content:"\F9FE"}.mdi-lighthouse-on:before{content:"\F9FF"}.mdi-link:before{content:"\F337"}.mdi-link-box:before{content:"\FCF6"}.mdi-link-box-outline:before{content:"\FCF7"}.mdi-link-box-variant:before{content:"\FCF8"}.mdi-link-box-variant-outline:before{content:"\FCF9"}.mdi-link-off:before{content:"\F338"}.mdi-link-plus:before{content:"\FC70"}.mdi-link-variant:before{content:"\F339"}.mdi-link-variant-off:before{content:"\F33A"}.mdi-linkedin:before{content:"\F33B"}.mdi-linkedin-box:before{content:"\F33C"}.mdi-linux:before{content:"\F33D"}.mdi-linux-mint:before{content:"\F8EC"}.mdi-litecoin:before{content:"\FA60"}.mdi-loading:before{content:"\F771"}.mdi-lock:before{content:"\F33E"}.mdi-lock-alert:before{content:"\F8ED"}.mdi-lock-clock:before{content:"\F97E"}.mdi-lock-open:before{content:"\F33F"}.mdi-lock-open-outline:before{content:"\F340"}.mdi-lock-outline:before{content:"\F341"}.mdi-lock-pattern:before{content:"\F6E9"}.mdi-lock-plus:before{content:"\F5FB"}.mdi-lock-question:before{content:"\F8EE"}.mdi-lock-reset:before{content:"\F772"}.mdi-lock-smart:before{content:"\F8B1"}.mdi-locker:before{content:"\F7D6"}.mdi-locker-multiple:before{content:"\F7D7"}.mdi-login:before{content:"\F342"}.mdi-login-variant:before{content:"\F5FC"}.mdi-logout:before{content:"\F343"}.mdi-logout-variant:before{content:"\F5FD"}.mdi-looks:before{content:"\F344"}.mdi-loop:before{content:"\F6EA"}.mdi-loupe:before{content:"\F345"}.mdi-lumx:before{content:"\F346"}.mdi-lyft:before{content:"\FB1D"}.mdi-magnet:before{content:"\F347"}.mdi-magnet-on:before{content:"\F348"}.mdi-magnify:before{content:"\F349"}.mdi-magnify-close:before{content:"\F97F"}.mdi-magnify-minus:before{content:"\F34A"}.mdi-magnify-minus-cursor:before{content:"\FA61"}.mdi-magnify-minus-outline:before{content:"\F6EB"}.mdi-magnify-plus:before{content:"\F34B"}.mdi-magnify-plus-cursor:before{content:"\FA62"}.mdi-magnify-plus-outline:before{content:"\F6EC"}.mdi-mail-ru:before{content:"\F34C"}.mdi-mailbox:before{content:"\F6ED"}.mdi-mailbox-open:before{content:"\FD64"}.mdi-mailbox-open-outline:before{content:"\FD65"}.mdi-mailbox-open-up:before{content:"\FD66"}.mdi-mailbox-open-up-outline:before{content:"\FD67"}.mdi-mailbox-outline:before{content:"\FD68"}.mdi-mailbox-up:before{content:"\FD69"}.mdi-mailbox-up-outline:before{content:"\FD6A"}.mdi-map:before{content:"\F34D"}.mdi-map-clock:before{content:"\FCFA"}.mdi-map-clock-outline:before{content:"\FCFB"}.mdi-map-legend:before{content:"\FA00"}.mdi-map-marker:before{content:"\F34E"}.mdi-map-marker-check:before{content:"\FC71"}.mdi-map-marker-circle:before{content:"\F34F"}.mdi-map-marker-distance:before{content:"\F8EF"}.mdi-map-marker-minus:before{content:"\F650"}.mdi-map-marker-multiple:before{content:"\F350"}.mdi-map-marker-off:before{content:"\F351"}.mdi-map-marker-outline:before{content:"\F7D8"}.mdi-map-marker-path:before{content:"\FCFC"}.mdi-map-marker-plus:before{content:"\F651"}.mdi-map-marker-radius:before{content:"\F352"}.mdi-map-minus:before{content:"\F980"}.mdi-map-outline:before{content:"\F981"}.mdi-map-plus:before{content:"\F982"}.mdi-map-search:before{content:"\F983"}.mdi-map-search-outline:before{content:"\F984"}.mdi-mapbox:before{content:"\FB86"}.mdi-margin:before{content:"\F353"}.mdi-markdown:before{content:"\F354"}.mdi-marker:before{content:"\F652"}.mdi-marker-cancel:before{content:"\FDB5"}.mdi-marker-check:before{content:"\F355"}.mdi-mastodon:before{content:"\FAD0"}.mdi-mastodon-variant:before{content:"\FAD1"}.mdi-material-design:before{content:"\F985"}.mdi-material-ui:before{content:"\F357"}.mdi-math-compass:before{content:"\F358"}.mdi-math-cos:before{content:"\FC72"}.mdi-math-sin:before{content:"\FC73"}.mdi-math-tan:before{content:"\FC74"}.mdi-matrix:before{content:"\F628"}.mdi-maxcdn:before{content:"\F359"}.mdi-medal:before{content:"\F986"}.mdi-medical-bag:before{content:"\F6EE"}.mdi-medium:before{content:"\F35A"}.mdi-meetup:before{content:"\FAD2"}.mdi-memory:before{content:"\F35B"}.mdi-menu:before{content:"\F35C"}.mdi-menu-down:before{content:"\F35D"}.mdi-menu-down-outline:before{content:"\F6B5"}.mdi-menu-left:before{content:"\F35E"}.mdi-menu-left-outline:before{content:"\FA01"}.mdi-menu-open:before{content:"\FB87"}.mdi-menu-right:before{content:"\F35F"}.mdi-menu-right-outline:before{content:"\FA02"}.mdi-menu-swap:before{content:"\FA63"}.mdi-menu-swap-outline:before{content:"\FA64"}.mdi-menu-up:before{content:"\F360"}.mdi-menu-up-outline:before{content:"\F6B6"}.mdi-message:before{content:"\F361"}.mdi-message-alert:before{content:"\F362"}.mdi-message-alert-outline:before{content:"\FA03"}.mdi-message-bulleted:before{content:"\F6A1"}.mdi-message-bulleted-off:before{content:"\F6A2"}.mdi-message-draw:before{content:"\F363"}.mdi-message-image:before{content:"\F364"}.mdi-message-outline:before{content:"\F365"}.mdi-message-plus:before{content:"\F653"}.mdi-message-processing:before{content:"\F366"}.mdi-message-reply:before{content:"\F367"}.mdi-message-reply-text:before{content:"\F368"}.mdi-message-settings:before{content:"\F6EF"}.mdi-message-settings-variant:before{content:"\F6F0"}.mdi-message-text:before{content:"\F369"}.mdi-message-text-outline:before{content:"\F36A"}.mdi-message-video:before{content:"\F36B"}.mdi-meteor:before{content:"\F629"}.mdi-metronome:before{content:"\F7D9"}.mdi-metronome-tick:before{content:"\F7DA"}.mdi-micro-sd:before{content:"\F7DB"}.mdi-microphone:before{content:"\F36C"}.mdi-microphone-minus:before{content:"\F8B2"}.mdi-microphone-off:before{content:"\F36D"}.mdi-microphone-outline:before{content:"\F36E"}.mdi-microphone-plus:before{content:"\F8B3"}.mdi-microphone-settings:before{content:"\F36F"}.mdi-microphone-variant:before{content:"\F370"}.mdi-microphone-variant-off:before{content:"\F371"}.mdi-microscope:before{content:"\F654"}.mdi-microsoft:before{content:"\F372"}.mdi-microsoft-dynamics:before{content:"\F987"}.mdi-microwave:before{content:"\FC75"}.mdi-midi:before{content:"\F8F0"}.mdi-midi-port:before{content:"\F8F1"}.mdi-mine:before{content:"\FDB6"}.mdi-minecraft:before{content:"\F373"}.mdi-mini-sd:before{content:"\FA04"}.mdi-minidisc:before{content:"\FA05"}.mdi-minus:before{content:"\F374"}.mdi-minus-box:before{content:"\F375"}.mdi-minus-box-outline:before{content:"\F6F1"}.mdi-minus-circle:before{content:"\F376"}.mdi-minus-circle-outline:before{content:"\F377"}.mdi-minus-network:before{content:"\F378"}.mdi-minus-network-outline:before{content:"\FC76"}.mdi-mixcloud:before{content:"\F62A"}.mdi-mixed-martial-arts:before{content:"\FD6B"}.mdi-mixed-reality:before{content:"\F87E"}.mdi-mixer:before{content:"\F7DC"}.mdi-molecule:before{content:"\FB88"}.mdi-monitor:before{content:"\F379"}.mdi-monitor-cellphone:before{content:"\F988"}.mdi-monitor-cellphone-star:before{content:"\F989"}.mdi-monitor-dashboard:before{content:"\FA06"}.mdi-monitor-lock:before{content:"\FDB7"}.mdi-monitor-multiple:before{content:"\F37A"}.mdi-monitor-off:before{content:"\FD6C"}.mdi-monitor-star:before{content:"\FDB8"}.mdi-more:before{content:"\F37B"}.mdi-mother-nurse:before{content:"\FCFD"}.mdi-motion-sensor:before{content:"\FD6D"}.mdi-motorbike:before{content:"\F37C"}.mdi-mouse:before{content:"\F37D"}.mdi-mouse-bluetooth:before{content:"\F98A"}.mdi-mouse-off:before{content:"\F37E"}.mdi-mouse-variant:before{content:"\F37F"}.mdi-mouse-variant-off:before{content:"\F380"}.mdi-move-resize:before{content:"\F655"}.mdi-move-resize-variant:before{content:"\F656"}.mdi-movie:before{content:"\F381"}.mdi-movie-outline:before{content:"\FDB9"}.mdi-movie-roll:before{content:"\F7DD"}.mdi-muffin:before{content:"\F98B"}.mdi-multiplication:before{content:"\F382"}.mdi-multiplication-box:before{content:"\F383"}.mdi-mushroom:before{content:"\F7DE"}.mdi-mushroom-outline:before{content:"\F7DF"}.mdi-music:before{content:"\F759"}.mdi-music-box:before{content:"\F384"}.mdi-music-box-outline:before{content:"\F385"}.mdi-music-circle:before{content:"\F386"}.mdi-music-circle-outline:before{content:"\FAD3"}.mdi-music-note:before{content:"\F387"}.mdi-music-note-bluetooth:before{content:"\F5FE"}.mdi-music-note-bluetooth-off:before{content:"\F5FF"}.mdi-music-note-eighth:before{content:"\F388"}.mdi-music-note-half:before{content:"\F389"}.mdi-music-note-off:before{content:"\F38A"}.mdi-music-note-plus:before{content:"\FDBA"}.mdi-music-note-quarter:before{content:"\F38B"}.mdi-music-note-sixteenth:before{content:"\F38C"}.mdi-music-note-whole:before{content:"\F38D"}.mdi-music-off:before{content:"\F75A"}.mdi-nail:before{content:"\FDBB"}.mdi-nas:before{content:"\F8F2"}.mdi-nativescript:before{content:"\F87F"}.mdi-nature:before{content:"\F38E"}.mdi-nature-people:before{content:"\F38F"}.mdi-navigation:before{content:"\F390"}.mdi-near-me:before{content:"\F5CD"}.mdi-needle:before{content:"\F391"}.mdi-netflix:before{content:"\F745"}.mdi-network:before{content:"\F6F2"}.mdi-network-off:before{content:"\FC77"}.mdi-network-off-outline:before{content:"\FC78"}.mdi-network-outline:before{content:"\FC79"}.mdi-network-strength-1:before{content:"\F8F3"}.mdi-network-strength-1-alert:before{content:"\F8F4"}.mdi-network-strength-2:before{content:"\F8F5"}.mdi-network-strength-2-alert:before{content:"\F8F6"}.mdi-network-strength-3:before{content:"\F8F7"}.mdi-network-strength-3-alert:before{content:"\F8F8"}.mdi-network-strength-4:before{content:"\F8F9"}.mdi-network-strength-4-alert:before{content:"\F8FA"}.mdi-network-strength-off:before{content:"\F8FB"}.mdi-network-strength-off-outline:before{content:"\F8FC"}.mdi-network-strength-outline:before{content:"\F8FD"}.mdi-new-box:before{content:"\F394"}.mdi-newspaper:before{content:"\F395"}.mdi-nfc:before{content:"\F396"}.mdi-nfc-tap:before{content:"\F397"}.mdi-nfc-variant:before{content:"\F398"}.mdi-ninja:before{content:"\F773"}.mdi-nintendo-switch:before{content:"\F7E0"}.mdi-nodejs:before{content:"\F399"}.mdi-not-equal:before{content:"\F98C"}.mdi-not-equal-variant:before{content:"\F98D"}.mdi-note:before{content:"\F39A"}.mdi-note-multiple:before{content:"\F6B7"}.mdi-note-multiple-outline:before{content:"\F6B8"}.mdi-note-outline:before{content:"\F39B"}.mdi-note-plus:before{content:"\F39C"}.mdi-note-plus-outline:before{content:"\F39D"}.mdi-note-text:before{content:"\F39E"}.mdi-notebook:before{content:"\F82D"}.mdi-notification-clear-all:before{content:"\F39F"}.mdi-npm:before{content:"\F6F6"}.mdi-npm-variant:before{content:"\F98E"}.mdi-npm-variant-outline:before{content:"\F98F"}.mdi-nuke:before{content:"\F6A3"}.mdi-null:before{content:"\F7E1"}.mdi-numeric:before{content:"\F3A0"}.mdi-numeric-0:before{content:"\30"}.mdi-numeric-0-box:before{content:"\F3A1"}.mdi-numeric-0-box-multiple-outline:before{content:"\F3A2"}.mdi-numeric-0-box-outline:before{content:"\F3A3"}.mdi-numeric-0-circle:before{content:"\FC7A"}.mdi-numeric-0-circle-outline:before{content:"\FC7B"}.mdi-numeric-1:before{content:"\31"}.mdi-numeric-1-box:before{content:"\F3A4"}.mdi-numeric-1-box-multiple-outline:before{content:"\F3A5"}.mdi-numeric-1-box-outline:before{content:"\F3A6"}.mdi-numeric-1-circle:before{content:"\FC7C"}.mdi-numeric-1-circle-outline:before{content:"\FC7D"}.mdi-numeric-2:before{content:"\32"}.mdi-numeric-2-box:before{content:"\F3A7"}.mdi-numeric-2-box-multiple-outline:before{content:"\F3A8"}.mdi-numeric-2-box-outline:before{content:"\F3A9"}.mdi-numeric-2-circle:before{content:"\FC7E"}.mdi-numeric-2-circle-outline:before{content:"\FC7F"}.mdi-numeric-3:before{content:"\33"}.mdi-numeric-3-box:before{content:"\F3AA"}.mdi-numeric-3-box-multiple-outline:before{content:"\F3AB"}.mdi-numeric-3-box-outline:before{content:"\F3AC"}.mdi-numeric-3-circle:before{content:"\FC80"}.mdi-numeric-3-circle-outline:before{content:"\FC81"}.mdi-numeric-4:before{content:"\34"}.mdi-numeric-4-box:before{content:"\F3AD"}.mdi-numeric-4-box-multiple-outline:before{content:"\F3AE"}.mdi-numeric-4-box-outline:before{content:"\F3AF"}.mdi-numeric-4-circle:before{content:"\FC82"}.mdi-numeric-4-circle-outline:before{content:"\FC83"}.mdi-numeric-5:before{content:"\35"}.mdi-numeric-5-box:before{content:"\F3B0"}.mdi-numeric-5-box-multiple-outline:before{content:"\F3B1"}.mdi-numeric-5-box-outline:before{content:"\F3B2"}.mdi-numeric-5-circle:before{content:"\FC84"}.mdi-numeric-5-circle-outline:before{content:"\FC85"}.mdi-numeric-6:before{content:"\36"}.mdi-numeric-6-box:before{content:"\F3B3"}.mdi-numeric-6-box-multiple-outline:before{content:"\F3B4"}.mdi-numeric-6-box-outline:before{content:"\F3B5"}.mdi-numeric-6-circle:before{content:"\FC86"}.mdi-numeric-6-circle-outline:before{content:"\FC87"}.mdi-numeric-7:before{content:"\37"}.mdi-numeric-7-box:before{content:"\F3B6"}.mdi-numeric-7-box-multiple-outline:before{content:"\F3B7"}.mdi-numeric-7-box-outline:before{content:"\F3B8"}.mdi-numeric-7-circle:before{content:"\FC88"}.mdi-numeric-7-circle-outline:before{content:"\FC89"}.mdi-numeric-8:before{content:"\38"}.mdi-numeric-8-box:before{content:"\F3B9"}.mdi-numeric-8-box-multiple-outline:before{content:"\F3BA"}.mdi-numeric-8-box-outline:before{content:"\F3BB"}.mdi-numeric-8-circle:before{content:"\FC8A"}.mdi-numeric-8-circle-outline:before{content:"\FC8B"}.mdi-numeric-9:before{content:"\39"}.mdi-numeric-9-box:before{content:"\F3BC"}.mdi-numeric-9-box-multiple-outline:before{content:"\F3BD"}.mdi-numeric-9-box-outline:before{content:"\F3BE"}.mdi-numeric-9-circle:before{content:"\FC8C"}.mdi-numeric-9-circle-outline:before{content:"\FC8D"}.mdi-numeric-9-plus-box:before{content:"\F3BF"}.mdi-numeric-9-plus-box-multiple-outline:before{content:"\F3C0"}.mdi-numeric-9-plus-box-outline:before{content:"\F3C1"}.mdi-numeric-9-plus-circle:before{content:"\FC8E"}.mdi-numeric-9-plus-circle-outline:before{content:"\FC8F"}.mdi-nut:before{content:"\F6F7"}.mdi-nutrition:before{content:"\F3C2"}.mdi-oar:before{content:"\F67B"}.mdi-ocarina:before{content:"\FDBC"}.mdi-octagon:before{content:"\F3C3"}.mdi-octagon-outline:before{content:"\F3C4"}.mdi-octagram:before{content:"\F6F8"}.mdi-octagram-outline:before{content:"\F774"}.mdi-odnoklassniki:before{content:"\F3C5"}.mdi-office:before{content:"\F3C6"}.mdi-office-building:before{content:"\F990"}.mdi-oil:before{content:"\F3C7"}.mdi-oil-temperature:before{content:"\F3C8"}.mdi-omega:before{content:"\F3C9"}.mdi-one-up:before{content:"\FB89"}.mdi-onedrive:before{content:"\F3CA"}.mdi-onenote:before{content:"\F746"}.mdi-onepassword:before{content:"\F880"}.mdi-opacity:before{content:"\F5CC"}.mdi-open-in-app:before{content:"\F3CB"}.mdi-open-in-new:before{content:"\F3CC"}.mdi-open-source-initiative:before{content:"\FB8A"}.mdi-openid:before{content:"\F3CD"}.mdi-opera:before{content:"\F3CE"}.mdi-orbit:before{content:"\F018"}.mdi-origin:before{content:"\FB2B"}.mdi-ornament:before{content:"\F3CF"}.mdi-ornament-variant:before{content:"\F3D0"}.mdi-outlook:before{content:"\FCFE"}.mdi-owl:before{content:"\F3D2"}.mdi-pac-man:before{content:"\FB8B"}.mdi-package:before{content:"\F3D3"}.mdi-package-down:before{content:"\F3D4"}.mdi-package-up:before{content:"\F3D5"}.mdi-package-variant:before{content:"\F3D6"}.mdi-package-variant-closed:before{content:"\F3D7"}.mdi-page-first:before{content:"\F600"}.mdi-page-last:before{content:"\F601"}.mdi-page-layout-body:before{content:"\F6F9"}.mdi-page-layout-footer:before{content:"\F6FA"}.mdi-page-layout-header:before{content:"\F6FB"}.mdi-page-layout-sidebar-left:before{content:"\F6FC"}.mdi-page-layout-sidebar-right:before{content:"\F6FD"}.mdi-page-next:before{content:"\FB8C"}.mdi-page-next-outline:before{content:"\FB8D"}.mdi-page-previous:before{content:"\FB8E"}.mdi-page-previous-outline:before{content:"\FB8F"}.mdi-palette:before{content:"\F3D8"}.mdi-palette-advanced:before{content:"\F3D9"}.mdi-palette-outline:before{content:"\FDE8"}.mdi-palette-swatch:before{content:"\F8B4"}.mdi-pan:before{content:"\FB90"}.mdi-pan-bottom-left:before{content:"\FB91"}.mdi-pan-bottom-right:before{content:"\FB92"}.mdi-pan-down:before{content:"\FB93"}.mdi-pan-horizontal:before{content:"\FB94"}.mdi-pan-left:before{content:"\FB95"}.mdi-pan-right:before{content:"\FB96"}.mdi-pan-top-left:before{content:"\FB97"}.mdi-pan-top-right:before{content:"\FB98"}.mdi-pan-up:before{content:"\FB99"}.mdi-pan-vertical:before{content:"\FB9A"}.mdi-panda:before{content:"\F3DA"}.mdi-pandora:before{content:"\F3DB"}.mdi-panorama:before{content:"\F3DC"}.mdi-panorama-fisheye:before{content:"\F3DD"}.mdi-panorama-horizontal:before{content:"\F3DE"}.mdi-panorama-vertical:before{content:"\F3DF"}.mdi-panorama-wide-angle:before{content:"\F3E0"}.mdi-paper-cut-vertical:before{content:"\F3E1"}.mdi-paperclip:before{content:"\F3E2"}.mdi-parachute:before{content:"\FC90"}.mdi-parachute-outline:before{content:"\FC91"}.mdi-parking:before{content:"\F3E3"}.mdi-passport:before{content:"\F7E2"}.mdi-passport-biometric:before{content:"\FDBD"}.mdi-patreon:before{content:"\F881"}.mdi-pause:before{content:"\F3E4"}.mdi-pause-circle:before{content:"\F3E5"}.mdi-pause-circle-outline:before{content:"\F3E6"}.mdi-pause-octagon:before{content:"\F3E7"}.mdi-pause-octagon-outline:before{content:"\F3E8"}.mdi-paw:before{content:"\F3E9"}.mdi-paw-off:before{content:"\F657"}.mdi-paypal:before{content:"\F882"}.mdi-peace:before{content:"\F883"}.mdi-pen:before{content:"\F3EA"}.mdi-pen-lock:before{content:"\FDBE"}.mdi-pen-minus:before{content:"\FDBF"}.mdi-pen-off:before{content:"\FDC0"}.mdi-pen-plus:before{content:"\FDC1"}.mdi-pen-remove:before{content:"\FDC2"}.mdi-pencil:before{content:"\F3EB"}.mdi-pencil-box:before{content:"\F3EC"}.mdi-pencil-box-outline:before{content:"\F3ED"}.mdi-pencil-circle:before{content:"\F6FE"}.mdi-pencil-circle-outline:before{content:"\F775"}.mdi-pencil-lock:before{content:"\F3EE"}.mdi-pencil-lock-outline:before{content:"\FDC3"}.mdi-pencil-minus:before{content:"\FDC4"}.mdi-pencil-minus-outline:before{content:"\FDC5"}.mdi-pencil-off:before{content:"\F3EF"}.mdi-pencil-off-outline:before{content:"\FDC6"}.mdi-pencil-outline:before{content:"\FC92"}.mdi-pencil-plus:before{content:"\FDC7"}.mdi-pencil-plus-outline:before{content:"\FDC8"}.mdi-pencil-remove:before{content:"\FDC9"}.mdi-pencil-remove-outline:before{content:"\FDCA"}.mdi-pentagon:before{content:"\F6FF"}.mdi-pentagon-outline:before{content:"\F700"}.mdi-percent:before{content:"\F3F0"}.mdi-periodic-table:before{content:"\F8B5"}.mdi-periodic-table-co2:before{content:"\F7E3"}.mdi-periscope:before{content:"\F747"}.mdi-perspective-less:before{content:"\FCFF"}.mdi-perspective-more:before{content:"\FD00"}.mdi-pharmacy:before{content:"\F3F1"}.mdi-phone:before{content:"\F3F2"}.mdi-phone-bluetooth:before{content:"\F3F3"}.mdi-phone-classic:before{content:"\F602"}.mdi-phone-forward:before{content:"\F3F4"}.mdi-phone-hangup:before{content:"\F3F5"}.mdi-phone-in-talk:before{content:"\F3F6"}.mdi-phone-incoming:before{content:"\F3F7"}.mdi-phone-lock:before{content:"\F3F8"}.mdi-phone-log:before{content:"\F3F9"}.mdi-phone-minus:before{content:"\F658"}.mdi-phone-missed:before{content:"\F3FA"}.mdi-phone-off:before{content:"\FDCB"}.mdi-phone-outgoing:before{content:"\F3FB"}.mdi-phone-outline:before{content:"\FDCC"}.mdi-phone-paused:before{content:"\F3FC"}.mdi-phone-plus:before{content:"\F659"}.mdi-phone-return:before{content:"\F82E"}.mdi-phone-rotate-landscape:before{content:"\F884"}.mdi-phone-rotate-portrait:before{content:"\F885"}.mdi-phone-settings:before{content:"\F3FD"}.mdi-phone-voip:before{content:"\F3FE"}.mdi-pi:before{content:"\F3FF"}.mdi-pi-box:before{content:"\F400"}.mdi-pi-hole:before{content:"\FDCD"}.mdi-piano:before{content:"\F67C"}.mdi-pickaxe:before{content:"\F8B6"}.mdi-pier:before{content:"\F886"}.mdi-pier-crane:before{content:"\F887"}.mdi-pig:before{content:"\F401"}.mdi-pill:before{content:"\F402"}.mdi-pillar:before{content:"\F701"}.mdi-pin:before{content:"\F403"}.mdi-pin-off:before{content:"\F404"}.mdi-pin-off-outline:before{content:"\F92F"}.mdi-pin-outline:before{content:"\F930"}.mdi-pine-tree:before{content:"\F405"}.mdi-pine-tree-box:before{content:"\F406"}.mdi-pinterest:before{content:"\F407"}.mdi-pinterest-box:before{content:"\F408"}.mdi-pinwheel:before{content:"\FAD4"}.mdi-pinwheel-outline:before{content:"\FAD5"}.mdi-pipe:before{content:"\F7E4"}.mdi-pipe-disconnected:before{content:"\F7E5"}.mdi-pipe-leak:before{content:"\F888"}.mdi-pirate:before{content:"\FA07"}.mdi-pistol:before{content:"\F702"}.mdi-piston:before{content:"\F889"}.mdi-pizza:before{content:"\F409"}.mdi-play:before{content:"\F40A"}.mdi-play-box-outline:before{content:"\F40B"}.mdi-play-circle:before{content:"\F40C"}.mdi-play-circle-outline:before{content:"\F40D"}.mdi-play-network:before{content:"\F88A"}.mdi-play-network-outline:before{content:"\FC93"}.mdi-play-pause:before{content:"\F40E"}.mdi-play-protected-content:before{content:"\F40F"}.mdi-play-speed:before{content:"\F8FE"}.mdi-playlist-check:before{content:"\F5C7"}.mdi-playlist-edit:before{content:"\F8FF"}.mdi-playlist-minus:before{content:"\F410"}.mdi-playlist-music:before{content:"\FC94"}.mdi-playlist-music-outline:before{content:"\FC95"}.mdi-playlist-play:before{content:"\F411"}.mdi-playlist-plus:before{content:"\F412"}.mdi-playlist-remove:before{content:"\F413"}.mdi-playlist-star:before{content:"\FDCE"}.mdi-playstation:before{content:"\F414"}.mdi-plex:before{content:"\F6B9"}.mdi-plus:before{content:"\F415"}.mdi-plus-box:before{content:"\F416"}.mdi-plus-box-outline:before{content:"\F703"}.mdi-plus-circle:before{content:"\F417"}.mdi-plus-circle-multiple-outline:before{content:"\F418"}.mdi-plus-circle-outline:before{content:"\F419"}.mdi-plus-minus:before{content:"\F991"}.mdi-plus-minus-box:before{content:"\F992"}.mdi-plus-network:before{content:"\F41A"}.mdi-plus-network-outline:before{content:"\FC96"}.mdi-plus-one:before{content:"\F41B"}.mdi-plus-outline:before{content:"\F704"}.mdi-pocket:before{content:"\F41C"}.mdi-podcast:before{content:"\F993"}.mdi-podium:before{content:"\FD01"}.mdi-podium-bronze:before{content:"\FD02"}.mdi-podium-gold:before{content:"\FD03"}.mdi-podium-silver:before{content:"\FD04"}.mdi-point-of-sale:before{content:"\FD6E"}.mdi-pokeball:before{content:"\F41D"}.mdi-pokemon-go:before{content:"\FA08"}.mdi-poker-chip:before{content:"\F82F"}.mdi-polaroid:before{content:"\F41E"}.mdi-poll:before{content:"\F41F"}.mdi-poll-box:before{content:"\F420"}.mdi-polymer:before{content:"\F421"}.mdi-pool:before{content:"\F606"}.mdi-popcorn:before{content:"\F422"}.mdi-postage-stamp:before{content:"\FC97"}.mdi-pot:before{content:"\F65A"}.mdi-pot-mix:before{content:"\F65B"}.mdi-pound:before{content:"\F423"}.mdi-pound-box:before{content:"\F424"}.mdi-power:before{content:"\F425"}.mdi-power-cycle:before{content:"\F900"}.mdi-power-off:before{content:"\F901"}.mdi-power-on:before{content:"\F902"}.mdi-power-plug:before{content:"\F6A4"}.mdi-power-plug-off:before{content:"\F6A5"}.mdi-power-settings:before{content:"\F426"}.mdi-power-sleep:before{content:"\F903"}.mdi-power-socket:before{content:"\F427"}.mdi-power-socket-au:before{content:"\F904"}.mdi-power-socket-eu:before{content:"\F7E6"}.mdi-power-socket-uk:before{content:"\F7E7"}.mdi-power-socket-us:before{content:"\F7E8"}.mdi-power-standby:before{content:"\F905"}.mdi-powershell:before{content:"\FA09"}.mdi-prescription:before{content:"\F705"}.mdi-presentation:before{content:"\F428"}.mdi-presentation-play:before{content:"\F429"}.mdi-printer:before{content:"\F42A"}.mdi-printer-3d:before{content:"\F42B"}.mdi-printer-alert:before{content:"\F42C"}.mdi-printer-settings:before{content:"\F706"}.mdi-printer-wireless:before{content:"\FA0A"}.mdi-priority-high:before{content:"\F603"}.mdi-priority-low:before{content:"\F604"}.mdi-professional-hexagon:before{content:"\F42D"}.mdi-progress-alert:before{content:"\FC98"}.mdi-progress-check:before{content:"\F994"}.mdi-progress-clock:before{content:"\F995"}.mdi-progress-download:before{content:"\F996"}.mdi-progress-upload:before{content:"\F997"}.mdi-progress-wrench:before{content:"\FC99"}.mdi-projector:before{content:"\F42E"}.mdi-projector-screen:before{content:"\F42F"}.mdi-publish:before{content:"\F6A6"}.mdi-pulse:before{content:"\F430"}.mdi-pumpkin:before{content:"\FB9B"}.mdi-puzzle:before{content:"\F431"}.mdi-puzzle-outline:before{content:"\FA65"}.mdi-qi:before{content:"\F998"}.mdi-qqchat:before{content:"\F605"}.mdi-qrcode:before{content:"\F432"}.mdi-qrcode-edit:before{content:"\F8B7"}.mdi-qrcode-scan:before{content:"\F433"}.mdi-quadcopter:before{content:"\F434"}.mdi-quality-high:before{content:"\F435"}.mdi-quality-low:before{content:"\FA0B"}.mdi-quality-medium:before{content:"\FA0C"}.mdi-quicktime:before{content:"\F436"}.mdi-quora:before{content:"\FD05"}.mdi-rabbit:before{content:"\F906"}.mdi-racing-helmet:before{content:"\FD6F"}.mdi-racquetball:before{content:"\FD70"}.mdi-radar:before{content:"\F437"}.mdi-radiator:before{content:"\F438"}.mdi-radiator-disabled:before{content:"\FAD6"}.mdi-radiator-off:before{content:"\FAD7"}.mdi-radio:before{content:"\F439"}.mdi-radio-am:before{content:"\FC9A"}.mdi-radio-fm:before{content:"\FC9B"}.mdi-radio-handheld:before{content:"\F43A"}.mdi-radio-tower:before{content:"\F43B"}.mdi-radioactive:before{content:"\F43C"}.mdi-radiobox-blank:before{content:"\F43D"}.mdi-radiobox-marked:before{content:"\F43E"}.mdi-radius:before{content:"\FC9C"}.mdi-radius-outline:before{content:"\FC9D"}.mdi-raspberry-pi:before{content:"\F43F"}.mdi-ray-end:before{content:"\F440"}.mdi-ray-end-arrow:before{content:"\F441"}.mdi-ray-start:before{content:"\F442"}.mdi-ray-start-arrow:before{content:"\F443"}.mdi-ray-start-end:before{content:"\F444"}.mdi-ray-vertex:before{content:"\F445"}.mdi-react:before{content:"\F707"}.mdi-read:before{content:"\F447"}.mdi-receipt:before{content:"\F449"}.mdi-record:before{content:"\F44A"}.mdi-record-player:before{content:"\F999"}.mdi-record-rec:before{content:"\F44B"}.mdi-recycle:before{content:"\F44C"}.mdi-reddit:before{content:"\F44D"}.mdi-redo:before{content:"\F44E"}.mdi-redo-variant:before{content:"\F44F"}.mdi-reflect-horizontal:before{content:"\FA0D"}.mdi-reflect-vertical:before{content:"\FA0E"}.mdi-refresh:before{content:"\F450"}.mdi-regex:before{content:"\F451"}.mdi-registered-trademark:before{content:"\FA66"}.mdi-relative-scale:before{content:"\F452"}.mdi-reload:before{content:"\F453"}.mdi-reminder:before{content:"\F88B"}.mdi-remote:before{content:"\F454"}.mdi-remote-desktop:before{content:"\F8B8"}.mdi-rename-box:before{content:"\F455"}.mdi-reorder-horizontal:before{content:"\F687"}.mdi-reorder-vertical:before{content:"\F688"}.mdi-repeat:before{content:"\F456"}.mdi-repeat-off:before{content:"\F457"}.mdi-repeat-once:before{content:"\F458"}.mdi-replay:before{content:"\F459"}.mdi-reply:before{content:"\F45A"}.mdi-reply-all:before{content:"\F45B"}.mdi-reproduction:before{content:"\F45C"}.mdi-resistor:before{content:"\FB1F"}.mdi-resistor-nodes:before{content:"\FB20"}.mdi-resize:before{content:"\FA67"}.mdi-resize-bottom-right:before{content:"\F45D"}.mdi-responsive:before{content:"\F45E"}.mdi-restart:before{content:"\F708"}.mdi-restart-off:before{content:"\FD71"}.mdi-restore:before{content:"\F99A"}.mdi-restore-clock:before{content:"\F6A7"}.mdi-rewind:before{content:"\F45F"}.mdi-rewind-10:before{content:"\FD06"}.mdi-rewind-30:before{content:"\FD72"}.mdi-rewind-outline:before{content:"\F709"}.mdi-rhombus:before{content:"\F70A"}.mdi-rhombus-medium:before{content:"\FA0F"}.mdi-rhombus-outline:before{content:"\F70B"}.mdi-rhombus-split:before{content:"\FA10"}.mdi-ribbon:before{content:"\F460"}.mdi-rice:before{content:"\F7E9"}.mdi-ring:before{content:"\F7EA"}.mdi-road:before{content:"\F461"}.mdi-road-variant:before{content:"\F462"}.mdi-robot:before{content:"\F6A8"}.mdi-robot-industrial:before{content:"\FB21"}.mdi-robot-vacuum:before{content:"\F70C"}.mdi-robot-vacuum-variant:before{content:"\F907"}.mdi-rocket:before{content:"\F463"}.mdi-roller-skate:before{content:"\FD07"}.mdi-rollerblade:before{content:"\FD08"}.mdi-rollupjs:before{content:"\FB9C"}.mdi-room-service:before{content:"\F88C"}.mdi-room-service-outline:before{content:"\FD73"}.mdi-rotate-3d:before{content:"\F464"}.mdi-rotate-left:before{content:"\F465"}.mdi-rotate-left-variant:before{content:"\F466"}.mdi-rotate-orbit:before{content:"\FD74"}.mdi-rotate-right:before{content:"\F467"}.mdi-rotate-right-variant:before{content:"\F468"}.mdi-rounded-corner:before{content:"\F607"}.mdi-router-wireless:before{content:"\F469"}.mdi-router-wireless-settings:before{content:"\FA68"}.mdi-routes:before{content:"\F46A"}.mdi-rowing:before{content:"\F608"}.mdi-rss:before{content:"\F46B"}.mdi-rss-box:before{content:"\F46C"}.mdi-ruby:before{content:"\FD09"}.mdi-rugby:before{content:"\FD75"}.mdi-ruler:before{content:"\F46D"}.mdi-ruler-square:before{content:"\FC9E"}.mdi-run:before{content:"\F70D"}.mdi-run-fast:before{content:"\F46E"}.mdi-sack:before{content:"\FD0A"}.mdi-sack-percent:before{content:"\FD0B"}.mdi-safe:before{content:"\FA69"}.mdi-safety-goggles:before{content:"\FD0C"}.mdi-sale:before{content:"\F46F"}.mdi-salesforce:before{content:"\F88D"}.mdi-sass:before{content:"\F7EB"}.mdi-satellite:before{content:"\F470"}.mdi-satellite-uplink:before{content:"\F908"}.mdi-satellite-variant:before{content:"\F471"}.mdi-sausage:before{content:"\F8B9"}.mdi-saxophone:before{content:"\F609"}.mdi-scale:before{content:"\F472"}.mdi-scale-balance:before{content:"\F5D1"}.mdi-scale-bathroom:before{content:"\F473"}.mdi-scanner:before{content:"\F6AA"}.mdi-scanner-off:before{content:"\F909"}.mdi-school:before{content:"\F474"}.mdi-scissors-cutting:before{content:"\FA6A"}.mdi-screen-rotation:before{content:"\F475"}.mdi-screen-rotation-lock:before{content:"\F476"}.mdi-screw-flat-top:before{content:"\FDCF"}.mdi-screw-lag:before{content:"\FDD0"}.mdi-screw-machine-flat-top:before{content:"\FDD1"}.mdi-screw-machine-round-top:before{content:"\FDD2"}.mdi-screw-round-top:before{content:"\FDD3"}.mdi-screwdriver:before{content:"\F477"}.mdi-script:before{content:"\FB9D"}.mdi-script-outline:before{content:"\F478"}.mdi-script-text:before{content:"\FB9E"}.mdi-script-text-outline:before{content:"\FB9F"}.mdi-sd:before{content:"\F479"}.mdi-seal:before{content:"\F47A"}.mdi-search-web:before{content:"\F70E"}.mdi-seat:before{content:"\FC9F"}.mdi-seat-flat:before{content:"\F47B"}.mdi-seat-flat-angled:before{content:"\F47C"}.mdi-seat-individual-suite:before{content:"\F47D"}.mdi-seat-legroom-extra:before{content:"\F47E"}.mdi-seat-legroom-normal:before{content:"\F47F"}.mdi-seat-legroom-reduced:before{content:"\F480"}.mdi-seat-outline:before{content:"\FCA0"}.mdi-seat-recline-extra:before{content:"\F481"}.mdi-seat-recline-normal:before{content:"\F482"}.mdi-seatbelt:before{content:"\FCA1"}.mdi-security:before{content:"\F483"}.mdi-security-network:before{content:"\F484"}.mdi-select:before{content:"\F485"}.mdi-select-all:before{content:"\F486"}.mdi-select-color:before{content:"\FD0D"}.mdi-select-compare:before{content:"\FAD8"}.mdi-select-drag:before{content:"\FA6B"}.mdi-select-inverse:before{content:"\F487"}.mdi-select-off:before{content:"\F488"}.mdi-selection:before{content:"\F489"}.mdi-selection-drag:before{content:"\FA6C"}.mdi-selection-ellipse:before{content:"\FD0E"}.mdi-selection-off:before{content:"\F776"}.mdi-send:before{content:"\F48A"}.mdi-send-circle:before{content:"\FDD4"}.mdi-send-circle-outline:before{content:"\FDD5"}.mdi-send-lock:before{content:"\F7EC"}.mdi-serial-port:before{content:"\F65C"}.mdi-server:before{content:"\F48B"}.mdi-server-minus:before{content:"\F48C"}.mdi-server-network:before{content:"\F48D"}.mdi-server-network-off:before{content:"\F48E"}.mdi-server-off:before{content:"\F48F"}.mdi-server-plus:before{content:"\F490"}.mdi-server-remove:before{content:"\F491"}.mdi-server-security:before{content:"\F492"}.mdi-set-all:before{content:"\F777"}.mdi-set-center:before{content:"\F778"}.mdi-set-center-right:before{content:"\F779"}.mdi-set-left:before{content:"\F77A"}.mdi-set-left-center:before{content:"\F77B"}.mdi-set-left-right:before{content:"\F77C"}.mdi-set-none:before{content:"\F77D"}.mdi-set-right:before{content:"\F77E"}.mdi-set-top-box:before{content:"\F99E"}.mdi-settings:before{content:"\F493"}.mdi-settings-box:before{content:"\F494"}.mdi-settings-helper:before{content:"\FA6D"}.mdi-settings-outline:before{content:"\F8BA"}.mdi-shape:before{content:"\F830"}.mdi-shape-circle-plus:before{content:"\F65D"}.mdi-shape-outline:before{content:"\F831"}.mdi-shape-plus:before{content:"\F495"}.mdi-shape-polygon-plus:before{content:"\F65E"}.mdi-shape-rectangle-plus:before{content:"\F65F"}.mdi-shape-square-plus:before{content:"\F660"}.mdi-share:before{content:"\F496"}.mdi-share-outline:before{content:"\F931"}.mdi-share-variant:before{content:"\F497"}.mdi-sheep:before{content:"\FCA2"}.mdi-shield:before{content:"\F498"}.mdi-shield-account:before{content:"\F88E"}.mdi-shield-account-outline:before{content:"\FA11"}.mdi-shield-airplane:before{content:"\F6BA"}.mdi-shield-airplane-outline:before{content:"\FCA3"}.mdi-shield-check:before{content:"\F565"}.mdi-shield-check-outline:before{content:"\FCA4"}.mdi-shield-cross:before{content:"\FCA5"}.mdi-shield-cross-outline:before{content:"\FCA6"}.mdi-shield-half-full:before{content:"\F77F"}.mdi-shield-home:before{content:"\F689"}.mdi-shield-home-outline:before{content:"\FCA7"}.mdi-shield-key:before{content:"\FBA0"}.mdi-shield-key-outline:before{content:"\FBA1"}.mdi-shield-link-variant:before{content:"\FD0F"}.mdi-shield-link-variant-outline:before{content:"\FD10"}.mdi-shield-lock:before{content:"\F99C"}.mdi-shield-lock-outline:before{content:"\FCA8"}.mdi-shield-off:before{content:"\F99D"}.mdi-shield-off-outline:before{content:"\F99B"}.mdi-shield-outline:before{content:"\F499"}.mdi-shield-plus:before{content:"\FAD9"}.mdi-shield-plus-outline:before{content:"\FADA"}.mdi-shield-remove:before{content:"\FADB"}.mdi-shield-remove-outline:before{content:"\FADC"}.mdi-shield-search:before{content:"\FD76"}.mdi-ship-wheel:before{content:"\F832"}.mdi-shoe-formal:before{content:"\FB22"}.mdi-shoe-heel:before{content:"\FB23"}.mdi-shoe-print:before{content:"\FDD6"}.mdi-shopify:before{content:"\FADD"}.mdi-shopping:before{content:"\F49A"}.mdi-shopping-music:before{content:"\F49B"}.mdi-shovel:before{content:"\F70F"}.mdi-shovel-off:before{content:"\F710"}.mdi-shower:before{content:"\F99F"}.mdi-shower-head:before{content:"\F9A0"}.mdi-shredder:before{content:"\F49C"}.mdi-shuffle:before{content:"\F49D"}.mdi-shuffle-disabled:before{content:"\F49E"}.mdi-shuffle-variant:before{content:"\F49F"}.mdi-sigma:before{content:"\F4A0"}.mdi-sigma-lower:before{content:"\F62B"}.mdi-sign-caution:before{content:"\F4A1"}.mdi-sign-direction:before{content:"\F780"}.mdi-sign-text:before{content:"\F781"}.mdi-signal:before{content:"\F4A2"}.mdi-signal-2g:before{content:"\F711"}.mdi-signal-3g:before{content:"\F712"}.mdi-signal-4g:before{content:"\F713"}.mdi-signal-5g:before{content:"\FA6E"}.mdi-signal-cellular-1:before{content:"\F8BB"}.mdi-signal-cellular-2:before{content:"\F8BC"}.mdi-signal-cellular-3:before{content:"\F8BD"}.mdi-signal-cellular-outline:before{content:"\F8BE"}.mdi-signal-hspa:before{content:"\F714"}.mdi-signal-hspa-plus:before{content:"\F715"}.mdi-signal-off:before{content:"\F782"}.mdi-signal-variant:before{content:"\F60A"}.mdi-signature:before{content:"\FDD7"}.mdi-signature-freehand:before{content:"\FDD8"}.mdi-signature-image:before{content:"\FDD9"}.mdi-signature-text:before{content:"\FDDA"}.mdi-silo:before{content:"\FB24"}.mdi-silverware:before{content:"\F4A3"}.mdi-silverware-fork:before{content:"\F4A4"}.mdi-silverware-fork-knife:before{content:"\FA6F"}.mdi-silverware-spoon:before{content:"\F4A5"}.mdi-silverware-variant:before{content:"\F4A6"}.mdi-sim:before{content:"\F4A7"}.mdi-sim-alert:before{content:"\F4A8"}.mdi-sim-off:before{content:"\F4A9"}.mdi-sina-weibo:before{content:"\FADE"}.mdi-sitemap:before{content:"\F4AA"}.mdi-skate:before{content:"\FD11"}.mdi-skew-less:before{content:"\FD12"}.mdi-skew-more:before{content:"\FD13"}.mdi-skip-backward:before{content:"\F4AB"}.mdi-skip-forward:before{content:"\F4AC"}.mdi-skip-next:before{content:"\F4AD"}.mdi-skip-next-circle:before{content:"\F661"}.mdi-skip-next-circle-outline:before{content:"\F662"}.mdi-skip-previous:before{content:"\F4AE"}.mdi-skip-previous-circle:before{content:"\F663"}.mdi-skip-previous-circle-outline:before{content:"\F664"}.mdi-skull:before{content:"\F68B"}.mdi-skull-crossbones:before{content:"\FBA2"}.mdi-skull-crossbones-outline:before{content:"\FBA3"}.mdi-skull-outline:before{content:"\FBA4"}.mdi-skype:before{content:"\F4AF"}.mdi-skype-business:before{content:"\F4B0"}.mdi-slack:before{content:"\F4B1"}.mdi-slackware:before{content:"\F90A"}.mdi-sleep:before{content:"\F4B2"}.mdi-sleep-off:before{content:"\F4B3"}.mdi-slope-downhill:before{content:"\FDDB"}.mdi-slope-uphill:before{content:"\FDDC"}.mdi-smog:before{content:"\FA70"}.mdi-smoke-detector:before{content:"\F392"}.mdi-smoking:before{content:"\F4B4"}.mdi-smoking-off:before{content:"\F4B5"}.mdi-snapchat:before{content:"\F4B6"}.mdi-snowflake:before{content:"\F716"}.mdi-snowman:before{content:"\F4B7"}.mdi-soccer:before{content:"\F4B8"}.mdi-soccer-field:before{content:"\F833"}.mdi-sofa:before{content:"\F4B9"}.mdi-solar-panel:before{content:"\FD77"}.mdi-solar-panel-large:before{content:"\FD78"}.mdi-solar-power:before{content:"\FA71"}.mdi-solid:before{content:"\F68C"}.mdi-sort:before{content:"\F4BA"}.mdi-sort-alphabetical:before{content:"\F4BB"}.mdi-sort-ascending:before{content:"\F4BC"}.mdi-sort-descending:before{content:"\F4BD"}.mdi-sort-numeric:before{content:"\F4BE"}.mdi-sort-variant:before{content:"\F4BF"}.mdi-sort-variant-lock:before{content:"\FCA9"}.mdi-sort-variant-lock-open:before{content:"\FCAA"}.mdi-soundcloud:before{content:"\F4C0"}.mdi-source-branch:before{content:"\F62C"}.mdi-source-commit:before{content:"\F717"}.mdi-source-commit-end:before{content:"\F718"}.mdi-source-commit-end-local:before{content:"\F719"}.mdi-source-commit-local:before{content:"\F71A"}.mdi-source-commit-next-local:before{content:"\F71B"}.mdi-source-commit-start:before{content:"\F71C"}.mdi-source-commit-start-next-local:before{content:"\F71D"}.mdi-source-fork:before{content:"\F4C1"}.mdi-source-merge:before{content:"\F62D"}.mdi-source-pull:before{content:"\F4C2"}.mdi-source-repository:before{content:"\FCAB"}.mdi-source-repository-multiple:before{content:"\FCAC"}.mdi-soy-sauce:before{content:"\F7ED"}.mdi-spa:before{content:"\FCAD"}.mdi-spa-outline:before{content:"\FCAE"}.mdi-space-invaders:before{content:"\FBA5"}.mdi-speaker:before{content:"\F4C3"}.mdi-speaker-bluetooth:before{content:"\F9A1"}.mdi-speaker-multiple:before{content:"\FD14"}.mdi-speaker-off:before{content:"\F4C4"}.mdi-speaker-wireless:before{content:"\F71E"}.mdi-speedometer:before{content:"\F4C5"}.mdi-spellcheck:before{content:"\F4C6"}.mdi-spider-web:before{content:"\FBA6"}.mdi-spotify:before{content:"\F4C7"}.mdi-spotlight:before{content:"\F4C8"}.mdi-spotlight-beam:before{content:"\F4C9"}.mdi-spray:before{content:"\F665"}.mdi-spray-bottle:before{content:"\FADF"}.mdi-square:before{content:"\F763"}.mdi-square-edit-outline:before{content:"\F90B"}.mdi-square-inc:before{content:"\F4CA"}.mdi-square-inc-cash:before{content:"\F4CB"}.mdi-square-medium:before{content:"\FA12"}.mdi-square-medium-outline:before{content:"\FA13"}.mdi-square-outline:before{content:"\F762"}.mdi-square-root:before{content:"\F783"}.mdi-square-root-box:before{content:"\F9A2"}.mdi-square-small:before{content:"\FA14"}.mdi-squeegee:before{content:"\FAE0"}.mdi-ssh:before{content:"\F8BF"}.mdi-stack-exchange:before{content:"\F60B"}.mdi-stack-overflow:before{content:"\F4CC"}.mdi-stadium:before{content:"\F71F"}.mdi-stairs:before{content:"\F4CD"}.mdi-stamper:before{content:"\FD15"}.mdi-standard-definition:before{content:"\F7EE"}.mdi-star:before{content:"\F4CE"}.mdi-star-box:before{content:"\FA72"}.mdi-star-box-outline:before{content:"\FA73"}.mdi-star-circle:before{content:"\F4CF"}.mdi-star-circle-outline:before{content:"\F9A3"}.mdi-star-face:before{content:"\F9A4"}.mdi-star-four-points:before{content:"\FAE1"}.mdi-star-four-points-outline:before{content:"\FAE2"}.mdi-star-half:before{content:"\F4D0"}.mdi-star-off:before{content:"\F4D1"}.mdi-star-outline:before{content:"\F4D2"}.mdi-star-three-points:before{content:"\FAE3"}.mdi-star-three-points-outline:before{content:"\FAE4"}.mdi-steam:before{content:"\F4D3"}.mdi-steam-box:before{content:"\F90C"}.mdi-steering:before{content:"\F4D4"}.mdi-steering-off:before{content:"\F90D"}.mdi-step-backward:before{content:"\F4D5"}.mdi-step-backward-2:before{content:"\F4D6"}.mdi-step-forward:before{content:"\F4D7"}.mdi-step-forward-2:before{content:"\F4D8"}.mdi-stethoscope:before{content:"\F4D9"}.mdi-sticker:before{content:"\F5D0"}.mdi-sticker-emoji:before{content:"\F784"}.mdi-stocking:before{content:"\F4DA"}.mdi-stop:before{content:"\F4DB"}.mdi-stop-circle:before{content:"\F666"}.mdi-stop-circle-outline:before{content:"\F667"}.mdi-store:before{content:"\F4DC"}.mdi-store-24-hour:before{content:"\F4DD"}.mdi-stove:before{content:"\F4DE"}.mdi-strava:before{content:"\FB25"}.mdi-subdirectory-arrow-left:before{content:"\F60C"}.mdi-subdirectory-arrow-right:before{content:"\F60D"}.mdi-subtitles:before{content:"\FA15"}.mdi-subtitles-outline:before{content:"\FA16"}.mdi-subway:before{content:"\F6AB"}.mdi-subway-alert-variant:before{content:"\FD79"}.mdi-subway-variant:before{content:"\F4DF"}.mdi-summit:before{content:"\F785"}.mdi-sunglasses:before{content:"\F4E0"}.mdi-surround-sound:before{content:"\F5C5"}.mdi-surround-sound-2-0:before{content:"\F7EF"}.mdi-surround-sound-3-1:before{content:"\F7F0"}.mdi-surround-sound-5-1:before{content:"\F7F1"}.mdi-surround-sound-7-1:before{content:"\F7F2"}.mdi-svg:before{content:"\F720"}.mdi-swap-horizontal:before{content:"\F4E1"}.mdi-swap-horizontal-bold:before{content:"\FBA9"}.mdi-swap-horizontal-variant:before{content:"\F8C0"}.mdi-swap-vertical:before{content:"\F4E2"}.mdi-swap-vertical-bold:before{content:"\FBAA"}.mdi-swap-vertical-variant:before{content:"\F8C1"}.mdi-swim:before{content:"\F4E3"}.mdi-switch:before{content:"\F4E4"}.mdi-sword:before{content:"\F4E5"}.mdi-sword-cross:before{content:"\F786"}.mdi-symfony:before{content:"\FAE5"}.mdi-sync:before{content:"\F4E6"}.mdi-sync-alert:before{content:"\F4E7"}.mdi-sync-off:before{content:"\F4E8"}.mdi-tab:before{content:"\F4E9"}.mdi-tab-minus:before{content:"\FB26"}.mdi-tab-plus:before{content:"\F75B"}.mdi-tab-remove:before{content:"\FB27"}.mdi-tab-unselected:before{content:"\F4EA"}.mdi-table:before{content:"\F4EB"}.mdi-table-border:before{content:"\FA17"}.mdi-table-column:before{content:"\F834"}.mdi-table-column-plus-after:before{content:"\F4EC"}.mdi-table-column-plus-before:before{content:"\F4ED"}.mdi-table-column-remove:before{content:"\F4EE"}.mdi-table-column-width:before{content:"\F4EF"}.mdi-table-edit:before{content:"\F4F0"}.mdi-table-large:before{content:"\F4F1"}.mdi-table-merge-cells:before{content:"\F9A5"}.mdi-table-of-contents:before{content:"\F835"}.mdi-table-plus:before{content:"\FA74"}.mdi-table-remove:before{content:"\FA75"}.mdi-table-row:before{content:"\F836"}.mdi-table-row-height:before{content:"\F4F2"}.mdi-table-row-plus-after:before{content:"\F4F3"}.mdi-table-row-plus-before:before{content:"\F4F4"}.mdi-table-row-remove:before{content:"\F4F5"}.mdi-table-search:before{content:"\F90E"}.mdi-table-settings:before{content:"\F837"}.mdi-tablet:before{content:"\F4F6"}.mdi-tablet-android:before{content:"\F4F7"}.mdi-tablet-cellphone:before{content:"\F9A6"}.mdi-tablet-ipad:before{content:"\F4F8"}.mdi-taco:before{content:"\F761"}.mdi-tag:before{content:"\F4F9"}.mdi-tag-faces:before{content:"\F4FA"}.mdi-tag-heart:before{content:"\F68A"}.mdi-tag-heart-outline:before{content:"\FBAB"}.mdi-tag-minus:before{content:"\F90F"}.mdi-tag-multiple:before{content:"\F4FB"}.mdi-tag-outline:before{content:"\F4FC"}.mdi-tag-plus:before{content:"\F721"}.mdi-tag-remove:before{content:"\F722"}.mdi-tag-text-outline:before{content:"\F4FD"}.mdi-tank:before{content:"\FD16"}.mdi-tape-measure:before{content:"\FB28"}.mdi-target:before{content:"\F4FE"}.mdi-target-account:before{content:"\FBAC"}.mdi-target-variant:before{content:"\FA76"}.mdi-taxi:before{content:"\F4FF"}.mdi-tea:before{content:"\FD7A"}.mdi-tea-outline:before{content:"\FD7B"}.mdi-teach:before{content:"\F88F"}.mdi-teamviewer:before{content:"\F500"}.mdi-telegram:before{content:"\F501"}.mdi-telescope:before{content:"\FB29"}.mdi-television:before{content:"\F502"}.mdi-television-box:before{content:"\F838"}.mdi-television-classic:before{content:"\F7F3"}.mdi-television-classic-off:before{content:"\F839"}.mdi-television-guide:before{content:"\F503"}.mdi-television-off:before{content:"\F83A"}.mdi-temperature-celsius:before{content:"\F504"}.mdi-temperature-fahrenheit:before{content:"\F505"}.mdi-temperature-kelvin:before{content:"\F506"}.mdi-tennis:before{content:"\FD7C"}.mdi-tennis-ball:before{content:"\F507"}.mdi-tent:before{content:"\F508"}.mdi-terrain:before{content:"\F509"}.mdi-test-tube:before{content:"\F668"}.mdi-test-tube-empty:before{content:"\F910"}.mdi-test-tube-off:before{content:"\F911"}.mdi-text:before{content:"\F9A7"}.mdi-text-shadow:before{content:"\F669"}.mdi-text-short:before{content:"\F9A8"}.mdi-text-subject:before{content:"\F9A9"}.mdi-text-to-speech:before{content:"\F50A"}.mdi-text-to-speech-off:before{content:"\F50B"}.mdi-textbox:before{content:"\F60E"}.mdi-textbox-password:before{content:"\F7F4"}.mdi-texture:before{content:"\F50C"}.mdi-theater:before{content:"\F50D"}.mdi-theme-light-dark:before{content:"\F50E"}.mdi-thermometer:before{content:"\F50F"}.mdi-thermometer-alert:before{content:"\FDDD"}.mdi-thermometer-chevron-down:before{content:"\FDDE"}.mdi-thermometer-chevron-up:before{content:"\FDDF"}.mdi-thermometer-lines:before{content:"\F510"}.mdi-thermometer-minus:before{content:"\FDE0"}.mdi-thermometer-plus:before{content:"\FDE1"}.mdi-thermostat:before{content:"\F393"}.mdi-thermostat-box:before{content:"\F890"}.mdi-thought-bubble:before{content:"\F7F5"}.mdi-thought-bubble-outline:before{content:"\F7F6"}.mdi-thumb-down:before{content:"\F511"}.mdi-thumb-down-outline:before{content:"\F512"}.mdi-thumb-up:before{content:"\F513"}.mdi-thumb-up-outline:before{content:"\F514"}.mdi-thumbs-up-down:before{content:"\F515"}.mdi-ticket:before{content:"\F516"}.mdi-ticket-account:before{content:"\F517"}.mdi-ticket-confirmation:before{content:"\F518"}.mdi-ticket-outline:before{content:"\F912"}.mdi-ticket-percent:before{content:"\F723"}.mdi-tie:before{content:"\F519"}.mdi-tilde:before{content:"\F724"}.mdi-timelapse:before{content:"\F51A"}.mdi-timeline:before{content:"\FBAD"}.mdi-timeline-outline:before{content:"\FBAE"}.mdi-timeline-text:before{content:"\FBAF"}.mdi-timeline-text-outline:before{content:"\FBB0"}.mdi-timer:before{content:"\F51B"}.mdi-timer-10:before{content:"\F51C"}.mdi-timer-3:before{content:"\F51D"}.mdi-timer-off:before{content:"\F51E"}.mdi-timer-sand:before{content:"\F51F"}.mdi-timer-sand-empty:before{content:"\F6AC"}.mdi-timer-sand-full:before{content:"\F78B"}.mdi-timetable:before{content:"\F520"}.mdi-toaster-oven:before{content:"\FCAF"}.mdi-toggle-switch:before{content:"\F521"}.mdi-toggle-switch-off:before{content:"\F522"}.mdi-toggle-switch-off-outline:before{content:"\FA18"}.mdi-toggle-switch-outline:before{content:"\FA19"}.mdi-toilet:before{content:"\F9AA"}.mdi-toolbox:before{content:"\F9AB"}.mdi-toolbox-outline:before{content:"\F9AC"}.mdi-tooltip:before{content:"\F523"}.mdi-tooltip-account:before{content:"\F00C"}.mdi-tooltip-edit:before{content:"\F524"}.mdi-tooltip-image:before{content:"\F525"}.mdi-tooltip-image-outline:before{content:"\FBB1"}.mdi-tooltip-outline:before{content:"\F526"}.mdi-tooltip-plus:before{content:"\FBB2"}.mdi-tooltip-plus-outline:before{content:"\F527"}.mdi-tooltip-text:before{content:"\F528"}.mdi-tooltip-text-outline:before{content:"\FBB3"}.mdi-tooth:before{content:"\F8C2"}.mdi-tooth-outline:before{content:"\F529"}.mdi-tor:before{content:"\F52A"}.mdi-tortoise:before{content:"\FD17"}.mdi-tournament:before{content:"\F9AD"}.mdi-tower-beach:before{content:"\F680"}.mdi-tower-fire:before{content:"\F681"}.mdi-towing:before{content:"\F83B"}.mdi-track-light:before{content:"\F913"}.mdi-trackpad:before{content:"\F7F7"}.mdi-trackpad-lock:before{content:"\F932"}.mdi-tractor:before{content:"\F891"}.mdi-trademark:before{content:"\FA77"}.mdi-traffic-light:before{content:"\F52B"}.mdi-train:before{content:"\F52C"}.mdi-train-car:before{content:"\FBB4"}.mdi-train-variant:before{content:"\F8C3"}.mdi-tram:before{content:"\F52D"}.mdi-transcribe:before{content:"\F52E"}.mdi-transcribe-close:before{content:"\F52F"}.mdi-transfer-down:before{content:"\FD7D"}.mdi-transfer-left:before{content:"\FD7E"}.mdi-transfer-right:before{content:"\F530"}.mdi-transfer-up:before{content:"\FD7F"}.mdi-transit-connection:before{content:"\FD18"}.mdi-transit-connection-variant:before{content:"\FD19"}.mdi-transit-transfer:before{content:"\F6AD"}.mdi-transition:before{content:"\F914"}.mdi-transition-masked:before{content:"\F915"}.mdi-translate:before{content:"\F5CA"}.mdi-translate-off:before{content:"\FDE2"}.mdi-transmission-tower:before{content:"\FD1A"}.mdi-trash-can:before{content:"\FA78"}.mdi-trash-can-outline:before{content:"\FA79"}.mdi-treasure-chest:before{content:"\F725"}.mdi-tree:before{content:"\F531"}.mdi-trello:before{content:"\F532"}.mdi-trending-down:before{content:"\F533"}.mdi-trending-neutral:before{content:"\F534"}.mdi-trending-up:before{content:"\F535"}.mdi-triangle:before{content:"\F536"}.mdi-triangle-outline:before{content:"\F537"}.mdi-triforce:before{content:"\FBB5"}.mdi-trophy:before{content:"\F538"}.mdi-trophy-award:before{content:"\F539"}.mdi-trophy-broken:before{content:"\FD80"}.mdi-trophy-outline:before{content:"\F53A"}.mdi-trophy-variant:before{content:"\F53B"}.mdi-trophy-variant-outline:before{content:"\F53C"}.mdi-truck:before{content:"\F53D"}.mdi-truck-check:before{content:"\FCB0"}.mdi-truck-delivery:before{content:"\F53E"}.mdi-truck-fast:before{content:"\F787"}.mdi-truck-trailer:before{content:"\F726"}.mdi-tshirt-crew:before{content:"\FA7A"}.mdi-tshirt-crew-outline:before{content:"\F53F"}.mdi-tshirt-v:before{content:"\FA7B"}.mdi-tshirt-v-outline:before{content:"\F540"}.mdi-tumble-dryer:before{content:"\F916"}.mdi-tumblr:before{content:"\F541"}.mdi-tumblr-box:before{content:"\F917"}.mdi-tumblr-reblog:before{content:"\F542"}.mdi-tune:before{content:"\F62E"}.mdi-tune-vertical:before{content:"\F66A"}.mdi-turnstile:before{content:"\FCB1"}.mdi-turnstile-outline:before{content:"\FCB2"}.mdi-turtle:before{content:"\FCB3"}.mdi-twitch:before{content:"\F543"}.mdi-twitter:before{content:"\F544"}.mdi-twitter-box:before{content:"\F545"}.mdi-twitter-circle:before{content:"\F546"}.mdi-twitter-retweet:before{content:"\F547"}.mdi-two-factor-authentication:before{content:"\F9AE"}.mdi-uber:before{content:"\F748"}.mdi-ubisoft:before{content:"\FBB6"}.mdi-ubuntu:before{content:"\F548"}.mdi-ultra-high-definition:before{content:"\F7F8"}.mdi-umbraco:before{content:"\F549"}.mdi-umbrella:before{content:"\F54A"}.mdi-umbrella-closed:before{content:"\F9AF"}.mdi-umbrella-outline:before{content:"\F54B"}.mdi-undo:before{content:"\F54C"}.mdi-undo-variant:before{content:"\F54D"}.mdi-unfold-less-horizontal:before{content:"\F54E"}.mdi-unfold-less-vertical:before{content:"\F75F"}.mdi-unfold-more-horizontal:before{content:"\F54F"}.mdi-unfold-more-vertical:before{content:"\F760"}.mdi-ungroup:before{content:"\F550"}.mdi-unity:before{content:"\F6AE"}.mdi-unreal:before{content:"\F9B0"}.mdi-untappd:before{content:"\F551"}.mdi-update:before{content:"\F6AF"}.mdi-upload:before{content:"\F552"}.mdi-upload-multiple:before{content:"\F83C"}.mdi-upload-network:before{content:"\F6F5"}.mdi-upload-network-outline:before{content:"\FCB4"}.mdi-upload-outline:before{content:"\FDE3"}.mdi-usb:before{content:"\F553"}.mdi-van-passenger:before{content:"\F7F9"}.mdi-van-utility:before{content:"\F7FA"}.mdi-vanish:before{content:"\F7FB"}.mdi-variable:before{content:"\FAE6"}.mdi-vector-arrange-above:before{content:"\F554"}.mdi-vector-arrange-below:before{content:"\F555"}.mdi-vector-bezier:before{content:"\FAE7"}.mdi-vector-circle:before{content:"\F556"}.mdi-vector-circle-variant:before{content:"\F557"}.mdi-vector-combine:before{content:"\F558"}.mdi-vector-curve:before{content:"\F559"}.mdi-vector-difference:before{content:"\F55A"}.mdi-vector-difference-ab:before{content:"\F55B"}.mdi-vector-difference-ba:before{content:"\F55C"}.mdi-vector-ellipse:before{content:"\F892"}.mdi-vector-intersection:before{content:"\F55D"}.mdi-vector-line:before{content:"\F55E"}.mdi-vector-point:before{content:"\F55F"}.mdi-vector-polygon:before{content:"\F560"}.mdi-vector-polyline:before{content:"\F561"}.mdi-vector-radius:before{content:"\F749"}.mdi-vector-rectangle:before{content:"\F5C6"}.mdi-vector-selection:before{content:"\F562"}.mdi-vector-square:before{content:"\F001"}.mdi-vector-triangle:before{content:"\F563"}.mdi-vector-union:before{content:"\F564"}.mdi-venmo:before{content:"\F578"}.mdi-vhs:before{content:"\FA1A"}.mdi-vibrate:before{content:"\F566"}.mdi-vibrate-off:before{content:"\FCB5"}.mdi-video:before{content:"\F567"}.mdi-video-3d:before{content:"\F7FC"}.mdi-video-4k-box:before{content:"\F83D"}.mdi-video-account:before{content:"\F918"}.mdi-video-image:before{content:"\F919"}.mdi-video-input-antenna:before{content:"\F83E"}.mdi-video-input-component:before{content:"\F83F"}.mdi-video-input-hdmi:before{content:"\F840"}.mdi-video-input-svideo:before{content:"\F841"}.mdi-video-minus:before{content:"\F9B1"}.mdi-video-off:before{content:"\F568"}.mdi-video-off-outline:before{content:"\FBB7"}.mdi-video-outline:before{content:"\FBB8"}.mdi-video-plus:before{content:"\F9B2"}.mdi-video-stabilization:before{content:"\F91A"}.mdi-video-switch:before{content:"\F569"}.mdi-video-vintage:before{content:"\FA1B"}.mdi-view-agenda:before{content:"\F56A"}.mdi-view-array:before{content:"\F56B"}.mdi-view-carousel:before{content:"\F56C"}.mdi-view-column:before{content:"\F56D"}.mdi-view-dashboard:before{content:"\F56E"}.mdi-view-dashboard-outline:before{content:"\FA1C"}.mdi-view-dashboard-variant:before{content:"\F842"}.mdi-view-day:before{content:"\F56F"}.mdi-view-grid:before{content:"\F570"}.mdi-view-headline:before{content:"\F571"}.mdi-view-list:before{content:"\F572"}.mdi-view-module:before{content:"\F573"}.mdi-view-parallel:before{content:"\F727"}.mdi-view-quilt:before{content:"\F574"}.mdi-view-sequential:before{content:"\F728"}.mdi-view-split-horizontal:before{content:"\FBA7"}.mdi-view-split-vertical:before{content:"\FBA8"}.mdi-view-stream:before{content:"\F575"}.mdi-view-week:before{content:"\F576"}.mdi-vimeo:before{content:"\F577"}.mdi-violin:before{content:"\F60F"}.mdi-virtual-reality:before{content:"\F893"}.mdi-visual-studio:before{content:"\F610"}.mdi-visual-studio-code:before{content:"\FA1D"}.mdi-vk:before{content:"\F579"}.mdi-vk-box:before{content:"\F57A"}.mdi-vk-circle:before{content:"\F57B"}.mdi-vlc:before{content:"\F57C"}.mdi-voice:before{content:"\F5CB"}.mdi-voicemail:before{content:"\F57D"}.mdi-volleyball:before{content:"\F9B3"}.mdi-volume-high:before{content:"\F57E"}.mdi-volume-low:before{content:"\F57F"}.mdi-volume-medium:before{content:"\F580"}.mdi-volume-minus:before{content:"\F75D"}.mdi-volume-mute:before{content:"\F75E"}.mdi-volume-off:before{content:"\F581"}.mdi-volume-plus:before{content:"\F75C"}.mdi-volume-variant-off:before{content:"\FDE4"}.mdi-vote:before{content:"\FA1E"}.mdi-vote-outline:before{content:"\FA1F"}.mdi-vpn:before{content:"\F582"}.mdi-vuejs:before{content:"\F843"}.mdi-walk:before{content:"\F583"}.mdi-wall:before{content:"\F7FD"}.mdi-wall-sconce:before{content:"\F91B"}.mdi-wall-sconce-flat:before{content:"\F91C"}.mdi-wall-sconce-variant:before{content:"\F91D"}.mdi-wallet:before{content:"\F584"}.mdi-wallet-giftcard:before{content:"\F585"}.mdi-wallet-membership:before{content:"\F586"}.mdi-wallet-outline:before{content:"\FBB9"}.mdi-wallet-travel:before{content:"\F587"}.mdi-wallpaper:before{content:"\FDE5"}.mdi-wan:before{content:"\F588"}.mdi-washing-machine:before{content:"\F729"}.mdi-watch:before{content:"\F589"}.mdi-watch-export:before{content:"\F58A"}.mdi-watch-export-variant:before{content:"\F894"}.mdi-watch-import:before{content:"\F58B"}.mdi-watch-import-variant:before{content:"\F895"}.mdi-watch-variant:before{content:"\F896"}.mdi-watch-vibrate:before{content:"\F6B0"}.mdi-watch-vibrate-off:before{content:"\FCB6"}.mdi-water:before{content:"\F58C"}.mdi-water-off:before{content:"\F58D"}.mdi-water-outline:before{content:"\FDE6"}.mdi-water-percent:before{content:"\F58E"}.mdi-water-pump:before{content:"\F58F"}.mdi-watermark:before{content:"\F612"}.mdi-waves:before{content:"\F78C"}.mdi-waze:before{content:"\FBBA"}.mdi-weather-cloudy:before{content:"\F590"}.mdi-weather-fog:before{content:"\F591"}.mdi-weather-hail:before{content:"\F592"}.mdi-weather-hurricane:before{content:"\F897"}.mdi-weather-lightning:before{content:"\F593"}.mdi-weather-lightning-rainy:before{content:"\F67D"}.mdi-weather-night:before{content:"\F594"}.mdi-weather-partlycloudy:before{content:"\F595"}.mdi-weather-pouring:before{content:"\F596"}.mdi-weather-rainy:before{content:"\F597"}.mdi-weather-snowy:before{content:"\F598"}.mdi-weather-snowy-rainy:before{content:"\F67E"}.mdi-weather-sunny:before{content:"\F599"}.mdi-weather-sunset:before{content:"\F59A"}.mdi-weather-sunset-down:before{content:"\F59B"}.mdi-weather-sunset-up:before{content:"\F59C"}.mdi-weather-windy:before{content:"\F59D"}.mdi-weather-windy-variant:before{content:"\F59E"}.mdi-web:before{content:"\F59F"}.mdi-webcam:before{content:"\F5A0"}.mdi-webhook:before{content:"\F62F"}.mdi-webpack:before{content:"\F72A"}.mdi-wechat:before{content:"\F611"}.mdi-weight:before{content:"\F5A1"}.mdi-weight-gram:before{content:"\FD1B"}.mdi-weight-kilogram:before{content:"\F5A2"}.mdi-weight-pound:before{content:"\F9B4"}.mdi-whatsapp:before{content:"\F5A3"}.mdi-wheelchair-accessibility:before{content:"\F5A4"}.mdi-whistle:before{content:"\F9B5"}.mdi-white-balance-auto:before{content:"\F5A5"}.mdi-white-balance-incandescent:before{content:"\F5A6"}.mdi-white-balance-iridescent:before{content:"\F5A7"}.mdi-white-balance-sunny:before{content:"\F5A8"}.mdi-widgets:before{content:"\F72B"}.mdi-wifi:before{content:"\F5A9"}.mdi-wifi-off:before{content:"\F5AA"}.mdi-wifi-star:before{content:"\FDE7"}.mdi-wifi-strength-1:before{content:"\F91E"}.mdi-wifi-strength-1-alert:before{content:"\F91F"}.mdi-wifi-strength-1-lock:before{content:"\F920"}.mdi-wifi-strength-2:before{content:"\F921"}.mdi-wifi-strength-2-alert:before{content:"\F922"}.mdi-wifi-strength-2-lock:before{content:"\F923"}.mdi-wifi-strength-3:before{content:"\F924"}.mdi-wifi-strength-3-alert:before{content:"\F925"}.mdi-wifi-strength-3-lock:before{content:"\F926"}.mdi-wifi-strength-4:before{content:"\F927"}.mdi-wifi-strength-4-alert:before{content:"\F928"}.mdi-wifi-strength-4-lock:before{content:"\F929"}.mdi-wifi-strength-alert-outline:before{content:"\F92A"}.mdi-wifi-strength-lock-outline:before{content:"\F92B"}.mdi-wifi-strength-off:before{content:"\F92C"}.mdi-wifi-strength-off-outline:before{content:"\F92D"}.mdi-wifi-strength-outline:before{content:"\F92E"}.mdi-wii:before{content:"\F5AB"}.mdi-wiiu:before{content:"\F72C"}.mdi-wikipedia:before{content:"\F5AC"}.mdi-wind-turbine:before{content:"\FD81"}.mdi-window-close:before{content:"\F5AD"}.mdi-window-closed:before{content:"\F5AE"}.mdi-window-maximize:before{content:"\F5AF"}.mdi-window-minimize:before{content:"\F5B0"}.mdi-window-open:before{content:"\F5B1"}.mdi-window-restore:before{content:"\F5B2"}.mdi-windows:before{content:"\F5B3"}.mdi-windows-classic:before{content:"\FA20"}.mdi-wiper:before{content:"\FAE8"}.mdi-wiper-wash:before{content:"\FD82"}.mdi-wordpress:before{content:"\F5B4"}.mdi-worker:before{content:"\F5B5"}.mdi-wrap:before{content:"\F5B6"}.mdi-wrap-disabled:before{content:"\FBBB"}.mdi-wrench:before{content:"\F5B7"}.mdi-wrench-outline:before{content:"\FBBC"}.mdi-wunderlist:before{content:"\F5B8"}.mdi-xamarin:before{content:"\F844"}.mdi-xamarin-outline:before{content:"\F845"}.mdi-xaml:before{content:"\F673"}.mdi-xbox:before{content:"\F5B9"}.mdi-xbox-controller:before{content:"\F5BA"}.mdi-xbox-controller-battery-alert:before{content:"\F74A"}.mdi-xbox-controller-battery-charging:before{content:"\FA21"}.mdi-xbox-controller-battery-empty:before{content:"\F74B"}.mdi-xbox-controller-battery-full:before{content:"\F74C"}.mdi-xbox-controller-battery-low:before{content:"\F74D"}.mdi-xbox-controller-battery-medium:before{content:"\F74E"}.mdi-xbox-controller-battery-unknown:before{content:"\F74F"}.mdi-xbox-controller-off:before{content:"\F5BB"}.mdi-xda:before{content:"\F5BC"}.mdi-xing:before{content:"\F5BD"}.mdi-xing-box:before{content:"\F5BE"}.mdi-xing-circle:before{content:"\F5BF"}.mdi-xml:before{content:"\F5C0"}.mdi-xmpp:before{content:"\F7FE"}.mdi-yahoo:before{content:"\FB2A"}.mdi-yammer:before{content:"\F788"}.mdi-yeast:before{content:"\F5C1"}.mdi-yelp:before{content:"\F5C2"}.mdi-yin-yang:before{content:"\F67F"}.mdi-youtube:before{content:"\F5C3"}.mdi-youtube-creator-studio:before{content:"\F846"}.mdi-youtube-gaming:before{content:"\F847"}.mdi-youtube-subscription:before{content:"\FD1C"}.mdi-youtube-tv:before{content:"\F448"}.mdi-z-wave:before{content:"\FAE9"}.mdi-zend:before{content:"\FAEA"}.mdi-zigbee:before{content:"\FD1D"}.mdi-zip-box:before{content:"\F5C4"}.mdi-zip-disk:before{content:"\FA22"}.mdi-zodiac-aquarius:before{content:"\FA7C"}.mdi-zodiac-aries:before{content:"\FA7D"}.mdi-zodiac-cancer:before{content:"\FA7E"}.mdi-zodiac-capricorn:before{content:"\FA7F"}.mdi-zodiac-gemini:before{content:"\FA80"}.mdi-zodiac-leo:before{content:"\FA81"}.mdi-zodiac-libra:before{content:"\FA82"}.mdi-zodiac-pisces:before{content:"\FA83"}.mdi-zodiac-sagittarius:before{content:"\FA84"}.mdi-zodiac-scorpio:before{content:"\FA85"}.mdi-zodiac-taurus:before{content:"\FA86"}.mdi-zodiac-virgo:before{content:"\FA87"}.mdi-blank:before{content:"\F68C";visibility:hidden}.mdi-18px.mdi-set,.mdi-18px.mdi:before{font-size:18px}.mdi-24px.mdi-set,.mdi-24px.mdi:before{font-size:24px}.mdi-36px.mdi-set,.mdi-36px.mdi:before{font-size:36px}.mdi-48px.mdi-set,.mdi-48px.mdi:before{font-size:48px}.mdi-dark:before{color:rgba(0,0,0,0.54)}.mdi-dark.mdi-inactive:before{color:rgba(0,0,0,0.26)}.mdi-light:before{color:#fff}.mdi-light.mdi-inactive:before{color:rgba(255,255,255,0.3)}.mdi-rotate-45:before{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.mdi-rotate-90:before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.mdi-rotate-135:before{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg)}.mdi-rotate-180:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.mdi-rotate-225:before{-webkit-transform:rotate(225deg);-ms-transform:rotate(225deg);transform:rotate(225deg)}.mdi-rotate-270:before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.mdi-rotate-315:before{-webkit-transform:rotate(315deg);-ms-transform:rotate(315deg);transform:rotate(315deg)}.mdi-flip-h:before{-webkit-transform:scaleX(-1);transform:scaleX(-1);filter:FlipH;-ms-filter:"FlipH"}.mdi-flip-v:before{-webkit-transform:scaleY(-1);transform:scaleY(-1);filter:FlipV;-ms-filter:"FlipV"}.mdi-spin:before{-webkit-animation:mdi-spin 2s infinite linear;animation:mdi-spin 2s infinite linear}@-webkit-keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes mdi-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
+/*# sourceMappingURL=materialdesignicons.min.css.map */
diff --git a/community_server/webroot/css/normalize.css b/community_server/webroot/css/normalize.css
new file mode 100644
index 000000000..b0c1902dc
--- /dev/null
+++ b/community_server/webroot/css/normalize.css
@@ -0,0 +1,349 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/* Sections
+ ========================================================================== */
+
+/**
+ * Remove the margin in all browsers.
+ */
+
+body {
+ margin: 0;
+}
+
+/**
+ * Render the `main` element consistently in IE.
+ */
+
+main {
+ display: block;
+}
+
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/* Grouping content
+ ========================================================================== */
+
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+
+/* Text-level semantics
+ ========================================================================== */
+
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+
+a {
+ background-color: transparent;
+}
+
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+}
+
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+code,
+kbd,
+samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+}
+
+/**
+ * Add the correct font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/* Embedded content
+ ========================================================================== */
+
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+
+img {
+ border-style: none;
+}
+
+/* Forms
+ ========================================================================== */
+
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+}
+
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+button,
+input { /* 1 */
+ overflow: visible;
+}
+
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+button,
+select { /* 1 */
+ text-transform: none;
+}
+
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+
+/**
+ * Correct the padding in Firefox.
+ */
+
+fieldset {
+ padding: 0.35em 0.75em 0.625em;
+}
+
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+}
+
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+progress {
+ vertical-align: baseline;
+}
+
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+textarea {
+ overflow: auto;
+}
+
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+[type="checkbox"],
+[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+}
+
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+}
+
+/* Interactive
+ ========================================================================== */
+
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+details {
+ display: block;
+}
+
+/*
+ * Add the correct display in all browsers.
+ */
+
+summary {
+ display: list-item;
+}
+
+/* Misc
+ ========================================================================== */
+
+/**
+ * Add the correct display in IE 10+.
+ */
+
+template {
+ display: none;
+}
+
+/**
+ * Add the correct display in IE 10.
+ */
+
+[hidden] {
+ display: none;
+}
\ No newline at end of file
diff --git a/community_server/webroot/css/rippleUI/style.css b/community_server/webroot/css/rippleUI/style.css
new file mode 100644
index 000000000..8ba93da24
--- /dev/null
+++ b/community_server/webroot/css/rippleUI/style.css
@@ -0,0 +1,14705 @@
+.animated {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both
+}
+
+.animated.infinite {
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite
+}
+
+@-webkit-keyframes fadeIn {
+ from {
+ opacity: 0
+ }
+
+ to {
+ opacity: 1
+ }
+
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0
+ }
+
+ to {
+ opacity: 1
+ }
+
+}
+
+.fadeIn {
+ -webkit-animation-name: fadeIn;
+ animation-name: fadeIn
+}
+
+@-webkit-keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none
+ }
+
+}
+
+@keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none
+ }
+
+}
+
+.fadeInDown {
+ -webkit-animation-name: fadeInDown;
+ animation-name: fadeInDown
+}
+
+@-webkit-keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0)
+ }
+
+}
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0)
+ }
+
+}
+
+.fadeInUp {
+ -webkit-animation-name: fadeInUp;
+ animation-name: fadeInUp
+}
+
+@-webkit-keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+@keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+.zoomIn {
+ -webkit-animation-name: zoomIn;
+ animation-name: zoomIn
+}
+
+@keyframes bounceIn {
+ 20%,
+ 40%,
+ 60%,
+ 80%,
+ from,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+ animation-timing-function: cubic-bezier(.215, .61, .355, 1)
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.4, 1.4, 1.4);
+ transform: scale3d(1.4, 1.4, 1.4)
+ }
+
+ 40% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9)
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03)
+ }
+
+ 80% {
+ -webkit-transform: scale3d(.97, .97, .97);
+ transform: scale3d(.97, .97, .97)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1)
+ }
+
+}
+
+@-webkit-keyframes rotate360 {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ -webkit-transform-origin: center;
+ transform-origin: center
+ }
+
+}
+
+@keyframes rotate360 {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg);
+ -webkit-transform-origin: center;
+ transform-origin: center
+ }
+
+}
+
+@-webkit-keyframes bounceIn {
+ 20%,
+ 40%,
+ 60%,
+ 80%,
+ from,
+ to {
+ -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+ animation-timing-function: cubic-bezier(.215, .61, .355, 1)
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3)
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.4, 1.4, 1.4);
+ transform: scale3d(1.4, 1.4, 1.4)
+ }
+
+ 40% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9)
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03)
+ }
+
+ 80% {
+ -webkit-transform: scale3d(.97, .97, .97);
+ transform: scale3d(.97, .97, .97)
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1)
+ }
+
+}
+
+@-webkit-keyframes ripple {
+ 0%,
+ 35% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ opacity: 1
+ }
+
+ 50% {
+ -webkit-transform: scale(.6);
+ transform: scale(.6);
+ opacity: .8
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2)
+ }
+
+}
+
+@keyframes ripple {
+ 0%,
+ 35% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ opacity: 1
+ }
+
+ 50% {
+ -webkit-transform: scale(.6);
+ transform: scale(.6);
+ opacity: .8
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2)
+ }
+
+}
+
+@font-face {
+ font-family: Roboto;
+ src: url(../../fonts/Roboto/Roboto-Thin.ttf);
+ font-weight: 100
+}
+
+@font-face {
+ font-family: Roboto;
+ src: url(../../fonts/Roboto/Roboto-Light.ttf);
+ font-weight: 300
+}
+
+@font-face {
+ font-family: Roboto;
+ src: url(../../fonts/Roboto/Roboto-Regular.ttf);
+ font-weight: 400
+}
+
+@font-face {
+ font-family: Roboto;
+ src: url(../../fonts/Roboto/Roboto-Medium.ttf);
+ font-weight: 500
+}
+
+@font-face {
+ font-family: Roboto;
+ src: url(../../fonts/Roboto/Roboto-Bold.ttf);
+ font-weight: 700
+}
+
+.bg-inverse-primary {
+ background: rgba(4, 112, 6, .2)
+}
+
+.bg-inverse-secondary {
+ background: rgba(128, 128, 128, .2)
+}
+
+.bg-inverse-success {
+ background: rgba(0, 224, 147, .2)
+}
+
+.bg-inverse-info {
+ background: rgba(108, 97, 246, .2)
+}
+
+.bg-inverse-warning {
+ background: rgba(240, 130, 95, .2)
+}
+
+.bg-inverse-danger {
+ background: rgba(255, 95, 102, .2)
+}
+
+.bg-inverse-light {
+ background: rgba(223, 223, 223, .2)
+}
+
+.bg-inverse-dark {
+ background: rgba(116, 118, 123, .2)
+}
+
+.bg-inverse-white {
+ background: rgba(255, 255, 255, .2)
+}
+
+/*!
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+:root {
+ --blue: #007bff;
+ --indigo: #6610f2;
+ --purple: #6f42c1;
+ --pink: #e83e8c;
+ --red: #dc3545;
+ --orange: #fd7e14;
+ --yellow: #ffc107;
+ --green: #28a745;
+ --teal: #20c997;
+ --cyan: #17a2b8;
+ --white: #fff;
+ --gray: #6c757d;
+ --gray-dark: #343a40;
+ --primary: #047006;
+ --secondary: grey;
+ --success: #047006;
+ --info: #6c61f6;
+ --warning: #f0825f;
+ --danger: #ff5f66;
+ --light: #dfdfdf;
+ --dark: #74767b;
+ --white: #fff;
+ --breakpoint-xs: 0;
+ --breakpoint-sm: 576px;
+ --breakpoint-md: 768px;
+ --breakpoint-lg: 992px;
+ --breakpoint-xl: 1200px;
+ --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace
+}
+
+*,
+::after,
+::before {
+ box-sizing: border-box
+}
+
+html {
+ font-family: sans-serif;
+ line-height: 1.15;
+ -webkit-text-size-adjust: 100%;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0)
+}
+
+article,
+aside,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section {
+ display: block
+}
+
+body {
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.7;
+ color: #212529;
+ text-align: left;
+ background-color: #fff
+}
+
+[tabindex="-1"]:focus {
+ outline: 0 !important
+}
+
+hr {
+ box-sizing: content-box;
+ height: 0;
+ overflow: visible
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-top: 0;
+ margin-bottom: .5rem
+}
+
+p {
+ margin-top: 0;
+ margin-bottom: 1rem
+}
+
+abbr[data-original-title],
+abbr[title] {
+ text-decoration: underline;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+ cursor: help;
+ border-bottom: 0;
+ text-decoration-skip-ink: none
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit
+}
+
+dl,
+ol,
+ul {
+ margin-top: 0;
+ margin-bottom: 1rem
+}
+
+ol ol,
+ol ul,
+ul ol,
+ul ul {
+ margin-bottom: 0
+}
+
+dt {
+ font-weight: 700
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0
+}
+
+blockquote {
+ margin: 0 0 1rem
+}
+
+b,
+strong {
+ font-weight: bolder
+}
+
+small {
+ font-size: 80%
+}
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline
+}
+
+sub {
+ bottom: -.25em
+}
+
+sup {
+ top: -.5em
+}
+
+a {
+ color: #047006;
+ text-decoration: none;
+ background-color: transparent
+}
+
+a:hover {
+ color: #012602;
+ text-decoration: underline
+}
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none
+}
+
+a:not([href]):not([tabindex]):focus,
+a:not([href]):not([tabindex]):hover {
+ color: inherit;
+ text-decoration: none
+}
+
+a:not([href]):not([tabindex]):focus {
+ outline: 0
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ font-size: 1em
+}
+
+pre {
+ margin-top: 0;
+ margin-bottom: 1rem;
+ overflow: auto
+}
+
+figure {
+ margin: 0 0 1rem
+}
+
+img {
+ vertical-align: middle;
+ border-style: none
+}
+
+svg {
+ overflow: hidden;
+ vertical-align: middle
+}
+
+table {
+ border-collapse: collapse
+}
+
+caption {
+ padding-top: 10px 15px;
+ padding-bottom: 10px 15px;
+ color: #6c757d;
+ text-align: left;
+ caption-side: bottom
+}
+
+th {
+ text-align: inherit
+}
+
+label {
+ display: inline-block;
+ margin-bottom: .5rem
+}
+
+button {
+ border-radius: 0
+}
+
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ margin: 0;
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit
+}
+
+button,
+input {
+ overflow: visible
+}
+
+button,
+select {
+ text-transform: none
+}
+
+select {
+ word-wrap: normal
+}
+
+[type=button],
+[type=reset],
+[type=submit],
+button {
+ -webkit-appearance: button
+}
+
+[type=button]:not(:disabled),
+[type=reset]:not(:disabled),
+[type=submit]:not(:disabled),
+button:not(:disabled) {
+ cursor: pointer
+}
+
+[type=button]::-moz-focus-inner,
+[type=reset]::-moz-focus-inner,
+[type=submit]::-moz-focus-inner,
+button::-moz-focus-inner {
+ padding: 0;
+ border-style: none
+}
+
+input[type=checkbox],
+input[type=radio] {
+ box-sizing: border-box;
+ padding: 0
+}
+
+input[type=date],
+input[type=datetime-local],
+input[type=month],
+input[type=time] {
+ -webkit-appearance: listbox
+}
+
+textarea {
+ overflow: auto;
+ resize: vertical
+}
+
+fieldset {
+ min-width: 0;
+ padding: 0;
+ margin: 0;
+ border: 0
+}
+
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%;
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit;
+ white-space: normal
+}
+
+progress {
+ vertical-align: baseline
+}
+
+[type=number]::-webkit-inner-spin-button,
+[type=number]::-webkit-outer-spin-button {
+ height: auto
+}
+
+[type=search] {
+ outline-offset: -2px;
+ -webkit-appearance: none
+}
+
+[type=search]::-webkit-search-decoration {
+ -webkit-appearance: none
+}
+
+::-webkit-file-upload-button {
+ font: inherit;
+ -webkit-appearance: button
+}
+
+output {
+ display: inline-block
+}
+
+summary {
+ display: list-item;
+ cursor: pointer
+}
+
+template {
+ display: none
+}
+
+[hidden] {
+ display: none !important
+}
+
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ margin-bottom: .5rem;
+ font-weight: 500;
+ line-height: 1.2
+}
+
+.h1,
+h1 {
+ font-size: 2.5rem
+}
+
+.h2,
+h2 {
+ font-size: 2rem
+}
+
+.h3,
+h3 {
+ font-size: 1.75rem
+}
+
+.h4,
+h4 {
+ font-size: 1.5rem
+}
+
+.h5,
+h5 {
+ font-size: 1.25rem
+}
+
+.h6,
+h6 {
+ font-size: 1rem
+}
+
+.lead {
+ font-size: 1.25rem;
+ font-weight: 300
+}
+
+.display-1 {
+ font-size: 6rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+.display-2 {
+ font-size: 5.5rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+.display-3 {
+ font-size: 4.5rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+.display-4 {
+ font-size: 3.5rem;
+ font-weight: 300;
+ line-height: 1.2
+}
+
+hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: 1px solid rgba(0, 0, 0, .1)
+}
+
+.small,
+small {
+ font-size: 80%;
+ font-weight: 400
+}
+
+.mark,
+mark {
+ padding: .2em;
+ background-color: #fcf8e3
+}
+
+.list-unstyled {
+ padding-left: 0;
+ list-style: none
+}
+
+.list-inline {
+ padding-left: 0;
+ list-style: none
+}
+
+.list-inline-item {
+ display: inline-block
+}
+
+.list-inline-item:not(:last-child) {
+ margin-right: .5rem
+}
+
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase
+}
+
+.blockquote {
+ margin-bottom: 1rem;
+ font-size: 1.25rem
+}
+
+.blockquote-footer {
+ display: block;
+ font-size: 80%;
+ color: #6c757d
+}
+
+.blockquote-footer::before {
+ content: "\2014\00A0"
+}
+
+.img-fluid {
+ max-width: 100%;
+ height: auto
+}
+
+.img-thumbnail {
+ padding: .25rem;
+ background-color: #fff;
+ border: 1px solid #dee2e6;
+ border-radius: .25rem;
+ max-width: 100%;
+ height: auto
+}
+
+.figure {
+ display: inline-block
+}
+
+.figure-img {
+ margin-bottom: .5rem;
+ line-height: 1
+}
+
+.figure-caption {
+ font-size: 90%;
+ color: #6c757d
+}
+
+code {
+ font-size: 90%;
+ color: #bd4147;
+ word-break: break-word
+}
+
+a>code {
+ color: inherit
+}
+
+kbd {
+ padding: .2rem .4rem;
+ font-size: 87.5%;
+ color: #fff;
+ background-color: #212529;
+ border-radius: .2rem
+}
+
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ font-weight: 700
+}
+
+pre {
+ display: block;
+ font-size: 90%;
+ color: #212529
+}
+
+pre code {
+ font-size: inherit;
+ color: inherit;
+ word-break: normal
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll
+}
+
+.container {
+ width: 100%;
+ padding-right: 10px;
+ padding-left: 10px;
+ margin-right: auto;
+ margin-left: auto
+}
+
+@media (min-width:576px) {
+ .container {
+ max-width: 540px
+ }
+
+}
+
+@media (min-width:768px) {
+ .container {
+ max-width: 720px
+ }
+
+}
+
+@media (min-width:992px) {
+ .container {
+ max-width: 960px
+ }
+
+}
+
+@media (min-width:1200px) {
+ .container {
+ max-width: 1140px
+ }
+
+}
+
+.container-fluid {
+ width: 100%;
+ padding-right: 10px;
+ padding-left: 10px;
+ margin-right: auto;
+ margin-left: auto
+}
+
+.row {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -10px;
+ margin-left: -10px
+}
+
+.no-gutters {
+ margin-right: 0;
+ margin-left: 0
+}
+
+.no-gutters>.col,
+.no-gutters>[class*=col-] {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.col,
+.col-1,
+.col-10,
+.col-11,
+.col-12,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-auto,
+.col-lg,
+.col-lg-1,
+.col-lg-10,
+.col-lg-11,
+.col-lg-12,
+.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-auto,
+.col-md,
+.col-md-1,
+.col-md-10,
+.col-md-11,
+.col-md-12,
+.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-auto,
+.col-sm,
+.col-sm-1,
+.col-sm-10,
+.col-sm-11,
+.col-sm-12,
+.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-auto,
+.col-xl,
+.col-xl-1,
+.col-xl-10,
+.col-xl-11,
+.col-xl-12,
+.col-xl-2,
+.col-xl-3,
+.col-xl-4,
+.col-xl-5,
+.col-xl-6,
+.col-xl-7,
+.col-xl-8,
+.col-xl-9,
+.col-xl-auto {
+ position: relative;
+ width: 100%;
+ padding-right: 10px;
+ padding-left: 10px
+}
+
+.col {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+}
+
+.col-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+}
+
+.col-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+}
+
+.col-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+}
+
+.col-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+}
+
+.col-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+}
+
+.col-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+}
+
+.col-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+}
+
+.col-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+}
+
+.col-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+}
+
+.col-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+}
+
+.col-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+}
+
+.col-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+}
+
+.col-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+}
+
+.order-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+}
+
+.order-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+}
+
+.order-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+}
+
+.order-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+}
+
+.order-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+}
+
+.order-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+}
+
+.order-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+}
+
+.order-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+}
+
+.order-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+}
+
+.order-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+}
+
+.order-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+}
+
+.order-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+}
+
+.order-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+}
+
+.order-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+}
+
+.order-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+}
+
+.offset-1 {
+ margin-left: 8.33333%
+}
+
+.offset-2 {
+ margin-left: 16.66667%
+}
+
+.offset-3 {
+ margin-left: 25%
+}
+
+.offset-4 {
+ margin-left: 33.33333%
+}
+
+.offset-5 {
+ margin-left: 41.66667%
+}
+
+.offset-6 {
+ margin-left: 50%
+}
+
+.offset-7 {
+ margin-left: 58.33333%
+}
+
+.offset-8 {
+ margin-left: 66.66667%
+}
+
+.offset-9 {
+ margin-left: 75%
+}
+
+.offset-10 {
+ margin-left: 83.33333%
+}
+
+.offset-11 {
+ margin-left: 91.66667%
+}
+
+@media (min-width:576px) {
+ .col-sm {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-sm-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-sm-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-sm-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-sm-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-sm-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-sm-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-sm-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-sm-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-sm-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-sm-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-sm-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-sm-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-sm-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-sm-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-sm-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-sm-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-sm-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-sm-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-sm-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-sm-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-sm-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-sm-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-sm-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-sm-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-sm-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-sm-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-sm-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-sm-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-sm-0 {
+ margin-left: 0
+ }
+
+ .offset-sm-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-sm-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-sm-3 {
+ margin-left: 25%
+ }
+
+ .offset-sm-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-sm-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-sm-6 {
+ margin-left: 50%
+ }
+
+ .offset-sm-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-sm-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-sm-9 {
+ margin-left: 75%
+ }
+
+ .offset-sm-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-sm-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+@media (min-width:768px) {
+ .col-md {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-md-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-md-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-md-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-md-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-md-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-md-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-md-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-md-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-md-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-md-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-md-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-md-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-md-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-md-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-md-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-md-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-md-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-md-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-md-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-md-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-md-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-md-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-md-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-md-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-md-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-md-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-md-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-md-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-md-0 {
+ margin-left: 0
+ }
+
+ .offset-md-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-md-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-md-3 {
+ margin-left: 25%
+ }
+
+ .offset-md-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-md-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-md-6 {
+ margin-left: 50%
+ }
+
+ .offset-md-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-md-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-md-9 {
+ margin-left: 75%
+ }
+
+ .offset-md-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-md-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+@media (min-width:992px) {
+ .col-lg {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-lg-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-lg-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-lg-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-lg-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-lg-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-lg-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-lg-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-lg-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-lg-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-lg-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-lg-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-lg-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-lg-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-lg-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-lg-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-lg-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-lg-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-lg-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-lg-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-lg-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-lg-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-lg-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-lg-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-lg-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-lg-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-lg-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-lg-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-lg-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-lg-0 {
+ margin-left: 0
+ }
+
+ .offset-lg-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-lg-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-lg-3 {
+ margin-left: 25%
+ }
+
+ .offset-lg-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-lg-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-lg-6 {
+ margin-left: 50%
+ }
+
+ .offset-lg-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-lg-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-lg-9 {
+ margin-left: 75%
+ }
+
+ .offset-lg-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-lg-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+@media (min-width:1200px) {
+ .col-xl {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ max-width: 100%
+ }
+
+ .col-xl-auto {
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ width: auto;
+ max-width: 100%
+ }
+
+ .col-xl-1 {
+ -webkit-box-flex: 0;
+ flex: 0 0 8.33333%;
+ max-width: 8.33333%
+ }
+
+ .col-xl-2 {
+ -webkit-box-flex: 0;
+ flex: 0 0 16.66667%;
+ max-width: 16.66667%
+ }
+
+ .col-xl-3 {
+ -webkit-box-flex: 0;
+ flex: 0 0 25%;
+ max-width: 25%
+ }
+
+ .col-xl-4 {
+ -webkit-box-flex: 0;
+ flex: 0 0 33.33333%;
+ max-width: 33.33333%
+ }
+
+ .col-xl-5 {
+ -webkit-box-flex: 0;
+ flex: 0 0 41.66667%;
+ max-width: 41.66667%
+ }
+
+ .col-xl-6 {
+ -webkit-box-flex: 0;
+ flex: 0 0 50%;
+ max-width: 50%
+ }
+
+ .col-xl-7 {
+ -webkit-box-flex: 0;
+ flex: 0 0 58.33333%;
+ max-width: 58.33333%
+ }
+
+ .col-xl-8 {
+ -webkit-box-flex: 0;
+ flex: 0 0 66.66667%;
+ max-width: 66.66667%
+ }
+
+ .col-xl-9 {
+ -webkit-box-flex: 0;
+ flex: 0 0 75%;
+ max-width: 75%
+ }
+
+ .col-xl-10 {
+ -webkit-box-flex: 0;
+ flex: 0 0 83.33333%;
+ max-width: 83.33333%
+ }
+
+ .col-xl-11 {
+ -webkit-box-flex: 0;
+ flex: 0 0 91.66667%;
+ max-width: 91.66667%
+ }
+
+ .col-xl-12 {
+ -webkit-box-flex: 0;
+ flex: 0 0 100%;
+ max-width: 100%
+ }
+
+ .order-xl-first {
+ -webkit-box-ordinal-group: 0;
+ order: -1
+ }
+
+ .order-xl-last {
+ -webkit-box-ordinal-group: 14;
+ order: 13
+ }
+
+ .order-xl-0 {
+ -webkit-box-ordinal-group: 1;
+ order: 0
+ }
+
+ .order-xl-1 {
+ -webkit-box-ordinal-group: 2;
+ order: 1
+ }
+
+ .order-xl-2 {
+ -webkit-box-ordinal-group: 3;
+ order: 2
+ }
+
+ .order-xl-3 {
+ -webkit-box-ordinal-group: 4;
+ order: 3
+ }
+
+ .order-xl-4 {
+ -webkit-box-ordinal-group: 5;
+ order: 4
+ }
+
+ .order-xl-5 {
+ -webkit-box-ordinal-group: 6;
+ order: 5
+ }
+
+ .order-xl-6 {
+ -webkit-box-ordinal-group: 7;
+ order: 6
+ }
+
+ .order-xl-7 {
+ -webkit-box-ordinal-group: 8;
+ order: 7
+ }
+
+ .order-xl-8 {
+ -webkit-box-ordinal-group: 9;
+ order: 8
+ }
+
+ .order-xl-9 {
+ -webkit-box-ordinal-group: 10;
+ order: 9
+ }
+
+ .order-xl-10 {
+ -webkit-box-ordinal-group: 11;
+ order: 10
+ }
+
+ .order-xl-11 {
+ -webkit-box-ordinal-group: 12;
+ order: 11
+ }
+
+ .order-xl-12 {
+ -webkit-box-ordinal-group: 13;
+ order: 12
+ }
+
+ .offset-xl-0 {
+ margin-left: 0
+ }
+
+ .offset-xl-1 {
+ margin-left: 8.33333%
+ }
+
+ .offset-xl-2 {
+ margin-left: 16.66667%
+ }
+
+ .offset-xl-3 {
+ margin-left: 25%
+ }
+
+ .offset-xl-4 {
+ margin-left: 33.33333%
+ }
+
+ .offset-xl-5 {
+ margin-left: 41.66667%
+ }
+
+ .offset-xl-6 {
+ margin-left: 50%
+ }
+
+ .offset-xl-7 {
+ margin-left: 58.33333%
+ }
+
+ .offset-xl-8 {
+ margin-left: 66.66667%
+ }
+
+ .offset-xl-9 {
+ margin-left: 75%
+ }
+
+ .offset-xl-10 {
+ margin-left: 83.33333%
+ }
+
+ .offset-xl-11 {
+ margin-left: 91.66667%
+ }
+
+}
+
+.table {
+ width: 100%;
+ margin-bottom: 1rem;
+ color: #212529
+}
+
+.table td,
+.table th {
+ padding: 10px 15px;
+ vertical-align: top;
+ border-top: 1px solid #f2f4f9
+}
+
+.table thead th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #f2f4f9
+}
+
+.table tbody+tbody {
+ border-top: 2px solid #f2f4f9
+}
+
+.table-sm td,
+.table-sm th {
+ padding: 10px 15px
+}
+
+.table-bordered {
+ border: 1px solid #f2f4f9
+}
+
+.table-bordered td,
+.table-bordered th {
+ border: 1px solid #f2f4f9
+}
+
+.table-bordered thead td,
+.table-bordered thead th {
+ border-bottom-width: 2px
+}
+
+.table-borderless tbody+tbody,
+.table-borderless td,
+.table-borderless th,
+.table-borderless thead th {
+ border: 0
+}
+
+.table-striped tbody tr:nth-of-type(odd) {
+ background-color: #f6f7f9
+}
+
+.table-hover tbody tr:hover {
+ color: #212529;
+ background-color: #f6f7f9
+}
+
+.table-primary,
+.table-primary>td,
+.table-primary>th {
+ background-color: #b9d7b9
+}
+
+.table-primary tbody+tbody,
+.table-primary td,
+.table-primary th,
+.table-primary thead th {
+ border-color: #7cb57e
+}
+
+.table-hover .table-primary:hover {
+ background-color: #a9cea9
+}
+
+.table-hover .table-primary:hover>td,
+.table-hover .table-primary:hover>th {
+ background-color: #a9cea9
+}
+
+.table-secondary,
+.table-secondary>td,
+.table-secondary>th {
+ background-color: #dbdbdb
+}
+
+.table-secondary tbody+tbody,
+.table-secondary td,
+.table-secondary th,
+.table-secondary thead th {
+ border-color: #bdbdbd
+}
+
+.table-hover .table-secondary:hover {
+ background-color: #cecece
+}
+
+.table-hover .table-secondary:hover>td,
+.table-hover .table-secondary:hover>th {
+ background-color: #cecece
+}
+
+.table-success,
+.table-success>td,
+.table-success>th {
+ background-color: #b8f6e1
+}
+
+.table-success tbody+tbody,
+.table-success td,
+.table-success th,
+.table-success thead th {
+ border-color: #7aefc7
+}
+
+.table-hover .table-success:hover {
+ background-color: #a1f3d7
+}
+
+.table-hover .table-success:hover>td,
+.table-hover .table-success:hover>th {
+ background-color: #a1f3d7
+}
+
+.table-info,
+.table-info>td,
+.table-info>th {
+ background-color: #d6d3fc
+}
+
+.table-info tbody+tbody,
+.table-info td,
+.table-info th,
+.table-info thead th {
+ border-color: #b3adfa
+}
+
+.table-hover .table-info:hover {
+ background-color: #c0bbfa
+}
+
+.table-hover .table-info:hover>td,
+.table-hover .table-info:hover>th {
+ background-color: #c0bbfa
+}
+
+.table-warning,
+.table-warning>td,
+.table-warning>th {
+ background-color: #fbdcd2
+}
+
+.table-warning tbody+tbody,
+.table-warning td,
+.table-warning th,
+.table-warning thead th {
+ border-color: #f7beac
+}
+
+.table-hover .table-warning:hover {
+ background-color: #f9cabb
+}
+
+.table-hover .table-warning:hover>td,
+.table-hover .table-warning:hover>th {
+ background-color: #f9cabb
+}
+
+.table-danger,
+.table-danger>td,
+.table-danger>th {
+ background-color: #ffd2d4
+}
+
+.table-danger tbody+tbody,
+.table-danger td,
+.table-danger th,
+.table-danger thead th {
+ border-color: #ffacaf
+}
+
+.table-hover .table-danger:hover {
+ background-color: #ffb9bc
+}
+
+.table-hover .table-danger:hover>td,
+.table-hover .table-danger:hover>th {
+ background-color: #ffb9bc
+}
+
+.table-light,
+.table-light>td,
+.table-light>th {
+ background-color: #f6f6f6
+}
+
+.table-light tbody+tbody,
+.table-light td,
+.table-light th,
+.table-light thead th {
+ border-color: #eee
+}
+
+.table-hover .table-light:hover {
+ background-color: #e9e9e9
+}
+
+.table-hover .table-light:hover>td,
+.table-hover .table-light:hover>th {
+ background-color: #e9e9e9
+}
+
+.table-dark,
+.table-dark>td,
+.table-dark>th {
+ background-color: #d8d9da
+}
+
+.table-dark tbody+tbody,
+.table-dark td,
+.table-dark th,
+.table-dark thead th {
+ border-color: #b7b8ba
+}
+
+.table-hover .table-dark:hover {
+ background-color: #cbccce
+}
+
+.table-hover .table-dark:hover>td,
+.table-hover .table-dark:hover>th {
+ background-color: #cbccce
+}
+
+.table-white,
+.table-white>td,
+.table-white>th {
+ background-color: #fff
+}
+
+.table-white tbody+tbody,
+.table-white td,
+.table-white th,
+.table-white thead th {
+ border-color: #fff
+}
+
+.table-hover .table-white:hover {
+ background-color: #f2f2f2
+}
+
+.table-hover .table-white:hover>td,
+.table-hover .table-white:hover>th {
+ background-color: #f2f2f2
+}
+
+.table-active,
+.table-active>td,
+.table-active>th {
+ background-color: rgba(0, 0, 0, .075)
+}
+
+.table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, .075)
+}
+
+.table-hover .table-active:hover>td,
+.table-hover .table-active:hover>th {
+ background-color: rgba(0, 0, 0, .075)
+}
+
+.table .thead-dark th {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #454d55
+}
+
+.table .thead-light th {
+ color: #495057;
+ background-color: #e1e4e6;
+ border-color: #f2f4f9
+}
+
+.table-dark {
+ color: #fff;
+ background-color: #343a40
+}
+
+.table-dark td,
+.table-dark th,
+.table-dark thead th {
+ border-color: #454d55
+}
+
+.table-dark.table-bordered {
+ border: 0
+}
+
+.table-dark.table-striped tbody tr:nth-of-type(odd) {
+ background-color: rgba(255, 255, 255, .05)
+}
+
+.table-dark.table-hover tbody tr:hover {
+ color: #fff;
+ background-color: rgba(255, 255, 255, .075)
+}
+
+@media (max-width:575.98px) {
+ .table-responsive-sm {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-sm>.table-bordered {
+ border: 0
+ }
+
+}
+
+@media (max-width:767.98px) {
+ .table-responsive-md {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-md>.table-bordered {
+ border: 0
+ }
+
+}
+
+@media (max-width:991.98px) {
+ .table-responsive-lg {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-lg>.table-bordered {
+ border: 0
+ }
+
+}
+
+@media (max-width:1199.98px) {
+ .table-responsive-xl {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+ }
+
+ .table-responsive-xl>.table-bordered {
+ border: 0
+ }
+
+}
+
+.table-responsive {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch
+}
+
+.table-responsive>.table-bordered {
+ border: 0
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ padding: .375rem .75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #6c757d;
+ background-color: #f6f7f9;
+ background-clip: padding-box;
+ border: 1px solid #f0f2f5;
+ border-radius: .25rem;
+ -webkit-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .form-control {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.form-control::-ms-expand {
+ background-color: transparent;
+ border: 0
+}
+
+.form-control:focus {
+ color: #495057;
+ background-color: #f6f7f9;
+ border-color: #d7dee5;
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.form-control::-webkit-input-placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control::-moz-placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control::-ms-input-placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control::placeholder {
+ color: #6c757d;
+ opacity: 1
+}
+
+.form-control:disabled,
+.form-control[readonly] {
+ background-color: #f8f9fa;
+ opacity: 1
+}
+
+select.form-control:focus::-ms-value {
+ color: #6c757d;
+ background-color: #f6f7f9
+}
+
+.form-control-file,
+.form-control-range {
+ display: block;
+ width: 100%
+}
+
+.col-form-label {
+ padding-top: calc(.375rem + 1px);
+ padding-bottom: calc(.375rem + 1px);
+ margin-bottom: 0;
+ font-size: inherit;
+ line-height: 1.5
+}
+
+.col-form-label-lg {
+ padding-top: calc(.5rem + 1px);
+ padding-bottom: calc(.5rem + 1px);
+ font-size: 1.25rem;
+ line-height: 1.5
+}
+
+.col-form-label-sm {
+ padding-top: calc(.25rem + 1px);
+ padding-bottom: calc(.25rem + 1px);
+ font-size: .875rem;
+ line-height: 1.5
+}
+
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding-top: .375rem;
+ padding-bottom: .375rem;
+ margin-bottom: 0;
+ line-height: 1.5;
+ color: #212529;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: 1px 0
+}
+
+.form-control-plaintext.form-control-lg,
+.form-control-plaintext.form-control-sm {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.form-control-sm {
+ height: calc(1.5em + .5rem + 2px);
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem
+}
+
+.form-control-lg {
+ height: calc(1.5em + 1rem + 2px);
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem
+}
+
+select.form-control[multiple],
+select.form-control[size] {
+ height: auto
+}
+
+textarea.form-control {
+ height: auto
+}
+
+.form-group {
+ margin-bottom: 1rem
+}
+
+.form-text {
+ display: block;
+ margin-top: .25rem
+}
+
+.form-row {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px
+}
+
+.form-row>.col,
+.form-row>[class*=col-] {
+ padding-right: 5px;
+ padding-left: 5px
+}
+
+.form-check {
+ position: relative;
+ display: block;
+ padding-left: 1.25rem
+}
+
+.form-check-input {
+ position: absolute;
+ margin-top: .3rem;
+ margin-left: -1.25rem
+}
+
+.form-check-input:disabled~.form-check-label {
+ color: #adb5bd
+}
+
+.form-check-label {
+ margin-bottom: 0
+}
+
+.form-check-inline {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ -webkit-box-align: center;
+ align-items: center;
+ padding-left: 0;
+ margin-right: .75rem
+}
+
+.form-check-inline .form-check-input {
+ position: static;
+ margin-top: 0;
+ margin-right: .3125rem;
+ margin-left: 0
+}
+
+.valid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: .25rem;
+ font-size: 80%;
+ color: #28a745
+}
+
+.valid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: .25rem .5rem;
+ margin-top: .1rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ color: #fff;
+ background-color: rgba(40, 167, 69, .9);
+ border-radius: .25rem
+}
+
+.form-control.is-valid,
+.was-validated .form-control:valid {
+ border-color: #28a745;
+ padding-right: calc(1.5em + .75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e");
+ background-repeat: no-repeat;
+ background-position: center right calc(.375em + .1875rem);
+ background-size: calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.form-control.is-valid:focus,
+.was-validated .form-control:valid:focus {
+ border-color: #28a745;
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.form-control.is-valid~.valid-feedback,
+.form-control.is-valid~.valid-tooltip,
+.was-validated .form-control:valid~.valid-feedback,
+.was-validated .form-control:valid~.valid-tooltip {
+ display: block
+}
+
+.was-validated textarea.form-control:valid,
+textarea.form-control.is-valid {
+ padding-right: calc(1.5em + .75rem);
+ background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem)
+}
+
+.custom-select.is-valid,
+.was-validated .custom-select:valid {
+ border-color: #28a745;
+ padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem);
+ background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.custom-select.is-valid:focus,
+.was-validated .custom-select:valid:focus {
+ border-color: #28a745;
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.custom-select.is-valid~.valid-feedback,
+.custom-select.is-valid~.valid-tooltip,
+.was-validated .custom-select:valid~.valid-feedback,
+.was-validated .custom-select:valid~.valid-tooltip {
+ display: block
+}
+
+.form-control-file.is-valid~.valid-feedback,
+.form-control-file.is-valid~.valid-tooltip,
+.was-validated .form-control-file:valid~.valid-feedback,
+.was-validated .form-control-file:valid~.valid-tooltip {
+ display: block
+}
+
+.form-check-input.is-valid~.form-check-label,
+.was-validated .form-check-input:valid~.form-check-label {
+ color: #28a745
+}
+
+.form-check-input.is-valid~.valid-feedback,
+.form-check-input.is-valid~.valid-tooltip,
+.was-validated .form-check-input:valid~.valid-feedback,
+.was-validated .form-check-input:valid~.valid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-valid~.custom-control-label,
+.was-validated .custom-control-input:valid~.custom-control-label {
+ color: #28a745
+}
+
+.custom-control-input.is-valid~.custom-control-label::before,
+.was-validated .custom-control-input:valid~.custom-control-label::before {
+ border-color: #28a745
+}
+
+.custom-control-input.is-valid~.valid-feedback,
+.custom-control-input.is-valid~.valid-tooltip,
+.was-validated .custom-control-input:valid~.valid-feedback,
+.was-validated .custom-control-input:valid~.valid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-valid:checked~.custom-control-label::before,
+.was-validated .custom-control-input:valid:checked~.custom-control-label::before {
+ border-color: #34ce57;
+ background-color: #34ce57
+}
+
+.custom-control-input.is-valid:focus~.custom-control-label::before,
+.was-validated .custom-control-input:valid:focus~.custom-control-label::before {
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label::before,
+.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label::before {
+ border-color: #28a745
+}
+
+.custom-file-input.is-valid~.custom-file-label,
+.was-validated .custom-file-input:valid~.custom-file-label {
+ border-color: #28a745
+}
+
+.custom-file-input.is-valid~.valid-feedback,
+.custom-file-input.is-valid~.valid-tooltip,
+.was-validated .custom-file-input:valid~.valid-feedback,
+.was-validated .custom-file-input:valid~.valid-tooltip {
+ display: block
+}
+
+.custom-file-input.is-valid:focus~.custom-file-label,
+.was-validated .custom-file-input:valid:focus~.custom-file-label {
+ border-color: #28a745;
+ box-shadow: 0 0 0 .2rem rgba(40, 167, 69, .25)
+}
+
+.invalid-feedback {
+ display: none;
+ width: 100%;
+ margin-top: .25rem;
+ font-size: 80%;
+ color: #dc3545
+}
+
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%;
+ padding: .25rem .5rem;
+ margin-top: .1rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ color: #fff;
+ background-color: rgba(220, 53, 69, .9);
+ border-radius: .25rem
+}
+
+.form-control.is-invalid,
+.was-validated .form-control:invalid {
+ border-color: #dc3545;
+ padding-right: calc(1.5em + .75rem);
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E");
+ background-repeat: no-repeat;
+ background-position: center right calc(.375em + .1875rem);
+ background-size: calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.form-control.is-invalid:focus,
+.was-validated .form-control:invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.form-control.is-invalid~.invalid-feedback,
+.form-control.is-invalid~.invalid-tooltip,
+.was-validated .form-control:invalid~.invalid-feedback,
+.was-validated .form-control:invalid~.invalid-tooltip {
+ display: block
+}
+
+.was-validated textarea.form-control:invalid,
+textarea.form-control.is-invalid {
+ padding-right: calc(1.5em + .75rem);
+ background-position: top calc(.375em + .1875rem) right calc(.375em + .1875rem)
+}
+
+.custom-select.is-invalid,
+.was-validated .custom-select:invalid {
+ border-color: #dc3545;
+ padding-right: calc((1em + .75rem) * 3 / 4 + 1.75rem);
+ background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3ccircle r=!string!/%3e%3ccircle cx=!string!r=!string!/%3e%3ccircle cy=!string!r=!string!/%3e%3ccircle cx=!string!cy=!string!r=!string!/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem)
+}
+
+.custom-select.is-invalid:focus,
+.was-validated .custom-select:invalid:focus {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.custom-select.is-invalid~.invalid-feedback,
+.custom-select.is-invalid~.invalid-tooltip,
+.was-validated .custom-select:invalid~.invalid-feedback,
+.was-validated .custom-select:invalid~.invalid-tooltip {
+ display: block
+}
+
+.form-control-file.is-invalid~.invalid-feedback,
+.form-control-file.is-invalid~.invalid-tooltip,
+.was-validated .form-control-file:invalid~.invalid-feedback,
+.was-validated .form-control-file:invalid~.invalid-tooltip {
+ display: block
+}
+
+.form-check-input.is-invalid~.form-check-label,
+.was-validated .form-check-input:invalid~.form-check-label {
+ color: #dc3545
+}
+
+.form-check-input.is-invalid~.invalid-feedback,
+.form-check-input.is-invalid~.invalid-tooltip,
+.was-validated .form-check-input:invalid~.invalid-feedback,
+.was-validated .form-check-input:invalid~.invalid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-invalid~.custom-control-label,
+.was-validated .custom-control-input:invalid~.custom-control-label {
+ color: #dc3545
+}
+
+.custom-control-input.is-invalid~.custom-control-label::before,
+.was-validated .custom-control-input:invalid~.custom-control-label::before {
+ border-color: #dc3545
+}
+
+.custom-control-input.is-invalid~.invalid-feedback,
+.custom-control-input.is-invalid~.invalid-tooltip,
+.was-validated .custom-control-input:invalid~.invalid-feedback,
+.was-validated .custom-control-input:invalid~.invalid-tooltip {
+ display: block
+}
+
+.custom-control-input.is-invalid:checked~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:checked~.custom-control-label::before {
+ border-color: #e4606d;
+ background-color: #e4606d
+}
+
+.custom-control-input.is-invalid:focus~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:focus~.custom-control-label::before {
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label::before,
+.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label::before {
+ border-color: #dc3545
+}
+
+.custom-file-input.is-invalid~.custom-file-label,
+.was-validated .custom-file-input:invalid~.custom-file-label {
+ border-color: #dc3545
+}
+
+.custom-file-input.is-invalid~.invalid-feedback,
+.custom-file-input.is-invalid~.invalid-tooltip,
+.was-validated .custom-file-input:invalid~.invalid-feedback,
+.was-validated .custom-file-input:invalid~.invalid-tooltip {
+ display: block
+}
+
+.custom-file-input.is-invalid:focus~.custom-file-label,
+.was-validated .custom-file-input:invalid:focus~.custom-file-label {
+ border-color: #dc3545;
+ box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .25)
+}
+
+.form-inline {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.form-inline .form-check {
+ width: 100%
+}
+
+@media (min-width:576px) {
+ .form-inline label {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ margin-bottom: 0
+ }
+
+ .form-inline .form-group {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-flex: 0;
+ flex: 0 0 auto;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap;
+ -webkit-box-align: center;
+ align-items: center;
+ margin-bottom: 0
+ }
+
+ .form-inline .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle
+ }
+
+ .form-inline .form-control-plaintext {
+ display: inline-block
+ }
+
+ .form-inline .custom-select,
+ .form-inline .input-group {
+ width: auto
+ }
+
+ .form-inline .form-check {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ width: auto;
+ padding-left: 0
+ }
+
+ .form-inline .form-check-input {
+ position: relative;
+ flex-shrink: 0;
+ margin-top: 0;
+ margin-right: .25rem;
+ margin-left: 0
+ }
+
+ .form-inline .custom-control {
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center
+ }
+
+ .form-inline .custom-control-label {
+ margin-bottom: 0
+ }
+
+}
+
+.btn {
+ display: inline-block;
+ font-weight: 400;
+ color: #212529;
+ text-align: center;
+ vertical-align: middle;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ background-color: transparent;
+ border: 1px solid transparent;
+ padding: .375rem .75rem;
+ font-size: 1rem;
+ line-height: 1.5;
+ border-radius: .25rem;
+ -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .btn {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.btn:hover {
+ color: #212529;
+ text-decoration: none
+}
+
+.btn.focus,
+.btn:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.btn.disabled,
+.btn:disabled {
+ opacity: .65
+}
+
+a.btn.disabled,
+fieldset:disabled a.btn {
+ pointer-events: none
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-primary:hover {
+ color: #fff;
+ background-color: #034b04;
+ border-color: #023f03
+}
+
+.btn-primary.focus,
+.btn-primary:focus {
+ box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5)
+}
+
+.btn-primary.disabled,
+.btn-primary:disabled {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-primary:not(:disabled):not(.disabled).active,
+.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #023f03;
+ border-color: #023203
+}
+
+.btn-primary:not(:disabled):not(.disabled).active:focus,
+.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(42, 133, 43, .5)
+}
+
+.btn-secondary {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-secondary:hover {
+ color: #fff;
+ background-color: #6d6d6d;
+ border-color: #676767
+}
+
+.btn-secondary.focus,
+.btn-secondary:focus {
+ box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5)
+}
+
+.btn-secondary.disabled,
+.btn-secondary:disabled {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-secondary:not(:disabled):not(.disabled).active,
+.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: #676767;
+ border-color: #606060
+}
+
+.btn-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(147, 147, 147, .5)
+}
+
+.btn-success {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-success:hover {
+ color: #fff;
+ background-color: #00ba7a;
+ border-color: #00ad72
+}
+
+.btn-success.focus,
+.btn-success:focus {
+ box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5)
+}
+
+.btn-success.disabled,
+.btn-success:disabled {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-success:not(:disabled):not(.disabled).active,
+.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #00ad72;
+ border-color: #00a069
+}
+
+.btn-success:not(:disabled):not(.disabled).active:focus,
+.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(38, 229, 163, .5)
+}
+
+.btn-info {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-info:hover {
+ color: #fff;
+ background-color: #4a3df4;
+ border-color: #3f31f3
+}
+
+.btn-info.focus,
+.btn-info:focus {
+ box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5)
+}
+
+.btn-info.disabled,
+.btn-info:disabled {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-info:not(:disabled):not(.disabled).active,
+.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #3f31f3;
+ border-color: #3425f3
+}
+
+.btn-info:not(:disabled):not(.disabled).active:focus,
+.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(130, 121, 247, .5)
+}
+
+.btn-warning {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-warning:hover {
+ color: #fff;
+ background-color: #ed673c;
+ border-color: #ec5e30
+}
+
+.btn-warning.focus,
+.btn-warning:focus {
+ box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5)
+}
+
+.btn-warning.disabled,
+.btn-warning:disabled {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-warning:not(:disabled):not(.disabled).active,
+.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec5e30;
+ border-color: #eb5425
+}
+
+.btn-warning:not(:disabled):not(.disabled).active:focus,
+.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(209, 116, 87, .5)
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-danger:hover {
+ color: #fff;
+ background-color: #ff3941;
+ border-color: #ff2c35
+}
+
+.btn-danger.focus,
+.btn-danger:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5)
+}
+
+.btn-danger.disabled,
+.btn-danger:disabled {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-danger:not(:disabled):not(.disabled).active,
+.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #ff2c35;
+ border-color: #ff1f29
+}
+
+.btn-danger:not(:disabled):not(.disabled).active:focus,
+.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 119, 125, .5)
+}
+
+.btn-light {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-light:hover {
+ color: #212529;
+ background-color: #ccc;
+ border-color: #c6c6c6
+}
+
+.btn-light.focus,
+.btn-light:focus {
+ box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5)
+}
+
+.btn-light.disabled,
+.btn-light:disabled {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-light:not(:disabled):not(.disabled).active,
+.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle {
+ color: #212529;
+ background-color: #c6c6c6;
+ border-color: #bfbfbf
+}
+
+.btn-light:not(:disabled):not(.disabled).active:focus,
+.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(195, 195, 196, .5)
+}
+
+.btn-dark {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-dark:hover {
+ color: #fff;
+ background-color: #616367;
+ border-color: #5b5d61
+}
+
+.btn-dark.focus,
+.btn-dark:focus {
+ box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5)
+}
+
+.btn-dark.disabled,
+.btn-dark:disabled {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-dark:not(:disabled):not(.disabled).active,
+.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #5b5d61;
+ border-color: #55575a
+}
+
+.btn-dark:not(:disabled):not(.disabled).active:focus,
+.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(137, 139, 143, .5)
+}
+
+.btn-white {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-white:hover {
+ color: #212529;
+ background-color: #ececec;
+ border-color: #e6e6e6
+}
+
+.btn-white.focus,
+.btn-white:focus {
+ box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5)
+}
+
+.btn-white.disabled,
+.btn-white:disabled {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-white:not(:disabled):not(.disabled).active,
+.btn-white:not(:disabled):not(.disabled):active,.show>.btn-white.dropdown-toggle {
+ color: #212529;
+ background-color: #e6e6e6;
+ border-color: #dfdfdf
+}
+
+.btn-white:not(:disabled):not(.disabled).active:focus,
+.btn-white:not(:disabled):not(.disabled):active:focus,.show>.btn-white.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(222, 222, 223, .5)
+}
+
+.btn-outline-primary {
+ color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-primary:hover {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-primary.focus,
+.btn-outline-primary:focus {
+ box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5)
+}
+
+.btn-outline-primary.disabled,
+.btn-outline-primary:disabled {
+ color: #047006;
+ background-color: transparent
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled).active,
+.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-primary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5)
+}
+
+.btn-outline-secondary {
+ color: grey;
+ border-color: grey
+}
+
+.btn-outline-secondary:hover {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-outline-secondary.focus,
+.btn-outline-secondary:focus {
+ box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5)
+}
+
+.btn-outline-secondary.disabled,
+.btn-outline-secondary:disabled {
+ color: grey;
+ background-color: transparent
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active,
+.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle {
+ color: #fff;
+ background-color: grey;
+ border-color: grey
+}
+
+.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
+.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5)
+}
+
+.btn-outline-success {
+ color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-success:hover {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-success.focus,
+.btn-outline-success:focus {
+ box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5)
+}
+
+.btn-outline-success.disabled,
+.btn-outline-success:disabled {
+ color: #047006;
+ background-color: transparent
+}
+
+.btn-outline-success:not(:disabled):not(.disabled).active,
+.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle {
+ color: #fff;
+ background-color: #047006;
+ border-color: #047006
+}
+
+.btn-outline-success:not(:disabled):not(.disabled).active:focus,
+.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5)
+}
+
+.btn-outline-info {
+ color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-outline-info:hover {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-outline-info.focus,
+.btn-outline-info:focus {
+ box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5)
+}
+
+.btn-outline-info.disabled,
+.btn-outline-info:disabled {
+ color: #6c61f6;
+ background-color: transparent
+}
+
+.btn-outline-info:not(:disabled):not(.disabled).active,
+.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle {
+ color: #fff;
+ background-color: #6c61f6;
+ border-color: #6c61f6
+}
+
+.btn-outline-info:not(:disabled):not(.disabled).active:focus,
+.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5)
+}
+
+.btn-outline-warning {
+ color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-outline-warning:hover {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-outline-warning.focus,
+.btn-outline-warning:focus {
+ box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5)
+}
+
+.btn-outline-warning.disabled,
+.btn-outline-warning:disabled {
+ color: #f0825f;
+ background-color: transparent
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled).active,
+.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle {
+ color: #212529;
+ background-color: #f0825f;
+ border-color: #f0825f
+}
+
+.btn-outline-warning:not(:disabled):not(.disabled).active:focus,
+.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5)
+}
+
+.btn-outline-danger {
+ color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-outline-danger:hover {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-outline-danger.focus,
+.btn-outline-danger:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5)
+}
+
+.btn-outline-danger.disabled,
+.btn-outline-danger:disabled {
+ color: #ff5f66;
+ background-color: transparent
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled).active,
+.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #ff5f66;
+ border-color: #ff5f66
+}
+
+.btn-outline-danger:not(:disabled):not(.disabled).active:focus,
+.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5)
+}
+
+.btn-outline-light {
+ color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-outline-light:hover {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-outline-light.focus,
+.btn-outline-light:focus {
+ box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5)
+}
+
+.btn-outline-light.disabled,
+.btn-outline-light:disabled {
+ color: #dfdfdf;
+ background-color: transparent
+}
+
+.btn-outline-light:not(:disabled):not(.disabled).active,
+.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle {
+ color: #212529;
+ background-color: #dfdfdf;
+ border-color: #dfdfdf
+}
+
+.btn-outline-light:not(:disabled):not(.disabled).active:focus,
+.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5)
+}
+
+.btn-outline-dark {
+ color: #74767b;
+ border-color: #74767b
+}
+
+.btn-outline-dark:hover {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-outline-dark.focus,
+.btn-outline-dark:focus {
+ box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5)
+}
+
+.btn-outline-dark.disabled,
+.btn-outline-dark:disabled {
+ color: #74767b;
+ background-color: transparent
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled).active,
+.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #74767b;
+ border-color: #74767b
+}
+
+.btn-outline-dark:not(:disabled):not(.disabled).active:focus,
+.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5)
+}
+
+.btn-outline-white {
+ color: #fff;
+ border-color: #fff
+}
+
+.btn-outline-white:hover {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-outline-white.focus,
+.btn-outline-white:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5)
+}
+
+.btn-outline-white.disabled,
+.btn-outline-white:disabled {
+ color: #fff;
+ background-color: transparent
+}
+
+.btn-outline-white:not(:disabled):not(.disabled).active,
+.btn-outline-white:not(:disabled):not(.disabled):active,.show>.btn-outline-white.dropdown-toggle {
+ color: #212529;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.btn-outline-white:not(:disabled):not(.disabled).active:focus,
+.btn-outline-white:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-white.dropdown-toggle:focus {
+ box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5)
+}
+
+.btn-link {
+ font-weight: 400;
+ color: #047006;
+ text-decoration: none
+}
+
+.btn-link:hover {
+ color: #012602;
+ text-decoration: underline
+}
+
+.btn-link.focus,
+.btn-link:focus {
+ text-decoration: underline;
+ box-shadow: none
+}
+
+.btn-link.disabled,
+.btn-link:disabled {
+ color: #6c757d;
+ pointer-events: none
+}
+
+.btn-group-lg>.btn,
+.btn-lg {
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem
+}
+
+.btn-group-sm>.btn,
+.btn-sm {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem
+}
+
+.btn-block {
+ display: block;
+ width: 100%
+}
+
+.btn-block+.btn-block {
+ margin-top: .5rem
+}
+
+input[type=button].btn-block,
+input[type=reset].btn-block,
+input[type=submit].btn-block {
+ width: 100%
+}
+
+.fade {
+ -webkit-transition: opacity .15s linear;
+ transition: opacity .15s linear
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .fade {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.fade:not(.show) {
+ opacity: 0
+}
+
+.collapse:not(.show) {
+ display: none
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition: height .35s ease;
+ transition: height .35s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .collapsing {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.dropdown,
+.dropleft,
+.dropright,
+.dropup {
+ position: relative
+}
+
+.dropdown-toggle {
+ white-space: nowrap
+}
+
+.dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: 'http://www.w3.org/2000/svg';
+ border-top: .3em solid;
+ border-right: .3em solid transparent;
+ border-bottom: 0;
+ border-left: .3em solid transparent
+}
+
+.dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: 1000;
+ display: none;
+ float: left;
+ min-width: 10rem;
+ padding: .5rem 0;
+ margin: .125rem 0 0;
+ font-size: 1rem;
+ color: #212529;
+ text-align: left;
+ list-style: none;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .15);
+ border-radius: .25rem
+}
+
+.dropdown-menu-left {
+ right: auto;
+ left: 0
+}
+
+.dropdown-menu-right {
+ right: 0;
+ left: auto
+}
+
+@media (min-width:576px) {
+ .dropdown-menu-sm-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-sm-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+@media (min-width:768px) {
+ .dropdown-menu-md-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-md-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+@media (min-width:992px) {
+ .dropdown-menu-lg-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-lg-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+@media (min-width:1200px) {
+ .dropdown-menu-xl-left {
+ right: auto;
+ left: 0
+ }
+
+ .dropdown-menu-xl-right {
+ right: 0;
+ left: auto
+ }
+
+}
+
+.dropup .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: .125rem
+}
+
+.dropup .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: '0 0 8 8';
+ border-top: 0;
+ border-right: .3em solid transparent;
+ border-bottom: .3em solid;
+ border-left: .3em solid transparent
+}
+
+.dropup .dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropright .dropdown-menu {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: .125rem
+}
+
+.dropright .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: '%2328a745';
+ border-top: .3em solid transparent;
+ border-right: 0;
+ border-bottom: .3em solid transparent;
+ border-left: .3em solid
+}
+
+.dropright .dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropright .dropdown-toggle::after {
+ vertical-align: 0
+}
+
+.dropleft .dropdown-menu {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: .125rem
+}
+
+.dropleft .dropdown-toggle::after {
+ display: inline-block;
+ margin-left: .255em;
+ vertical-align: .255em;
+ content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'
+}
+
+.dropleft .dropdown-toggle::after {
+ display: none
+}
+
+.dropleft .dropdown-toggle::before {
+ display: inline-block;
+ margin-right: .255em;
+ vertical-align: .255em;
+ content: 'http://www.w3.org/2000/svg';
+ border-top: .3em solid transparent;
+ border-right: .3em solid;
+ border-bottom: .3em solid transparent
+}
+
+.dropleft .dropdown-toggle:empty::after {
+ margin-left: 0
+}
+
+.dropleft .dropdown-toggle::before {
+ vertical-align: 0
+}
+
+.dropdown-menu[x-placement^=bottom],
+.dropdown-menu[x-placement^=left],
+.dropdown-menu[x-placement^=right],
+.dropdown-menu[x-placement^=top] {
+ right: auto;
+ bottom: auto
+}
+
+.dropdown-divider {
+ height: 0;
+ margin: .5rem 0;
+ overflow: hidden;
+ border-top: 1px solid #e9ecef
+}
+
+.dropdown-item {
+ display: block;
+ width: 100%;
+ padding: .25rem 1.5rem;
+ clear: both;
+ font-weight: 400;
+ color: #212529;
+ text-align: inherit;
+ white-space: nowrap;
+ background-color: transparent;
+ border: 0
+}
+
+.dropdown-item:focus,
+.dropdown-item:hover {
+ color: #16181b;
+ text-decoration: none;
+ background-color: #f8f9fa
+}
+
+.dropdown-item.active,
+.dropdown-item:active {
+ color: #fff;
+ text-decoration: none;
+ background-color: #007bff
+}
+
+.dropdown-item.disabled,
+.dropdown-item:disabled {
+ color: #6c757d;
+ pointer-events: none;
+ background-color: transparent
+}
+
+.dropdown-menu.show {
+ display: block
+}
+
+.dropdown-header {
+ display: block;
+ padding: .5rem 1.5rem;
+ margin-bottom: 0;
+ font-size: .875rem;
+ color: #6c757d;
+ white-space: nowrap
+}
+
+.dropdown-item-text {
+ display: block;
+ padding: .25rem 1.5rem;
+ color: #212529
+}
+
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: -webkit-inline-box;
+ display: inline-flex;
+ vertical-align: middle
+}
+
+.btn-group-vertical>.btn,
+.btn-group>.btn {
+ position: relative;
+ -webkit-box-flex: 1;
+ flex: 1 1 auto
+}
+
+.btn-group-vertical>.btn:hover,
+.btn-group>.btn:hover {
+ z-index: 1
+}
+
+.btn-group-vertical>.btn.active,
+.btn-group-vertical>.btn:active,
+.btn-group-vertical>.btn:focus,
+.btn-group>.btn.active,
+.btn-group>.btn:active,
+.btn-group>.btn:focus {
+ z-index: 1
+}
+
+.btn-toolbar {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+}
+
+.btn-toolbar .input-group {
+ width: auto
+}
+
+.btn-group>.btn-group:not(:first-child),
+.btn-group>.btn:not(:first-child) {
+ margin-left: -1px
+}
+
+.btn-group>.btn-group:not(:last-child)>.btn,
+.btn-group>.btn:not(:last-child):not(.dropdown-toggle) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.btn-group>.btn-group:not(:first-child)>.btn,
+.btn-group>.btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.dropdown-toggle-split {
+ padding-right: .5625rem;
+ padding-left: .5625rem
+}
+
+.dropdown-toggle-split::after,
+.dropright .dropdown-toggle-split::after,
+.dropup .dropdown-toggle-split::after {
+ margin-left: 0
+}
+
+.dropleft .dropdown-toggle-split::before {
+ margin-right: 0
+}
+
+.btn-group-sm>.btn+.dropdown-toggle-split,
+.btn-sm+.dropdown-toggle-split {
+ padding-right: .375rem;
+ padding-left: .375rem
+}
+
+.btn-group-lg>.btn+.dropdown-toggle-split,
+.btn-lg+.dropdown-toggle-split {
+ padding-right: .75rem;
+ padding-left: .75rem
+}
+
+.btn-group-vertical {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: center;
+ justify-content: center
+}
+
+.btn-group-vertical>.btn,
+.btn-group-vertical>.btn-group {
+ width: 100%
+}
+
+.btn-group-vertical>.btn-group:not(:first-child),
+.btn-group-vertical>.btn:not(:first-child) {
+ margin-top: -1px
+}
+
+.btn-group-vertical>.btn-group:not(:last-child)>.btn,
+.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle) {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.btn-group-vertical>.btn-group:not(:first-child)>.btn,
+.btn-group-vertical>.btn:not(:first-child) {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0
+}
+
+.btn-group-toggle>.btn,
+.btn-group-toggle>.btn-group>.btn {
+ margin-bottom: 0
+}
+
+.btn-group-toggle>.btn input[type=checkbox],
+.btn-group-toggle>.btn input[type=radio],
+.btn-group-toggle>.btn-group>.btn input[type=checkbox],
+.btn-group-toggle>.btn-group>.btn input[type=radio] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none
+}
+
+.input-group {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-align: stretch;
+ align-items: stretch;
+ width: 100%
+}
+
+.input-group>.custom-file,
+.input-group>.custom-select,
+.input-group>.form-control,
+.input-group>.form-control-plaintext {
+ position: relative;
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ width: 1%;
+ margin-bottom: 0
+}
+
+.input-group>.custom-file+.custom-file,
+.input-group>.custom-file+.custom-select,
+.input-group>.custom-file+.form-control,
+.input-group>.custom-select+.custom-file,
+.input-group>.custom-select+.custom-select,
+.input-group>.custom-select+.form-control,
+.input-group>.form-control+.custom-file,
+.input-group>.form-control+.custom-select,
+.input-group>.form-control+.form-control,
+.input-group>.form-control-plaintext+.custom-file,
+.input-group>.form-control-plaintext+.custom-select,
+.input-group>.form-control-plaintext+.form-control {
+ margin-left: -1px
+}
+
+.input-group>.custom-file .custom-file-input:focus~.custom-file-label,
+.input-group>.custom-select:focus,
+.input-group>.form-control:focus {
+ z-index: 3
+}
+
+.input-group>.custom-file .custom-file-input:focus {
+ z-index: 4
+}
+
+.input-group>.custom-select:not(:last-child),
+.input-group>.form-control:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.input-group>.custom-select:not(:first-child),
+.input-group>.form-control:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.input-group>.custom-file {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.input-group>.custom-file:not(:last-child) .custom-file-label,
+.input-group>.custom-file:not(:last-child) .custom-file-label::after {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.input-group>.custom-file:not(:first-child) .custom-file-label {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.input-group-append,
+.input-group-prepend {
+ display: -webkit-box;
+ display: flex
+}
+
+.input-group-append .btn,
+.input-group-prepend .btn {
+ position: relative;
+ z-index: 2
+}
+
+.input-group-append .btn:focus,
+.input-group-prepend .btn:focus {
+ z-index: 3
+}
+
+.input-group-append .btn+.btn,
+.input-group-append .btn+.input-group-text,
+.input-group-append .input-group-text+.btn,
+.input-group-append .input-group-text+.input-group-text,
+.input-group-prepend .btn+.btn,
+.input-group-prepend .btn+.input-group-text,
+.input-group-prepend .input-group-text+.btn,
+.input-group-prepend .input-group-text+.input-group-text {
+ margin-left: -1px
+}
+
+.input-group-prepend {
+ margin-right: -1px
+}
+
+.input-group-append {
+ margin-left: -1px
+}
+
+.input-group-text {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ padding: .375rem .75rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #6c757d;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #e9ecef;
+ border: 1px solid #f0f2f5;
+ border-radius: .25rem
+}
+
+.input-group-text input[type=checkbox],
+.input-group-text input[type=radio] {
+ margin-top: 0
+}
+
+.input-group-lg>.custom-select,
+.input-group-lg>.form-control:not(textarea) {
+ height: calc(1.5em + 1rem + 2px)
+}
+
+.input-group-lg>.custom-select,
+.input-group-lg>.form-control,
+.input-group-lg>.input-group-append>.btn,
+.input-group-lg>.input-group-append>.input-group-text,
+.input-group-lg>.input-group-prepend>.btn,
+.input-group-lg>.input-group-prepend>.input-group-text {
+ padding: .5rem 1rem;
+ font-size: 1.25rem;
+ line-height: 1.5;
+ border-radius: .3rem
+}
+
+.input-group-sm>.custom-select,
+.input-group-sm>.form-control:not(textarea) {
+ height: calc(1.5em + .5rem + 2px)
+}
+
+.input-group-sm>.custom-select,
+.input-group-sm>.form-control,
+.input-group-sm>.input-group-append>.btn,
+.input-group-sm>.input-group-append>.input-group-text,
+.input-group-sm>.input-group-prepend>.btn,
+.input-group-sm>.input-group-prepend>.input-group-text {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5;
+ border-radius: .2rem
+}
+
+.input-group-lg>.custom-select,
+.input-group-sm>.custom-select {
+ padding-right: 1.75rem
+}
+
+.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),
+.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),
+.input-group>.input-group-append:not(:last-child)>.btn,
+.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.input-group>.input-group-append>.btn,
+.input-group>.input-group-append>.input-group-text,
+.input-group>.input-group-prepend:first-child>.btn:not(:first-child),
+.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),
+.input-group>.input-group-prepend:not(:first-child)>.btn,
+.input-group>.input-group-prepend:not(:first-child)>.input-group-text {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-control {
+ position: relative;
+ display: block;
+ min-height: 1.7rem;
+ padding-left: 1.9rem
+}
+
+.custom-control-inline {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ margin-right: 1rem
+}
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1;
+ opacity: 0
+}
+
+.custom-control-input:checked~.custom-control-label::before {
+ color: #fff;
+ border-color: #047006;
+ background-color: #047006
+}
+
+.custom-control-input:focus~.custom-control-label::before {
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-control-input:focus:not(:checked)~.custom-control-label::before {
+ border-color: #80bdff
+}
+
+.custom-control-input:not(:disabled):active~.custom-control-label::before {
+ color: #fff;
+ background-color: #b3d7ff;
+ border-color: #b3d7ff
+}
+
+.custom-control-input:disabled~.custom-control-label {
+ color: #6c757d
+}
+
+.custom-control-input:disabled~.custom-control-label::before {
+ background-color: #e9ecef
+}
+
+.custom-control-label {
+ position: relative;
+ margin-bottom: 0;
+ vertical-align: top
+}
+
+.custom-control-label::before {
+ position: absolute;
+ top: .15rem;
+ left: -1.9rem;
+ display: block;
+ width: 1.4rem;
+ height: 1.4rem;
+ pointer-events: none;
+ content: '0 0 4 5';
+ background-color: #fff;
+ border: #e1e5f1 solid 1px
+}
+
+.custom-control-label::after {
+ position: absolute;
+ top: .15rem;
+ left: -1.9rem;
+ display: block;
+ width: 1.4rem;
+ height: 1.4rem;
+ content: '%23343a40';
+ background: no-repeat 50%/50% 50%
+}
+
+.custom-checkbox .custom-control-label::before {
+ border-radius: .25rem
+}
+
+.custom-checkbox .custom-control-input:checked~.custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before {
+ border-color: #007bff;
+ background-color: #007bff
+}
+
+.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath stroke=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-radio .custom-control-label::before {
+ border-radius: 50%
+}
+
+.custom-radio .custom-control-input:checked~.custom-control-label::after {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3ccircle r=!string!fill=!string!/%3e%3c/svg%3e")
+}
+
+.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-switch {
+ padding-left: 2.8rem
+}
+
+.custom-switch .custom-control-label::before {
+ left: -2.8rem;
+ width: 2.3rem;
+ pointer-events: all;
+ border-radius: 25px
+}
+
+.custom-switch .custom-control-label::after {
+ top: calc(.15rem + 2px);
+ left: calc(-2.8rem + 2px);
+ width: 1.1rem;
+ height: 1.1rem;
+ background-color: #e1e5f1;
+ border-radius: 25px;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out;
+ transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: transform .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, -webkit-transform .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-switch .custom-control-label::after {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-switch .custom-control-input:checked~.custom-control-label::after {
+ background-color: #fff;
+ -webkit-transform: translateX(.9rem);
+ transform: translateX(.9rem)
+}
+
+.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before {
+ background-color: rgba(0, 123, 255, .5)
+}
+
+.custom-select {
+ display: inline-block;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ padding: .375rem 1.75rem .375rem .75rem;
+ font-size: 1rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #495057;
+ vertical-align: middle;
+ background: url("data:image/svg+xml,%3csvg xmlns=!string!viewBox=!string!%3e%3cpath fill=!string!d=!string!/%3e%3c/svg%3e") no-repeat right .75rem center/8px 10px;
+ background-color: #fff;
+ border: 1px solid #ced4da;
+ border-radius: .25rem;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none
+}
+
+.custom-select:focus {
+ border-color: #80bdff;
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-select:focus::-ms-value {
+ color: #6c757d;
+ background-color: #f6f7f9
+}
+
+.custom-select[multiple],
+.custom-select[size]:not([size='M2 0L0 2h4zm0 5L0 3h4z']) {
+ height: auto;
+ padding-right: .75rem;
+ background-image: none
+}
+
+.custom-select:disabled {
+ color: #6c757d;
+ background-color: #e9ecef
+}
+
+.custom-select::-ms-expand {
+ display: none
+}
+
+.custom-select-sm {
+ height: calc(1.5em + .5rem + 2px);
+ padding-top: .25rem;
+ padding-bottom: .25rem;
+ padding-left: .5rem;
+ font-size: .875rem
+}
+
+.custom-select-lg {
+ height: calc(1.5em + 1rem + 2px);
+ padding-top: .5rem;
+ padding-bottom: .5rem;
+ padding-left: 1rem;
+ font-size: 1.25rem
+}
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ margin-bottom: 0
+}
+
+.custom-file-input {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ height: calc(1.5em + .75rem + 2px);
+ margin: 0;
+ opacity: 0
+}
+
+.custom-file-input:focus~.custom-file-label {
+ border-color: #80bdff;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-file-input:disabled~.custom-file-label {
+ background-color: #e9ecef
+}
+
+.custom-file-input:lang(en)~.custom-file-label::after {
+ content: 'http://www.w3.org/2000/svg'
+}
+
+.custom-file-input~.custom-file-label[data-browse]::after {
+ content: attr(data-browse)
+}
+
+.custom-file-label {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1;
+ height: calc(1.5em + .75rem + 2px);
+ padding: .375rem .75rem;
+ font-weight: 400;
+ line-height: 1.5;
+ color: #6c757d;
+ background-color: #f6f7f9;
+ border: 1px solid #f0f2f5;
+ border-radius: .25rem
+}
+
+.custom-file-label::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 3;
+ display: block;
+ height: calc(1.5em + .75rem);
+ padding: .375rem .75rem;
+ line-height: 1.5;
+ color: #495057;
+ content: '0 0 8 8';
+ background-color: #e9ecef;
+ border-left: inherit;
+ border-radius: 0 .25rem .25rem 0
+}
+
+.custom-range {
+ width: 100%;
+ height: calc(1rem + .4rem);
+ padding: 0;
+ background-color: transparent;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none
+}
+
+.custom-range:focus {
+ outline: 0
+}
+
+.custom-range:focus::-webkit-slider-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-range:focus::-moz-range-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-range:focus::-ms-thumb {
+ box-shadow: 0 0 0 1px #fff, 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.custom-range::-moz-focus-outer {
+ border: 0
+}
+
+.custom-range::-webkit-slider-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: -.25rem;
+ background-color: #007bff;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ -webkit-appearance: none;
+ appearance: none
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-range::-webkit-slider-thumb {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-range::-webkit-slider-thumb:active {
+ background-color: #b3d7ff
+}
+
+.custom-range::-webkit-slider-runnable-track {
+ width: 100%;
+ height: .5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem
+}
+
+.custom-range::-moz-range-thumb {
+ width: 1rem;
+ height: 1rem;
+ background-color: #007bff;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ -moz-appearance: none;
+ appearance: none
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-range::-moz-range-thumb {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-range::-moz-range-thumb:active {
+ background-color: #b3d7ff
+}
+
+.custom-range::-moz-range-track {
+ width: 100%;
+ height: .5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: #dee2e6;
+ border-color: transparent;
+ border-radius: 1rem
+}
+
+.custom-range::-ms-thumb {
+ width: 1rem;
+ height: 1rem;
+ margin-top: 0;
+ margin-right: .2rem;
+ margin-left: .2rem;
+ background-color: #007bff;
+ border: 0;
+ border-radius: 1rem;
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ appearance: none
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-range::-ms-thumb {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.custom-range::-ms-thumb:active {
+ background-color: #b3d7ff
+}
+
+.custom-range::-ms-track {
+ width: 100%;
+ height: .5rem;
+ color: transparent;
+ cursor: pointer;
+ background-color: transparent;
+ border-color: transparent;
+ border-width: .5rem
+}
+
+.custom-range::-ms-fill-lower {
+ background-color: #dee2e6;
+ border-radius: 1rem
+}
+
+.custom-range::-ms-fill-upper {
+ margin-right: 15px;
+ background-color: #dee2e6;
+ border-radius: 1rem
+}
+
+.custom-range:disabled::-webkit-slider-thumb {
+ background-color: #adb5bd
+}
+
+.custom-range:disabled::-webkit-slider-runnable-track {
+ cursor: default
+}
+
+.custom-range:disabled::-moz-range-thumb {
+ background-color: #adb5bd
+}
+
+.custom-range:disabled::-moz-range-track {
+ cursor: default
+}
+
+.custom-range:disabled::-ms-thumb {
+ background-color: #adb5bd
+}
+
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+ -webkit-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .custom-control-label::before,
+ .custom-file-label,
+ .custom-select {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.nav {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none
+}
+
+.nav-link {
+ display: block;
+ padding: .5rem 1rem
+}
+
+.nav-link:focus,
+.nav-link:hover {
+ text-decoration: none
+}
+
+.nav-link.disabled {
+ color: #6c757d;
+ pointer-events: none;
+ cursor: default
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #dee2e6
+}
+
+.nav-tabs .nav-item {
+ margin-bottom: -1px
+}
+
+.nav-tabs .nav-link {
+ border: 1px solid transparent;
+ border-top-left-radius: 2px;
+ border-top-right-radius: 2px
+}
+
+.nav-tabs .nav-link:focus,
+.nav-tabs .nav-link:hover {
+ border-color: #e9ecef #e9ecef #dee2e6
+}
+
+.nav-tabs .nav-link.disabled {
+ color: #6c757d;
+ background-color: transparent;
+ border-color: transparent
+}
+
+.nav-tabs .nav-item.show .nav-link,
+.nav-tabs .nav-link.active {
+ color: #495057;
+ background-color: #fff;
+ border-color: #dee2e6 #dee2e6 #fff
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0
+}
+
+.nav-pills .nav-link {
+ border-radius: 2px
+}
+
+.nav-pills .nav-link.active,
+.nav-pills .show>.nav-link {
+ color: #fff;
+ background-color: #007bff
+}
+
+.nav-fill .nav-item {
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ text-align: center
+}
+
+.nav-justified .nav-item {
+ flex-basis: 0;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ text-align: center
+}
+
+.tab-content>.tab-pane {
+ display: none
+}
+
+.tab-content>.active {
+ display: block
+}
+
+.navbar {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ justify-content: space-between;
+ padding: .5rem 1rem
+}
+
+.navbar>.container,
+.navbar>.container-fluid {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: justify;
+ justify-content: space-between
+}
+
+.navbar-brand {
+ display: inline-block;
+ padding-top: .3125rem;
+ padding-bottom: .3125rem;
+ margin-right: 1rem;
+ font-size: 1.25rem;
+ line-height: inherit;
+ white-space: nowrap
+}
+
+.navbar-brand:focus,
+.navbar-brand:hover {
+ text-decoration: none
+}
+
+.navbar-nav {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none
+}
+
+.navbar-nav .nav-link {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.navbar-nav .dropdown-menu {
+ position: static;
+ float: none
+}
+
+.navbar-text {
+ display: inline-block;
+ padding-top: .5rem;
+ padding-bottom: .5rem
+}
+
+.navbar-collapse {
+ flex-basis: 100%;
+ -webkit-box-flex: 1;
+ flex-grow: 1;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.navbar-toggler {
+ padding: .25rem .75rem;
+ font-size: 1.25rem;
+ line-height: 1;
+ background-color: transparent;
+ border: 1px solid transparent;
+ border-radius: .25rem
+}
+
+.navbar-toggler:focus,
+.navbar-toggler:hover {
+ text-decoration: none
+}
+
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: '%2328a745';
+ background: no-repeat center center;
+ background-size: 100% 100%
+}
+
+@media (max-width:575.98px) {
+ .navbar-expand-sm>.container,
+ .navbar-expand-sm>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:576px) {
+ .navbar-expand-sm {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-sm .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-sm .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-sm .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-sm>.container,
+ .navbar-expand-sm>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-sm .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-sm .navbar-toggler {
+ display: none
+ }
+
+}
+
+@media (max-width:767.98px) {
+ .navbar-expand-md>.container,
+ .navbar-expand-md>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:768px) {
+ .navbar-expand-md {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-md .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-md .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-md .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-md>.container,
+ .navbar-expand-md>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-md .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-md .navbar-toggler {
+ display: none
+ }
+
+}
+
+@media (max-width:991.98px) {
+ .navbar-expand-lg>.container,
+ .navbar-expand-lg>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:992px) {
+ .navbar-expand-lg {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-lg .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-lg .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-lg .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-lg>.container,
+ .navbar-expand-lg>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-lg .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-lg .navbar-toggler {
+ display: none
+ }
+
+}
+
+@media (max-width:1199.98px) {
+ .navbar-expand-xl>.container,
+ .navbar-expand-xl>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+ }
+
+}
+
+@media (min-width:1200px) {
+ .navbar-expand-xl {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+ }
+
+ .navbar-expand-xl .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .navbar-expand-xl .navbar-nav .dropdown-menu {
+ position: absolute
+ }
+
+ .navbar-expand-xl .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+ }
+
+ .navbar-expand-xl>.container,
+ .navbar-expand-xl>.container-fluid {
+ flex-wrap: nowrap
+ }
+
+ .navbar-expand-xl .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+ }
+
+ .navbar-expand-xl .navbar-toggler {
+ display: none
+ }
+
+}
+
+.navbar-expand {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row nowrap;
+ -webkit-box-pack: start;
+ justify-content: flex-start
+}
+
+.navbar-expand>.container,
+.navbar-expand>.container-fluid {
+ padding-right: 0;
+ padding-left: 0
+}
+
+.navbar-expand .navbar-nav {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+}
+
+.navbar-expand .navbar-nav .dropdown-menu {
+ position: absolute
+}
+
+.navbar-expand .navbar-nav .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem
+}
+
+.navbar-expand>.container,
+.navbar-expand>.container-fluid {
+ flex-wrap: nowrap
+}
+
+.navbar-expand .navbar-collapse {
+ display: -webkit-box !important;
+ display: flex !important;
+ flex-basis: auto
+}
+
+.navbar-expand .navbar-toggler {
+ display: none
+}
+
+.navbar-light .navbar-brand {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-brand:focus,
+.navbar-light .navbar-brand:hover {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-nav .nav-link {
+ color: rgba(0, 0, 0, .5)
+}
+
+.navbar-light .navbar-nav .nav-link:focus,
+.navbar-light .navbar-nav .nav-link:hover {
+ color: rgba(0, 0, 0, .7)
+}
+
+.navbar-light .navbar-nav .nav-link.disabled {
+ color: rgba(0, 0, 0, .3)
+}
+
+.navbar-light .navbar-nav .active>.nav-link,
+.navbar-light .navbar-nav .nav-link.active,
+.navbar-light .navbar-nav .nav-link.show,
+.navbar-light .navbar-nav .show>.nav-link {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-toggler {
+ color: rgba(0, 0, 0, .5);
+ border-color: rgba(0, 0, 0, .1)
+}
+
+.navbar-light .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.navbar-light .navbar-text {
+ color: rgba(0, 0, 0, .5)
+}
+
+.navbar-light .navbar-text a {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-light .navbar-text a:focus,
+.navbar-light .navbar-text a:hover {
+ color: rgba(0, 0, 0, .9)
+}
+
+.navbar-dark .navbar-brand {
+ color: #fff
+}
+
+.navbar-dark .navbar-brand:focus,
+.navbar-dark .navbar-brand:hover {
+ color: #fff
+}
+
+.navbar-dark .navbar-nav .nav-link {
+ color: rgba(255, 255, 255, .5)
+}
+
+.navbar-dark .navbar-nav .nav-link:focus,
+.navbar-dark .navbar-nav .nav-link:hover {
+ color: rgba(255, 255, 255, .75)
+}
+
+.navbar-dark .navbar-nav .nav-link.disabled {
+ color: rgba(255, 255, 255, .25)
+}
+
+.navbar-dark .navbar-nav .active>.nav-link,
+.navbar-dark .navbar-nav .nav-link.active,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .show>.nav-link {
+ color: #fff
+}
+
+.navbar-dark .navbar-toggler {
+ color: rgba(255, 255, 255, .5);
+ border-color: rgba(255, 255, 255, .1)
+}
+
+.navbar-dark .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg viewBox=!string!xmlns=!string!%3e%3cpath stroke=!string!stroke-width=!string!stroke-linecap=!string!stroke-miterlimit=!string!d=!string!/%3e%3c/svg%3e")
+}
+
+.navbar-dark .navbar-text {
+ color: rgba(255, 255, 255, .5)
+}
+
+.navbar-dark .navbar-text a {
+ color: #fff
+}
+
+.navbar-dark .navbar-text a:focus,
+.navbar-dark .navbar-text a:hover {
+ color: #fff
+}
+
+.card {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: border-box;
+ border: 1px solid rgba(238, 238, 238, .75);
+ border-radius: .25rem
+}
+
+.card>hr {
+ margin-right: 0;
+ margin-left: 0
+}
+
+.card>.list-group:first-child .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem
+}
+
+.card>.list-group:last-child .list-group-item:last-child {
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: .25rem
+}
+
+.card-body {
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ padding: 1.25rem
+}
+
+.card-title {
+ margin-bottom: .75rem
+}
+
+.card-subtitle {
+ margin-top: -.375rem;
+ margin-bottom: 0
+}
+
+.card-text:last-child {
+ margin-bottom: 0
+}
+
+.card-link:hover {
+ text-decoration: none
+}
+
+.card-link+.card-link {
+ margin-left: 1.25rem
+}
+
+.card-header {
+ padding: .75rem 1.25rem;
+ margin-bottom: 0;
+ background-color: rgba(0, 0, 0, .03);
+ border-bottom: 1px solid rgba(238, 238, 238, .75)
+}
+
+.card-header:first-child {
+ border-radius: calc(.25rem - 1px) calc(.25rem - 1px) 0 0
+}
+
+.card-header+.list-group .list-group-item:first-child {
+ border-top: 0
+}
+
+.card-footer {
+ padding: .75rem 1.25rem;
+ background-color: rgba(0, 0, 0, .03);
+ border-top: 1px solid rgba(238, 238, 238, .75)
+}
+
+.card-footer:last-child {
+ border-radius: 0 0 calc(.25rem - 1px) calc(.25rem - 1px)
+}
+
+.card-header-tabs {
+ margin-right: -.625rem;
+ margin-bottom: -.75rem;
+ margin-left: -.625rem;
+ border-bottom: 0
+}
+
+.card-header-pills {
+ margin-right: -.625rem;
+ margin-left: -.625rem
+}
+
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 1.25rem
+}
+
+.card-img {
+ width: 100%;
+ border-radius: calc(.25rem - 1px)
+}
+
+.card-img-top {
+ width: 100%;
+ border-top-left-radius: calc(.25rem - 1px);
+ border-top-right-radius: calc(.25rem - 1px)
+}
+
+.card-img-bottom {
+ width: 100%;
+ border-bottom-right-radius: calc(.25rem - 1px);
+ border-bottom-left-radius: calc(.25rem - 1px)
+}
+
+.card-deck {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column
+}
+
+.card-deck .card {
+ margin-bottom: 15px
+}
+
+@media (min-width:576px) {
+ .card-deck {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap;
+ margin-right: -15px;
+ margin-left: -15px
+ }
+
+ .card-deck .card {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-flex: 1;
+ flex: 1 0 0%;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ margin-right: 15px;
+ margin-bottom: 0;
+ margin-left: 15px
+ }
+
+}
+
+.card-group {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column
+}
+
+.card-group>.card {
+ margin-bottom: 15px
+}
+
+@media (min-width:576px) {
+ .card-group {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-flow: row wrap
+ }
+
+ .card-group>.card {
+ -webkit-box-flex: 1;
+ flex: 1 0 0%;
+ margin-bottom: 0
+ }
+
+ .card-group>.card+.card {
+ margin-left: 0;
+ border-left: 0
+ }
+
+ .card-group>.card:not(:last-child) {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+ }
+
+ .card-group>.card:not(:last-child) .card-header,
+ .card-group>.card:not(:last-child) .card-img-top {
+ border-top-right-radius: 0
+ }
+
+ .card-group>.card:not(:last-child) .card-footer,
+ .card-group>.card:not(:last-child) .card-img-bottom {
+ border-bottom-right-radius: 0
+ }
+
+ .card-group>.card:not(:first-child) {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+ }
+
+ .card-group>.card:not(:first-child) .card-header,
+ .card-group>.card:not(:first-child) .card-img-top {
+ border-top-left-radius: 0
+ }
+
+ .card-group>.card:not(:first-child) .card-footer,
+ .card-group>.card:not(:first-child) .card-img-bottom {
+ border-bottom-left-radius: 0
+ }
+
+}
+
+.card-columns .card {
+ margin-bottom: .75rem
+}
+
+@media (min-width:576px) {
+ .card-columns {
+ -webkit-column-count: 3;
+ -moz-column-count: 3;
+ column-count: 3;
+ -webkit-column-gap: 1.25rem;
+ -moz-column-gap: 1.25rem;
+ column-gap: 1.25rem;
+ orphans: 1;
+ widows: 1
+ }
+
+ .card-columns .card {
+ display: inline-block;
+ width: 100%
+ }
+
+}
+
+.accordion>.card {
+ overflow: hidden
+}
+
+.accordion>.card:not(:first-of-type) .card-header:first-child {
+ border-radius: 0
+}
+
+.accordion>.card:not(:first-of-type):not(:last-of-type) {
+ border-bottom: 0;
+ border-radius: 0
+}
+
+.accordion>.card:first-of-type {
+ border-bottom: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.accordion>.card:last-of-type {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0
+}
+
+.accordion>.card .card-header {
+ margin-bottom: -1px
+}
+
+.breadcrumb {
+ display: -webkit-box;
+ display: flex;
+ flex-wrap: wrap;
+ padding: .75rem 1rem;
+ margin-bottom: 1rem;
+ list-style: none;
+ background-color: #f7f9fa;
+ border-radius: .25rem
+}
+
+.breadcrumb-item+.breadcrumb-item {
+ padding-left: .5rem
+}
+
+.breadcrumb-item+.breadcrumb-item::before {
+ display: inline-block;
+ padding-right: .5rem;
+ color: #a8a9ad;
+ content: 'M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'
+}
+
+.breadcrumb-item+.breadcrumb-item:hover::before {
+ text-decoration: underline
+}
+
+.breadcrumb-item+.breadcrumb-item:hover::before {
+ text-decoration: none
+}
+
+.breadcrumb-item.active {
+ color: #6c757d
+}
+
+.pagination {
+ display: -webkit-box;
+ display: flex;
+ padding-left: 0;
+ list-style: none;
+ border-radius: 2px
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: .5rem .75rem;
+ margin-left: -1px;
+ line-height: 1.25;
+ color: #007bff;
+ background-color: #fff;
+ border: 1px solid #dee2e6
+}
+
+.page-link:hover {
+ z-index: 2;
+ color: #0056b3;
+ text-decoration: none;
+ background-color: #e9ecef;
+ border-color: #dee2e6
+}
+
+.page-link:focus {
+ z-index: 2;
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 123, 255, .25)
+}
+
+.page-item:first-child .page-link {
+ margin-left: 0;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px
+}
+
+.page-item:last-child .page-link {
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px
+}
+
+.page-item.active .page-link {
+ z-index: 1;
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff
+}
+
+.page-item.disabled .page-link {
+ color: #6c757d;
+ pointer-events: none;
+ cursor: auto;
+ background-color: #fff;
+ border-color: #dee2e6
+}
+
+.pagination-lg .page-link {
+ padding: .75rem 1.5rem;
+ font-size: 1.25rem;
+ line-height: 1.5
+}
+
+.pagination-lg .page-item:first-child .page-link {
+ border-top-left-radius: 6px;
+ border-bottom-left-radius: 6px
+}
+
+.pagination-lg .page-item:last-child .page-link {
+ border-top-right-radius: 6px;
+ border-bottom-right-radius: 6px
+}
+
+.pagination-sm .page-link {
+ padding: .25rem .5rem;
+ font-size: .875rem;
+ line-height: 1.5
+}
+
+.pagination-sm .page-item:first-child .page-link {
+ border-top-left-radius: .2rem;
+ border-bottom-left-radius: .2rem
+}
+
+.pagination-sm .page-item:last-child .page-link {
+ border-top-right-radius: .2rem;
+ border-bottom-right-radius: .2rem
+}
+
+.badge {
+ display: inline-block;
+ padding: .45rem 1rem;
+ font-size: 80%;
+ font-weight: 700;
+ line-height: 1;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25rem;
+ -webkit-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out;
+ transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .badge {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+a.badge:focus,
+a.badge:hover {
+ text-decoration: none
+}
+
+.badge:empty {
+ display: none
+}
+
+.btn .badge {
+ position: relative;
+ top: -1px
+}
+
+.badge-pill {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ border-radius: 10rem
+}
+
+.badge-primary {
+ color: #fff;
+ background-color: #047006
+}
+
+a.badge-primary:focus,
+a.badge-primary:hover {
+ color: #fff;
+ background-color: #023f03
+}
+
+a.badge-primary.focus,
+a.badge-primary:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(4, 112, 6, .5)
+}
+
+.badge-secondary {
+ color: #fff;
+ background-color: grey
+}
+
+a.badge-secondary:focus,
+a.badge-secondary:hover {
+ color: #fff;
+ background-color: #676767
+}
+
+a.badge-secondary.focus,
+a.badge-secondary:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(128, 128, 128, .5)
+}
+
+.badge-success {
+ color: #fff;
+ background-color: #047006
+}
+
+a.badge-success:focus,
+a.badge-success:hover {
+ color: #fff;
+ background-color: #00ad72
+}
+
+a.badge-success.focus,
+a.badge-success:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(0, 224, 147, .5)
+}
+
+.badge-info {
+ color: #fff;
+ background-color: #6c61f6
+}
+
+a.badge-info:focus,
+a.badge-info:hover {
+ color: #fff;
+ background-color: #3f31f3
+}
+
+a.badge-info.focus,
+a.badge-info:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(108, 97, 246, .5)
+}
+
+.badge-warning {
+ color: #212529;
+ background-color: #f0825f
+}
+
+a.badge-warning:focus,
+a.badge-warning:hover {
+ color: #212529;
+ background-color: #ec5e30
+}
+
+a.badge-warning.focus,
+a.badge-warning:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(240, 130, 95, .5)
+}
+
+.badge-danger {
+ color: #fff;
+ background-color: #ff5f66
+}
+
+a.badge-danger:focus,
+a.badge-danger:hover {
+ color: #fff;
+ background-color: #ff2c35
+}
+
+a.badge-danger.focus,
+a.badge-danger:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(255, 95, 102, .5)
+}
+
+.badge-light {
+ color: #212529;
+ background-color: #dfdfdf
+}
+
+a.badge-light:focus,
+a.badge-light:hover {
+ color: #212529;
+ background-color: #c6c6c6
+}
+
+a.badge-light.focus,
+a.badge-light:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(223, 223, 223, .5)
+}
+
+.badge-dark {
+ color: #fff;
+ background-color: #74767b
+}
+
+a.badge-dark:focus,
+a.badge-dark:hover {
+ color: #fff;
+ background-color: #5b5d61
+}
+
+a.badge-dark.focus,
+a.badge-dark:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(116, 118, 123, .5)
+}
+
+.badge-white {
+ color: #212529;
+ background-color: #fff
+}
+
+a.badge-white:focus,
+a.badge-white:hover {
+ color: #212529;
+ background-color: #e6e6e6
+}
+
+a.badge-white.focus,
+a.badge-white:focus {
+ outline: 0;
+ box-shadow: 0 0 0 .2rem rgba(255, 255, 255, .5)
+}
+
+.jumbotron {
+ padding: 2rem 1rem;
+ margin-bottom: 2rem;
+ background-color: #e9ecef;
+ border-radius: 6px
+}
+
+@media (min-width:576px) {
+ .jumbotron {
+ padding: 4rem 2rem
+ }
+
+}
+
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ border-radius: 0
+}
+
+.alert {
+ position: relative;
+ padding: 1.15rem 1.15rem;
+ margin-bottom: 1rem;
+ border: 1px solid transparent;
+ border-radius: 2px
+}
+
+.alert-heading {
+ color: inherit
+}
+
+.alert-link {
+ font-weight: 700
+}
+
+.alert-dismissible {
+ padding-right: 3.8rem
+}
+
+.alert-dismissible .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: 1.15rem 1.15rem;
+ color: inherit
+}
+
+.alert-primary {
+ color: #023a03;
+ background-color: #cde2cd;
+ border-color: #b9d7b9
+}
+
+.alert-primary hr {
+ border-top-color: #a9cea9
+}
+
+.alert-primary .alert-link {
+ color: #000900
+}
+
+.alert-secondary {
+ color: #434343;
+ background-color: #e6e6e6;
+ border-color: #dbdbdb
+}
+
+.alert-secondary hr {
+ border-top-color: #cecece
+}
+
+.alert-secondary .alert-link {
+ color: #2a2a2a
+}
+
+.alert-success {
+ color: #00744c;
+ background-color: #ccf9e9;
+ border-color: #b8f6e1
+}
+
+.alert-success hr {
+ border-top-color: #a1f3d7
+}
+
+.alert-success .alert-link {
+ color: #00412b
+}
+
+.alert-info {
+ color: #383280;
+ background-color: #e2dffd;
+ border-color: #d6d3fc
+}
+
+.alert-info hr {
+ border-top-color: #c0bbfa
+}
+
+.alert-info .alert-link {
+ color: #28245b
+}
+
+.alert-warning {
+ color: #7d4431;
+ background-color: #fce6df;
+ border-color: #fbdcd2
+}
+
+.alert-warning hr {
+ border-top-color: #f9cabb
+}
+
+.alert-warning .alert-link {
+ color: #583023
+}
+
+.alert-danger {
+ color: #853135;
+ background-color: #ffdfe0;
+ border-color: #ffd2d4
+}
+
+.alert-danger hr {
+ border-top-color: #ffb9bc
+}
+
+.alert-danger .alert-link {
+ color: #602326
+}
+
+.alert-light {
+ color: #747474;
+ background-color: #f9f9f9;
+ border-color: #f6f6f6
+}
+
+.alert-light hr {
+ border-top-color: #e9e9e9
+}
+
+.alert-light .alert-link {
+ color: #5b5b5b
+}
+
+.alert-dark {
+ color: #3c3d40;
+ background-color: #e3e4e5;
+ border-color: #d8d9da
+}
+
+.alert-dark hr {
+ border-top-color: #cbccce
+}
+
+.alert-dark .alert-link {
+ color: #232426
+}
+
+.alert-white {
+ color: #858585;
+ background-color: #fff;
+ border-color: #fff
+}
+
+.alert-white hr {
+ border-top-color: #f2f2f2
+}
+
+.alert-white .alert-link {
+ color: #6c6c6c
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0
+ }
+
+ to {
+ background-position: 0 0
+ }
+
+}
+
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 1rem 0
+ }
+
+ to {
+ background-position: 0 0
+ }
+
+}
+
+.progress {
+ display: -webkit-box;
+ display: flex;
+ height: 1rem;
+ overflow: hidden;
+ font-size: .75rem;
+ background-color: #f3f5f7;
+ border-radius: 2px
+}
+
+.progress-bar {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-pack: center;
+ justify-content: center;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ background-color: #007bff;
+ -webkit-transition: width .6s ease;
+ transition: width .6s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .progress-bar {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.progress-bar-striped {
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+ background-size: 1rem 1rem
+}
+
+.progress-bar-animated {
+ -webkit-animation: progress-bar-stripes 1s linear infinite;
+ animation: progress-bar-stripes 1s linear infinite
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .progress-bar-animated {
+ -webkit-animation: none;
+ animation: none
+ }
+
+}
+
+.media {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: start;
+ align-items: flex-start
+}
+
+.media-body {
+ -webkit-box-flex: 1;
+ flex: 1
+}
+
+.list-group {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ padding-left: 0;
+ margin-bottom: 0
+}
+
+.list-group-item-action {
+ width: 100%;
+ color: #495057;
+ text-align: inherit
+}
+
+.list-group-item-action:focus,
+.list-group-item-action:hover {
+ z-index: 1;
+ color: #495057;
+ text-decoration: none;
+ background-color: #f8f9fa
+}
+
+.list-group-item-action:active {
+ color: #212529;
+ background-color: #e9ecef
+}
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: .75rem 1.25rem;
+ margin-bottom: -1px;
+ background-color: #fff;
+ border: 1px solid rgba(0, 0, 0, .125)
+}
+
+.list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-top-right-radius: .25rem
+}
+
+.list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: .25rem
+}
+
+.list-group-item.disabled,
+.list-group-item:disabled {
+ color: #6c757d;
+ pointer-events: none;
+ background-color: #fff
+}
+
+.list-group-item.active {
+ z-index: 2;
+ color: #fff;
+ background-color: #007bff;
+ border-color: #007bff
+}
+
+.list-group-horizontal {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+}
+
+.list-group-horizontal .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+}
+
+.list-group-horizontal .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+}
+
+.list-group-horizontal .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+}
+
+@media (min-width:576px) {
+ .list-group-horizontal-sm {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-sm .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-sm .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-sm .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+@media (min-width:768px) {
+ .list-group-horizontal-md {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-md .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-md .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-md .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+@media (min-width:992px) {
+ .list-group-horizontal-lg {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-lg .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-lg .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-lg .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+@media (min-width:1200px) {
+ .list-group-horizontal-xl {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row
+ }
+
+ .list-group-horizontal-xl .list-group-item {
+ margin-right: -1px;
+ margin-bottom: 0
+ }
+
+ .list-group-horizontal-xl .list-group-item:first-child {
+ border-top-left-radius: .25rem;
+ border-bottom-left-radius: .25rem;
+ border-top-right-radius: 0
+ }
+
+ .list-group-horizontal-xl .list-group-item:last-child {
+ margin-right: 0;
+ border-top-right-radius: .25rem;
+ border-bottom-right-radius: .25rem;
+ border-bottom-left-radius: 0
+ }
+
+}
+
+.list-group-flush .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ border-radius: 0
+}
+
+.list-group-flush .list-group-item:last-child {
+ margin-bottom: -1px
+}
+
+.list-group-flush:first-child .list-group-item:first-child {
+ border-top: 0
+}
+
+.list-group-flush:last-child .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom: 0
+}
+
+.list-group-item-primary {
+ color: #023a03;
+ background-color: #b9d7b9
+}
+
+.list-group-item-primary.list-group-item-action:focus,
+.list-group-item-primary.list-group-item-action:hover {
+ color: #023a03;
+ background-color: #a9cea9
+}
+
+.list-group-item-primary.list-group-item-action.active {
+ color: #fff;
+ background-color: #023a03;
+ border-color: #023a03
+}
+
+.list-group-item-secondary {
+ color: #434343;
+ background-color: #dbdbdb
+}
+
+.list-group-item-secondary.list-group-item-action:focus,
+.list-group-item-secondary.list-group-item-action:hover {
+ color: #434343;
+ background-color: #cecece
+}
+
+.list-group-item-secondary.list-group-item-action.active {
+ color: #fff;
+ background-color: #434343;
+ border-color: #434343
+}
+
+.list-group-item-success {
+ color: #00744c;
+ background-color: #b8f6e1
+}
+
+.list-group-item-success.list-group-item-action:focus,
+.list-group-item-success.list-group-item-action:hover {
+ color: #00744c;
+ background-color: #a1f3d7
+}
+
+.list-group-item-success.list-group-item-action.active {
+ color: #fff;
+ background-color: #00744c;
+ border-color: #00744c
+}
+
+.list-group-item-info {
+ color: #383280;
+ background-color: #d6d3fc
+}
+
+.list-group-item-info.list-group-item-action:focus,
+.list-group-item-info.list-group-item-action:hover {
+ color: #383280;
+ background-color: #c0bbfa
+}
+
+.list-group-item-info.list-group-item-action.active {
+ color: #fff;
+ background-color: #383280;
+ border-color: #383280
+}
+
+.list-group-item-warning {
+ color: #7d4431;
+ background-color: #fbdcd2
+}
+
+.list-group-item-warning.list-group-item-action:focus,
+.list-group-item-warning.list-group-item-action:hover {
+ color: #7d4431;
+ background-color: #f9cabb
+}
+
+.list-group-item-warning.list-group-item-action.active {
+ color: #fff;
+ background-color: #7d4431;
+ border-color: #7d4431
+}
+
+.list-group-item-danger {
+ color: #853135;
+ background-color: #ffd2d4
+}
+
+.list-group-item-danger.list-group-item-action:focus,
+.list-group-item-danger.list-group-item-action:hover {
+ color: #853135;
+ background-color: #ffb9bc
+}
+
+.list-group-item-danger.list-group-item-action.active {
+ color: #fff;
+ background-color: #853135;
+ border-color: #853135
+}
+
+.list-group-item-light {
+ color: #747474;
+ background-color: #f6f6f6
+}
+
+.list-group-item-light.list-group-item-action:focus,
+.list-group-item-light.list-group-item-action:hover {
+ color: #747474;
+ background-color: #e9e9e9
+}
+
+.list-group-item-light.list-group-item-action.active {
+ color: #fff;
+ background-color: #747474;
+ border-color: #747474
+}
+
+.list-group-item-dark {
+ color: #3c3d40;
+ background-color: #d8d9da
+}
+
+.list-group-item-dark.list-group-item-action:focus,
+.list-group-item-dark.list-group-item-action:hover {
+ color: #3c3d40;
+ background-color: #cbccce
+}
+
+.list-group-item-dark.list-group-item-action.active {
+ color: #fff;
+ background-color: #3c3d40;
+ border-color: #3c3d40
+}
+
+.list-group-item-white {
+ color: #858585;
+ background-color: #fff
+}
+
+.list-group-item-white.list-group-item-action:focus,
+.list-group-item-white.list-group-item-action:hover {
+ color: #858585;
+ background-color: #f2f2f2
+}
+
+.list-group-item-white.list-group-item-action.active {
+ color: #fff;
+ background-color: #858585;
+ border-color: #858585
+}
+
+.close {
+ float: right;
+ font-size: 1.5rem;
+ font-weight: 700;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: .5
+}
+
+.close:hover {
+ color: #000;
+ text-decoration: none
+}
+
+.close:not(:disabled):not(.disabled):focus,
+.close:not(:disabled):not(.disabled):hover {
+ opacity: .75
+}
+
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none
+}
+
+a.close.disabled {
+ pointer-events: none
+}
+
+.toast {
+ max-width: 350px;
+ overflow: hidden;
+ font-size: .875rem;
+ background-color: rgba(255, 255, 255, .85);
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .1);
+ box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .1);
+ -webkit-backdrop-filter: blur(10px);
+ backdrop-filter: blur(10px);
+ opacity: 0;
+ border-radius: .25rem
+}
+
+.toast:not(:last-child) {
+ margin-bottom: .75rem
+}
+
+.toast.showing {
+ opacity: 1
+}
+
+.toast.show {
+ display: block;
+ opacity: 1
+}
+
+.toast.hide {
+ display: none
+}
+
+.toast-header {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ padding: .25rem .75rem;
+ color: #6c757d;
+ background-color: rgba(255, 255, 255, .85);
+ background-clip: padding-box;
+ border-bottom: 1px solid rgba(0, 0, 0, .05)
+}
+
+.toast-body {
+ padding: .75rem
+}
+
+.modal-open {
+ overflow: hidden
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto
+}
+
+.modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1050;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ outline: 0
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: .5rem;
+ pointer-events: none
+}
+
+.modal.fade .modal-dialog {
+ -webkit-transition: -webkit-transform .3s ease-out;
+ transition: -webkit-transform .3s ease-out;
+ transition: transform .3s ease-out;
+ transition: transform .3s ease-out, -webkit-transform .3s ease-out;
+ -webkit-transform: translate(0, -50px);
+ transform: translate(0, -50px)
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .modal.fade .modal-dialog {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.modal.show .modal-dialog {
+ -webkit-transform: none;
+ transform: none
+}
+
+.modal-dialog-scrollable {
+ display: -webkit-box;
+ display: flex;
+ max-height: calc(100% - 1rem)
+}
+
+.modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 1rem);
+ overflow: hidden
+}
+
+.modal-dialog-scrollable .modal-footer,
+.modal-dialog-scrollable .modal-header {
+ flex-shrink: 0
+}
+
+.modal-dialog-scrollable .modal-body {
+ overflow-y: auto
+}
+
+.modal-dialog-centered {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ min-height: calc(100% - 1rem)
+}
+
+.modal-dialog-centered::before {
+ display: block;
+ height: calc(100vh - 1rem);
+ content: 'http://www.w3.org/2000/svg'
+}
+
+.modal-dialog-centered.modal-dialog-scrollable {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ -webkit-box-pack: center;
+ justify-content: center;
+ height: 100%
+}
+
+.modal-dialog-centered.modal-dialog-scrollable .modal-content {
+ max-height: none
+}
+
+.modal-dialog-centered.modal-dialog-scrollable::before {
+ content: none
+}
+
+.modal-content {
+ position: relative;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column;
+ width: 100%;
+ pointer-events: auto;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: .3rem;
+ outline: 0
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1040;
+ width: 100vw;
+ height: 100vh;
+ background-color: #000
+}
+
+.modal-backdrop.fade {
+ opacity: 0
+}
+
+.modal-backdrop.show {
+ opacity: .8
+}
+
+.modal-header {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: start;
+ align-items: flex-start;
+ -webkit-box-pack: justify;
+ justify-content: space-between;
+ padding: 1rem 1rem;
+ border-bottom: 1px solid #dee2e6;
+ border-top-left-radius: .3rem;
+ border-top-right-radius: .3rem
+}
+
+.modal-header .close {
+ padding: 1rem 1rem;
+ margin: -1rem -1rem -1rem auto
+}
+
+.modal-title {
+ margin-bottom: 0;
+ line-height: 1.5
+}
+
+.modal-body {
+ position: relative;
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ padding: 1rem
+}
+
+.modal-footer {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: end;
+ justify-content: flex-end;
+ padding: 1rem;
+ border-top: 1px solid #dee2e6;
+ border-bottom-right-radius: .3rem;
+ border-bottom-left-radius: .3rem
+}
+
+.modal-footer>:not(:first-child) {
+ margin-left: .25rem
+}
+
+.modal-footer>:not(:last-child) {
+ margin-right: .25rem
+}
+
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll
+}
+
+@media (min-width:576px) {
+ .modal-dialog {
+ max-width: 500px;
+ margin: 1.75rem auto
+ }
+
+ .modal-dialog-scrollable {
+ max-height: calc(100% - 3.5rem)
+ }
+
+ .modal-dialog-scrollable .modal-content {
+ max-height: calc(100vh - 3.5rem)
+ }
+
+ .modal-dialog-centered {
+ min-height: calc(100% - 3.5rem)
+ }
+
+ .modal-dialog-centered::before {
+ height: calc(100vh - 3.5rem)
+ }
+
+ .modal-sm {
+ max-width: 300px
+ }
+
+}
+
+@media (min-width:992px) {
+ .modal-lg,
+ .modal-xl {
+ max-width: 800px
+ }
+
+}
+
+@media (min-width:1200px) {
+ .modal-xl {
+ max-width: 1140px
+ }
+
+}
+
+.tooltip {
+ position: absolute;
+ z-index: 1070;
+ display: block;
+ margin: 0;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.7;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: .875rem;
+ word-wrap: break-word;
+ opacity: 0
+}
+
+.tooltip.show {
+ opacity: .9
+}
+
+.tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: .8rem;
+ height: .4rem
+}
+
+.tooltip .arrow::before {
+ position: absolute;
+ content: '%23dc3545';
+ border-color: transparent;
+ border-style: solid
+}
+
+.bs-tooltip-auto[x-placement^=top],
+.bs-tooltip-top {
+ padding: .4rem 0
+}
+
+.bs-tooltip-auto[x-placement^=top] .arrow,
+.bs-tooltip-top .arrow {
+ bottom: 0
+}
+
+.bs-tooltip-auto[x-placement^=top] .arrow::before,
+.bs-tooltip-top .arrow::before {
+ top: 0;
+ border-width: .4rem .4rem 0;
+ border-top-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=right],
+.bs-tooltip-right {
+ padding: 0 .4rem
+}
+
+.bs-tooltip-auto[x-placement^=right] .arrow,
+.bs-tooltip-right .arrow {
+ left: 0;
+ width: .4rem;
+ height: .8rem
+}
+
+.bs-tooltip-auto[x-placement^=right] .arrow::before,
+.bs-tooltip-right .arrow::before {
+ right: 0;
+ border-width: .4rem .4rem .4rem 0;
+ border-right-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=bottom],
+.bs-tooltip-bottom {
+ padding: .4rem 0
+}
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow,
+.bs-tooltip-bottom .arrow {
+ top: 0
+}
+
+.bs-tooltip-auto[x-placement^=bottom] .arrow::before,
+.bs-tooltip-bottom .arrow::before {
+ bottom: 0;
+ border-width: 0 .4rem .4rem;
+ border-bottom-color: #000
+}
+
+.bs-tooltip-auto[x-placement^=left],
+.bs-tooltip-left {
+ padding: 0 .4rem
+}
+
+.bs-tooltip-auto[x-placement^=left] .arrow,
+.bs-tooltip-left .arrow {
+ right: 0;
+ width: .4rem;
+ height: .8rem
+}
+
+.bs-tooltip-auto[x-placement^=left] .arrow::before,
+.bs-tooltip-left .arrow::before {
+ left: 0;
+ border-width: .4rem 0 .4rem .4rem;
+ border-left-color: #000
+}
+
+.tooltip-inner {
+ max-width: 200px;
+ padding: .25rem .5rem;
+ color: #fff;
+ text-align: center;
+ background-color: #000;
+ border-radius: .25rem
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: block;
+ max-width: 276px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ font-style: normal;
+ font-weight: 400;
+ line-height: 1.7;
+ text-align: left;
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+ font-size: .875rem;
+ word-wrap: break-word;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: .3rem
+}
+
+.popover .arrow {
+ position: absolute;
+ display: block;
+ width: 1rem;
+ height: .5rem;
+ margin: 0 6px
+}
+
+.popover .arrow::after,
+.popover .arrow::before {
+ position: absolute;
+ display: block;
+ content: '-2 -2 7 7';
+ border-color: transparent;
+ border-style: solid
+}
+
+.bs-popover-auto[x-placement^=top],
+.bs-popover-top {
+ margin-bottom: .5rem
+}
+
+.bs-popover-auto[x-placement^=top]>.arrow,
+.bs-popover-top>.arrow {
+ bottom: calc((.5rem + 1px) * -1)
+}
+
+.bs-popover-auto[x-placement^=top]>.arrow::before,
+.bs-popover-top>.arrow::before {
+ bottom: 0;
+ border-width: .5rem .5rem 0;
+ border-top-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=top]>.arrow::after,
+.bs-popover-top>.arrow::after {
+ bottom: 1px;
+ border-width: .5rem .5rem 0;
+ border-top-color: #fff
+}
+
+.bs-popover-auto[x-placement^=right],
+.bs-popover-right {
+ margin-left: .5rem
+}
+
+.bs-popover-auto[x-placement^=right]>.arrow,
+.bs-popover-right>.arrow {
+ left: calc((.5rem + 1px) * -1);
+ width: .5rem;
+ height: 1rem;
+ margin: 6px 0
+}
+
+.bs-popover-auto[x-placement^=right]>.arrow::before,
+.bs-popover-right>.arrow::before {
+ left: 0;
+ border-width: .5rem .5rem .5rem 0;
+ border-right-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=right]>.arrow::after,
+.bs-popover-right>.arrow::after {
+ left: 1px;
+ border-width: .5rem .5rem .5rem 0;
+ border-right-color: #fff
+}
+
+.bs-popover-auto[x-placement^=bottom],
+.bs-popover-bottom {
+ margin-top: .5rem
+}
+
+.bs-popover-auto[x-placement^=bottom]>.arrow,
+.bs-popover-bottom>.arrow {
+ top: calc((.5rem + 1px) * -1)
+}
+
+.bs-popover-auto[x-placement^=bottom]>.arrow::before,
+.bs-popover-bottom>.arrow::before {
+ top: 0;
+ border-width: 0 .5rem .5rem .5rem;
+ border-bottom-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=bottom]>.arrow::after,
+.bs-popover-bottom>.arrow::after {
+ top: 1px;
+ border-width: 0 .5rem .5rem .5rem;
+ border-bottom-color: #fff
+}
+
+.bs-popover-auto[x-placement^=bottom] .popover-header::before,
+.bs-popover-bottom .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 1rem;
+ margin-left: -.5rem;
+ content: '%23dc3545';
+ border-bottom: 1px solid #f7f7f7
+}
+
+.bs-popover-auto[x-placement^=left],
+.bs-popover-left {
+ margin-right: .5rem
+}
+
+.bs-popover-auto[x-placement^=left]>.arrow,
+.bs-popover-left>.arrow {
+ right: calc((.5rem + 1px) * -1);
+ width: .5rem;
+ height: 1rem;
+ margin: 6px 0
+}
+
+.bs-popover-auto[x-placement^=left]>.arrow::before,
+.bs-popover-left>.arrow::before {
+ right: 0;
+ border-width: .5rem 0 .5rem .5rem;
+ border-left-color: rgba(0, 0, 0, .25)
+}
+
+.bs-popover-auto[x-placement^=left]>.arrow::after,
+.bs-popover-left>.arrow::after {
+ right: 1px;
+ border-width: .5rem 0 .5rem .5rem;
+ border-left-color: #fff
+}
+
+.popover-header {
+ padding: .5rem .75rem;
+ margin-bottom: 0;
+ font-size: 1rem;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-top-left-radius: calc(6px - 1px);
+ border-top-right-radius: calc(6px - 1px)
+}
+
+.popover-header:empty {
+ display: none
+}
+
+.popover-body {
+ padding: .5rem .75rem;
+ color: #212529
+}
+
+.carousel {
+ position: relative
+}
+
+.carousel.pointer-event {
+ touch-action: pan-y
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden
+}
+
+.carousel-inner::after {
+ display: block;
+ clear: both;
+ content: 'M0 0l3 3m0-3L0 3'
+}
+
+.carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-transition: -webkit-transform .6s ease-in-out;
+ transition: -webkit-transform .6s ease-in-out;
+ transition: transform .6s ease-in-out;
+ transition: transform .6s ease-in-out, -webkit-transform .6s ease-in-out
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-item {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-item-next,
+.carousel-item-prev,
+.carousel-item.active {
+ display: block
+}
+
+.active.carousel-item-right,
+.carousel-item-next:not(.carousel-item-left) {
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%)
+}
+
+.active.carousel-item-left,
+.carousel-item-prev:not(.carousel-item-right) {
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%)
+}
+
+.carousel-fade .carousel-item {
+ opacity: 0;
+ -webkit-transition-property: opacity;
+ transition-property: opacity;
+ -webkit-transform: none;
+ transform: none
+}
+
+.carousel-fade .carousel-item-next.carousel-item-left,
+.carousel-fade .carousel-item-prev.carousel-item-right,
+.carousel-fade .carousel-item.active {
+ z-index: 1;
+ opacity: 1
+}
+
+.carousel-fade .active.carousel-item-left,
+.carousel-fade .active.carousel-item-right {
+ z-index: 0;
+ opacity: 0;
+ -webkit-transition: 0s .6s opacity;
+ transition: 0s .6s opacity
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-fade .active.carousel-item-left,
+ .carousel-fade .active.carousel-item-right {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-control-next,
+.carousel-control-prev {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ width: 15%;
+ color: #fff;
+ text-align: center;
+ opacity: .5;
+ -webkit-transition: opacity .15s ease;
+ transition: opacity .15s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-control-next,
+ .carousel-control-prev {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-control-next:focus,
+.carousel-control-next:hover,
+.carousel-control-prev:focus,
+.carousel-control-prev:hover {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ opacity: .9
+}
+
+.carousel-control-prev {
+ left: 0
+}
+
+.carousel-control-next {
+ right: 0
+}
+
+.carousel-control-next-icon,
+.carousel-control-prev-icon {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ background: no-repeat 50%/100% 100%
+}
+
+.carousel-control-prev-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e")
+}
+
+.carousel-control-next-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns=!string!fill=!string!viewBox=!string!%3e%3cpath d=!string!/%3e%3c/svg%3e")
+}
+
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 15;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ padding-left: 0;
+ margin-right: 15%;
+ margin-left: 15%;
+ list-style: none
+}
+
+.carousel-indicators li {
+ box-sizing: content-box;
+ -webkit-box-flex: 0;
+ flex: 0 1 auto;
+ width: 30px;
+ height: 3px;
+ margin-right: 3px;
+ margin-left: 3px;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: #fff;
+ background-clip: padding-box;
+ border-top: 10px solid transparent;
+ border-bottom: 10px solid transparent;
+ opacity: .5;
+ -webkit-transition: opacity .6s ease;
+ transition: opacity .6s ease
+}
+
+@media (prefers-reduced-motion:reduce) {
+ .carousel-indicators li {
+ -webkit-transition: none;
+ transition: none
+ }
+
+}
+
+.carousel-indicators .active {
+ opacity: 1
+}
+
+.carousel-caption {
+ position: absolute;
+ right: 15%;
+ bottom: 20px;
+ left: 15%;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ text-align: center
+}
+
+@-webkit-keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+
+}
+
+@keyframes spinner-border {
+ to {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+
+}
+
+.spinner-border {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ border: .25em solid currentColor;
+ border-right-color: transparent;
+ border-radius: 50%;
+ -webkit-animation: spinner-border .75s linear infinite;
+ animation: spinner-border .75s linear infinite
+}
+
+.spinner-border-sm {
+ width: 1rem;
+ height: 1rem;
+ border-width: .2em
+}
+
+@-webkit-keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+@keyframes spinner-grow {
+ 0% {
+ -webkit-transform: scale(0);
+ transform: scale(0)
+ }
+
+ 50% {
+ opacity: 1
+ }
+
+}
+
+.spinner-grow {
+ display: inline-block;
+ width: 2rem;
+ height: 2rem;
+ vertical-align: text-bottom;
+ background-color: currentColor;
+ border-radius: 50%;
+ opacity: 0;
+ -webkit-animation: spinner-grow .75s linear infinite;
+ animation: spinner-grow .75s linear infinite
+}
+
+.spinner-grow-sm {
+ width: 1rem;
+ height: 1rem
+}
+
+.align-baseline {
+ vertical-align: baseline !important
+}
+
+.align-top {
+ vertical-align: top !important
+}
+
+.align-middle {
+ vertical-align: middle !important
+}
+
+.align-bottom {
+ vertical-align: bottom !important
+}
+
+.align-text-bottom {
+ vertical-align: text-bottom !important
+}
+
+.align-text-top {
+ vertical-align: text-top !important
+}
+
+.bg-primary {
+ background-color: #047006 !important
+}
+
+a.bg-primary:focus,
+a.bg-primary:hover,
+button.bg-primary:focus,
+button.bg-primary:hover {
+ background-color: #023f03 !important
+}
+
+.bg-secondary {
+ background-color: grey !important
+}
+
+a.bg-secondary:focus,
+a.bg-secondary:hover,
+button.bg-secondary:focus,
+button.bg-secondary:hover {
+ background-color: #676767 !important
+}
+
+.bg-success {
+ background-color: #047006 !important
+}
+
+a.bg-success:focus,
+a.bg-success:hover,
+button.bg-success:focus,
+button.bg-success:hover {
+ background-color: #00ad72 !important
+}
+
+.bg-info {
+ background-color: #6c61f6 !important
+}
+
+a.bg-info:focus,
+a.bg-info:hover,
+button.bg-info:focus,
+button.bg-info:hover {
+ background-color: #3f31f3 !important
+}
+
+.bg-warning {
+ background-color: #f0825f !important
+}
+
+a.bg-warning:focus,
+a.bg-warning:hover,
+button.bg-warning:focus,
+button.bg-warning:hover {
+ background-color: #ec5e30 !important
+}
+
+.bg-danger {
+ background-color: #ff5f66 !important
+}
+
+a.bg-danger:focus,
+a.bg-danger:hover,
+button.bg-danger:focus,
+button.bg-danger:hover {
+ background-color: #ff2c35 !important
+}
+
+.bg-light {
+ background-color: #dfdfdf !important
+}
+
+a.bg-light:focus,
+a.bg-light:hover,
+button.bg-light:focus,
+button.bg-light:hover {
+ background-color: #c6c6c6 !important
+}
+
+.bg-dark {
+ background-color: #74767b !important
+}
+
+a.bg-dark:focus,
+a.bg-dark:hover,
+button.bg-dark:focus,
+button.bg-dark:hover {
+ background-color: #5b5d61 !important
+}
+
+.bg-white {
+ background-color: #fff !important
+}
+
+a.bg-white:focus,
+a.bg-white:hover,
+button.bg-white:focus,
+button.bg-white:hover {
+ background-color: #e6e6e6 !important
+}
+
+.bg-white {
+ background-color: #fff !important
+}
+
+.bg-transparent {
+ background-color: transparent !important
+}
+
+.border {
+ border: 1px solid #f2f4f9 !important
+}
+
+.border-top {
+ border-top: 1px solid #f2f4f9 !important
+}
+
+.border-right {
+ border-right: 1px solid #f2f4f9 !important
+}
+
+.border-bottom {
+ border-bottom: 1px solid #f2f4f9 !important
+}
+
+.border-left {
+ border-left: 1px solid #f2f4f9 !important
+}
+
+.border-0 {
+ border: 0 !important
+}
+
+.border-top-0 {
+ border-top: 0 !important
+}
+
+.border-right-0 {
+ border-right: 0 !important
+}
+
+.border-bottom-0 {
+ border-bottom: 0 !important
+}
+
+.border-left-0 {
+ border-left: 0 !important
+}
+
+.border-primary {
+ border-color: #047006 !important
+}
+
+.border-secondary {
+ border-color: grey !important
+}
+
+.border-success {
+ border-color: #047006 !important
+}
+
+.border-info {
+ border-color: #6c61f6 !important
+}
+
+.border-warning {
+ border-color: #f0825f !important
+}
+
+.border-danger {
+ border-color: #ff5f66 !important
+}
+
+.border-light {
+ border-color: #dfdfdf !important
+}
+
+.border-dark {
+ border-color: #74767b !important
+}
+
+.border-white {
+ border-color: #fff !important
+}
+
+.border-white {
+ border-color: #fff !important
+}
+
+.rounded-sm {
+ border-radius: .2rem !important
+}
+
+.rounded {
+ border-radius: 2px !important
+}
+
+.rounded-top {
+ border-top-left-radius: 2px !important;
+ border-top-right-radius: 2px !important
+}
+
+.rounded-right {
+ border-top-right-radius: 2px !important;
+ border-bottom-right-radius: 2px !important
+}
+
+.rounded-bottom {
+ border-bottom-right-radius: 2px !important;
+ border-bottom-left-radius: 2px !important
+}
+
+.rounded-left {
+ border-top-left-radius: 2px !important;
+ border-bottom-left-radius: 2px !important
+}
+
+.rounded-lg {
+ border-radius: 6px !important
+}
+
+.rounded-circle {
+ border-radius: 50% !important
+}
+
+.rounded-pill {
+ border-radius: 50rem !important
+}
+
+.rounded-0 {
+ border-radius: 0 !important
+}
+
+.clearfix::after {
+ display: block;
+ clear: both;
+ content: '.5'
+}
+
+.d-none {
+ display: none !important
+}
+
+.d-inline {
+ display: inline !important
+}
+
+.d-inline-block {
+ display: inline-block !important
+}
+
+.d-block {
+ display: block !important
+}
+
+.d-table {
+ display: table !important
+}
+
+.d-table-row {
+ display: table-row !important
+}
+
+.d-table-cell {
+ display: table-cell !important
+}
+
+.d-flex {
+ display: -webkit-box !important;
+ display: flex !important
+}
+
+.d-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+}
+
+@media (min-width:576px) {
+ .d-sm-none {
+ display: none !important
+ }
+
+ .d-sm-inline {
+ display: inline !important
+ }
+
+ .d-sm-inline-block {
+ display: inline-block !important
+ }
+
+ .d-sm-block {
+ display: block !important
+ }
+
+ .d-sm-table {
+ display: table !important
+ }
+
+ .d-sm-table-row {
+ display: table-row !important
+ }
+
+ .d-sm-table-cell {
+ display: table-cell !important
+ }
+
+ .d-sm-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-sm-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .d-md-none {
+ display: none !important
+ }
+
+ .d-md-inline {
+ display: inline !important
+ }
+
+ .d-md-inline-block {
+ display: inline-block !important
+ }
+
+ .d-md-block {
+ display: block !important
+ }
+
+ .d-md-table {
+ display: table !important
+ }
+
+ .d-md-table-row {
+ display: table-row !important
+ }
+
+ .d-md-table-cell {
+ display: table-cell !important
+ }
+
+ .d-md-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-md-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .d-lg-none {
+ display: none !important
+ }
+
+ .d-lg-inline {
+ display: inline !important
+ }
+
+ .d-lg-inline-block {
+ display: inline-block !important
+ }
+
+ .d-lg-block {
+ display: block !important
+ }
+
+ .d-lg-table {
+ display: table !important
+ }
+
+ .d-lg-table-row {
+ display: table-row !important
+ }
+
+ .d-lg-table-cell {
+ display: table-cell !important
+ }
+
+ .d-lg-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-lg-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .d-xl-none {
+ display: none !important
+ }
+
+ .d-xl-inline {
+ display: inline !important
+ }
+
+ .d-xl-inline-block {
+ display: inline-block !important
+ }
+
+ .d-xl-block {
+ display: block !important
+ }
+
+ .d-xl-table {
+ display: table !important
+ }
+
+ .d-xl-table-row {
+ display: table-row !important
+ }
+
+ .d-xl-table-cell {
+ display: table-cell !important
+ }
+
+ .d-xl-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-xl-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+@media print {
+ .d-print-none {
+ display: none !important
+ }
+
+ .d-print-inline {
+ display: inline !important
+ }
+
+ .d-print-inline-block {
+ display: inline-block !important
+ }
+
+ .d-print-block {
+ display: block !important
+ }
+
+ .d-print-table {
+ display: table !important
+ }
+
+ .d-print-table-row {
+ display: table-row !important
+ }
+
+ .d-print-table-cell {
+ display: table-cell !important
+ }
+
+ .d-print-flex {
+ display: -webkit-box !important;
+ display: flex !important
+ }
+
+ .d-print-inline-flex {
+ display: -webkit-inline-box !important;
+ display: inline-flex !important
+ }
+
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden
+}
+
+.embed-responsive::before {
+ display: block;
+ content: '3'
+}
+
+.embed-responsive .embed-responsive-item,
+.embed-responsive embed,
+.embed-responsive iframe,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0
+}
+
+.embed-responsive-21by9::before {
+ padding-top: 42.85714%
+}
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%
+}
+
+.embed-responsive-4by3::before {
+ padding-top: 75%
+}
+
+.embed-responsive-1by1::before {
+ padding-top: 100%
+}
+
+.embed-responsive-21by9::before {
+ padding-top: 42.85714%
+}
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%
+}
+
+.embed-responsive-4by3::before {
+ padding-top: 75%
+}
+
+.embed-responsive-1by1::before {
+ padding-top: 100%
+}
+
+.flex-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+}
+
+.flex-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+}
+
+.flex-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+}
+
+.flex-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+}
+
+.flex-wrap {
+ flex-wrap: wrap !important
+}
+
+.flex-nowrap {
+ flex-wrap: nowrap !important
+}
+
+.flex-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+}
+
+.flex-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+}
+
+.flex-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+}
+
+.flex-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0 !important
+}
+
+.flex-shrink-1 {
+ flex-shrink: 1 !important
+}
+
+.justify-content-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+}
+
+.justify-content-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+}
+
+.justify-content-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+}
+
+.justify-content-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+}
+
+.justify-content-around {
+ justify-content: space-around !important
+}
+
+.align-items-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+}
+
+.align-items-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+}
+
+.align-items-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+}
+
+.align-items-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+}
+
+.align-items-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+}
+
+.align-content-start {
+ align-content: flex-start !important
+}
+
+.align-content-end {
+ align-content: flex-end !important
+}
+
+.align-content-center {
+ align-content: center !important
+}
+
+.align-content-between {
+ align-content: space-between !important
+}
+
+.align-content-around {
+ align-content: space-around !important
+}
+
+.align-content-stretch {
+ align-content: stretch !important
+}
+
+.align-self-auto {
+ align-self: auto !important
+}
+
+.align-self-start {
+ align-self: flex-start !important
+}
+
+.align-self-end {
+ align-self: flex-end !important
+}
+
+.align-self-center {
+ align-self: center !important
+}
+
+.align-self-baseline {
+ align-self: baseline !important
+}
+
+.align-self-stretch {
+ align-self: stretch !important
+}
+
+@media (min-width:576px) {
+ .flex-sm-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-sm-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-sm-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-sm-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-sm-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-sm-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-sm-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-sm-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-sm-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-sm-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-sm-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-sm-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-sm-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-sm-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-sm-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-sm-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-sm-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-sm-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-sm-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-sm-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-sm-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-sm-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-sm-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-sm-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-sm-center {
+ align-content: center !important
+ }
+
+ .align-content-sm-between {
+ align-content: space-between !important
+ }
+
+ .align-content-sm-around {
+ align-content: space-around !important
+ }
+
+ .align-content-sm-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-sm-auto {
+ align-self: auto !important
+ }
+
+ .align-self-sm-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-sm-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-sm-center {
+ align-self: center !important
+ }
+
+ .align-self-sm-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-sm-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .flex-md-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-md-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-md-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-md-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-md-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-md-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-md-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-md-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-md-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-md-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-md-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-md-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-md-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-md-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-md-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-md-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-md-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-md-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-md-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-md-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-md-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-md-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-md-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-md-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-md-center {
+ align-content: center !important
+ }
+
+ .align-content-md-between {
+ align-content: space-between !important
+ }
+
+ .align-content-md-around {
+ align-content: space-around !important
+ }
+
+ .align-content-md-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-md-auto {
+ align-self: auto !important
+ }
+
+ .align-self-md-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-md-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-md-center {
+ align-self: center !important
+ }
+
+ .align-self-md-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-md-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .flex-lg-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-lg-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-lg-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-lg-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-lg-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-lg-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-lg-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-lg-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-lg-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-lg-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-lg-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-lg-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-lg-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-lg-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-lg-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-lg-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-lg-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-lg-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-lg-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-lg-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-lg-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-lg-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-lg-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-lg-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-lg-center {
+ align-content: center !important
+ }
+
+ .align-content-lg-between {
+ align-content: space-between !important
+ }
+
+ .align-content-lg-around {
+ align-content: space-around !important
+ }
+
+ .align-content-lg-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-lg-auto {
+ align-self: auto !important
+ }
+
+ .align-self-lg-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-lg-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-lg-center {
+ align-self: center !important
+ }
+
+ .align-self-lg-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-lg-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .flex-xl-row {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: row !important
+ }
+
+ .flex-xl-column {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: normal !important;
+ flex-direction: column !important
+ }
+
+ .flex-xl-row-reverse {
+ -webkit-box-orient: horizontal !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: row-reverse !important
+ }
+
+ .flex-xl-column-reverse {
+ -webkit-box-orient: vertical !important;
+ -webkit-box-direction: reverse !important;
+ flex-direction: column-reverse !important
+ }
+
+ .flex-xl-wrap {
+ flex-wrap: wrap !important
+ }
+
+ .flex-xl-nowrap {
+ flex-wrap: nowrap !important
+ }
+
+ .flex-xl-wrap-reverse {
+ flex-wrap: wrap-reverse !important
+ }
+
+ .flex-xl-fill {
+ -webkit-box-flex: 1 !important;
+ flex: 1 1 auto !important
+ }
+
+ .flex-xl-grow-0 {
+ -webkit-box-flex: 0 !important;
+ flex-grow: 0 !important
+ }
+
+ .flex-xl-grow-1 {
+ -webkit-box-flex: 1 !important;
+ flex-grow: 1 !important
+ }
+
+ .flex-xl-shrink-0 {
+ flex-shrink: 0 !important
+ }
+
+ .flex-xl-shrink-1 {
+ flex-shrink: 1 !important
+ }
+
+ .justify-content-xl-start {
+ -webkit-box-pack: start !important;
+ justify-content: flex-start !important
+ }
+
+ .justify-content-xl-end {
+ -webkit-box-pack: end !important;
+ justify-content: flex-end !important
+ }
+
+ .justify-content-xl-center {
+ -webkit-box-pack: center !important;
+ justify-content: center !important
+ }
+
+ .justify-content-xl-between {
+ -webkit-box-pack: justify !important;
+ justify-content: space-between !important
+ }
+
+ .justify-content-xl-around {
+ justify-content: space-around !important
+ }
+
+ .align-items-xl-start {
+ -webkit-box-align: start !important;
+ align-items: flex-start !important
+ }
+
+ .align-items-xl-end {
+ -webkit-box-align: end !important;
+ align-items: flex-end !important
+ }
+
+ .align-items-xl-center {
+ -webkit-box-align: center !important;
+ align-items: center !important
+ }
+
+ .align-items-xl-baseline {
+ -webkit-box-align: baseline !important;
+ align-items: baseline !important
+ }
+
+ .align-items-xl-stretch {
+ -webkit-box-align: stretch !important;
+ align-items: stretch !important
+ }
+
+ .align-content-xl-start {
+ align-content: flex-start !important
+ }
+
+ .align-content-xl-end {
+ align-content: flex-end !important
+ }
+
+ .align-content-xl-center {
+ align-content: center !important
+ }
+
+ .align-content-xl-between {
+ align-content: space-between !important
+ }
+
+ .align-content-xl-around {
+ align-content: space-around !important
+ }
+
+ .align-content-xl-stretch {
+ align-content: stretch !important
+ }
+
+ .align-self-xl-auto {
+ align-self: auto !important
+ }
+
+ .align-self-xl-start {
+ align-self: flex-start !important
+ }
+
+ .align-self-xl-end {
+ align-self: flex-end !important
+ }
+
+ .align-self-xl-center {
+ align-self: center !important
+ }
+
+ .align-self-xl-baseline {
+ align-self: baseline !important
+ }
+
+ .align-self-xl-stretch {
+ align-self: stretch !important
+ }
+
+}
+
+.float-left {
+ float: left !important
+}
+
+.float-right {
+ float: right !important
+}
+
+.float-none {
+ float: none !important
+}
+
+@media (min-width:576px) {
+ .float-sm-left {
+ float: left !important
+ }
+
+ .float-sm-right {
+ float: right !important
+ }
+
+ .float-sm-none {
+ float: none !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .float-md-left {
+ float: left !important
+ }
+
+ .float-md-right {
+ float: right !important
+ }
+
+ .float-md-none {
+ float: none !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .float-lg-left {
+ float: left !important
+ }
+
+ .float-lg-right {
+ float: right !important
+ }
+
+ .float-lg-none {
+ float: none !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .float-xl-left {
+ float: left !important
+ }
+
+ .float-xl-right {
+ float: right !important
+ }
+
+ .float-xl-none {
+ float: none !important
+ }
+
+}
+
+.overflow-auto {
+ overflow: auto !important
+}
+
+.overflow-hidden {
+ overflow: hidden !important
+}
+
+.position-static {
+ position: static !important
+}
+
+.position-relative {
+ position: relative !important
+}
+
+.position-absolute {
+ position: absolute !important
+}
+
+.position-fixed {
+ position: fixed !important
+}
+
+.position-sticky {
+ position: -webkit-sticky !important;
+ position: sticky !important
+}
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1030
+}
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1030
+}
+
+@supports ((position:-webkit-sticky) or (position:sticky)) {
+ .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020
+ }
+
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0
+}
+
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal
+}
+
+.shadow-sm {
+ box-shadow: 0 .125rem .25rem rgba(0, 0, 0, .075) !important
+}
+
+.shadow {
+ box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15) !important
+}
+
+.shadow-lg {
+ box-shadow: 0 1rem 3rem rgba(0, 0, 0, .175) !important
+}
+
+.shadow-none {
+ box-shadow: none !important
+}
+
+.w-25 {
+ width: 25% !important
+}
+
+.w-50 {
+ width: 50% !important
+}
+
+.w-75 {
+ width: 75% !important
+}
+
+.w-100 {
+ width: 100% !important
+}
+
+.w-auto {
+ width: auto !important
+}
+
+.h-25 {
+ height: 25% !important
+}
+
+.h-50 {
+ height: 50% !important
+}
+
+.h-75 {
+ height: 75% !important
+}
+
+.h-100 {
+ height: 100% !important
+}
+
+.h-auto {
+ height: auto !important
+}
+
+.mw-100 {
+ max-width: 100% !important
+}
+
+.mh-100 {
+ max-height: 100% !important
+}
+
+.min-vw-100 {
+ min-width: 100vw !important
+}
+
+.min-vh-100 {
+ min-height: 100vh !important
+}
+
+.vw-100 {
+ width: 100vw !important
+}
+
+.vh-100 {
+ height: 100vh !important
+}
+
+.stretched-link::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ pointer-events: auto;
+ content: '.5';
+ background-color: rgba(0, 0, 0, 0)
+}
+
+.m-0 {
+ margin: 0 !important
+}
+
+.mt-0,
+.my-0 {
+ margin-top: 0 !important
+}
+
+.mr-0,
+.mx-0 {
+ margin-right: 0 !important
+}
+
+.mb-0,
+.my-0 {
+ margin-bottom: 0 !important
+}
+
+.ml-0,
+.mx-0 {
+ margin-left: 0 !important
+}
+
+.m-1 {
+ margin: .25rem !important
+}
+
+.mt-1,
+.my-1 {
+ margin-top: .25rem !important
+}
+
+.mr-1,
+.mx-1 {
+ margin-right: .25rem !important
+}
+
+.mb-1,
+.my-1 {
+ margin-bottom: .25rem !important
+}
+
+.ml-1,
+.mx-1 {
+ margin-left: .25rem !important
+}
+
+.m-2 {
+ margin: .5rem !important
+}
+
+.mt-2,
+.my-2 {
+ margin-top: .5rem !important
+}
+
+.mr-2,
+.mx-2 {
+ margin-right: .5rem !important
+}
+
+.mb-2,
+.my-2 {
+ margin-bottom: .5rem !important
+}
+
+.ml-2,
+.mx-2 {
+ margin-left: .5rem !important
+}
+
+.m-3 {
+ margin: 1rem !important
+}
+
+.mt-3,
+.my-3 {
+ margin-top: 1rem !important
+}
+
+.mr-3,
+.mx-3 {
+ margin-right: 1rem !important
+}
+
+.mb-3,
+.my-3 {
+ margin-bottom: 1rem !important
+}
+
+.ml-3,
+.mx-3 {
+ margin-left: 1rem !important
+}
+
+.m-4 {
+ margin: 1.5rem !important
+}
+
+.mt-4,
+.my-4 {
+ margin-top: 1.5rem !important
+}
+
+.mr-4,
+.mx-4 {
+ margin-right: 1.5rem !important
+}
+
+.mb-4,
+.my-4 {
+ margin-bottom: 1.5rem !important
+}
+
+.ml-4,
+.mx-4 {
+ margin-left: 1.5rem !important
+}
+
+.m-5 {
+ margin: 3rem !important
+}
+
+.mt-5,
+.my-5 {
+ margin-top: 3rem !important
+}
+
+.mr-5,
+.mx-5 {
+ margin-right: 3rem !important
+}
+
+.mb-5,
+.my-5 {
+ margin-bottom: 3rem !important
+}
+
+.ml-5,
+.mx-5 {
+ margin-left: 3rem !important
+}
+
+.p-0 {
+ padding: 0 !important
+}
+
+.pt-0,
+.py-0 {
+ padding-top: 0 !important
+}
+
+.pr-0,
+.px-0 {
+ padding-right: 0 !important
+}
+
+.pb-0,
+.py-0 {
+ padding-bottom: 0 !important
+}
+
+.pl-0,
+.px-0 {
+ padding-left: 0 !important
+}
+
+.p-1 {
+ padding: .25rem !important
+}
+
+.pt-1,
+.py-1 {
+ padding-top: .25rem !important
+}
+
+.pr-1,
+.px-1 {
+ padding-right: .25rem !important
+}
+
+.pb-1,
+.py-1 {
+ padding-bottom: .25rem !important
+}
+
+.pl-1,
+.px-1 {
+ padding-left: .25rem !important
+}
+
+.p-2 {
+ padding: .5rem !important
+}
+
+.pt-2,
+.py-2 {
+ padding-top: .5rem !important
+}
+
+.pr-2,
+.px-2 {
+ padding-right: .5rem !important
+}
+
+.pb-2,
+.py-2 {
+ padding-bottom: .5rem !important
+}
+
+.pl-2,
+.px-2 {
+ padding-left: .5rem !important
+}
+
+.p-3 {
+ padding: 1rem !important
+}
+
+.pt-3,
+.py-3 {
+ padding-top: 1rem !important
+}
+
+.pr-3,
+.px-3 {
+ padding-right: 1rem !important
+}
+
+.pb-3,
+.py-3 {
+ padding-bottom: 1rem !important
+}
+
+.pl-3,
+.px-3 {
+ padding-left: 1rem !important
+}
+
+.p-4 {
+ padding: 1.5rem !important
+}
+
+.pt-4,
+.py-4 {
+ padding-top: 1.5rem !important
+}
+
+.pr-4,
+.px-4 {
+ padding-right: 1.5rem !important
+}
+
+.pb-4,
+.py-4 {
+ padding-bottom: 1.5rem !important
+}
+
+.pl-4,
+.px-4 {
+ padding-left: 1.5rem !important
+}
+
+.p-5 {
+ padding: 3rem !important
+}
+
+.pt-5,
+.py-5 {
+ padding-top: 3rem !important
+}
+
+.pr-5,
+.px-5 {
+ padding-right: 3rem !important
+}
+
+.pb-5,
+.py-5 {
+ padding-bottom: 3rem !important
+}
+
+.pl-5,
+.px-5 {
+ padding-left: 3rem !important
+}
+
+.m-n1 {
+ margin: -.25rem !important
+}
+
+.mt-n1,
+.my-n1 {
+ margin-top: -.25rem !important
+}
+
+.mr-n1,
+.mx-n1 {
+ margin-right: -.25rem !important
+}
+
+.mb-n1,
+.my-n1 {
+ margin-bottom: -.25rem !important
+}
+
+.ml-n1,
+.mx-n1 {
+ margin-left: -.25rem !important
+}
+
+.m-n2 {
+ margin: -.5rem !important
+}
+
+.mt-n2,
+.my-n2 {
+ margin-top: -.5rem !important
+}
+
+.mr-n2,
+.mx-n2 {
+ margin-right: -.5rem !important
+}
+
+.mb-n2,
+.my-n2 {
+ margin-bottom: -.5rem !important
+}
+
+.ml-n2,
+.mx-n2 {
+ margin-left: -.5rem !important
+}
+
+.m-n3 {
+ margin: -1rem !important
+}
+
+.mt-n3,
+.my-n3 {
+ margin-top: -1rem !important
+}
+
+.mr-n3,
+.mx-n3 {
+ margin-right: -1rem !important
+}
+
+.mb-n3,
+.my-n3 {
+ margin-bottom: -1rem !important
+}
+
+.ml-n3,
+.mx-n3 {
+ margin-left: -1rem !important
+}
+
+.m-n4 {
+ margin: -1.5rem !important
+}
+
+.mt-n4,
+.my-n4 {
+ margin-top: -1.5rem !important
+}
+
+.mr-n4,
+.mx-n4 {
+ margin-right: -1.5rem !important
+}
+
+.mb-n4,
+.my-n4 {
+ margin-bottom: -1.5rem !important
+}
+
+.ml-n4,
+.mx-n4 {
+ margin-left: -1.5rem !important
+}
+
+.m-n5 {
+ margin: -3rem !important
+}
+
+.mt-n5,
+.my-n5 {
+ margin-top: -3rem !important
+}
+
+.mr-n5,
+.mx-n5 {
+ margin-right: -3rem !important
+}
+
+.mb-n5,
+.my-n5 {
+ margin-bottom: -3rem !important
+}
+
+.ml-n5,
+.mx-n5 {
+ margin-left: -3rem !important
+}
+
+.m-auto {
+ margin: auto !important
+}
+
+.mt-auto,
+.my-auto {
+ margin-top: auto !important
+}
+
+.mr-auto,
+.mx-auto {
+ margin-right: auto !important
+}
+
+.mb-auto,
+.my-auto {
+ margin-bottom: auto !important
+}
+
+.ml-auto,
+.mx-auto {
+ margin-left: auto !important
+}
+
+@media (min-width:576px) {
+ .m-sm-0 {
+ margin: 0 !important
+ }
+
+ .mt-sm-0,
+ .my-sm-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-sm-0,
+ .mx-sm-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-sm-0,
+ .my-sm-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-sm-0,
+ .mx-sm-0 {
+ margin-left: 0 !important
+ }
+
+ .m-sm-1 {
+ margin: .25rem !important
+ }
+
+ .mt-sm-1,
+ .my-sm-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-sm-1,
+ .mx-sm-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-sm-1,
+ .my-sm-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-sm-1,
+ .mx-sm-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-sm-2 {
+ margin: .5rem !important
+ }
+
+ .mt-sm-2,
+ .my-sm-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-sm-2,
+ .mx-sm-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-sm-2,
+ .my-sm-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-sm-2,
+ .mx-sm-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-sm-3 {
+ margin: 1rem !important
+ }
+
+ .mt-sm-3,
+ .my-sm-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-sm-3,
+ .mx-sm-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-sm-3,
+ .my-sm-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-sm-3,
+ .mx-sm-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-sm-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-sm-4,
+ .my-sm-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-sm-4,
+ .mx-sm-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-sm-4,
+ .my-sm-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-sm-4,
+ .mx-sm-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-sm-5 {
+ margin: 3rem !important
+ }
+
+ .mt-sm-5,
+ .my-sm-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-sm-5,
+ .mx-sm-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-sm-5,
+ .my-sm-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-sm-5,
+ .mx-sm-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-sm-0 {
+ padding: 0 !important
+ }
+
+ .pt-sm-0,
+ .py-sm-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-sm-0,
+ .px-sm-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-sm-0,
+ .py-sm-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-sm-0,
+ .px-sm-0 {
+ padding-left: 0 !important
+ }
+
+ .p-sm-1 {
+ padding: .25rem !important
+ }
+
+ .pt-sm-1,
+ .py-sm-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-sm-1,
+ .px-sm-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-sm-1,
+ .py-sm-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-sm-1,
+ .px-sm-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-sm-2 {
+ padding: .5rem !important
+ }
+
+ .pt-sm-2,
+ .py-sm-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-sm-2,
+ .px-sm-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-sm-2,
+ .py-sm-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-sm-2,
+ .px-sm-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-sm-3 {
+ padding: 1rem !important
+ }
+
+ .pt-sm-3,
+ .py-sm-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-sm-3,
+ .px-sm-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-sm-3,
+ .py-sm-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-sm-3,
+ .px-sm-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-sm-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-sm-4,
+ .py-sm-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-sm-4,
+ .px-sm-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-sm-4,
+ .py-sm-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-sm-4,
+ .px-sm-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-sm-5 {
+ padding: 3rem !important
+ }
+
+ .pt-sm-5,
+ .py-sm-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-sm-5,
+ .px-sm-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-sm-5,
+ .py-sm-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-sm-5,
+ .px-sm-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-sm-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-sm-n1,
+ .my-sm-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-sm-n1,
+ .mx-sm-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-sm-n1,
+ .my-sm-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-sm-n1,
+ .mx-sm-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-sm-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-sm-n2,
+ .my-sm-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-sm-n2,
+ .mx-sm-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-sm-n2,
+ .my-sm-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-sm-n2,
+ .mx-sm-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-sm-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-sm-n3,
+ .my-sm-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-sm-n3,
+ .mx-sm-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-sm-n3,
+ .my-sm-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-sm-n3,
+ .mx-sm-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-sm-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-sm-n4,
+ .my-sm-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-sm-n4,
+ .mx-sm-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-sm-n4,
+ .my-sm-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-sm-n4,
+ .mx-sm-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-sm-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-sm-n5,
+ .my-sm-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-sm-n5,
+ .mx-sm-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-sm-n5,
+ .my-sm-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-sm-n5,
+ .mx-sm-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-sm-auto {
+ margin: auto !important
+ }
+
+ .mt-sm-auto,
+ .my-sm-auto {
+ margin-top: auto !important
+ }
+
+ .mr-sm-auto,
+ .mx-sm-auto {
+ margin-right: auto !important
+ }
+
+ .mb-sm-auto,
+ .my-sm-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-sm-auto,
+ .mx-sm-auto {
+ margin-left: auto !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .m-md-0 {
+ margin: 0 !important
+ }
+
+ .mt-md-0,
+ .my-md-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-md-0,
+ .mx-md-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-md-0,
+ .my-md-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-md-0,
+ .mx-md-0 {
+ margin-left: 0 !important
+ }
+
+ .m-md-1 {
+ margin: .25rem !important
+ }
+
+ .mt-md-1,
+ .my-md-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-md-1,
+ .mx-md-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-md-1,
+ .my-md-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-md-1,
+ .mx-md-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-md-2 {
+ margin: .5rem !important
+ }
+
+ .mt-md-2,
+ .my-md-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-md-2,
+ .mx-md-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-md-2,
+ .my-md-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-md-2,
+ .mx-md-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-md-3 {
+ margin: 1rem !important
+ }
+
+ .mt-md-3,
+ .my-md-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-md-3,
+ .mx-md-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-md-3,
+ .my-md-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-md-3,
+ .mx-md-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-md-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-md-4,
+ .my-md-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-md-4,
+ .mx-md-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-md-4,
+ .my-md-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-md-4,
+ .mx-md-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-md-5 {
+ margin: 3rem !important
+ }
+
+ .mt-md-5,
+ .my-md-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-md-5,
+ .mx-md-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-md-5,
+ .my-md-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-md-5,
+ .mx-md-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-md-0 {
+ padding: 0 !important
+ }
+
+ .pt-md-0,
+ .py-md-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-md-0,
+ .px-md-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-md-0,
+ .py-md-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-md-0,
+ .px-md-0 {
+ padding-left: 0 !important
+ }
+
+ .p-md-1 {
+ padding: .25rem !important
+ }
+
+ .pt-md-1,
+ .py-md-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-md-1,
+ .px-md-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-md-1,
+ .py-md-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-md-1,
+ .px-md-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-md-2 {
+ padding: .5rem !important
+ }
+
+ .pt-md-2,
+ .py-md-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-md-2,
+ .px-md-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-md-2,
+ .py-md-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-md-2,
+ .px-md-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-md-3 {
+ padding: 1rem !important
+ }
+
+ .pt-md-3,
+ .py-md-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-md-3,
+ .px-md-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-md-3,
+ .py-md-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-md-3,
+ .px-md-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-md-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-md-4,
+ .py-md-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-md-4,
+ .px-md-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-md-4,
+ .py-md-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-md-4,
+ .px-md-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-md-5 {
+ padding: 3rem !important
+ }
+
+ .pt-md-5,
+ .py-md-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-md-5,
+ .px-md-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-md-5,
+ .py-md-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-md-5,
+ .px-md-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-md-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-md-n1,
+ .my-md-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-md-n1,
+ .mx-md-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-md-n1,
+ .my-md-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-md-n1,
+ .mx-md-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-md-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-md-n2,
+ .my-md-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-md-n2,
+ .mx-md-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-md-n2,
+ .my-md-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-md-n2,
+ .mx-md-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-md-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-md-n3,
+ .my-md-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-md-n3,
+ .mx-md-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-md-n3,
+ .my-md-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-md-n3,
+ .mx-md-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-md-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-md-n4,
+ .my-md-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-md-n4,
+ .mx-md-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-md-n4,
+ .my-md-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-md-n4,
+ .mx-md-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-md-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-md-n5,
+ .my-md-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-md-n5,
+ .mx-md-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-md-n5,
+ .my-md-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-md-n5,
+ .mx-md-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-md-auto {
+ margin: auto !important
+ }
+
+ .mt-md-auto,
+ .my-md-auto {
+ margin-top: auto !important
+ }
+
+ .mr-md-auto,
+ .mx-md-auto {
+ margin-right: auto !important
+ }
+
+ .mb-md-auto,
+ .my-md-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-md-auto,
+ .mx-md-auto {
+ margin-left: auto !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .m-lg-0 {
+ margin: 0 !important
+ }
+
+ .mt-lg-0,
+ .my-lg-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-lg-0,
+ .mx-lg-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-lg-0,
+ .my-lg-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-lg-0,
+ .mx-lg-0 {
+ margin-left: 0 !important
+ }
+
+ .m-lg-1 {
+ margin: .25rem !important
+ }
+
+ .mt-lg-1,
+ .my-lg-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-lg-1,
+ .mx-lg-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-lg-1,
+ .my-lg-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-lg-1,
+ .mx-lg-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-lg-2 {
+ margin: .5rem !important
+ }
+
+ .mt-lg-2,
+ .my-lg-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-lg-2,
+ .mx-lg-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-lg-2,
+ .my-lg-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-lg-2,
+ .mx-lg-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-lg-3 {
+ margin: 1rem !important
+ }
+
+ .mt-lg-3,
+ .my-lg-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-lg-3,
+ .mx-lg-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-lg-3,
+ .my-lg-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-lg-3,
+ .mx-lg-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-lg-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-lg-4,
+ .my-lg-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-lg-4,
+ .mx-lg-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-lg-4,
+ .my-lg-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-lg-4,
+ .mx-lg-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-lg-5 {
+ margin: 3rem !important
+ }
+
+ .mt-lg-5,
+ .my-lg-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-lg-5,
+ .mx-lg-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-lg-5,
+ .my-lg-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-lg-5,
+ .mx-lg-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-lg-0 {
+ padding: 0 !important
+ }
+
+ .pt-lg-0,
+ .py-lg-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-lg-0,
+ .px-lg-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-lg-0,
+ .py-lg-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-lg-0,
+ .px-lg-0 {
+ padding-left: 0 !important
+ }
+
+ .p-lg-1 {
+ padding: .25rem !important
+ }
+
+ .pt-lg-1,
+ .py-lg-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-lg-1,
+ .px-lg-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-lg-1,
+ .py-lg-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-lg-1,
+ .px-lg-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-lg-2 {
+ padding: .5rem !important
+ }
+
+ .pt-lg-2,
+ .py-lg-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-lg-2,
+ .px-lg-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-lg-2,
+ .py-lg-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-lg-2,
+ .px-lg-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-lg-3 {
+ padding: 1rem !important
+ }
+
+ .pt-lg-3,
+ .py-lg-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-lg-3,
+ .px-lg-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-lg-3,
+ .py-lg-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-lg-3,
+ .px-lg-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-lg-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-lg-4,
+ .py-lg-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-lg-4,
+ .px-lg-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-lg-4,
+ .py-lg-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-lg-4,
+ .px-lg-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-lg-5 {
+ padding: 3rem !important
+ }
+
+ .pt-lg-5,
+ .py-lg-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-lg-5,
+ .px-lg-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-lg-5,
+ .py-lg-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-lg-5,
+ .px-lg-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-lg-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-lg-n1,
+ .my-lg-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-lg-n1,
+ .mx-lg-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-lg-n1,
+ .my-lg-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-lg-n1,
+ .mx-lg-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-lg-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-lg-n2,
+ .my-lg-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-lg-n2,
+ .mx-lg-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-lg-n2,
+ .my-lg-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-lg-n2,
+ .mx-lg-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-lg-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-lg-n3,
+ .my-lg-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-lg-n3,
+ .mx-lg-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-lg-n3,
+ .my-lg-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-lg-n3,
+ .mx-lg-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-lg-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-lg-n4,
+ .my-lg-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-lg-n4,
+ .mx-lg-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-lg-n4,
+ .my-lg-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-lg-n4,
+ .mx-lg-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-lg-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-lg-n5,
+ .my-lg-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-lg-n5,
+ .mx-lg-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-lg-n5,
+ .my-lg-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-lg-n5,
+ .mx-lg-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-lg-auto {
+ margin: auto !important
+ }
+
+ .mt-lg-auto,
+ .my-lg-auto {
+ margin-top: auto !important
+ }
+
+ .mr-lg-auto,
+ .mx-lg-auto {
+ margin-right: auto !important
+ }
+
+ .mb-lg-auto,
+ .my-lg-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-lg-auto,
+ .mx-lg-auto {
+ margin-left: auto !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .m-xl-0 {
+ margin: 0 !important
+ }
+
+ .mt-xl-0,
+ .my-xl-0 {
+ margin-top: 0 !important
+ }
+
+ .mr-xl-0,
+ .mx-xl-0 {
+ margin-right: 0 !important
+ }
+
+ .mb-xl-0,
+ .my-xl-0 {
+ margin-bottom: 0 !important
+ }
+
+ .ml-xl-0,
+ .mx-xl-0 {
+ margin-left: 0 !important
+ }
+
+ .m-xl-1 {
+ margin: .25rem !important
+ }
+
+ .mt-xl-1,
+ .my-xl-1 {
+ margin-top: .25rem !important
+ }
+
+ .mr-xl-1,
+ .mx-xl-1 {
+ margin-right: .25rem !important
+ }
+
+ .mb-xl-1,
+ .my-xl-1 {
+ margin-bottom: .25rem !important
+ }
+
+ .ml-xl-1,
+ .mx-xl-1 {
+ margin-left: .25rem !important
+ }
+
+ .m-xl-2 {
+ margin: .5rem !important
+ }
+
+ .mt-xl-2,
+ .my-xl-2 {
+ margin-top: .5rem !important
+ }
+
+ .mr-xl-2,
+ .mx-xl-2 {
+ margin-right: .5rem !important
+ }
+
+ .mb-xl-2,
+ .my-xl-2 {
+ margin-bottom: .5rem !important
+ }
+
+ .ml-xl-2,
+ .mx-xl-2 {
+ margin-left: .5rem !important
+ }
+
+ .m-xl-3 {
+ margin: 1rem !important
+ }
+
+ .mt-xl-3,
+ .my-xl-3 {
+ margin-top: 1rem !important
+ }
+
+ .mr-xl-3,
+ .mx-xl-3 {
+ margin-right: 1rem !important
+ }
+
+ .mb-xl-3,
+ .my-xl-3 {
+ margin-bottom: 1rem !important
+ }
+
+ .ml-xl-3,
+ .mx-xl-3 {
+ margin-left: 1rem !important
+ }
+
+ .m-xl-4 {
+ margin: 1.5rem !important
+ }
+
+ .mt-xl-4,
+ .my-xl-4 {
+ margin-top: 1.5rem !important
+ }
+
+ .mr-xl-4,
+ .mx-xl-4 {
+ margin-right: 1.5rem !important
+ }
+
+ .mb-xl-4,
+ .my-xl-4 {
+ margin-bottom: 1.5rem !important
+ }
+
+ .ml-xl-4,
+ .mx-xl-4 {
+ margin-left: 1.5rem !important
+ }
+
+ .m-xl-5 {
+ margin: 3rem !important
+ }
+
+ .mt-xl-5,
+ .my-xl-5 {
+ margin-top: 3rem !important
+ }
+
+ .mr-xl-5,
+ .mx-xl-5 {
+ margin-right: 3rem !important
+ }
+
+ .mb-xl-5,
+ .my-xl-5 {
+ margin-bottom: 3rem !important
+ }
+
+ .ml-xl-5,
+ .mx-xl-5 {
+ margin-left: 3rem !important
+ }
+
+ .p-xl-0 {
+ padding: 0 !important
+ }
+
+ .pt-xl-0,
+ .py-xl-0 {
+ padding-top: 0 !important
+ }
+
+ .pr-xl-0,
+ .px-xl-0 {
+ padding-right: 0 !important
+ }
+
+ .pb-xl-0,
+ .py-xl-0 {
+ padding-bottom: 0 !important
+ }
+
+ .pl-xl-0,
+ .px-xl-0 {
+ padding-left: 0 !important
+ }
+
+ .p-xl-1 {
+ padding: .25rem !important
+ }
+
+ .pt-xl-1,
+ .py-xl-1 {
+ padding-top: .25rem !important
+ }
+
+ .pr-xl-1,
+ .px-xl-1 {
+ padding-right: .25rem !important
+ }
+
+ .pb-xl-1,
+ .py-xl-1 {
+ padding-bottom: .25rem !important
+ }
+
+ .pl-xl-1,
+ .px-xl-1 {
+ padding-left: .25rem !important
+ }
+
+ .p-xl-2 {
+ padding: .5rem !important
+ }
+
+ .pt-xl-2,
+ .py-xl-2 {
+ padding-top: .5rem !important
+ }
+
+ .pr-xl-2,
+ .px-xl-2 {
+ padding-right: .5rem !important
+ }
+
+ .pb-xl-2,
+ .py-xl-2 {
+ padding-bottom: .5rem !important
+ }
+
+ .pl-xl-2,
+ .px-xl-2 {
+ padding-left: .5rem !important
+ }
+
+ .p-xl-3 {
+ padding: 1rem !important
+ }
+
+ .pt-xl-3,
+ .py-xl-3 {
+ padding-top: 1rem !important
+ }
+
+ .pr-xl-3,
+ .px-xl-3 {
+ padding-right: 1rem !important
+ }
+
+ .pb-xl-3,
+ .py-xl-3 {
+ padding-bottom: 1rem !important
+ }
+
+ .pl-xl-3,
+ .px-xl-3 {
+ padding-left: 1rem !important
+ }
+
+ .p-xl-4 {
+ padding: 1.5rem !important
+ }
+
+ .pt-xl-4,
+ .py-xl-4 {
+ padding-top: 1.5rem !important
+ }
+
+ .pr-xl-4,
+ .px-xl-4 {
+ padding-right: 1.5rem !important
+ }
+
+ .pb-xl-4,
+ .py-xl-4 {
+ padding-bottom: 1.5rem !important
+ }
+
+ .pl-xl-4,
+ .px-xl-4 {
+ padding-left: 1.5rem !important
+ }
+
+ .p-xl-5 {
+ padding: 3rem !important
+ }
+
+ .pt-xl-5,
+ .py-xl-5 {
+ padding-top: 3rem !important
+ }
+
+ .pr-xl-5,
+ .px-xl-5 {
+ padding-right: 3rem !important
+ }
+
+ .pb-xl-5,
+ .py-xl-5 {
+ padding-bottom: 3rem !important
+ }
+
+ .pl-xl-5,
+ .px-xl-5 {
+ padding-left: 3rem !important
+ }
+
+ .m-xl-n1 {
+ margin: -.25rem !important
+ }
+
+ .mt-xl-n1,
+ .my-xl-n1 {
+ margin-top: -.25rem !important
+ }
+
+ .mr-xl-n1,
+ .mx-xl-n1 {
+ margin-right: -.25rem !important
+ }
+
+ .mb-xl-n1,
+ .my-xl-n1 {
+ margin-bottom: -.25rem !important
+ }
+
+ .ml-xl-n1,
+ .mx-xl-n1 {
+ margin-left: -.25rem !important
+ }
+
+ .m-xl-n2 {
+ margin: -.5rem !important
+ }
+
+ .mt-xl-n2,
+ .my-xl-n2 {
+ margin-top: -.5rem !important
+ }
+
+ .mr-xl-n2,
+ .mx-xl-n2 {
+ margin-right: -.5rem !important
+ }
+
+ .mb-xl-n2,
+ .my-xl-n2 {
+ margin-bottom: -.5rem !important
+ }
+
+ .ml-xl-n2,
+ .mx-xl-n2 {
+ margin-left: -.5rem !important
+ }
+
+ .m-xl-n3 {
+ margin: -1rem !important
+ }
+
+ .mt-xl-n3,
+ .my-xl-n3 {
+ margin-top: -1rem !important
+ }
+
+ .mr-xl-n3,
+ .mx-xl-n3 {
+ margin-right: -1rem !important
+ }
+
+ .mb-xl-n3,
+ .my-xl-n3 {
+ margin-bottom: -1rem !important
+ }
+
+ .ml-xl-n3,
+ .mx-xl-n3 {
+ margin-left: -1rem !important
+ }
+
+ .m-xl-n4 {
+ margin: -1.5rem !important
+ }
+
+ .mt-xl-n4,
+ .my-xl-n4 {
+ margin-top: -1.5rem !important
+ }
+
+ .mr-xl-n4,
+ .mx-xl-n4 {
+ margin-right: -1.5rem !important
+ }
+
+ .mb-xl-n4,
+ .my-xl-n4 {
+ margin-bottom: -1.5rem !important
+ }
+
+ .ml-xl-n4,
+ .mx-xl-n4 {
+ margin-left: -1.5rem !important
+ }
+
+ .m-xl-n5 {
+ margin: -3rem !important
+ }
+
+ .mt-xl-n5,
+ .my-xl-n5 {
+ margin-top: -3rem !important
+ }
+
+ .mr-xl-n5,
+ .mx-xl-n5 {
+ margin-right: -3rem !important
+ }
+
+ .mb-xl-n5,
+ .my-xl-n5 {
+ margin-bottom: -3rem !important
+ }
+
+ .ml-xl-n5,
+ .mx-xl-n5 {
+ margin-left: -3rem !important
+ }
+
+ .m-xl-auto {
+ margin: auto !important
+ }
+
+ .mt-xl-auto,
+ .my-xl-auto {
+ margin-top: auto !important
+ }
+
+ .mr-xl-auto,
+ .mx-xl-auto {
+ margin-right: auto !important
+ }
+
+ .mb-xl-auto,
+ .my-xl-auto {
+ margin-bottom: auto !important
+ }
+
+ .ml-xl-auto,
+ .mx-xl-auto {
+ margin-left: auto !important
+ }
+
+}
+
+.text-monospace {
+ font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important
+}
+
+.text-justify {
+ text-align: justify !important
+}
+
+.text-wrap {
+ white-space: normal !important
+}
+
+.text-nowrap {
+ white-space: nowrap !important
+}
+
+.text-truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap
+}
+
+.text-left {
+ text-align: left !important
+}
+
+.text-right {
+ text-align: right !important
+}
+
+.text-center {
+ text-align: center !important
+}
+
+@media (min-width:576px) {
+ .text-sm-left {
+ text-align: left !important
+ }
+
+ .text-sm-right {
+ text-align: right !important
+ }
+
+ .text-sm-center {
+ text-align: center !important
+ }
+
+}
+
+@media (min-width:768px) {
+ .text-md-left {
+ text-align: left !important
+ }
+
+ .text-md-right {
+ text-align: right !important
+ }
+
+ .text-md-center {
+ text-align: center !important
+ }
+
+}
+
+@media (min-width:992px) {
+ .text-lg-left {
+ text-align: left !important
+ }
+
+ .text-lg-right {
+ text-align: right !important
+ }
+
+ .text-lg-center {
+ text-align: center !important
+ }
+
+}
+
+@media (min-width:1200px) {
+ .text-xl-left {
+ text-align: left !important
+ }
+
+ .text-xl-right {
+ text-align: right !important
+ }
+
+ .text-xl-center {
+ text-align: center !important
+ }
+
+}
+
+.text-lowercase {
+ text-transform: lowercase !important
+}
+
+.text-uppercase {
+ text-transform: uppercase !important
+}
+
+.text-capitalize {
+ text-transform: capitalize !important
+}
+
+.font-weight-light {
+ font-weight: 300 !important
+}
+
+.font-weight-lighter {
+ font-weight: lighter !important
+}
+
+.font-weight-normal {
+ font-weight: 400 !important
+}
+
+.font-weight-bold {
+ font-weight: 700 !important
+}
+
+.font-weight-bolder {
+ font-weight: bolder !important
+}
+
+.font-italic {
+ font-style: italic !important
+}
+
+.text-white {
+ color: #fff !important
+}
+
+.text-primary {
+ color: #047006 !important
+}
+
+a.text-primary:focus,
+a.text-primary:hover {
+ color: #012602 !important
+}
+
+.text-secondary {
+ color: grey !important
+}
+
+a.text-secondary:focus,
+a.text-secondary:hover {
+ color: #5a5a5a !important
+}
+
+.text-success {
+ color: #047006 !important
+}
+
+a.text-success:focus,
+a.text-success:hover {
+ color: #009461 !important
+}
+
+.text-info {
+ color: #6c61f6 !important
+}
+
+a.text-info:focus,
+a.text-info:hover {
+ color: #2919f2 !important
+}
+
+.text-warning {
+ color: #f0825f !important
+}
+
+a.text-warning:focus,
+a.text-warning:hover {
+ color: #e94b19 !important
+}
+
+.text-danger {
+ color: #ff5f66 !important
+}
+
+a.text-danger:focus,
+a.text-danger:hover {
+ color: #ff131d !important
+}
+
+.text-light {
+ color: #dfdfdf !important
+}
+
+a.text-light:focus,
+a.text-light:hover {
+ color: #b9b9b9 !important
+}
+
+.text-dark {
+ color: #74767b !important
+}
+
+a.text-dark:focus,
+a.text-dark:hover {
+ color: #4f5054 !important
+}
+
+.text-white {
+ color: #fff !important
+}
+
+a.text-white:focus,
+a.text-white:hover {
+ color: #d9d9d9 !important
+}
+
+.text-body {
+ color: #212529 !important
+}
+
+.text-muted {
+ color: #adb5bd !important
+}
+
+.text-black-50 {
+ color: rgba(0, 0, 0, .5) !important
+}
+
+.text-white-50 {
+ color: rgba(255, 255, 255, .5) !important
+}
+
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0
+}
+
+.text-decoration-none {
+ text-decoration: none !important
+}
+
+.text-break {
+ word-break: break-word !important;
+ overflow-wrap: break-word !important
+}
+
+.text-reset {
+ color: inherit !important
+}
+
+.visible {
+ visibility: visible !important
+}
+
+.invisible {
+ visibility: hidden !important
+}
+
+@media print {
+ *,
+ ::after,
+ ::before {
+ text-shadow: none !important;
+ box-shadow: none !important
+ }
+
+ a:not(.btn) {
+ text-decoration: underline
+ }
+
+ abbr[title]::after {
+ content: '3'attr(title) ")"
+ }
+
+ pre {
+ white-space: pre-wrap !important
+ }
+
+ blockquote,
+ pre {
+ border: 1px solid #adb5bd;
+ page-break-inside: avoid
+ }
+
+ thead {
+ display: table-header-group
+ }
+
+ img,
+ tr {
+ page-break-inside: avoid
+ }
+
+ h2,
+ h3,
+ p {
+ orphans: 3;
+ widows: 3
+ }
+
+ h2,
+ h3 {
+ page-break-after: avoid
+ }
+
+ @page {
+ size: a3
+ }
+
+ body {
+ min-width: 992px !important
+ }
+
+ .container {
+ min-width: 992px !important
+ }
+
+ .navbar {
+ display: none
+ }
+
+ .badge {
+ border: 1px solid #000
+ }
+
+ .table {
+ border-collapse: collapse !important
+ }
+
+ .table td,
+ .table th {
+ background-color: #fff !important
+ }
+
+ .table-bordered td,
+ .table-bordered th {
+ border: 1px solid #dee2e6 !important
+ }
+
+ .table-dark {
+ color: inherit
+ }
+
+ .table-dark tbody+tbody,
+ .table-dark td,
+ .table-dark th,
+ .table-dark thead th {
+ border-color: #f2f4f9
+ }
+
+ .table .thead-dark th {
+ color: inherit;
+ border-color: #f2f4f9
+ }
+
+}
+
+.dev-info {
+ position: fixed;
+ color: grey;
+ font-size: smaller;
+ left: 8px;
+ z-index: 120
+}
+
+.versionstring {
+ top: 70px;
+ right: 8px;
+ left: auto
+}
+
+.grd-time-used {
+ bottom: 0
+}
+
+.t-header {
+ display: -webkit-box;
+ display: flex;
+ height: 70px;
+ background: #f9fafb;
+ z-index: 100
+}
+
+@media (max-width:991.98px) {
+ .t-header {
+ padding-left: 5px;
+ padding-right: 5px
+ }
+
+}
+
+.t-header .t-header-brand-wrapper {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ height: 70px;
+ width: 17rem;
+ min-width: 17rem;
+ max-width: 17rem;
+ background: #fff;
+ z-index: 100;
+ padding-left: 18px
+}
+
+.t-header .t-header-brand-wrapper a {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ color: #dfdfdf;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ font-size: 1.25rem
+}
+
+.t-header .t-header-brand-wrapper a .logo {
+ max-width: 100%;
+ width: 110px
+}
+
+.t-header .t-header-brand-wrapper a .logo-mini {
+ display: none;
+ max-width: 100%;
+ width: 35px
+}
+
+.t-header .t-header-brand-wrapper a p {
+ color: inherit;
+ font-size: inherit;
+ font-weight: inherit;
+ margin-bottom: 0
+}
+
+@media (max-width:991.98px) {
+ .t-header .t-header-brand-wrapper {
+ padding-left: 0;
+ -webkit-box-pack: center;
+ justify-content: center
+ }
+
+ .t-header .t-header-brand-wrapper a .logo-mini {
+ width: 25px
+ }
+
+}
+
+.t-header .t-header-content-wrapper {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row;
+ width: 100%;
+ max-width: 100%;
+ padding: 0 2.5rem
+}
+
+@media (max-width:991.98px) {
+ .t-header .t-header-content-wrapper {
+ padding: 0 1rem
+ }
+
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box {
+ display: -webkit-box;
+ display: flex;
+ width: 40%;
+ height: 45px;
+ border: none;
+ background: #edf0f3;
+ border-radius: 4px;
+ -webkit-transition: .3s ease-in-out;
+ transition: .3s ease-in-out;
+ -webkit-transition-property: background;
+ transition-property: background
+}
+
+@media (max-width:580px) {
+ .t-header .t-header-content-wrapper .t-header-search-box {
+ display: none
+ }
+
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box .input-group-prepend .input-group-text {
+ border: none;
+ background: 0 0;
+ font-size: 1.5rem;
+ padding-left: 15px;
+ line-height: 23px
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box .form-control {
+ height: inherit;
+ border: none;
+ background: 0 0;
+ font-size: .875rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ padding-left: 0
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box .form-control.placeholder {
+ font-size: inherit;
+ font-family: inherit;
+ font-weight: inherit
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box .form-control:-moz-placeholder {
+ font-size: inherit;
+ font-family: inherit;
+ font-weight: inherit
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box .form-control::-moz-placeholder {
+ font-size: inherit;
+ font-family: inherit;
+ font-weight: inherit
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box .form-control:-ms-input-placeholder {
+ font-size: inherit;
+ font-family: inherit;
+ font-weight: inherit
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box .form-control::-webkit-input-placeholder {
+ font-size: inherit;
+ font-family: inherit;
+ font-weight: inherit
+}
+
+.t-header .t-header-content-wrapper .t-header-search-box:hover {
+ background: #e4e8ed
+}
+
+.t-header .t-header-content-wrapper .t-header-content {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ width: 100%;
+ max-width: 100%
+}
+
+.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link {
+ position: relative;
+ font-family: Roboto, sans-serif
+}
+
+.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link i {
+ color: #525c5d
+}
+
+.t-header .t-header-content-wrapper .t-header-content .nav .nav-item .nav-link .notification-indicator {
+ position: absolute;
+ top: 12px;
+ right: 12px
+}
+
+.t-header .t-header-content-wrapper .t-header-content .nav .nav-item:last-child .nav-link {
+ padding-right: 0
+}
+
+.t-header .t-header-toggler {
+ background: 0 0;
+ border: none;
+ margin-left: auto
+}
+
+.t-header .t-header-toggler svg.logo {
+ width: 50px;
+ height: 50px;
+ cursor: pointer;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0)
+}
+
+.t-header .t-header-toggler svg.logo path {
+ fill: none;
+ -webkit-transition: stroke-dashoffset .35s cubic-bezier(.25, -.25, .75, 1.25), stroke-dasharray .35s cubic-bezier(.25, -.25, .75, 1.25);
+ transition: stroke-dashoffset .35s cubic-bezier(.25, -.25, .75, 1.25), stroke-dasharray .35s cubic-bezier(.25, -.25, .75, 1.25);
+ stroke-width: 8px;
+ stroke-linecap: round;
+ stroke: #adb5bd;
+ stroke-dashoffset: -20px
+}
+
+.t-header .t-header-toggler svg.logo .bottom,
+.t-header .t-header-toggler svg.logo .middle,
+.t-header .t-header-toggler svg.logo .top {
+ stroke-dasharray: 60px 300px
+}
+
+.t-header .t-header-toggler.arrow path.bottom,
+.t-header .t-header-toggler.arrow path.top {
+ stroke-dasharray: 25px 300px;
+ stroke-dashoffset: -230px
+}
+
+.t-header .t-header-toggler i {
+ font-size: 1.375rem
+}
+
+.t-header .t-header-toggler.t-header-mobile-toggler {
+ margin-left: 0;
+ margin-right: 15px
+}
+
+.t-header.fixed-top {
+ position: fixed
+}
+
+.header-fixed .t-header {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ width: 100%;
+ z-index: 100
+}
+
+.header-fixed .sidebar {
+ padding-top: 70px
+}
+
+.header-fixed .sidebar .t-header-brand-wrapper {
+ position: fixed;
+ left: 0;
+ top: 0;
+ z-index: 100;
+ width: 17rem;
+ box-shadow: 0 2px 8px 0 rgba(0, 0, 0, .05)
+}
+
+.header-fixed .sidebar .navigation-menu {
+ z-index: 1
+}
+
+.sidebar {
+ position: relative;
+ display: block;
+ height: 100%;
+ min-height: 100vh;
+ width: 17rem;
+ min-width: 17rem;
+ max-width: 17rem;
+ background: #fff
+}
+
+.sidebar .sidebar-header {
+ border-bottom: 1px solid #2c3744
+}
+
+.sidebar .navigation-menu {
+ padding-left: 0;
+ padding-bottom: 80px;
+ margin-bottom: 0;
+ margin-top: 18px
+}
+
+.sidebar .navigation-menu li {
+ display: block;
+ margin: 0;
+ -webkit-transition-duration: .25s;
+ transition-duration: .25s;
+ -webkit-transition-timing-function: cubic-bezier(.26, .66, .45, .78);
+ transition-timing-function: cubic-bezier(.26, .66, .45, .78);
+ -webkit-transition-property: background;
+ transition-property: background
+}
+
+.sidebar .navigation-menu li.nav-category-divider {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 64px;
+ display: block;
+ background: #fff;
+ margin: 15px 0 0 0;
+ padding: 20px 30px 10px 30px;
+ font-size: 10px;
+ color: #047006;
+ z-index: 1;
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+}
+
+.sidebar .navigation-menu li.nav-category-divider:first-child {
+ margin-top: 0
+}
+
+.sidebar .navigation-menu li a {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: reverse;
+ flex-direction: row-reverse;
+ -webkit-box-pack: end;
+ justify-content: flex-end;
+ padding: 12px 30px 12px 30px;
+ font-size: 13px;
+ line-height: 1;
+ color: #525c5d;
+ letter-spacing: .03rem;
+ font-weight: 500;
+ max-width: 100%;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden
+}
+
+.sidebar .navigation-menu li a .link-icon {
+ margin-right: 15px;
+ line-height: 1;
+ color: #525c5d;
+ font-size: 1.1875rem
+}
+
+.sidebar .navigation-menu li:last-child a {
+ border-bottom: none
+}
+
+.sidebar .navigation-menu li .navigation-submenu {
+ background: #fafafa;
+ padding: 0 0 10px 30px
+}
+
+.sidebar .navigation-menu li .navigation-submenu.collapsing {
+ -webkit-transition: .2s ease-in;
+ transition: .2s ease-in
+}
+
+.sidebar .navigation-menu li .navigation-submenu li {
+ display: inherit
+}
+
+.sidebar .navigation-menu li .navigation-submenu li a {
+ display: block;
+ padding: calc(9px) 30px calc(9px) calc(30px + 2px);
+ opacity: .8;
+ letter-spacing: .03rem;
+ font-weight: 400;
+ font-size: calc(13px - 1px);
+ -webkit-transition: .3s ease-in-out;
+ transition: .3s ease-in-out;
+ -webkit-transition-property: color;
+ transition-property: color
+}
+
+.sidebar .navigation-menu li .navigation-submenu li a[data-toggle=collapse] {
+ position: relative
+}
+
+.sidebar .navigation-menu li .navigation-submenu li a[data-toggle=collapse]:after {
+ content: '.5';
+ height: 7px;
+ width: 7px;
+ border-radius: 25px;
+ position: absolute;
+ right: calc(30px + 4px);
+ top: 14px
+}
+
+.sidebar .navigation-menu li .navigation-submenu li a.active {
+ color: #047006
+}
+
+.sidebar .navigation-menu li .navigation-submenu li a:hover {
+ color: #047006
+}
+
+.sidebar .navigation-menu li .navigation-submenu li:first-child a {
+ padding-top: 10px
+}
+
+.sidebar .navigation-menu li .navigation-submenu li:first-child a:after {
+ top: 15px
+}
+
+.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+1) a:after {
+ background: #047006
+}
+
+.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+2) a:after {
+ background: #047006
+}
+
+.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+3) a:after {
+ background: #ff5f66
+}
+
+.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+4) a:after {
+ background: #f0825f
+}
+
+.sidebar .navigation-menu li .navigation-submenu li:nth-child(5n+5) a:after {
+ background: #6c61f6
+}
+
+.sidebar .navigation-menu li .navigation-submenu li .navigation-submenu {
+ padding-left: 0
+}
+
+.sidebar .navigation-menu li .navigation-submenu li .navigation-submenu li a {
+ opacity: .5
+}
+
+.sidebar .navigation-menu li.active a .link-title {
+ color: #047006
+}
+
+.sidebar .navigation-menu li.active a .link-icon {
+ color: #047006
+}
+
+.sidebar .navigation-menu>li:not(.nav-category-divider):hover {
+ background: #fafafa
+}
+
+.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse] {
+ position: relative
+}
+
+.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse]:after {
+ content: '3';
+ font-family: "Material Design Icons";
+ font-size: 15px;
+ text-rendering: auto;
+ line-height: inherit;
+ font-weight: bolder;
+ position: absolute;
+ top: 13px;
+ right: 30px;
+ display: block;
+ -webkit-transition: .3s;
+ transition: .3s;
+ -webkit-transition-property: -webkit-transform;
+ transition-property: -webkit-transform;
+ transition-property: transform;
+ transition-property: transform, -webkit-transform;
+ color: #839092
+}
+
+.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse][aria-expanded=true] {
+ background: #fafafa
+}
+
+.sidebar .navigation-menu>li:not(.nav-category-divider)>a[data-toggle=collapse][aria-expanded=true]:after {
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg)
+}
+
+.sidebar .sidebar_footer {
+ display: block;
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ margin-top: auto;
+ width: inherit;
+ z-index: 2;
+ background: #fff
+}
+
+.sidebar .sidebar_footer .admin-access-level {
+ position: absolute;
+ bottom: 0;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: start;
+ justify-content: flex-start;
+ -webkit-box-align: center;
+ align-items: center;
+ z-index: 9999;
+ height: auto;
+ width: 100%;
+ background: #fff;
+ cursor: pointer;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ padding: 10px 20px;
+ box-shadow: -7px -2px 25px -5px rgba(0, 0, 0, .12)
+}
+
+.sidebar .sidebar_footer .admin-access-level .user-type-wrapper {
+ padding: 0 0 0 10px
+}
+
+.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .user_name {
+ color: #525c5d;
+ margin-bottom: 8px;
+ line-height: 1;
+ max-width: 100%;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ max-width: 95px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ letter-spacing: .03rem
+}
+
+.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .user_access_level {
+ color: #74767b;
+ line-height: 1
+}
+
+.sidebar .sidebar_footer .admin-access-level .user-type-wrapper .status-indicator {
+ margin-right: 5px
+}
+
+.sidebar .sidebar_footer .admin-access-level .arrow {
+ color: #525c5d;
+ margin-left: auto;
+ font-size: 20px;
+ line-height: 1;
+ -webkit-transition: .3s;
+ transition: .3s
+}
+
+.sidebar .sidebar_footer .user-account {
+ display: block;
+ width: 100%;
+ border-radius: 0;
+ border: none;
+ margin-bottom: -100vh;
+ opacity: 0;
+ -webkit-transition: .3s;
+ transition: .3s;
+ border-right: 1px solid #f2f4f9;
+ box-shadow: -7px -2px 25px -5px rgba(0, 0, 0, .12)
+}
+
+.sidebar .sidebar_footer .user-account:before {
+ display: none
+}
+
+.sidebar .sidebar_footer .user-account .user-profile-item-tittle {
+ background: 0 0;
+ padding: 20px 18px 10px 18px;
+ z-index: 1;
+ color: #adb5bd;
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+}
+
+.sidebar .sidebar_footer .user-account .user-profile-itemcategory {
+ background: 0 0;
+ margin-bottom: 10px;
+ border-bottom: 1px solid #f2f4f9;
+ padding-bottom: 10px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ letter-spacing: .03rem
+}
+
+.sidebar .sidebar_footer .user-account .user-profile-item {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ background: inherit;
+ padding: 10px 18px;
+ -webkit-transition: .3s;
+ transition: .3s;
+ z-index: 1;
+ background: 0 0;
+ color: #525c5d;
+ font-size: 13px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ letter-spacing: .03rem
+}
+
+.sidebar .sidebar_footer .user-account .user-profile-item:hover {
+ background: #f5f5f5
+}
+
+.sidebar .sidebar_footer .user-account .user-profile-item i {
+ margin-right: 10px;
+ font-size: 18px;
+ line-height: 1;
+ color: inherit
+}
+
+.sidebar .sidebar_footer .user-account .user-profile-item img {
+ margin-right: 10px
+}
+
+.sidebar .sidebar_footer .user-account .btn-logout {
+ width: 91%;
+ max-width: 91%;
+ margin: 15px 10px 30px 10px;
+ border-radius: 4px
+}
+
+.sidebar .sidebar_footer.opened {
+ background: #fff
+}
+
+.sidebar .sidebar_footer.opened .admin-access-level {
+ background: #fff
+}
+
+.sidebar .sidebar_footer.opened .admin-access-level .arrow {
+ -webkit-transform: rotate(-90deg);
+ transform: rotate(-90deg)
+}
+
+.sidebar .sidebar_footer.opened .user-account {
+ margin-bottom: 60px;
+ opacity: 1;
+ background: #fff
+}
+
+footer {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ padding: 2rem 2.5rem;
+ max-width: 1140px;
+ margin-left: auto;
+ margin-right: auto
+}
+
+@media (max-width:991.98px) {
+ footer {
+ padding: 20px 0 30px 0
+ }
+
+}
+
+footer ul {
+ margin-left: 0;
+ padding-left: 0
+}
+
+footer ul li {
+ display: inline-block;
+ padding: 0 10px 0 0;
+ line-height: 1
+}
+
+footer ul li:not(:last-child) {
+ margin-right: 10px;
+ border-right: 1px solid #f2f4f9
+}
+
+footer ul li a {
+ font-family: Roboto, sans-serif;
+ font-weight: 400;
+ letter-spacing: .03rem;
+ color: #565656
+}
+
+pre.cake-error {
+ z-index: 220;
+ position: absolute;
+ background-color: #fff
+}
+
+.alert-notification-wrapper {
+ position: fixed;
+ left: 17rem;
+ right: 0;
+ z-index: 999
+}
+
+@media (max-width:991.98px) {
+ .alert-notification-wrapper {
+ left: 0
+ }
+
+}
+
+.alert-notification-wrapper.top {
+ top: 70px
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter {
+ border: 2px solid #55acee;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter i {
+ color: #55acee
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link {
+ background: 0 0;
+ color: #55acee
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-twitter.btn-link:hover {
+ color: #2795e9
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook {
+ border: 2px solid #0084ff;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook i {
+ color: #0084ff
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link {
+ background: 0 0;
+ color: #0084ff
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-facebook.btn-link:hover {
+ color: #006acc
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google {
+ border: 2px solid #dd4b39;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google i {
+ color: #dd4b39
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link {
+ background: 0 0;
+ color: #dd4b39
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-google.btn-link:hover {
+ color: #c23321
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin {
+ border: 2px solid #0077b5;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin i {
+ color: #0077b5
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link {
+ background: 0 0;
+ color: #0077b5
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-linkedin.btn-link:hover {
+ color: #005582
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest {
+ border: 2px solid #bd081c;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest i {
+ color: #bd081c
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link {
+ background: 0 0;
+ color: #bd081c
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-pinterest.btn-link:hover {
+ color: #8c0615
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube {
+ border: 2px solid #cd201f;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube i {
+ color: #cd201f
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link {
+ background: 0 0;
+ color: #cd201f
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-youtube.btn-link:hover {
+ color: #a11918
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github {
+ border: 2px solid #333;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github i {
+ color: #333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link {
+ background: 0 0;
+ color: #333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-github.btn-link:hover {
+ color: #1a1a1a
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance {
+ border: 2px solid #0454f6;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance i {
+ color: #0454f6
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link {
+ background: 0 0;
+ color: #0454f6
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-behance.btn-link:hover {
+ color: #0343c4
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble {
+ border: 2px solid #ea4c89;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble i {
+ color: #ea4c89
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link {
+ background: 0 0;
+ color: #ea4c89
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-dribbble.btn-link:hover {
+ color: #e51e6b
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit {
+ border: 2px solid #ed4333;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit i {
+ color: #ed4333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link {
+ background: 0 0;
+ color: #ed4333
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-reddit.btn-link:hover {
+ color: #da2413
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram {
+ border: 2px solid #ff759b;
+ color: #101010
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram i {
+ color: #ff759b
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link {
+ background: 0 0;
+ color: #ff759b
+}
+
+.btn:not(.social-icon-btn).social-btn-outlined.btn-instagram.btn-link:hover {
+ color: #ff4276
+}
+
+.btn-inverse-primary {
+ background: rgba(4, 112, 6, .15);
+ color: #047006
+}
+
+.btn-inverse-primary i {
+ color: inherit
+}
+
+.btn-inverse-primary:hover {
+ background: rgba(4, 112, 6, .8);
+ color: #fff
+}
+
+.btn-inverse-secondary {
+ background: rgba(128, 128, 128, .15);
+ color: grey
+}
+
+.btn-inverse-secondary i {
+ color: inherit
+}
+
+.btn-inverse-secondary:hover {
+ background: rgba(128, 128, 128, .8);
+ color: #fff
+}
+
+.btn-inverse-success {
+ background: rgba(0, 224, 147, .15);
+ color: #047006
+}
+
+.btn-inverse-success i {
+ color: inherit
+}
+
+.btn-inverse-success:hover {
+ background: rgba(0, 224, 147, .8);
+ color: #fff
+}
+
+.btn-inverse-info {
+ background: rgba(108, 97, 246, .15);
+ color: #6c61f6
+}
+
+.btn-inverse-info i {
+ color: inherit
+}
+
+.btn-inverse-info:hover {
+ background: rgba(108, 97, 246, .8);
+ color: #fff
+}
+
+.btn-inverse-warning {
+ background: rgba(240, 130, 95, .15);
+ color: #f0825f
+}
+
+.btn-inverse-warning i {
+ color: inherit
+}
+
+.btn-inverse-warning:hover {
+ background: rgba(240, 130, 95, .8);
+ color: #fff
+}
+
+.btn-inverse-danger {
+ background: rgba(255, 95, 102, .15);
+ color: #ff5f66
+}
+
+.btn-inverse-danger i {
+ color: inherit
+}
+
+.btn-inverse-danger:hover {
+ background: rgba(255, 95, 102, .8);
+ color: #fff
+}
+
+.btn-inverse-light {
+ background: rgba(223, 223, 223, .15);
+ color: #dfdfdf
+}
+
+.btn-inverse-light i {
+ color: inherit
+}
+
+.btn-inverse-light:hover {
+ background: rgba(223, 223, 223, .8);
+ color: #fff
+}
+
+.btn-inverse-dark {
+ background: rgba(116, 118, 123, .15);
+ color: #74767b
+}
+
+.btn-inverse-dark i {
+ color: inherit
+}
+
+.btn-inverse-dark:hover {
+ background: rgba(116, 118, 123, .8);
+ color: #fff
+}
+
+.btn-inverse-white {
+ background: rgba(255, 255, 255, .15);
+ color: #fff
+}
+
+.btn-inverse-white i {
+ color: inherit
+}
+
+.btn-inverse-white:hover {
+ background: rgba(255, 255, 255, .8);
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-twitter {
+ background: #55acee;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-twitter:hover {
+ background: #2795e9
+}
+
+.btn:not(.social-btn-outlined).btn-twitter.btn-link {
+ background: 0 0;
+ color: #55acee
+}
+
+.btn:not(.social-btn-outlined).btn-twitter.btn-link:hover {
+ color: #2795e9
+}
+
+.btn:not(.social-btn-outlined).btn-facebook {
+ background: #0084ff;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-facebook:hover {
+ background: #006acc
+}
+
+.btn:not(.social-btn-outlined).btn-facebook.btn-link {
+ background: 0 0;
+ color: #0084ff
+}
+
+.btn:not(.social-btn-outlined).btn-facebook.btn-link:hover {
+ color: #006acc
+}
+
+.btn:not(.social-btn-outlined).btn-google {
+ background: #dd4b39;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-google:hover {
+ background: #c23321
+}
+
+.btn:not(.social-btn-outlined).btn-google.btn-link {
+ background: 0 0;
+ color: #dd4b39
+}
+
+.btn:not(.social-btn-outlined).btn-google.btn-link:hover {
+ color: #c23321
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin {
+ background: #0077b5;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin:hover {
+ background: #005582
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin.btn-link {
+ background: 0 0;
+ color: #0077b5
+}
+
+.btn:not(.social-btn-outlined).btn-linkedin.btn-link:hover {
+ color: #005582
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest {
+ background: #bd081c;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest:hover {
+ background: #8c0615
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest.btn-link {
+ background: 0 0;
+ color: #bd081c
+}
+
+.btn:not(.social-btn-outlined).btn-pinterest.btn-link:hover {
+ color: #8c0615
+}
+
+.btn:not(.social-btn-outlined).btn-youtube {
+ background: #cd201f;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-youtube:hover {
+ background: #a11918
+}
+
+.btn:not(.social-btn-outlined).btn-youtube.btn-link {
+ background: 0 0;
+ color: #cd201f
+}
+
+.btn:not(.social-btn-outlined).btn-youtube.btn-link:hover {
+ color: #a11918
+}
+
+.btn:not(.social-btn-outlined).btn-github {
+ background: #333;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-github:hover {
+ background: #1a1a1a
+}
+
+.btn:not(.social-btn-outlined).btn-github.btn-link {
+ background: 0 0;
+ color: #333
+}
+
+.btn:not(.social-btn-outlined).btn-github.btn-link:hover {
+ color: #1a1a1a
+}
+
+.btn:not(.social-btn-outlined).btn-behance {
+ background: #0454f6;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-behance:hover {
+ background: #0343c4
+}
+
+.btn:not(.social-btn-outlined).btn-behance.btn-link {
+ background: 0 0;
+ color: #0454f6
+}
+
+.btn:not(.social-btn-outlined).btn-behance.btn-link:hover {
+ color: #0343c4
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble {
+ background: #ea4c89;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble:hover {
+ background: #e51e6b
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble.btn-link {
+ background: 0 0;
+ color: #ea4c89
+}
+
+.btn:not(.social-btn-outlined).btn-dribbble.btn-link:hover {
+ color: #e51e6b
+}
+
+.btn:not(.social-btn-outlined).btn-reddit {
+ background: #ed4333;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-reddit:hover {
+ background: #da2413
+}
+
+.btn:not(.social-btn-outlined).btn-reddit.btn-link {
+ background: 0 0;
+ color: #ed4333
+}
+
+.btn:not(.social-btn-outlined).btn-reddit.btn-link:hover {
+ color: #da2413
+}
+
+.btn:not(.social-btn-outlined).btn-instagram {
+ background: #ff759b;
+ border: none;
+ color: #fff
+}
+
+.btn:not(.social-btn-outlined).btn-instagram:hover {
+ background: #ff4276
+}
+
+.btn:not(.social-btn-outlined).btn-instagram.btn-link {
+ background: 0 0;
+ color: #ff759b
+}
+
+.btn:not(.social-btn-outlined).btn-instagram.btn-link:hover {
+ color: #ff4276
+}
+
+.btn-group label.btn.btn-primary:not(:disabled):not(.disabled).active {
+ background: #000e01
+}
+
+.btn-group label.btn.btn-secondary:not(:disabled):not(.disabled).active {
+ background: #4d4d4d
+}
+
+.btn-group label.btn.btn-success:not(:disabled):not(.disabled).active {
+ background: #007a50
+}
+
+.btn-group label.btn.btn-info:not(:disabled):not(.disabled).active {
+ background: #1d0de4
+}
+
+.btn-group label.btn.btn-warning:not(:disabled):not(.disabled).active {
+ background: #d54314
+}
+
+.btn-group label.btn.btn-danger:not(:disabled):not(.disabled).active {
+ background: #f8000b
+}
+
+.btn-group label.btn.btn-light:not(:disabled):not(.disabled).active {
+ background: #acacac
+}
+
+.btn-group label.btn.btn-dark:not(:disabled):not(.disabled).active {
+ background: #424447
+}
+
+.btn-group label.btn.btn-white:not(:disabled):not(.disabled).active {
+ background: #ccc
+}
+
+.btn-outline-primary {
+ border: 2px solid #047006
+}
+
+.btn-outline-secondary {
+ border: 2px solid grey
+}
+
+.btn-outline-success {
+ border: 2px solid #047006
+}
+
+.btn-outline-info {
+ border: 2px solid #6c61f6
+}
+
+.btn-outline-warning {
+ border: 2px solid #f0825f
+}
+
+.btn-outline-danger {
+ border: 2px solid #ff5f66
+}
+
+.btn-outline-light {
+ border: 2px solid #dfdfdf
+}
+
+.btn-outline-dark {
+ border: 2px solid #74767b
+}
+
+.btn-outline-white {
+ border: 2px solid #fff
+}
+
+.btn-group label.btn input {
+ display: none
+}
+
+.btn {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-transition: .3s ease;
+ transition: .3s ease;
+ -webkit-transition-property: background, color;
+ transition-property: background, color;
+ font-size: .875rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 600;
+ letter-spacing: .03rem
+}
+
+.btn:not([class*=btn-inverse]):not(.component-flat) {
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2)
+}
+
+.btn i {
+ font-size: 1.25rem
+}
+
+.btn-group-lg>.btn,
+.btn.btn-lg {
+ height: 55px;
+ max-height: 55px;
+ padding: 15px 30px;
+ font-size: 1.125rem
+}
+
+.btn-group-sm>.btn,
+.btn.btn-sm {
+ height: 35px;
+ max-height: 35px;
+ padding: 4px 15px;
+ font-size: .875rem
+}
+
+.btn.btn-xs {
+ height: 25px;
+ max-height: 25px;
+ padding: 0 10px;
+ line-height: 1;
+ font-size: .75rem
+}
+
+.btn.btn-xs.has-icon i,
+.btn.btn-xs.has-icon span {
+ font-size: .8125rem;
+ margin-right: 5px
+}
+
+.btn {
+ height: 40px;
+ max-height: 40px;
+ padding: 5px 20px
+}
+
+.btn.active {
+ box-shadow: none
+}
+
+.btn.social-icon-btn {
+ height: 40px;
+ width: 40px
+}
+
+.btn.social-btn i {
+ margin-right: 10px
+}
+
+.btn.social-btn-outlined i {
+ margin-right: 10px
+}
+
+.btn.has-icon i,
+.btn.has-icon span {
+ font-size: 1.25rem;
+ margin-right: 10px;
+ line-height: 1
+}
+
+.btn.btn-outline-secondary {
+ color: #1a1a1a;
+ border-color: #676767
+}
+
+.btn.btn-info,
+.btn.btn-warning {
+ color: #fff
+}
+
+.btn.btn-light {
+ background: #fff;
+ color: #000
+}
+
+.btn.dropdown-dotted-list {
+ background: #fff
+}
+
+.btn.dropdown-toggle-split {
+ padding: 0 8px
+}
+
+.btn.action-btn {
+ display: -webkit-inline-box;
+ display: inline-flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ padding: 0;
+ height: 40px;
+ width: 40px
+}
+
+.btn.action-btn i {
+ font-size: 1.25rem;
+ width: 26px;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ line-height: 23px;
+ vertical-align: middle;
+ font-size: 1.25rem
+}
+
+.btn.action-btn i:before {
+ width: inherit;
+ height: inherit;
+ line-height: inherit;
+ font-size: inherit
+}
+
+.btn.action-btn.btn-xs {
+ height: 30px;
+ width: 30px
+}
+
+.btn-group-sm>.btn.action-btn,
+.btn.action-btn.btn-sm {
+ height: 35px;
+ width: 35px
+}
+
+.btn-group-lg>.btn.action-btn,
+.btn.action-btn.btn-lg {
+ height: 50px;
+ width: 50px
+}
+
+.btn-group-lg>.btn.action-btn i,
+.btn.action-btn.btn-lg i {
+ font-size: 1.875rem;
+ line-height: 24px
+}
+
+.btn.action-btn.btn-refresh.clicked i {
+ color: #047006;
+ -webkit-animation: rotate360 .8s linear infinite;
+ animation: rotate360 .8s linear infinite
+}
+
+.btn.action-btn.btn-like.clicked i {
+ color: #ff5f66;
+ -webkit-animation: bounceIn .8s linear 1;
+ animation: bounceIn .8s linear 1
+}
+
+.btn.action-btn.btn-like.clicked:hover i {
+ color: #fff
+}
+
+.btn.btn-rounded {
+ border-radius: 50px
+}
+
+.flag-germany {
+ width: 40px;
+ height: 28px;
+ background: red;
+ border-top: 9px solid #000;
+ border-bottom: 9px solid #fc0;
+ display: block
+}
+
+.flag-england {
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJmbGFnLWljb24tY3NzLWdiIiB2aWV3Qm94PSIwIDAgNjQwIDQ4MCI+CiAgPHBhdGggZmlsbD0iIzAxMjE2OSIgZD0iTTAgMGg2NDB2NDgwSDB6Ii8+CiAgPHBhdGggZmlsbD0iI0ZGRiIgZD0iTTc1IDBsMjQ0IDE4MUw1NjIgMGg3OHY2Mkw0MDAgMjQxbDI0MCAxNzh2NjFoLTgwTDMyMCAzMDEgODEgNDgwSDB2LTYwbDIzOS0xNzhMMCA2NFYwaDc1eiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik00MjQgMjgxbDIxNiAxNTl2NDBMMzY5IDI4MWg1NXptLTE4NCAyMGw2IDM1TDU0IDQ4MEgwbDI0MC0xNzl6TTY0MCAwdjNMMzkxIDE5MWwyLTQ0TDU5MCAwaDUwek0wIDBsMjM5IDE3NmgtNjBMMCA0MlYweiIvPgogIDxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0yNDEgMHY0ODBoMTYwVjBIMjQxek0wIDE2MHYxNjBoNjQwVjE2MEgweiIvPgogIDxwYXRoIGZpbGw9IiNDODEwMkUiIGQ9Ik0wIDE5M3Y5Nmg2NDB2LTk2SDB6TTI3MyAwdjQ4MGg5NlYwaC05NnoiLz4KPC9zdmc+Cg==);
+ background-size: cover;
+ width: 40px;
+ height: 28px;
+ display: block
+}
+
+.language-active {
+ background-color: #f9fafb;
+ padding: 2px
+}
+
+.language-inactive {
+ padding: 2px;
+ background-color: transparent
+}
+
+.is-invalid .form-control {
+ background-color: rgba(240, 130, 95, .2);
+ border: none
+}
+
+.is-invalid .invalid-feedback {
+ display: block
+}
+
+.is-valid .form-control {
+ background-color: rgba(4, 112, 6, .2);
+ border: none
+}
+
+.form-control {
+ padding-left: 20px;
+ padding-right: 20px;
+ color: rgba(16, 16, 16, .8)
+}
+
+.form-control.placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control:-moz-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control::-moz-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control:-ms-input-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control::-webkit-input-placeholder {
+ font-weight: inherit;
+ color: inherit;
+ font-size: inherit
+}
+
+.form-control.is-invalid {
+ background-color: rgba(240, 130, 95, .2);
+ border: none
+}
+
+.form-control.is-valid {
+ background-color: rgba(4, 112, 6, .2);
+ border: none
+}
+
+.input-group-text {
+ background-color: #f6f7f9;
+ color: #101010;
+ border-color: #f2f4f9;
+ padding: 0 10px;
+ font-size: 17px
+}
+
+.is-valid .input-group-text {
+ background-color: rgba(4, 112, 6, .2);
+ color: #047006
+}
+
+.is-invalid .input-group-text {
+ background-color: rgba(240, 130, 95, .2);
+ color: #f0825f
+}
+
+.form-group {
+ margin-bottom: 20px
+}
+
+.form-group.input-rounded .form-control {
+ border-radius: 25px
+}
+
+.custom-file .custom-file-label {
+ padding: 8px .75rem;
+ height: 41px
+}
+
+.custom-file .custom-file-label:after {
+ padding: 1.45rem .8rem;
+ line-height: 0
+}
+
+.custom-select,
+.custom-select[multiple] {
+ background: #f6f7f9;
+ border-color: #f0f2f5;
+ color: rgba(16, 16, 16, .8)
+}
+
+.custom-select option,
+.custom-select[multiple] option {
+ background: #f6f7f9;
+ color: rgba(16, 16, 16, .8);
+ display: block;
+ border-bottom: 1px solid #f2f4f9;
+ padding: 5px 10px
+}
+
+.custom-select option:checked,
+.custom-select[multiple] option:checked {
+ background: #f6f7f9
+}
+
+.custom-select option[selected],
+.custom-select[multiple] option[selected] {
+ background: #f6f7f9;
+ display: block
+}
+
+.custom-select[multiple] {
+ padding: 0;
+ border-radius: 2px
+}
+
+.custom-control-input:focus~.custom-control-label::before {
+ box-shadow: none
+}
+
+.custom-switch .custom-control-label::after {
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2);
+ background: #047006
+}
+
+.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link {
+ color: #047006
+}
+
+.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-primary .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-primary .nav-tabs .nav-item .nav-link.active {
+ background: #047006;
+ color: #fff
+}
+
+.tab-container.tab-bg-primary .tab-content {
+ background: #047006;
+ color: #fff
+}
+
+.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link {
+ color: grey
+}
+
+.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-secondary .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-secondary .nav-tabs .nav-item .nav-link.active {
+ background: grey;
+ color: #fff
+}
+
+.tab-container.tab-bg-secondary .tab-content {
+ background: grey;
+ color: #fff
+}
+
+.tab-container.tab-bg-success .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link {
+ color: #047006
+}
+
+.tab-container.tab-bg-success .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-success .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-success .nav-tabs .nav-item .nav-link.active {
+ background: #047006;
+ color: #fff
+}
+
+.tab-container.tab-bg-success .tab-content {
+ background: #047006;
+ color: #fff
+}
+
+.tab-container.tab-bg-info .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link {
+ color: #6c61f6
+}
+
+.tab-container.tab-bg-info .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-info .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-info .nav-tabs .nav-item .nav-link.active {
+ background: #6c61f6;
+ color: #fff
+}
+
+.tab-container.tab-bg-info .tab-content {
+ background: #6c61f6;
+ color: #fff
+}
+
+.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link {
+ color: #f0825f
+}
+
+.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-warning .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-warning .nav-tabs .nav-item .nav-link.active {
+ background: #f0825f;
+ color: #fff
+}
+
+.tab-container.tab-bg-warning .tab-content {
+ background: #f0825f;
+ color: #fff
+}
+
+.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link {
+ color: #ff5f66
+}
+
+.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-danger .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-danger .nav-tabs .nav-item .nav-link.active {
+ background: #ff5f66;
+ color: #fff
+}
+
+.tab-container.tab-bg-danger .tab-content {
+ background: #ff5f66;
+ color: #fff
+}
+
+.tab-container.tab-bg-light .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link {
+ color: #dfdfdf
+}
+
+.tab-container.tab-bg-light .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-light .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-light .nav-tabs .nav-item .nav-link.active {
+ background: #dfdfdf;
+ color: #fff
+}
+
+.tab-container.tab-bg-light .tab-content {
+ background: #dfdfdf;
+ color: #fff
+}
+
+.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link {
+ color: #74767b
+}
+
+.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-dark .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-dark .nav-tabs .nav-item .nav-link.active {
+ background: #74767b;
+ color: #fff
+}
+
+.tab-container.tab-bg-dark .tab-content {
+ background: #74767b;
+ color: #fff
+}
+
+.tab-container.tab-bg-white .nav-pills .nav-item .nav-link,
+.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link {
+ color: #fff
+}
+
+.tab-container.tab-bg-white .nav-pills .nav-item .nav-link i,
+.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link i {
+ color: inherit
+}
+
+.tab-container.tab-bg-white .nav-pills .nav-item .nav-link.active,
+.tab-container.tab-bg-white .nav-tabs .nav-item .nav-link.active {
+ background: #fff;
+ color: #fff
+}
+
+.tab-container.tab-bg-white .tab-content {
+ background: #fff;
+ color: #fff
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #f2f4f9
+}
+
+.tab-container .nav-pills,
+.tab-container .nav-tabs {
+ border-bottom: none
+}
+
+.tab-container .nav-pills .nav-item .nav-link,
+.tab-container .nav-tabs .nav-item .nav-link {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: start;
+ justify-content: start;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ letter-spacing: 1;
+ padding: 7px 13px;
+ border: none;
+ -webkit-transition-duration: .3s;
+ transition-duration: .3s;
+ -webkit-transition-property: background, color;
+ transition-property: background, color
+}
+
+.tab-container .nav-pills .nav-item .nav-link i,
+.tab-container .nav-tabs .nav-item .nav-link i {
+ font-size: 20px;
+ line-height: 1
+}
+
+.tab-container .nav-pills .nav-item .nav-link .tab-tittle,
+.tab-container .nav-tabs .nav-item .nav-link .tab-tittle {
+ display: inline-block
+}
+
+.tab-container .nav-pills .nav-item .nav-link .tab-tittle.prepend,
+.tab-container .nav-tabs .nav-item .nav-link .tab-tittle.prepend {
+ margin-left: 10px
+}
+
+.tab-container .nav-pills .nav-item .nav-link .tab-tittle.append,
+.tab-container .nav-tabs .nav-item .nav-link .tab-tittle.append {
+ margin-right: 10px
+}
+
+.tab-container .tab-content {
+ padding: 30px 20px 20px 20px;
+ width: 100%;
+ background: #f0f2f5
+}
+
+.tab-container .nav-tabs .nav-link {
+ color: #101010
+}
+
+.tab-container .nav-tabs .nav-link i {
+ color: #101010
+}
+
+.tab-container .nav-tabs .nav-link.active {
+ background: #f7f7f7;
+ color: #047006
+}
+
+.tab-container .nav-tabs .nav-link.active i {
+ color: inherit
+}
+
+.tab-container .nav-pills {
+ margin: 10px
+}
+
+.tab-container .nav-pills .nav-link.active {
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2);
+ color: #fff
+}
+
+.tab-container.vertical-tabs {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row;
+ -webkit-box-flex: 1;
+ flex-grow: 1
+}
+
+.tab-container.vertical-tabs .nav-pills,
+.tab-container.vertical-tabs .nav-tabs {
+ float: left;
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ flex-direction: column
+}
+
+.table,
+table {
+ margin-bottom: 0
+}
+
+.table tfoot tr th,
+.table thead tr th,
+table tfoot tr th,
+table thead tr th {
+ border-bottom-width: 1px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+}
+
+.table tbody tr,
+table tbody tr {
+ -webkit-transition-duration: .5s;
+ transition-duration: .5s
+}
+
+.table tbody tr td,
+table tbody tr td {
+ font-family: Roboto, sans-serif;
+ font-weight: 400;
+ vertical-align: middle
+}
+
+.table tbody tr td .input-frame:after,
+table tbody tr td .input-frame:after {
+ top: 5px
+}
+
+.table tbody tr td span,
+table tbody tr td span {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.table tbody tr td span .status-indicator,
+table tbody tr td span .status-indicator {
+ margin-right: 5px
+}
+
+.table tbody tr td .image,
+table tbody tr td .image {
+ max-width: 75px;
+ width: 100%
+}
+
+.table tbody tr.text-align-edge td:first-child,
+table tbody tr.text-align-edge td:first-child {
+ padding-left: 0;
+ text-align: left
+}
+
+.table tbody tr.text-align-edge td:last-child,
+table tbody tr.text-align-edge td:last-child {
+ padding-right: 0;
+ text-align: right
+}
+
+.table td,
+.table th,
+table td,
+table th {
+ white-space: nowrap
+}
+
+.table:not(.table-dark) thead tr.solid-header th,
+table:not(.table-dark) thead tr.solid-header th {
+ background: #fafafa;
+ border-top: 1px solid #f2f4f9
+}
+
+.table:not(.table-dark) tfoot,
+.table:not(.table-dark) thead,
+table:not(.table-dark) tfoot,
+table:not(.table-dark) thead {
+ background: #e1e4e6
+}
+
+.table:not(.table-dark) tfoot tr th,
+.table:not(.table-dark) thead tr th,
+table:not(.table-dark) tfoot tr th,
+table:not(.table-dark) thead tr th {
+ background: #fff;
+ color: #101010
+}
+
+.table:not(.table-dark) tbody tr[class*=bg],
+table:not(.table-dark) tbody tr[class*=bg] {
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2)
+}
+
+.table:not(.table-dark) tbody tr[class*=bg] td,
+table:not(.table-dark) tbody tr[class*=bg] td {
+ color: #fff;
+ border: none
+}
+
+.table:not(.table-dark) tbody tr td,
+table:not(.table-dark) tbody tr td {
+ color: #101010
+}
+
+.table:not(.table-bordered) tfoot tr th,
+.table:not(.table-bordered) thead tr th,
+table:not(.table-bordered) tfoot tr th,
+table:not(.table-bordered) thead tr th {
+ border-top: none
+}
+
+.table.info-table tr td,
+.table.info-table tr th,
+table.info-table tr td,
+table.info-table tr th {
+ text-align: right
+}
+
+.table.info-table tr td:first-child,
+.table.info-table tr th:first-child,
+table.info-table tr td:first-child,
+table.info-table tr th:first-child {
+ text-align: left
+}
+
+.table.info-table tr td.actions,
+.table.info-table tr th.actions,
+table.info-table tr td.actions,
+table.info-table tr th.actions {
+ padding-left: 0
+}
+
+.tippy-tooltip[data-animation=fade][data-state=hidden] {
+ opacity: 0
+}
+
+.tippy-iOS {
+ cursor: pointer !important;
+ -webkit-tap-highlight-color: transparent
+}
+
+.tippy-popper {
+ pointer-events: none;
+ max-width: calc(100vw - 10px);
+ -webkit-transition-timing-function: cubic-bezier(.165, .84, .44, 1);
+ transition-timing-function: cubic-bezier(.165, .84, .44, 1);
+ -webkit-transition-property: -webkit-transform;
+ transition-property: -webkit-transform;
+ transition-property: transform;
+ transition-property: transform, -webkit-transform
+}
+
+.tippy-tooltip {
+ position: relative;
+ color: #fff;
+ border-radius: 4px;
+ font-size: 14px;
+ line-height: 1.4;
+ background-color: #333;
+ -webkit-transition-property: visibility, opacity, -webkit-transform;
+ transition-property: visibility, opacity, -webkit-transform;
+ transition-property: visibility, opacity, transform;
+ transition-property: visibility, opacity, transform, -webkit-transform;
+ outline: 0
+}
+
+.tippy-tooltip[data-placement^=top]>.tippy-arrow {
+ border-width: 8px 8px 0;
+ border-top-color: #333;
+ margin: 0 3px;
+ -webkit-transform-origin: 50% 0;
+ transform-origin: 50% 0;
+ bottom: -7px
+}
+
+.tippy-tooltip[data-placement^=bottom]>.tippy-arrow {
+ border-width: 0 8px 8px;
+ border-bottom-color: #333;
+ margin: 0 3px;
+ -webkit-transform-origin: 50% 7px;
+ transform-origin: 50% 7px;
+ top: -7px
+}
+
+.tippy-tooltip[data-placement^=left]>.tippy-arrow {
+ border-width: 8px 0 8px 8px;
+ border-left-color: #333;
+ margin: 3px 0;
+ -webkit-transform-origin: 0 50%;
+ transform-origin: 0 50%;
+ right: -7px
+}
+
+.tippy-tooltip[data-placement^=right]>.tippy-arrow {
+ border-width: 8px 8px 8px 0;
+ border-right-color: #333;
+ margin: 3px 0;
+ -webkit-transform-origin: 7px 50%;
+ transform-origin: 7px 50%;
+ left: -7px
+}
+
+.tippy-tooltip[data-interactive][data-state=visible] {
+ pointer-events: auto
+}
+
+.tippy-tooltip[data-inertia][data-state=visible] {
+ -webkit-transition-timing-function: cubic-bezier(.54, 1.5, .38, 1.11);
+ transition-timing-function: cubic-bezier(.54, 1.5, .38, 1.11)
+}
+
+.tippy-arrow {
+ position: absolute;
+ border-color: transparent;
+ border-style: solid
+}
+
+.tippy-content {
+ padding: 5px 9px
+}
+
+.tippy-tooltip {
+ color: #101010;
+ background-color: #f9fafb;
+ border-radius: 0;
+ font-size: 12px
+}
+
+.tippy-tooltip .tippy-content b {
+ color: #047006
+}
+
+.tippy-tooltip .tippy-content ul {
+ list-style-type: none;
+ padding-left: 4px
+}
+
+.tippy-tooltip .tippy-content .mdi {
+ font-size: 16px
+}
+
+.tippy-tooltip .tippy-content .grid-header {
+ padding: 5px 10px;
+ margin-bottom: 5px
+}
+
+.page-body {
+ background: #fff
+}
+
+.page-content-wrapper {
+ background: #f9fafb;
+ border-left: 1px solid #f2f4f9
+}
+
+@media (min-width:992px) {
+ .t-header .t-header-content-wrapper {
+ border-left: 1px solid #f2f4f9
+ }
+
+}
+
+@media (min-width:768px) {
+ .page-body {
+ position: relative;
+ display: grid;
+ max-width: 100%;
+ grid-template-columns: 17rem calc(100vw - 17rem);
+ -webkit-transition: .3s;
+ transition: .3s
+ }
+
+ .page-body .page-content-wrapper {
+ position: relative;
+ width: 100%;
+ min-height: 100vh;
+ padding: 1.5rem 2.5rem calc(90px + 1.5rem);
+ margin-top: 70px
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner {
+ max-width: 1140px;
+ margin-left: auto;
+ margin-right: auto
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 70px;
+ background: #f9fafb;
+ z-index: 99
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb {
+ padding: 1rem 1rem 1rem 21px;
+ margin-left: -20px;
+ margin-right: -20px;
+ background: #f9fafb
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item {
+ color: #565656;
+ letter-spacing: .03rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 500
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item a {
+ color: inherit
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .breadcrumb .breadcrumb-item.active {
+ color: #047006
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-title-heading {
+ color: #565656;
+ font-size: 1.5rem;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ margin-bottom: 0
+ }
+
+ .page-body .page-content-wrapper .page-content-wrapper-inner .viewport-header .page-description {
+ opacity: .7;
+ margin-top: 15px
+ }
+
+ body.sidebar-minimized .t-header .t-header-brand-wrapper {
+ background: #f9fafb
+ }
+
+ body.sidebar-minimized .t-header .t-header-content-wrapper {
+ border-left: #f9fafb
+ }
+
+ body.sidebar-minimized .page-body {
+ grid-template-columns: 0 100%
+ }
+
+ body.sidebar-minimized .page-body .sidebar .sidebar_footer {
+ left: -17rem
+ }
+
+ body.sidebar-minimized .page-body .sidebar .nav-category-divider {
+ position: initial
+ }
+
+}
+
+@media (max-width:991.98px) {
+ .t-header {
+ width: 100vw
+ }
+
+ .t-header .t-header-brand-wrapper {
+ background: #f9fafb;
+ width: 4rem;
+ min-width: 4rem;
+ max-width: 4rem
+ }
+
+ .t-header .t-header-brand-wrapper a .logo {
+ -webkit-animation-name: menuItemFadeIn;
+ animation-name: menuItemFadeIn;
+ -webkit-animation-duration: .25s;
+ animation-duration: .25s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+ display: none
+ }
+
+ @-webkit-keyframes menuItemFadeIn {
+ from {
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ display: none;
+ opacity: 0
+ }
+
+ to {
+ display: block;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+
+ }
+
+ @keyframes menuItemFadeIn {
+ from {
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ display: none;
+ opacity: 0
+ }
+
+ to {
+ display: block;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+
+ }
+
+ .t-header .t-header-brand-wrapper a .logo-mini {
+ display: block
+ }
+
+ .page-body {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ flex-direction: row;
+ overflow: hidden;
+ max-width: 100%
+ }
+
+ .page-body .sidebar {
+ position: relative;
+ left: 0;
+ z-index: 99;
+ width: 15rem;
+ min-width: 15rem;
+ max-width: 15rem;
+ margin-left: -15rem;
+ -webkit-transition-duration: .2s;
+ transition-duration: .2s;
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-property: margin-left, width;
+ transition-property: margin-left, width
+ }
+
+ .page-body .sidebar .sidebar_footer {
+ -webkit-transition-duration: .2s;
+ transition-duration: .2s;
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-property: left;
+ transition-property: left;
+ left: -15rem
+ }
+
+ .page-body .page-content-wrapper {
+ padding: 20px 20px;
+ min-width: 100vw;
+ margin-left: 0;
+ -webkit-transition-duration: .2s;
+ transition-duration: .2s;
+ -webkit-transition-timing-function: ease-in-out;
+ transition-timing-function: ease-in-out;
+ -webkit-transition-property: margin-left;
+ transition-property: margin-left
+ }
+
+ .page-body .page-content-wrapper .viewport-header .breadcrumb {
+ background: 0 0;
+ padding-left: 0
+ }
+
+ .page-body .page-content-wrapper footer {
+ position: relative
+ }
+
+ .page-body.sidebar-collpased .sidebar {
+ margin-left: 0;
+ min-width: 15rem
+ }
+
+ .page-body.sidebar-collpased .sidebar .sidebar_footer {
+ left: 0
+ }
+
+}
+
+@media (max-width:767.98px) {
+ .page-body .page-content-wrapper {
+ padding: 80px 20px 0 20px
+ }
+
+}
+
+.profile-img.bg-inverse-primary {
+ color: #047006
+}
+
+.profile-img.bg-inverse-secondary {
+ color: grey
+}
+
+.profile-img.bg-inverse-success {
+ color: #047006
+}
+
+.profile-img.bg-inverse-info {
+ color: #6c61f6
+}
+
+.profile-img.bg-inverse-warning {
+ color: #f0825f
+}
+
+.profile-img.bg-inverse-danger {
+ color: #ff5f66
+}
+
+.profile-img.bg-inverse-light {
+ color: #dfdfdf
+}
+
+.profile-img.bg-inverse-dark {
+ color: #74767b
+}
+
+.profile-img.bg-inverse-white {
+ color: #fff
+}
+
+.notification-indicator-primary {
+ background: #047006
+}
+
+.notification-indicator-primary:before {
+ content: '3';
+ background: rgba(4, 112, 6, .5)
+}
+
+.notification-indicator-secondary {
+ background: grey
+}
+
+.notification-indicator-secondary:before {
+ content: '.5';
+ background: rgba(128, 128, 128, .5)
+}
+
+.notification-indicator-success {
+ background: #047006
+}
+
+.notification-indicator-success:before {
+ content: 'http://www.w3.org/2000/svg';
+ background: rgba(0, 224, 147, .5)
+}
+
+.notification-indicator-info {
+ background: #6c61f6
+}
+
+.notification-indicator-info:before {
+ content: '0 0 4 5';
+ background: rgba(108, 97, 246, .5)
+}
+
+.notification-indicator-warning {
+ background: #f0825f
+}
+
+.notification-indicator-warning:before {
+ content: '%23343a40';
+ background: rgba(240, 130, 95, .5)
+}
+
+.notification-indicator-danger {
+ background: #ff5f66
+}
+
+.notification-indicator-danger:before {
+ content: 'M2 0L0 2h4zm0 5L0 3h4z';
+ background: rgba(255, 95, 102, .5)
+}
+
+.notification-indicator-light {
+ background: #dfdfdf
+}
+
+.notification-indicator-light:before {
+ content: 'http://www.w3.org/2000/svg';
+ background: rgba(223, 223, 223, .5)
+}
+
+.notification-indicator-dark {
+ background: #74767b
+}
+
+.notification-indicator-dark:before {
+ content: '%23dc3545';
+ background: rgba(116, 118, 123, .5)
+}
+
+.notification-indicator-white {
+ background: #fff
+}
+
+.notification-indicator-white:before {
+ content: '-2 -2 7 7';
+ background: rgba(255, 255, 255, .5)
+}
+
+.border-top {
+ border-top-style: solid;
+ border-top-color: #f2f4f9;
+ border-top-width: 1px
+}
+
+.border-right {
+ border-right-style: solid;
+ border-right-color: #f2f4f9;
+ border-right-width: 1px
+}
+
+.border-bottom {
+ border-bottom-style: solid;
+ border-bottom-color: #f2f4f9;
+ border-bottom-width: 1px
+}
+
+.border-left {
+ border-left-style: solid;
+ border-left-color: #f2f4f9;
+ border-left-width: 1px
+}
+
+.ellipsor {
+ max-width: 100%;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden
+}
+
+.text-gray {
+ color: #565656
+}
+
+.overflow-hidden {
+ overflow: hidden
+}
+
+.pos-relative {
+ position: relative
+}
+
+.profile-img {
+ width: 40px;
+ height: 40px;
+ overflow: hidden
+}
+
+.profile-img:not(.component-flat) {
+ box-shadow: 0 0 2px 0 rgba(0, 0, 0, .2)
+}
+
+.profile-img:not(.img-sm):not(.img-lg):not(.img-xl) img {
+ width: 40px;
+ height: 40px
+}
+
+.profile-img:not(.img-rounded) {
+ border-radius: 6px
+}
+
+.profile-img.no-avatar {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ text-align: center;
+ text-transform: uppercase;
+ font-family: Roboto, sans-serif;
+ font-weight: 600
+}
+
+.profile-img.img-rounded {
+ border-radius: 100%
+}
+
+.grouped-images {
+ display: -webkit-box;
+ display: flex
+}
+
+.grouped-images .plus-text,
+.grouped-images img {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+ text-align: center;
+ border-radius: 100%;
+ overflow: hidden;
+ margin-right: -10px;
+ margin-right: -10px;
+ border: 3px solid #fff;
+ background: #f0f2f5;
+ color: #565656;
+ font-family: Roboto, sans-serif;
+ font-weight: 700;
+ letter-spacing: .03rem
+}
+
+.grouped-images .plus-text:not(.img-sm):not(.img-lg):not(.img-xl),
+.grouped-images img:not(.img-sm):not(.img-lg):not(.img-xl) {
+ width: 40px;
+ height: 40px
+}
+
+.img-sm {
+ width: 30px;
+ height: 30px
+}
+
+.img-lg {
+ width: 80px;
+ height: 80px
+}
+
+.img-xl {
+ width: 100px;
+ height: 100px
+}
+
+.mdi.mdi-1x:before {
+ font-size: 1.25rem
+}
+
+.mdi.mdi-2x:before {
+ font-size: 1.5625rem
+}
+
+.mdi.mdi-3x:before {
+ font-size: 1.875rem
+}
+
+.mdi.mdi-4x:before {
+ font-size: 2.1875rem
+}
+
+.mdi.mdi-5x:before {
+ font-size: 2.5rem
+}
+
+.mdi.mdi-6x:before {
+ font-size: 3.125rem
+}
+
+.mdi.mdi-7x:before {
+ font-size: 3.75rem
+}
+
+.status-indicator {
+ display: inline-block;
+ width: 12px;
+ min-width: 12px;
+ height: 12px;
+ border-radius: 4px
+}
+
+.status-indicator.rounded-indicator {
+ border-radius: 50px
+}
+
+.status-indicator.small {
+ width: 7px;
+ min-width: 7px;
+ height: 7px
+}
+
+.text-black {
+ color: #101010
+}
+
+.notification-indicator {
+ display: block;
+ width: 7px;
+ height: 7px;
+ border-radius: 100%;
+ z-index: 0
+}
+
+.notification-indicator.notification-indicator-ripple:before {
+ content: '%23dc3545';
+ display: block;
+ width: 26px;
+ height: 26px;
+ z-index: -1;
+ position: absolute;
+ top: -9px;
+ left: -9px;
+ border-radius: 100%;
+ opacity: 0;
+ -webkit-transform-origin: 50% 50%;
+ transform-origin: 50% 50%;
+ mix-blend-mode: screen;
+ -webkit-animation: ripple 1.2s ease-out;
+ animation: ripple 1.2s ease-out;
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite
+}
+
+.logo {
+ display: block;
+ margin: 0 auto;
+ width: 280px
+}
+
+.logo img {
+ width: 100%
+}
+
+.grid {
+ background: #fff;
+ border-radius: 6px;
+ box-shadow: 0 0 10px 0 rgba(183, 192, 206, .2);
+ margin-bottom: 1.5rem;
+ border: 1px solid rgba(238, 238, 238, .75)
+}
+
+.grid-header {
+ padding: 15px 20px;
+ margin-bottom: 15px;
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ letter-spacing: .03rem;
+ background: #f9fafb;
+ border-left: 3px solid #047006;
+ border-radius: 0 6px 0 0
+}
+
+.grid-title {
+ opacity: .9;
+ margin-bottom: 25px
+}
+
+.close {
+ color: #101010
+}
+
+.split-header {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-pack: justify;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.split-header .content-wrapper {
+ display: -webkit-box;
+ display: flex
+}
+
+.split-header .content-wrapper a i,
+.split-header .content-wrapper span i {
+ font-size: 20px;
+ color: #adb5bd;
+ -webkit-transition: .3s ease color;
+ transition: .3s ease color
+}
+
+.split-header .content-wrapper a i:hover,
+.split-header .content-wrapper span i:hover {
+ color: #047006
+}
+
+.split-header .content-wrapper.v-centered {
+ -webkit-box-align: center;
+ align-items: center
+}
+
+.split-header .content-wrapper.h-centered {
+ -webkit-box-pack: center;
+ justify-content: center
+}
+
+.grid-body {
+ padding: 20px 25px 20px
+}
+
+.card-title {
+ font-family: Roboto, sans-serif;
+ font-weight: 500;
+ color: #313131;
+ margin-bottom: 0
+}
+
+.equel-grid {
+ display: -webkit-box;
+ display: flex;
+ -webkit-box-align: stretch;
+ align-items: stretch
+}
+
+.equel-grid .grid {
+ width: 100%;
+ min-width: 100%
+}
+
+.showcase_row_area {
+ margin-bottom: 20px
+}
+
+.showcase_row_area .showcase_text_area {
+ text-align: right
+}
+
+@media (max-width:767.98px) {
+ .showcase_row_area .showcase_text_area {
+ text-align: left
+ }
+
+}
+
+.showcase_row_area .showcase_content_area {
+ margin-bottom: -10px
+}
+
+.showcase_row_area .showcase_content_area .btn {
+ margin-right: 5px;
+ margin-bottom: 10px
+}
+
+.showcase_row_area:last-child {
+ margin-bottom: 0
+}
+
+.content-preview {
+ width: 45px;
+ height: 45px
+}
+
+.content-preview.rounded {
+ border-radius: 100%
+}
+
+.btn:not(.disabled),.cursor_pointer,a {
+ cursor: pointer
+}
+
+.grd-positive-currency {
+ color: #047006
+}
+
+.grd-negative-currency {
+ color: red
+}
+
+.color-success {
+ color: var(--success)
+}
+
+.color-danger {
+ color: var(--danger)
+}
+
+.color-warning {
+ color: var(--warning)
+}
+
+.color-primary {
+ color: var(--primary)
+}
+
+.btn-gradido-orange {
+ color: #fff;
+ background-color: #ffa600;
+ border-color: #ffa600
+}
+
+.visible-modal {
+ display: block
+}
+
+.margin-top-10 {
+ margin-top: 10px
+}
+
+.pull-right {
+ float: right
+}
+
+.pull-right-row {
+ display: block;
+ margin-right: 10px
+}
+
+.display-block {
+ display: block
+}
+
+p.grd_small {
+ margin-top: 2px;
+ margin-bottom: 2px
+}
+
+ul.grd-no-style {
+ list-style-type: none
+}
+
+.center-ul-container ul {
+ padding-left: 0;
+ margin-bottom: 0;
+ text-align: center
+}
+
+.center-ul-container ul .grd-error {
+ margin-top: 5px;
+ color: #8b0000
+}
+
+.grd-alert-color {
+ color: #ff5f66 !important
+}
+
+.grd-success-color {
+ color: #047006 !important
+}
+
+.grd-orange-color {
+ color: #ffa600
+}
+
+.hidden {
+ display: none
+}
+
+.alert {
+ cursor: pointer
+}
+
+.table.table-auto-break td,
+.table.table-auto-break th {
+ white-space: pre-line
+}
diff --git a/community_server/webroot/css/styles.css b/community_server/webroot/css/styles.css
new file mode 100644
index 000000000..143cbdc08
--- /dev/null
+++ b/community_server/webroot/css/styles.css
@@ -0,0 +1,347 @@
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/*
+ Created on : 30.10.2019, 09:26:42
+ Author : einhornimmond
+*/
+.dev-info {
+ position: fixed;
+ color: grey;
+ font-size: smaller;
+ left: 8px;
+}
+.grd-time-used {
+ bottom: 0;
+}
+.versionstring {
+ top: 0;
+}
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/*
+ Created on : 12.07.2019, 07:59:32
+ Author : einhornimmond
+*/
+div[role='grd_dialog'] {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.5);
+ top: 0;
+ left: 0;
+}
+div.grd_modal-dialog {
+ margin-top: 100px;
+ min-height: 200px;
+ max-width: 1000px;
+ margin-left: auto;
+ margin-right: auto;
+ background-color: white;
+ color: black;
+ border: 1px solid grey;
+}
+div.grd_modal-dialog.grd_dialog-large {
+ margin-top: 5px;
+ width: 90%;
+}
+div.grd_modal-body {
+ padding: 25px;
+}
+div.grd_modal-header {
+ background-color: rgba(0, 0, 0, 0.1);
+ padding: 5px;
+ padding-left: 15px;
+ border: 1px solid grey;
+ color: black;
+}
+div.grd_modal-footer {
+ background-color: rgba(0, 0, 0, 0.1);
+ height: 40px;
+}
+.grd_modal-footer a,
+.grd_modal-footer button {
+ float: right;
+ padding: 9px;
+ margin-right: 10px;
+ border: 1px solid grey;
+}
+.grd_modal-footer a:hover,
+.grd_modal-footer button:hover {
+ background-color: rgba(255, 255, 255, 0.5);
+}
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/*
+ Created on : 30.10.2019, 14:41:57
+ Author : einhornimmond
+*/
+/* Button */
+/*a.grd_bn,a.grd_bn:visited {
+ color:black;
+ text-decoration: none;
+}
+*/
+.grd-form-bn:hover,
+.grd-active {
+ background-color: lightgray;
+ border-color: black;
+}
+.grd-form-bn {
+ padding: 5px;
+ border: 1px solid grey;
+ display: table-cell;
+ text-align: center;
+ vertical-align: middle;
+ color: #444;
+}
+a.grd-form-bn,
+a.grd-form-bn:visited {
+ color: black;
+ text-decoration: none;
+}
+.grd-form-bn-succeed {
+ background-color: lightcyan;
+ color: green;
+ margin-top: 3px;
+ margin-bottom: 3px;
+}
+.grd-form-bn-succeed:not([disabled]):hover {
+ background-color: lightgreen;
+}
+.grd-form-bn-discard {
+ margin-left: 5px;
+ border: 1px solid red;
+ color: red;
+ cursor: pointer;
+}
+/*
+.grd_large-bn {
+ width:100vw;
+ height:25vh;
+ font-size: 8vh;
+}
+
+.grd_bg-bn {
+ width:50vw;
+ height:25vh;
+ font-size: 7vh;
+}
+
+.gr_md-bn {
+ width:50vw;
+ height:25vh;
+ font-size: 6vh;
+}
+*/
+/* form elements */
+.grd_textarea {
+ border: 1px solid grey;
+ background-color: rgba(0, 0, 0, 0.05);
+ padding: 5px;
+ font-style: italic;
+}
+.grd-input label {
+ display: block;
+}
+input.grd-privkey {
+ width: 465px;
+}
+input.grd-pubkey {
+ width: 465px;
+}
+input.grd-non-der-keys {
+ width: 900px;
+}
+input:not([type='radio']) {
+ width: 200px;
+}
+label:not(.grd_radio_label) {
+ width: 80px;
+ display: inline-block;
+}
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/*
+ Created on : 13.10.2019, 15:43:58
+ Author : einhornimmond
+*/
+.grd-time-used {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ color: grey;
+ font-size: smaller;
+}
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/*
+ Created on : 30.10.2019, 16:04:16
+ Author : einhornimmond
+*/
+/* messages, update flash */
+.grd-error {
+ color: red;
+ border: 1px solid rgba(255, 0, 0, 0.5);
+ padding: 5px;
+}
+.grd-info {
+ border: 1px dotted gray;
+ padding: 5px;
+}
+.grd-success {
+ padding: 5px;
+ color: green;
+}
+.flash-messages .message {
+ padding: 5px;
+}
+.flash-messages .success {
+ color: green;
+}
+.flash-messages .error {
+ color: red;
+}
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/*
+ Created on : 30.10.2019, 14:16:16
+ Author : einhornimmond
+*/
+/* navbar */
+nav.grd-left-bar {
+ position: fixed;
+ top: 80.5px;
+}
+nav .grd-nav-bn {
+ width: 120px;
+}
+nav ul {
+ margin-top: 0;
+ padding-left: 0;
+}
+/* buttons */
+.grd-nav-bn:hover,
+.grd-active {
+ background-color: lightgray;
+ border-color: black;
+}
+.grd-nav-bn {
+ padding: 10px;
+ border: 1px solid grey;
+ display: table-cell;
+ text-align: center;
+ vertical-align: middle;
+ color: grey;
+}
+.grd-nav-without-border {
+ border: none;
+}
+.grd-nav-bn-large {
+ width: 40vw;
+ height: 18vh;
+ font-size: 35px;
+}
+a.grd-nav-bn,
+a.grd-nav-bn:visited {
+ color: black;
+ text-decoration: none;
+}
+.grd-nav-bn-discard {
+ color: darkred !important;
+}
+/*
+To change this license header, choose License Headers in Project Properties.
+To change this template file, choose Tools | Templates
+and open the template in the editor.
+*/
+/*
+ Created on : 07.07.2019, 16:20:15
+ Author : einhornimmond
+*/
+/* content container */
+.grd_container {
+ max-width: 820px;
+ margin-left: auto;
+ margin-right: auto;
+}
+.grd_container_small {
+ max-width: 500px;
+}
+.grd_text {
+ max-width: 550px;
+ margin-bottom: 5px;
+}
+.grd_text-max-width {
+ max-width: 550px;
+}
+/* layout helper */
+.grd_margin_5 {
+ margin: 5px;
+}
+.grd-margin-top-10 {
+ margin-top: 10px;
+}
+.grd-width-200 {
+ width: 200px;
+}
+.grd-padding-top-bottom-5 {
+ padding-top: 5px;
+ padding-bottom: 5px;
+}
+.grd-padding-top-bottom-10 {
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+.grd_margin-bottom {
+ margin-bottom: 5px;
+}
+.grd_right {
+ float: right;
+}
+a.grd_invisible_link {
+ color: black;
+ text-decoration: none;
+}
+a.grd_invisible_link:hover {
+ color: grey;
+}
+.grd_clickable {
+ cursor: pointer;
+}
+ul.grd-no-style {
+ list-style: none;
+}
+p.grd_small {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+.grd-default-currency {
+ color: grey;
+}
+.grd-positive-currency {
+ color: green;
+}
+.grd-negative-currency {
+ color: red;
+}
+.admin-border {
+ border-color: #ffa600;
+}
diff --git a/community_server/webroot/favicon.ico b/community_server/webroot/favicon.ico
new file mode 100644
index 000000000..5b44f2027
Binary files /dev/null and b/community_server/webroot/favicon.ico differ
diff --git a/community_server/webroot/font/cakedingbats-webfont.eot b/community_server/webroot/font/cakedingbats-webfont.eot
new file mode 100644
index 000000000..e8605d926
Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.eot differ
diff --git a/community_server/webroot/font/cakedingbats-webfont.svg b/community_server/webroot/font/cakedingbats-webfont.svg
new file mode 100644
index 000000000..d1e0c98f7
--- /dev/null
+++ b/community_server/webroot/font/cakedingbats-webfont.svg
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/community_server/webroot/font/cakedingbats-webfont.ttf b/community_server/webroot/font/cakedingbats-webfont.ttf
new file mode 100644
index 000000000..13d54454e
Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.ttf differ
diff --git a/community_server/webroot/font/cakedingbats-webfont.woff b/community_server/webroot/font/cakedingbats-webfont.woff
new file mode 100644
index 000000000..073baab11
Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.woff differ
diff --git a/community_server/webroot/font/cakedingbats-webfont.woff2 b/community_server/webroot/font/cakedingbats-webfont.woff2
new file mode 100644
index 000000000..6e71eaf53
Binary files /dev/null and b/community_server/webroot/font/cakedingbats-webfont.woff2 differ
diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot
new file mode 100644
index 000000000..3e035411c
Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.eot differ
diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf
new file mode 100644
index 000000000..db76e5796
Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.ttf differ
diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff
new file mode 100644
index 000000000..5f10918f0
Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff differ
diff --git a/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2
new file mode 100644
index 000000000..34df5fe02
Binary files /dev/null and b/community_server/webroot/fonts/MaterialIconsOutlined/Material-Icons-Outline.woff2 differ
diff --git a/community_server/webroot/fonts/Roboto/Roboto-Black.ttf b/community_server/webroot/fonts/Roboto/Roboto-Black.ttf
new file mode 100644
index 000000000..689fe5cb3
Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Black.ttf differ
diff --git a/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf b/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf
new file mode 100644
index 000000000..d3f01ad24
Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Bold.ttf differ
diff --git a/community_server/webroot/fonts/Roboto/Roboto-Light.ttf b/community_server/webroot/fonts/Roboto/Roboto-Light.ttf
new file mode 100644
index 000000000..219063a57
Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Light.ttf differ
diff --git a/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf b/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf
new file mode 100644
index 000000000..1a7f3b0bb
Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Medium.ttf differ
diff --git a/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf b/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf
new file mode 100644
index 000000000..2c97eeadf
Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Regular.ttf differ
diff --git a/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf b/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf
new file mode 100644
index 000000000..b74a4fd1a
Binary files /dev/null and b/community_server/webroot/fonts/Roboto/Roboto-Thin.ttf differ
diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.eot b/community_server/webroot/fonts/materialdesignicons-webfont.eot
new file mode 100644
index 000000000..fe283ac48
Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.eot differ
diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.svg b/community_server/webroot/fonts/materialdesignicons-webfont.svg
new file mode 100644
index 000000000..b356c2977
--- /dev/null
+++ b/community_server/webroot/fonts/materialdesignicons-webfont.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.ttf b/community_server/webroot/fonts/materialdesignicons-webfont.ttf
new file mode 100644
index 000000000..3219fca04
Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.ttf differ
diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.woff b/community_server/webroot/fonts/materialdesignicons-webfont.woff
new file mode 100644
index 000000000..abe1e47ef
Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.woff differ
diff --git a/community_server/webroot/fonts/materialdesignicons-webfont.woff2 b/community_server/webroot/fonts/materialdesignicons-webfont.woff2
new file mode 100644
index 000000000..47e8a2c3e
Binary files /dev/null and b/community_server/webroot/fonts/materialdesignicons-webfont.woff2 differ
diff --git a/community_server/webroot/img/50x50.png b/community_server/webroot/img/50x50.png
new file mode 100644
index 000000000..7eb2b9ad8
Binary files /dev/null and b/community_server/webroot/img/50x50.png differ
diff --git a/community_server/webroot/img/cake-logo.png b/community_server/webroot/img/cake-logo.png
new file mode 100644
index 000000000..41939ef5a
Binary files /dev/null and b/community_server/webroot/img/cake-logo.png differ
diff --git a/community_server/webroot/img/cake.icon.png b/community_server/webroot/img/cake.icon.png
new file mode 100644
index 000000000..394fa42d5
Binary files /dev/null and b/community_server/webroot/img/cake.icon.png differ
diff --git a/community_server/webroot/img/cake.logo.svg b/community_server/webroot/img/cake.logo.svg
new file mode 100644
index 000000000..e73abb54b
--- /dev/null
+++ b/community_server/webroot/img/cake.logo.svg
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/community_server/webroot/img/cake.power.gif b/community_server/webroot/img/cake.power.gif
new file mode 100644
index 000000000..8f8d570a2
Binary files /dev/null and b/community_server/webroot/img/cake.power.gif differ
diff --git a/community_server/webroot/img/logo_half.png b/community_server/webroot/img/logo_half.png
new file mode 100644
index 000000000..d6852eab8
Binary files /dev/null and b/community_server/webroot/img/logo_half.png differ
diff --git a/community_server/webroot/img/logo_half.webp b/community_server/webroot/img/logo_half.webp
new file mode 100644
index 000000000..d0e6c245b
Binary files /dev/null and b/community_server/webroot/img/logo_half.webp differ
diff --git a/community_server/webroot/img/logo_schrift.png b/community_server/webroot/img/logo_schrift.png
new file mode 100644
index 000000000..062997764
Binary files /dev/null and b/community_server/webroot/img/logo_schrift.png differ
diff --git a/community_server/webroot/img/logo_schrift.webp b/community_server/webroot/img/logo_schrift.webp
new file mode 100644
index 000000000..bff8a245d
Binary files /dev/null and b/community_server/webroot/img/logo_schrift.webp differ
diff --git a/community_server/webroot/img/logo_schrift_half.png b/community_server/webroot/img/logo_schrift_half.png
new file mode 100644
index 000000000..5dfb1b3ac
Binary files /dev/null and b/community_server/webroot/img/logo_schrift_half.png differ
diff --git a/community_server/webroot/img/logo_schrift_half.webp b/community_server/webroot/img/logo_schrift_half.webp
new file mode 100644
index 000000000..fa7d49642
Binary files /dev/null and b/community_server/webroot/img/logo_schrift_half.webp differ
diff --git a/community_server/webroot/index.php b/community_server/webroot/index.php
new file mode 100644
index 000000000..2e697aedc
--- /dev/null
+++ b/community_server/webroot/index.php
@@ -0,0 +1,41 @@
+emit($server->run());
+
diff --git a/community_server/webroot/js/basic.js b/community_server/webroot/js/basic.js
new file mode 100644
index 000000000..df53065fe
--- /dev/null
+++ b/community_server/webroot/js/basic.js
@@ -0,0 +1,116 @@
+// cross browser dom is ready module from:
+// https://www.competa.com/blog/cross-browser-document-ready-with-vanilla-javascript/
+var domIsReady = (function(domIsReady) {
+ var isBrowserIeOrNot = function() {
+ return (!document.attachEvent || typeof document.attachEvent === "undefined" ? 'not-ie' : 'ie');
+ }
+
+ domIsReady = function(callback) {
+ if (callback && typeof callback === 'function') {
+ if (isBrowserIeOrNot() !== 'ie') {
+ document.addEventListener("DOMContentLoaded", function() {
+ return callback();
+ });
+ } else {
+ document.attachEvent("onreadystatechange", function() {
+ if (document.readyState === "complete") {
+ return callback();
+ }
+ });
+ }
+ } else {
+ console.error('The callback is not a function!');
+ }
+ }
+
+ return domIsReady;
+})(domIsReady || {});
+
+
+// vanilla ajax request, json get
+function getJson(basisUrl, method, successFunction, errorFunction, timeoutFunction) {
+ var xhr = new XMLHttpRequest();
+
+ xhr.onload = function(e) {
+ var xhr = e.target;
+ //console.log(xhr);
+ var jsonReturn = [];
+ if (xhr.responseType === 'json') {
+ jsonReturn = xhr.response;
+ } else {
+ jsonReturn = JSON.parse(xhr.responseText);
+ }
+ successFunction(jsonReturn);
+ }
+ xhr.onerror = function(e) {
+ errorFunction(e);
+ }
+ xhr.ontimeout = function(e) {
+ timeoutFunction(e);
+ }
+
+ var bustCache = '&' + new Date().getTime();
+ //oReq.open('GET', e.target.dataset.url + bustCache, true);
+ xhr.open('GET', basisUrl + '?method=' + method + bustCache, true);
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
+ xhr.responseType = 'json';
+ xhr.send();
+}
+
+// cross browser dom is ready
+(function(document, window, domIsReady, undefined) {
+ domIsReady(function() {
+ var DesktopToggler = document.querySelector('#nav-action');
+ var MobileToggler = document.querySelector('#nav-action-mobile');
+ var HeaderToggle = document.querySelector('.t-header-toggler');
+
+ // SIDEBAR TOGGLE FUNCTION FOR LARGE SCREENS (SCREEN "LG" AND UP)
+ if (DesktopToggler) {
+ DesktopToggler.addEventListener('click', function() {
+ console.log('toggler clicked / Desktop');
+ if (document.querySelector('.nav-menu').classList.contains('initial')) {
+ document.querySelector('.nav-menu').classList.remove('initial');
+ document.querySelector('.nav-menu').classList.add('nav-menu-minimized');
+ } else {
+ document.querySelector('.nav-menu').classList.toggle('nav-menu-minimized');
+ document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized');
+ }
+ let big = document.querySelectorAll('.logo.big');
+ big.forEach(function(el) {
+ el.classList.toggle('visible');
+ });
+ let small = document.querySelectorAll('.logo.small');
+ small.forEach(function(el) {
+ el.classList.toggle('visible');
+ });
+ });
+ }
+
+ // SIDEBAR TOGGLE FUNCTION FOR MOBILE (SCREEN "MD" AND DOWN)
+ if (MobileToggler) {
+ MobileToggler.addEventListener('click', function() {
+ console.log('toggler clicked / Desktop');
+ if (document.querySelector('.nav-menu').classList.contains('initial')) {
+ document.querySelector('.nav-menu').classList.remove('initial');
+ document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized');
+ } else {
+ document.querySelector('.nav-menu').classList.toggle('nav-menu-minimized');
+ document.querySelector('.nav-menu').classList.toggle('nav-menu-maximized');
+ }
+ let big = document.querySelectorAll('.logo.big');
+ big.forEach(function(el) {
+ el.classList.toggle('visible');
+ });
+ let small = document.querySelectorAll('.logo.small');
+ small.forEach(function(el) {
+ el.classList.toggle('visible');
+ });
+ });
+ }
+ if (HeaderToggle) {
+ HeaderToggle.addEventListener('click', function() {
+ HeaderToggle.classList.toggle('arrow');
+ });
+ }
+ });
+})(document, window, domIsReady);
\ No newline at end of file
diff --git a/community_server/webroot/js/core.js b/community_server/webroot/js/core.js
new file mode 100644
index 000000000..9678001c2
--- /dev/null
+++ b/community_server/webroot/js/core.js
@@ -0,0 +1 @@
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(T,e){"use strict";var t=[],x=T.document,i=Object.getPrototypeOf,a=t.slice,g=t.concat,l=t.push,r=t.indexOf,n={},o=n.toString,m=n.hasOwnProperty,s=m.toString,u=s.call(Object),v={},y=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},_=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,noModule:!0};function b(e,t,n){var i,r=(t=t||x).createElement("script");if(r.text=e,n)for(i in c)n[i]&&(r[i]=n[i]);t.head.appendChild(r).parentNode.removeChild(r)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var C=function(e,t){return new C.fn.init(e,t)},f=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function h(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!y(e)&&!_(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+P+")"+P+"*"),K=new RegExp("="+P+"*([^\\]'\"]*?)"+P+"*\\]","g"),$=new RegExp(F),Q=new RegExp("^"+q+"$"),V={ID:new RegExp("^#("+q+")"),CLASS:new RegExp("^\\.("+q+")"),TAG:new RegExp("^("+q+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},z=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,X=/^[^{]+\{\s*\[native \w/,G=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),ee=function(e,t,n){var i="0x"+t-65536;return i!=i||n?t:i<0?String.fromCharCode(i+65536):String.fromCharCode(i>>10|55296,1023&i|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ie=function(){E()},re=ye(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{O.apply(t=j.call(y.childNodes),y.childNodes),t[y.childNodes.length].nodeType}catch(n){O={apply:t.length?function(e,t){k.apply(e,j.call(t))}:function(e,t){for(var n=e.length,i=0;e[n++]=t[i++];);e.length=n-1}}}function oe(e,t,n,i){var r,o,s,a,l,u,c,f=t&&t.ownerDocument,h=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==h&&9!==h&&11!==h)return n;if(!i&&((t?t.ownerDocument||t:y)!==T&&E(t),t=t||T,x)){if(11!==h&&(l=G.exec(e)))if(r=l[1]){if(9===h){if(!(s=t.getElementById(r)))return n;if(s.id===r)return n.push(s),n}else if(f&&(s=f.getElementById(r))&&v(t,s)&&s.id===r)return n.push(s),n}else{if(l[2])return O.apply(n,t.getElementsByTagName(e)),n;if((r=l[3])&&d.getElementsByClassName&&t.getElementsByClassName)return O.apply(n,t.getElementsByClassName(r)),n}if(d.qsa&&!D[e+" "]&&(!m||!m.test(e))){if(1!==h)f=t,c=e;else if("object"!==t.nodeName.toLowerCase()){for((a=t.getAttribute("id"))?a=a.replace(te,ne):t.setAttribute("id",a=C),o=(u=p(e)).length;o--;)u[o]="#"+a+" "+ve(u[o]);c=u.join(","),f=J.test(e)&&ge(t.parentNode)||t}if(c)try{return O.apply(n,f.querySelectorAll(c)),n}catch(e){}finally{a===C&&t.removeAttribute("id")}}}return g(e.replace(W,"$1"),t,n,i)}function se(){var i=[];return function e(t,n){return i.push(t+" ")>b.cacheLength&&delete e[i.shift()],e[t+" "]=n}}function ae(e){return e[C]=!0,e}function le(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ue(e,t){for(var n=e.split("|"),i=n.length;i--;)b.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,i=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(i)return i;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function de(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&re(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function pe(s){return ae(function(o){return o=+o,ae(function(e,t){for(var n,i=s([],e.length,o),r=i.length;r--;)e[n=i[r]]&&(e[n]=!(t[n]=e[n]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in d=oe.support={},r=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},E=oe.setDocument=function(e){var t,n,i=e?e.ownerDocument||e:y;return i!==T&&9===i.nodeType&&i.documentElement&&(s=(T=i).documentElement,x=!r(T),y!==T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",ie,!1):n.attachEvent&&n.attachEvent("onunload",ie)),d.attributes=le(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=le(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=X.test(T.getElementsByClassName),d.getById=le(function(e){return s.appendChild(e).id=C,!T.getElementsByName||!T.getElementsByName(C).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(Z,ee);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if(void 0!==t.getElementById&&x){var n,i,r,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(r=t.getElementsByName(e),i=0;o=r[i++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,i=[],r=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[r++];)1===n.nodeType&&i.push(n);return i},b.find.CLASS=d.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&x)return t.getElementsByClassName(e)},a=[],m=[],(d.qsa=X.test(T.querySelectorAll))&&(le(function(e){s.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+P+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+C+"-]").length||m.push("~="),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+C+"+*").length||m.push(".#.+[+~]")}),le(function(e){e.innerHTML=" ";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+P+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),s.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(d.matchesSelector=X.test(c=s.matches||s.webkitMatchesSelector||s.mozMatchesSelector||s.oMatchesSelector||s.msMatchesSelector))&&le(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),a.push("!=",F)}),m=m.length&&new RegExp(m.join("|")),a=a.length&&new RegExp(a.join("|")),t=X.test(s.compareDocumentPosition),v=t||X.test(s.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,i=t&&t.parentNode;return e===i||!(!i||1!==i.nodeType||!(n.contains?n.contains(i):e.compareDocumentPosition&&16&e.compareDocumentPosition(i)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},A=t?function(e,t){if(e===t)return u=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument===y&&v(y,e)?-1:t===T||t.ownerDocument===y&&v(y,t)?1:l?L(l,e)-L(l,t):0:4&n?-1:1)}:function(e,t){if(e===t)return u=!0,0;var n,i=0,r=e.parentNode,o=t.parentNode,s=[e],a=[t];if(!r||!o)return e===T?-1:t===T?1:r?-1:o?1:l?L(l,e)-L(l,t):0;if(r===o)return ce(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)a.unshift(n);for(;s[i]===a[i];)i++;return i?ce(s[i],a[i]):s[i]===y?-1:a[i]===y?1:0}),T},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==T&&E(e),t=t.replace(K,"='$1']"),d.matchesSelector&&x&&!D[t+" "]&&(!a||!a.test(t))&&(!m||!m.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&$.test(n)&&(t=p(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=h[e+" "];return t||(t=new RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&h(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,i,r){return function(e){var t=oe.attr(e,n);return null==t?"!="===i:!i||(t+="","="===i?t===r:"!="===i?t!==r:"^="===i?r&&0===t.indexOf(r):"*="===i?r&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function N(e,n,i){return y(n)?C.grep(e,function(e,t){return!!n.call(e,t,e)!==i}):n.nodeType?C.grep(e,function(e){return e===n!==i}):"string"!=typeof n?C.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(C.fn.init=function(e,t,n){var i,r;if(!e)return this;if(n=n||I,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):y(e)?void 0!==n.ready?n.ready(e):e(C):C.makeArray(e,this);if(!(i="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:k.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:x,!0)),A.test(i[1])&&C.isPlainObject(t))for(i in t)y(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(r=x.getElementById(i[2]))&&(this[0]=r,this.length=1),this}).prototype=C.fn,I=C(x);var O=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function L(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t=C(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]+)/i,ce=/^$|^module$|\/(?:java|ecma)script/i,fe={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function he(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&D(e,t)?C.merge([e],n):n}function de(e,t){for(var n=0,i=e.length;nx",v.noCloneChecked=!!pe.cloneNode(!0).lastChild.defaultValue;var ye=x.documentElement,_e=/^key/,be=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,we=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Te(){return!1}function xe(){try{return x.activeElement}catch(e){}}function Ce(e,t,n,i,r,o){var s,a;if("object"==typeof t){for(a in"string"!=typeof n&&(i=i||n,n=void 0),t)Ce(e,a,n,i,t[a],o);return e}if(null==i&&null==r?(r=n,i=n=void 0):null==r&&("string"==typeof n?(r=i,i=void 0):(r=i,i=n,n=void 0)),!1===r)r=Te;else if(!r)return e;return 1===o&&(s=r,(r=function(e){return C().off(e),s.apply(this,arguments)}).guid=s.guid||(s.guid=C.guid++)),e.each(function(){C.event.add(this,t,r,i,n)})}C.event={global:{},add:function(t,e,n,i,r){var o,s,a,l,u,c,f,h,d,p,g,m=Y.get(t);if(m)for(n.handler&&(n=(o=n).handler,r=o.selector),r&&C.find.matchesSelector(ye,r),n.guid||(n.guid=C.guid++),(l=m.events)||(l=m.events={}),(s=m.handle)||(s=m.handle=function(e){return void 0!==C&&C.event.triggered!==e.type?C.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(H)||[""]).length;u--;)d=g=(a=we.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),d&&(f=C.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,f=C.event.special[d]||{},c=C.extend({type:d,origType:g,data:i,handler:n,guid:n.guid,selector:r,needsContext:r&&C.expr.match.needsContext.test(r),namespace:p.join(".")},o),(h=l[d])||((h=l[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(d,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),r?h.splice(h.delegateCount++,0,c):h.push(c),C.event.global[d]=!0)},remove:function(e,t,n,i,r){var o,s,a,l,u,c,f,h,d,p,g,m=Y.hasData(e)&&Y.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(H)||[""]).length;u--;)if(d=g=(a=we.exec(t[u])||[])[1],p=(a[2]||"").split(".").sort(),d){for(f=C.event.special[d]||{},h=l[d=(i?f.delegateType:f.bindType)||d]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)c=h[o],!r&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(h.splice(o,1),c.selector&&h.delegateCount--,f.remove&&f.remove.call(e,c));s&&!h.length&&(f.teardown&&!1!==f.teardown.call(e,p,m.handle)||C.removeEvent(e,d,m.handle),delete l[d])}else for(d in l)C.event.remove(e,d+t[u],n,i,!0);C.isEmptyObject(l)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,i,r,o,s,a=C.event.fix(e),l=new Array(arguments.length),u=(Y.get(this,"events")||{})[a.type]||[],c=C.event.special[a.type]||{};for(l[0]=a,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,De=/
+
+
+
+
+
+
+
+
+
+ Startseite
+ -
+ Überprüfe Transaktion
+
+
+
+
+
+
+
+ Copyright © 2020 Gradido
+
+
+ 98.597 ms
+
+
+
Community Server in Entwicklung
+
Alpha 0.21.KW21.05
+
+
+
+
+